open-index/open-npm huggingface dataset:
npm package: @howler/cli
Description: Howler TUI — encrypted messaging from your terminal
Latest version: 0.2.5

# Howler TUI

Terminal UI for [Howler](https://howler.pages.dev) encrypted messaging. Same account, same E2E encryption, same conversations — from your terminal.

## Install

```bash
npm install -g @howler/cli
```

Or run without installing:

```bash
npx @howler/cli
```

## Getting started

1. Run `howler` in your terminal
2. On first launch, your browser opens to log in with your Howler account
3. Once authenticated, the TUI connects and loads your inbox
4. Use `Tab` to switch between the inbox panel (left) and conversation panel (right)
5. Press `Enter` on a chat to open it, type a message, and press `Enter` to send

If you don't have an account yet, sign up at https://howler.pages.dev.

## Usage

```bash
howler          # Launch TUI (opens browser for login on first run)
howler --logout # Sign out and clear stored credentials
```

## Keyboard shortcuts

| Key | Action |
|-----|--------|
| `Tab` / `Shift+Tab` | Switch between inbox and conversation panels |
| `↑` / `↓` | Navigate list or scroll messages |
| `Enter` | Select chat / send message |
| `Escape` | Return to chat list or branch list |
| `1` `2` `3` `4` | Filter inbox: All, 1:1, Groups, AI |
| `l` | Load older messages |
| `/` | Open slash command autocomplete |

## Slash commands

Type `/` in the message input to see autocomplete suggestions.

| Command | Description |
|---------|-------------|
| `/agent <goal>` | Create an agent task (bot chats only) |
| `/addmember @username` | Add a member to the current group |
| `/change-branch` | Switch branch in repo bot chats |
| `/current-branch` | Show the active branch |
| `/exit` | Quit the TUI |

## Features

- **E2E encrypted** — Signal Protocol, same keys as the web app
- **Real-time** — messages appear instantly via Supabase subscriptions
- **Multi-device** — works alongside the web app on the same account
- **Bot/agent support** — interact with AI agents, view branch-based conversations

## Requirements

- Node.js 18+
- A Howler account (sign up at https://howler.pages.dev)
npm package: @howlove/choose-modal-list
Description: 弹出 选择框组件，可以进行 多选/单选
Latest version: 0.1.9

# 名称

@howlove/choose-modal-list

# 用法
https://unpkg.com/@howlove/choose-modal-list@0.0.11/build/index.html


# 介绍

弹出 选择框组件，可以进行 多选/单选。
getList传递用户的request方法，request返回的格式是：
```typescript
interface ListResult {
  pageNo: number;
  pageSize: number;
  total: number;
  datas: any[];
}
```
支持单选或者多选
```typescript
checkType: "checkbox" | "radio"
```

## 更新备注
  
0.0.11 ---------- 2023-05-12 15:19:52  
更新内容: 增加了按钮左边的jsx内容  
0.0.14 ---------- 2023-05-12 17:58:46  
更新内容: 隐藏pageSize切换器  
0.0.21 ---------- 2023-08-10 15:19:06  
更新内容: 增加sameReturn字段  
0.0.22 ---------- 2023-12-13 11:23:13  
更新内容: 修复defaultSelectedRow未传会报错的bug  
0.1.2 ---------- 2023-12-13 11:46:46  
更新内容: 增加loading状态
npm package: @howlove/enum
Description: ```javascript const verifyStatusEnum = createEnum({ 	wait: { 		label: "等待", 		value: 0, 		idx: 1, 	}, 	pass: { 		label: "通过", 		value: 1, 		idx: 2, 	}, 	reject: { 		label: "拒绝", 		value: 2, 		idx: 3, 	}, 	init: { 		label: { 			text: "支付取消", 			status: "Su
Author: liukai
Latest version: 0.0.6

## 使用 demo

```javascript
const verifyStatusEnum = createEnum({
	wait: {
		label: "等待",
		value: 0,
		idx: 1,
	},
	pass: {
		label: "通过",
		value: 1,
		idx: 2,
	},
	reject: {
		label: "拒绝",
		value: 2,
		idx: 3,
	},
	init: {
		label: {
			text: "支付取消",
			status: "Success",
		},
		value: 3,
		idx: 4,
	},
} as const);

// result -> 0
verifyStatusEnum.wait

// result -> 等待
verifyStatusEnum.waitName

// result -> { wait: '等待', pass: '通过', reject: '拒绝', init: { text: '支付取消', status: 'Success' } }
verifyStatusEnum.enum

// result -> { wait: '等待', pass: '通过', reject: '拒绝', init: '支付取消' }
verifyStatusEnum.textEnum

/**
 *
[
  { label: '等待', value: 0, idx: 1 },
  { label: '通过', value: 1, idx: 2 },
  { label: '拒绝', value: 2, idx: 3 },
  { label: { text: '支付取消', status: 'Success' }, value: 3, idx: 4 }
]
 */
verifyStatusEnum.options

```

## 更新备注
  
0.0.3 ---------- 2023-12-14 15:37:44  
更新内容: 枚举的key应该是value值  
0.0.5 ---------- 2023/12/19 20:26:13  
更新内容: labelType的text改为any类型，就可以传dom或者其他类型进来
npm package: @howlove/format-apis
Description: ```typescript import formatApis, { getRequestList, RequestSendConfig } from "format-apis";
Author: liukai
Latest version: 0.0.13

## 使用 demo

```typescript
import formatApis, { getRequestList, RequestSendConfig } from "format-apis";

const apis = {
	cc: {
		/** @todo getRequestList 的注释不会放出来 */
		...getRequestList(
			["add", "commit", ["getUserListPage", "list"], "audit"],
			"/admin/okr-taskgroup/",
			{
				async: true,
				spaceTimer: 1500,
			}
		),
		/** 这里是ee的调用注释 */
		ee: "/path/do/something/ee",
		/** 这里是ff的调用注释 */
		ff: {
			url: "/path/do/something/ff",
			method: "post",
			/** 默认数据 */
			defaultData: {
				username: "k",
			},
			/** 自定义header */
			headers: {
				"Content-Type": "application/json",
			},
			/** 是否异步 */
			async: true,
			/** 异步检查间隔，默认1秒 */
			spaceTimer: 1,
		},
	},
} as const;

interface ReturnResult<T> {
  success: boolean;
  data: T;
  msg: string;
}
const api = formatApis<ReturnResult<unknown>, typeof apis>(apis, {
	request: function (url: string, config: RequestSendConfig, axiosConfig: object) {
		const { method, data, headers = {} } = config;
		const requestFun = async (params = {}) => {
			/// 这里写你的函数主体，get/post等等
			return { params, method, data, headers, url, axiosConfig };
		};
		return requestFun();
	},
	postKey: ["send", "create", "update", "delete"],
});
api.cc.add();
api.cc.ff();
api.cc.ee();
```

## 更新备注

0.0.3 ---------- 2023-12-15 17:48:42  
更新内容: 将 postKey 转为正则进行匹配，就可以传\*

0.0.4 ---------- 2023-12-15 22:05:42  
getRequestList 数组优化，可以传递['getUserList','list']，在调用时 \*.list，但是接口尾部内容是 /getUserList
0.0.6 ---------- 2024/1/30 17:56:04  
更新内容: 去掉了checkAsync,感觉用不到，增加第三个参数requestConfig  
0.0.12 ---------- 3/26/2025, 3:34:16 PM  
更新内容: 增加了方法返回值类型说明