@pachca/cli 2026.5.3 → 2026.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/README.md +2 -1
- package/README.template.md +1 -1
- package/dist/api-introspect.js +1 -1
- package/dist/commands/threads/list.js +102 -0
- package/dist/data/alternatives.json +1 -0
- package/dist/data/changelog.json +11 -0
- package/dist/data/endpoints.json +1 -1
- package/dist/data/workflows.json +15 -0
- package/oclif.manifest.json +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026.5.4 (20 мая 2026)
|
|
4
|
+
|
|
5
|
+
- **Добавлено** (threads list): Новая команда — список доступных тредов с фильтрами `--last-message-at-after` / `--last-message-at-before` и курсорной пагинацией
|
|
6
|
+
|
|
3
7
|
## 2026.5.2 (17 мая 2026)
|
|
4
8
|
|
|
5
9
|
- **Добавлено** (users create): Параметр `--chat-ids` — добавить сотрудника в указанные чаты сразу при создании. Параметр `--role` теперь принимает значение `guest`: для роли `guest` нужно передать `--chat-ids` ровно с одним активным чатом, иначе API вернёт `400`
|
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
npm install -g @pachca/cli
|
|
9
9
|
|
|
10
10
|
# Или без установки:
|
|
11
|
-
npx @pachca/cli users list
|
|
11
|
+
npx -y @pachca/cli users list
|
|
12
12
|
```
|
|
13
13
|
|
|
14
14
|
## Быстрый старт
|
|
@@ -163,6 +163,7 @@ pachca guide # список всех сценариев
|
|
|
163
163
|
| Команда | Описание |
|
|
164
164
|
|---------|---------|
|
|
165
165
|
| `pachca threads add` | Новый тред |
|
|
166
|
+
| `pachca threads list` | Список тредов |
|
|
166
167
|
| `pachca threads get` | Информация о треде |
|
|
167
168
|
|
|
168
169
|
### profile
|
package/README.template.md
CHANGED
package/dist/api-introspect.js
CHANGED
|
@@ -20,7 +20,7 @@ export function buildListRows(entries) {
|
|
|
20
20
|
* Detect a self-documenting mode from raw argv (before this.parse()).
|
|
21
21
|
* `pachca api` already requires the method positionally, so
|
|
22
22
|
* `pachca api POST /messages --describe` is unambiguous by construction
|
|
23
|
-
* (no `-X
|
|
23
|
+
* (the HTTP method is a positional arg, so no `-X`-style flag is needed).
|
|
24
24
|
*/
|
|
25
25
|
export function detectIntrospectMode(argv) {
|
|
26
26
|
if (argv.includes('--describe'))
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// Auto-generated from openapi.yaml — DO NOT EDIT
|
|
2
|
+
import { Flags } from '@oclif/core';
|
|
3
|
+
import { BaseCommand } from '../../base-command.js';
|
|
4
|
+
export default class ThreadsList extends BaseCommand {
|
|
5
|
+
static description = "Список тредов";
|
|
6
|
+
static examples = [
|
|
7
|
+
"Получить список активных тредов за период:\n $ pachca threads list"
|
|
8
|
+
];
|
|
9
|
+
static scope = "threads:read";
|
|
10
|
+
static apiMethod = "GET";
|
|
11
|
+
static apiPath = "/threads";
|
|
12
|
+
static defaultColumns = ["id", "chat_id", "message_id", "message_chat_id", "updated_at"];
|
|
13
|
+
static args = {};
|
|
14
|
+
static flags = {
|
|
15
|
+
...BaseCommand.baseFlags,
|
|
16
|
+
'last-message-at-after': Flags.string({
|
|
17
|
+
description: "Фильтрация по времени последнего сообщения в треде. Будут возвращены только те треды, время последнего сообщения в которых не раньше чем указанное (в формате YYYY-MM-DDThh:mm:ss.sssZ).",
|
|
18
|
+
}),
|
|
19
|
+
'last-message-at-before': Flags.string({
|
|
20
|
+
description: "Фильтрация по времени последнего сообщения в треде. Будут возвращены только те треды, время последнего сообщения в которых не позже чем указанное (в формате YYYY-MM-DDThh:mm:ss.sssZ).",
|
|
21
|
+
}),
|
|
22
|
+
limit: Flags.integer({
|
|
23
|
+
description: 'Количество результатов на страницу',
|
|
24
|
+
}),
|
|
25
|
+
cursor: Flags.string({
|
|
26
|
+
description: 'Курсор для следующей страницы',
|
|
27
|
+
}),
|
|
28
|
+
all: Flags.boolean({
|
|
29
|
+
description: 'Загрузить все страницы автоматически',
|
|
30
|
+
default: false,
|
|
31
|
+
}),
|
|
32
|
+
};
|
|
33
|
+
async run() {
|
|
34
|
+
const { args, flags } = await this.parse(ThreadsList);
|
|
35
|
+
this.parsedFlags = flags;
|
|
36
|
+
if (flags.all) {
|
|
37
|
+
// Auto-pagination
|
|
38
|
+
const allData = [];
|
|
39
|
+
let nextCursor = undefined;
|
|
40
|
+
let pages = 0;
|
|
41
|
+
const seenCursors = new Set();
|
|
42
|
+
while (pages < 500) {
|
|
43
|
+
const query = {
|
|
44
|
+
'last_message_at_after': flags['last-message-at-after'],
|
|
45
|
+
'last_message_at_before': flags['last-message-at-before'],
|
|
46
|
+
limit: flags.limit,
|
|
47
|
+
cursor: nextCursor,
|
|
48
|
+
};
|
|
49
|
+
const response = await this.apiRequest({ method: 'GET', path: '/threads', query });
|
|
50
|
+
const body = response.data;
|
|
51
|
+
const items = body.data;
|
|
52
|
+
if (items)
|
|
53
|
+
allData.push(...items);
|
|
54
|
+
const meta = body.meta;
|
|
55
|
+
const paginate = meta?.paginate;
|
|
56
|
+
nextCursor = paginate?.next_page;
|
|
57
|
+
pages++;
|
|
58
|
+
// Условие конца: списочные методы — has_next === false; методы поиска и /users?query= (без has_next) — пустой data
|
|
59
|
+
const hasNext = paginate?.has_next;
|
|
60
|
+
if (typeof hasNext === 'boolean') {
|
|
61
|
+
if (!hasNext)
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
else if (!items || items.length === 0) {
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
if (process.stderr.isTTY) {
|
|
68
|
+
const total = paginate?.total;
|
|
69
|
+
const progress = total ? `${allData.length} / ${total}` : String(allData.length);
|
|
70
|
+
process.stderr.write(`\r Загружено: ${progress}...`);
|
|
71
|
+
}
|
|
72
|
+
if (!nextCursor)
|
|
73
|
+
break;
|
|
74
|
+
if (seenCursors.has(nextCursor)) {
|
|
75
|
+
process.stderr.write('\n⚠ Обнаружен цикл пагинации, остановка.\n');
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
seenCursors.add(nextCursor);
|
|
79
|
+
}
|
|
80
|
+
if (pages >= 500) {
|
|
81
|
+
process.stderr.write('\n⚠ Достигнут лимит 500 страниц.\n');
|
|
82
|
+
}
|
|
83
|
+
if (process.stderr.isTTY)
|
|
84
|
+
process.stderr.write('\n');
|
|
85
|
+
this.output(allData);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const { data } = await this.apiRequest({
|
|
89
|
+
method: 'GET',
|
|
90
|
+
path: '/threads',
|
|
91
|
+
query: {
|
|
92
|
+
'last_message_at_after': flags['last-message-at-after'],
|
|
93
|
+
'last_message_at_before': flags['last-message-at-before'],
|
|
94
|
+
limit: flags.limit,
|
|
95
|
+
cursor: flags.cursor,
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
const responseBody = data;
|
|
99
|
+
const items = responseBody.data ?? responseBody;
|
|
100
|
+
this.output(items);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -52,6 +52,7 @@
|
|
|
52
52
|
"tasks:get": "Информация о напоминании",
|
|
53
53
|
"tasks:update": "Редактирование напоминания",
|
|
54
54
|
"tasks:delete": "Удаление напоминания",
|
|
55
|
+
"threads:list": "Список тредов",
|
|
55
56
|
"threads:get": "Информация о треде",
|
|
56
57
|
"common:uploads": "Получение подписи, ключа и других параметров",
|
|
57
58
|
"users:create": "Создать сотрудника",
|
package/dist/data/changelog.json
CHANGED
|
@@ -1,4 +1,15 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"version": "2026.5.4",
|
|
4
|
+
"date": "20 мая 2026",
|
|
5
|
+
"changes": [
|
|
6
|
+
{
|
|
7
|
+
"type": "+",
|
|
8
|
+
"command": "threads list",
|
|
9
|
+
"description": "Новая команда — список доступных тредов с фильтрами `--last-message-at-after` / `--last-message-at-before` и курсорной пагинацией"
|
|
10
|
+
}
|
|
11
|
+
]
|
|
12
|
+
},
|
|
2
13
|
{
|
|
3
14
|
"version": "2026.5.2",
|
|
4
15
|
"date": "17 мая 2026",
|