@clowder-ai/enterprise-workflow 0.0.0-stage → 0.1.0-alpha.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/README.en.md +38 -0
- package/README.md +19 -2
- package/assets/icon.svg +5 -0
- package/dist/LarkActionService.d.ts +117 -0
- package/dist/LarkActionService.d.ts.map +1 -0
- package/dist/LarkActionService.js +189 -0
- package/dist/LarkActionService.js.map +1 -0
- package/dist/LarkCliExecutor.d.ts +83 -0
- package/dist/LarkCliExecutor.d.ts.map +1 -0
- package/dist/LarkCliExecutor.js +180 -0
- package/dist/LarkCliExecutor.js.map +1 -0
- package/dist/WeComActionService.d.ts +75 -0
- package/dist/WeComActionService.d.ts.map +1 -0
- package/dist/WeComActionService.js +183 -0
- package/dist/WeComActionService.js.map +1 -0
- package/dist/WeComCliExecutor.d.ts +61 -0
- package/dist/WeComCliExecutor.d.ts.map +1 -0
- package/dist/WeComCliExecutor.js +136 -0
- package/dist/WeComCliExecutor.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/lark-types.d.ts +120 -0
- package/dist/lark-types.d.ts.map +1 -0
- package/dist/lark-types.js +18 -0
- package/dist/lark-types.js.map +1 -0
- package/dist/logger.d.ts +13 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +22 -0
- package/dist/logger.js.map +1 -0
- package/dist/plugin-entrypoint.d.ts +38 -0
- package/dist/plugin-entrypoint.d.ts.map +1 -0
- package/dist/plugin-entrypoint.js +180 -0
- package/dist/plugin-entrypoint.js.map +1 -0
- package/dist/wecom-types.d.ts +85 -0
- package/dist/wecom-types.d.ts.map +1 -0
- package/dist/wecom-types.js +8 -0
- package/dist/wecom-types.js.map +1 -0
- package/npm-shrinkwrap.json +687 -0
- package/package.json +59 -4
- package/plugin.yaml +220 -0
- package/skills/enterprise-workflow/SKILL.md +209 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LarkCliExecutor.js","sourceRoot":"","sources":["../src/LarkCliExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* F162: WeChat Work Action Service.
|
|
3
|
+
*
|
|
4
|
+
* Typed methods for enterprise operations via wecom-cli.
|
|
5
|
+
* This is the governance boundary (ADR-029): audit log, error normalization.
|
|
6
|
+
* All cat-facing enterprise actions go through here — never raw CLI calls.
|
|
7
|
+
*
|
|
8
|
+
* ADR-029 Core Principle: ActionService is required for all external tool actions.
|
|
9
|
+
*/
|
|
10
|
+
import { WeComCliExecutor } from './WeComCliExecutor.js';
|
|
11
|
+
import type { EnterpriseLogger } from './logger.js';
|
|
12
|
+
import type { DocHandle, GoldenChainResult, MeetingHandle, TodoHandle } from './wecom-types.js';
|
|
13
|
+
export interface CreateDocOpts {
|
|
14
|
+
docName: string;
|
|
15
|
+
/** Markdown content to write after creation */
|
|
16
|
+
content?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface CreateSmartTableOpts {
|
|
19
|
+
tableName: string;
|
|
20
|
+
fields: Array<{
|
|
21
|
+
fieldTitle: string;
|
|
22
|
+
fieldType: string;
|
|
23
|
+
}>;
|
|
24
|
+
records: Array<Record<string, unknown>>;
|
|
25
|
+
}
|
|
26
|
+
export interface CreateTodoOpts {
|
|
27
|
+
content: string;
|
|
28
|
+
followerUserIds: string[];
|
|
29
|
+
/** ISO datetime string for reminder, e.g. "2026-04-20 09:00:00" */
|
|
30
|
+
remindTime?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface CreateMeetingOpts {
|
|
33
|
+
title: string;
|
|
34
|
+
/** ISO datetime string, e.g. "2026-04-20 14:00" */
|
|
35
|
+
startDatetime: string;
|
|
36
|
+
/** Duration in seconds */
|
|
37
|
+
durationSeconds: number;
|
|
38
|
+
inviteeUserIds: string[];
|
|
39
|
+
}
|
|
40
|
+
export interface GoldenChainOpts {
|
|
41
|
+
docName: string;
|
|
42
|
+
docContent: string;
|
|
43
|
+
tableName: string;
|
|
44
|
+
tasks: Array<{
|
|
45
|
+
content: string;
|
|
46
|
+
assigneeUserId: string;
|
|
47
|
+
remindTime?: string;
|
|
48
|
+
}>;
|
|
49
|
+
meetingTitle: string;
|
|
50
|
+
meetingStart: string;
|
|
51
|
+
meetingDurationSeconds: number;
|
|
52
|
+
meetingInviteeUserIds: string[];
|
|
53
|
+
}
|
|
54
|
+
export declare class WeComActionService {
|
|
55
|
+
private readonly executor;
|
|
56
|
+
private readonly log;
|
|
57
|
+
constructor(executor: WeComCliExecutor, log: EnterpriseLogger);
|
|
58
|
+
isAvailable(): Promise<boolean>;
|
|
59
|
+
createDoc(opts: CreateDocOpts): Promise<DocHandle>;
|
|
60
|
+
createSmartTable(opts: CreateSmartTableOpts): Promise<DocHandle>;
|
|
61
|
+
createTodo(opts: CreateTodoOpts): Promise<TodoHandle>;
|
|
62
|
+
createMeeting(opts: CreateMeetingOpts): Promise<MeetingHandle>;
|
|
63
|
+
getUserList(): Promise<Array<{
|
|
64
|
+
userId: string;
|
|
65
|
+
name: string;
|
|
66
|
+
alias?: string;
|
|
67
|
+
}>>;
|
|
68
|
+
/**
|
|
69
|
+
* Golden Chain: One sentence → Doc + Smart Table + Todos + Meeting.
|
|
70
|
+
* This is the F162 showcase — all 4 operations in sequence.
|
|
71
|
+
*/
|
|
72
|
+
goldenChain(opts: GoldenChainOpts): Promise<GoldenChainResult>;
|
|
73
|
+
private audit;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=WeComActionService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WeComActionService.d.ts","sourceRoot":"","sources":["../src/WeComActionService.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EACV,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,UAAU,EASX,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,aAAa,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/E,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,qBAAqB,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAmB;gBAE3B,QAAQ,EAAE,gBAAgB,EAAE,GAAG,EAAE,gBAAgB;IAKvD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC;IAgBlD,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,SAAS,CAAC;IA+DhE,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC;IAUrD,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC;IAgB9D,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAMrF;;;OAGG;IACG,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAqDpE,OAAO,CAAC,KAAK;CAGd"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* F162: WeChat Work Action Service.
|
|
3
|
+
*
|
|
4
|
+
* Typed methods for enterprise operations via wecom-cli.
|
|
5
|
+
* This is the governance boundary (ADR-029): audit log, error normalization.
|
|
6
|
+
* All cat-facing enterprise actions go through here — never raw CLI calls.
|
|
7
|
+
*
|
|
8
|
+
* ADR-029 Core Principle: ActionService is required for all external tool actions.
|
|
9
|
+
*/
|
|
10
|
+
export class WeComActionService {
|
|
11
|
+
executor;
|
|
12
|
+
log;
|
|
13
|
+
constructor(executor, log) {
|
|
14
|
+
this.executor = executor;
|
|
15
|
+
this.log = log;
|
|
16
|
+
}
|
|
17
|
+
async isAvailable() {
|
|
18
|
+
return this.executor.isAvailable();
|
|
19
|
+
}
|
|
20
|
+
async createDoc(opts) {
|
|
21
|
+
this.audit('createDoc', opts);
|
|
22
|
+
const res = await this.executor.exec('doc', 'create_doc', {
|
|
23
|
+
doc_type: 3, // Markdown document
|
|
24
|
+
doc_name: opts.docName,
|
|
25
|
+
});
|
|
26
|
+
if (opts.content) {
|
|
27
|
+
await this.executor.exec('doc', 'edit_doc_content', {
|
|
28
|
+
docid: res.docid,
|
|
29
|
+
content: opts.content,
|
|
30
|
+
content_type: 1, // Markdown
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return { docId: res.docid, url: res.url, docName: opts.docName };
|
|
34
|
+
}
|
|
35
|
+
async createSmartTable(opts) {
|
|
36
|
+
this.audit('createSmartTable', opts);
|
|
37
|
+
// Step 1: Create smart table document (comes with default sheet + one default field "文本")
|
|
38
|
+
const res = await this.executor.exec('doc', 'create_doc', {
|
|
39
|
+
doc_type: 10,
|
|
40
|
+
doc_name: opts.tableName,
|
|
41
|
+
});
|
|
42
|
+
if (opts.fields.length > 0) {
|
|
43
|
+
// Step 2: Get default sheet ID
|
|
44
|
+
const sheets = await this.executor.exec('doc', 'smartsheet_get_sheet', {
|
|
45
|
+
docid: res.docid,
|
|
46
|
+
});
|
|
47
|
+
const sheetId = sheets.sheet_list[0]?.sheet_id;
|
|
48
|
+
if (!sheetId) {
|
|
49
|
+
throw new Error(`Smart table "${opts.tableName}" created (docid=${res.docid}) but API returned no default sheet`);
|
|
50
|
+
}
|
|
51
|
+
// Step 3: Get default field ID, rename it to first user field (avoids orphan "文本" column)
|
|
52
|
+
const existingFields = await this.executor.exec('doc', 'smartsheet_get_fields', { docid: res.docid, sheet_id: sheetId });
|
|
53
|
+
const defaultFieldId = existingFields.fields[0]?.field_id;
|
|
54
|
+
const [firstField, ...remainingFields] = opts.fields;
|
|
55
|
+
if (defaultFieldId && firstField) {
|
|
56
|
+
await this.executor.exec('doc', 'smartsheet_update_fields', {
|
|
57
|
+
docid: res.docid,
|
|
58
|
+
sheet_id: sheetId,
|
|
59
|
+
fields: [{ field_id: defaultFieldId, field_title: firstField.fieldTitle, field_type: firstField.fieldType }],
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
// Step 4: Add remaining fields
|
|
63
|
+
if (remainingFields.length > 0) {
|
|
64
|
+
await this.executor.exec('doc', 'smartsheet_add_fields', {
|
|
65
|
+
docid: res.docid,
|
|
66
|
+
sheet_id: sheetId,
|
|
67
|
+
fields: remainingFields.map((f) => ({ field_title: f.fieldTitle, field_type: f.fieldType })),
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
// Step 5: Add records (convert plain values to API-specific formats per field type)
|
|
71
|
+
if (opts.records.length > 0) {
|
|
72
|
+
const fieldTypeMap = new Map(opts.fields.map((f) => [f.fieldTitle, f.fieldType]));
|
|
73
|
+
await this.executor.exec('doc', 'smartsheet_add_records', {
|
|
74
|
+
docid: res.docid,
|
|
75
|
+
sheet_id: sheetId,
|
|
76
|
+
records: opts.records.map((r) => ({
|
|
77
|
+
values: Object.fromEntries(Object.entries(r).map(([key, val]) => [key, toCellValue(fieldTypeMap.get(key), val)])),
|
|
78
|
+
})),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return { docId: res.docid, url: res.url, docName: opts.tableName };
|
|
83
|
+
}
|
|
84
|
+
async createTodo(opts) {
|
|
85
|
+
this.audit('createTodo', opts);
|
|
86
|
+
const res = await this.executor.exec('todo', 'create_todo', {
|
|
87
|
+
content: opts.content,
|
|
88
|
+
follower_list: { followers: opts.followerUserIds.map((id) => ({ follower_id: id })) },
|
|
89
|
+
...(opts.remindTime ? { remind_time: opts.remindTime } : {}),
|
|
90
|
+
});
|
|
91
|
+
return { todoId: res.todo_id, content: opts.content };
|
|
92
|
+
}
|
|
93
|
+
async createMeeting(opts) {
|
|
94
|
+
this.audit('createMeeting', opts);
|
|
95
|
+
const res = await this.executor.exec('meeting', 'create_meeting', {
|
|
96
|
+
title: opts.title,
|
|
97
|
+
meeting_start_datetime: opts.startDatetime,
|
|
98
|
+
meeting_duration: opts.durationSeconds,
|
|
99
|
+
invitees: { userid: opts.inviteeUserIds },
|
|
100
|
+
});
|
|
101
|
+
return {
|
|
102
|
+
meetingId: res.meetingid,
|
|
103
|
+
meetingCode: res.meeting_code,
|
|
104
|
+
meetingLink: res.meeting_link,
|
|
105
|
+
title: opts.title,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
async getUserList() {
|
|
109
|
+
this.audit('getUserList', {});
|
|
110
|
+
const res = await this.executor.exec('contact', 'get_userlist', {});
|
|
111
|
+
return res.userlist.map((u) => ({ userId: u.userid, name: u.name, alias: u.alias }));
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Golden Chain: One sentence → Doc + Smart Table + Todos + Meeting.
|
|
115
|
+
* This is the F162 showcase — all 4 operations in sequence.
|
|
116
|
+
*/
|
|
117
|
+
async goldenChain(opts) {
|
|
118
|
+
this.audit('goldenChain', { docName: opts.docName, taskCount: opts.tasks.length });
|
|
119
|
+
// Step 1: Create document with content
|
|
120
|
+
const doc = await this.createDoc({ docName: opts.docName, content: opts.docContent });
|
|
121
|
+
// Step 2: Create smart table with task breakdown
|
|
122
|
+
const smartTable = await this.createSmartTable({
|
|
123
|
+
tableName: opts.tableName,
|
|
124
|
+
fields: [
|
|
125
|
+
{ fieldTitle: '任务', fieldType: 'FIELD_TYPE_TEXT' },
|
|
126
|
+
{ fieldTitle: '负责人', fieldType: 'FIELD_TYPE_TEXT' },
|
|
127
|
+
{ fieldTitle: '截止时间', fieldType: 'FIELD_TYPE_DATE_TIME' },
|
|
128
|
+
{ fieldTitle: '状态', fieldType: 'FIELD_TYPE_SINGLE_SELECT' },
|
|
129
|
+
],
|
|
130
|
+
records: opts.tasks.map((t) => ({
|
|
131
|
+
任务: t.content,
|
|
132
|
+
负责人: t.assigneeUserId,
|
|
133
|
+
截止时间: t.remindTime ?? '',
|
|
134
|
+
状态: '待处理',
|
|
135
|
+
})),
|
|
136
|
+
});
|
|
137
|
+
// Step 3: Create todos for each person (sequential — each needs its own API call)
|
|
138
|
+
const todos = [];
|
|
139
|
+
for (const task of opts.tasks) {
|
|
140
|
+
todos.push(await this.createTodo({
|
|
141
|
+
content: task.content,
|
|
142
|
+
followerUserIds: [task.assigneeUserId],
|
|
143
|
+
remindTime: task.remindTime,
|
|
144
|
+
}));
|
|
145
|
+
}
|
|
146
|
+
// Step 4: Create meeting
|
|
147
|
+
const meeting = await this.createMeeting({
|
|
148
|
+
title: opts.meetingTitle,
|
|
149
|
+
startDatetime: opts.meetingStart,
|
|
150
|
+
durationSeconds: opts.meetingDurationSeconds,
|
|
151
|
+
inviteeUserIds: opts.meetingInviteeUserIds,
|
|
152
|
+
});
|
|
153
|
+
const summary = [
|
|
154
|
+
`📄 文档: ${doc.docName} — ${doc.url}`,
|
|
155
|
+
`📊 表格: ${smartTable.docName} — ${smartTable.url}`,
|
|
156
|
+
`✅ 待办: ${todos.length} 条已分发`,
|
|
157
|
+
`🎥 会议: ${meeting.title} — ${meeting.meetingLink}`,
|
|
158
|
+
].join('\n');
|
|
159
|
+
return { doc, smartTable, todos, meeting, summary };
|
|
160
|
+
}
|
|
161
|
+
audit(method, params) {
|
|
162
|
+
this.log.info({ service: 'WeComAction', method, params }, '[WeComAction] audit');
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Convert a plain record value to the format expected by wecom-cli smartsheet API.
|
|
167
|
+
* - FIELD_TYPE_TEXT → CellTextValue[]: [{text, type: "text"}]
|
|
168
|
+
* - FIELD_TYPE_SINGLE_SELECT → Option[]: [{text}]
|
|
169
|
+
* - Other types (DATE_TIME, NUMBER, etc.) → pass through as-is
|
|
170
|
+
*/
|
|
171
|
+
function toCellValue(fieldType, value) {
|
|
172
|
+
if (typeof value !== 'string' || !value)
|
|
173
|
+
return value;
|
|
174
|
+
switch (fieldType) {
|
|
175
|
+
case 'FIELD_TYPE_TEXT':
|
|
176
|
+
return [{ text: value, type: 'text' }];
|
|
177
|
+
case 'FIELD_TYPE_SINGLE_SELECT':
|
|
178
|
+
return [{ text: value }];
|
|
179
|
+
default:
|
|
180
|
+
return value;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=WeComActionService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WeComActionService.js","sourceRoot":"","sources":["../src/WeComActionService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* F162: WeChat Work CLI Executor.
|
|
3
|
+
*
|
|
4
|
+
* Thin wrapper around `wecom-cli` (Rust binary distributed via npm).
|
|
5
|
+
* Handles JSON output parsing, timeout, error classification.
|
|
6
|
+
* Modeled after PandocService's execFile pattern (not cli-spawn.ts — that's for
|
|
7
|
+
* long-running agent processes with NDJSON streaming).
|
|
8
|
+
*
|
|
9
|
+
* ADR-029 Decision 1: CliExecutor is the execution backend for WeComActionService.
|
|
10
|
+
*/
|
|
11
|
+
import type { EnterpriseLogger } from './logger.js';
|
|
12
|
+
import type { WeComBaseResponse } from './wecom-types.js';
|
|
13
|
+
interface ExecFileResult {
|
|
14
|
+
readonly stdout: string;
|
|
15
|
+
readonly stderr: string;
|
|
16
|
+
}
|
|
17
|
+
type ExecFileRunner = (executable: string, args: readonly string[], options: Readonly<Record<string, unknown>>) => Promise<ExecFileResult>;
|
|
18
|
+
/** Thrown when wecom-cli returns errcode !== 0 */
|
|
19
|
+
export declare class WeComApiError extends Error {
|
|
20
|
+
readonly errcode: number;
|
|
21
|
+
readonly errmsg: string;
|
|
22
|
+
readonly category: string;
|
|
23
|
+
readonly method: string;
|
|
24
|
+
constructor(errcode: number, errmsg: string, category: string, method: string);
|
|
25
|
+
}
|
|
26
|
+
/** Thrown when wecom-cli itself fails (not installed, timeout, crash) */
|
|
27
|
+
export declare class WeComCliUnavailableError extends Error {
|
|
28
|
+
readonly reason?: unknown;
|
|
29
|
+
constructor(message: string, reason?: unknown);
|
|
30
|
+
}
|
|
31
|
+
export declare class WeComCliExecutor {
|
|
32
|
+
private available;
|
|
33
|
+
private readonly log;
|
|
34
|
+
private readonly executable;
|
|
35
|
+
private readonly timeoutMs;
|
|
36
|
+
private readonly run;
|
|
37
|
+
constructor(log: EnterpriseLogger, executable: string, timeoutMs?: number, run?: ExecFileRunner);
|
|
38
|
+
/** Check if wecom-cli is available. Result is cached after first check. */
|
|
39
|
+
isAvailable(): Promise<boolean>;
|
|
40
|
+
/**
|
|
41
|
+
* Execute a wecom-cli command and parse JSON response.
|
|
42
|
+
*
|
|
43
|
+
* @param category - Command category (doc, todo, meeting, contact, etc.)
|
|
44
|
+
* @param method - Method name (create_doc, create_todo, etc.)
|
|
45
|
+
* @param params - JSON parameters to pass to the command
|
|
46
|
+
* @returns Parsed response (with errcode === 0 guaranteed)
|
|
47
|
+
* @throws WeComApiError if errcode !== 0
|
|
48
|
+
* @throws WeComCliUnavailableError if CLI is missing or crashes
|
|
49
|
+
*/
|
|
50
|
+
exec<T extends WeComBaseResponse>(category: string, method: string, params: Record<string, unknown>): Promise<T>;
|
|
51
|
+
/**
|
|
52
|
+
* Unwrap wecom-cli output. The CLI returns MCP-style content wrapper:
|
|
53
|
+
* `{"content":[{"text":"{...actual JSON...}","type":"text"}],"isError":false}`
|
|
54
|
+
* This method handles both wrapped and raw JSON formats.
|
|
55
|
+
*/
|
|
56
|
+
private unwrapOutput;
|
|
57
|
+
/** Reset cached availability (for testing) */
|
|
58
|
+
_resetCache(): void;
|
|
59
|
+
}
|
|
60
|
+
export {};
|
|
61
|
+
//# sourceMappingURL=WeComCliExecutor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WeComCliExecutor.d.ts","sourceRoot":"","sources":["../src/WeComCliExecutor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,UAAU,cAAc;IAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAC7E,KAAK,cAAc,GAAG,CACpB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KACvC,OAAO,CAAC,cAAc,CAAC,CAAC;AAM7B,kDAAkD;AAClD,qBAAa,aAAc,SAAQ,KAAK;aAEpB,OAAO,EAAE,MAAM;aACf,MAAM,EAAE,MAAM;aACd,QAAQ,EAAE,MAAM;aAChB,MAAM,EAAE,MAAM;gBAHd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM;CAKjC;AAED,yEAAyE;AACzE,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,SAAgB,MAAM,CAAC,EAAE,OAAO,CAAC;gBAErB,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO;CAK9C;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAmB;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAiB;gBAGnC,GAAG,EAAE,gBAAgB,EACrB,UAAU,EAAE,MAAM,EAClB,SAAS,SAAqB,EAC9B,GAAG,GAAE,cAA8B;IAQrC,2EAA2E;IACrE,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAarC;;;;;;;;;OASG;IACG,IAAI,CAAC,CAAC,SAAS,iBAAiB,EACpC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,CAAC,CAAC;IA4Cb;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAepB,8CAA8C;IAC9C,WAAW,IAAI,IAAI;CAGpB"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* F162: WeChat Work CLI Executor.
|
|
3
|
+
*
|
|
4
|
+
* Thin wrapper around `wecom-cli` (Rust binary distributed via npm).
|
|
5
|
+
* Handles JSON output parsing, timeout, error classification.
|
|
6
|
+
* Modeled after PandocService's execFile pattern (not cli-spawn.ts — that's for
|
|
7
|
+
* long-running agent processes with NDJSON streaming).
|
|
8
|
+
*
|
|
9
|
+
* ADR-029 Decision 1: CliExecutor is the execution backend for WeComActionService.
|
|
10
|
+
*/
|
|
11
|
+
import { execFile } from 'node:child_process';
|
|
12
|
+
import { promisify } from 'node:util';
|
|
13
|
+
const execFileAsync = promisify(execFile);
|
|
14
|
+
/** Default timeout for wecom-cli commands (30 seconds, matching upstream default) */
|
|
15
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
16
|
+
/** Thrown when wecom-cli returns errcode !== 0 */
|
|
17
|
+
export class WeComApiError extends Error {
|
|
18
|
+
errcode;
|
|
19
|
+
errmsg;
|
|
20
|
+
category;
|
|
21
|
+
method;
|
|
22
|
+
constructor(errcode, errmsg, category, method) {
|
|
23
|
+
super(`WeChat Work API error [${errcode}]: ${errmsg} (${category}.${method})`);
|
|
24
|
+
this.errcode = errcode;
|
|
25
|
+
this.errmsg = errmsg;
|
|
26
|
+
this.category = category;
|
|
27
|
+
this.method = method;
|
|
28
|
+
this.name = 'WeComApiError';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** Thrown when wecom-cli itself fails (not installed, timeout, crash) */
|
|
32
|
+
export class WeComCliUnavailableError extends Error {
|
|
33
|
+
reason;
|
|
34
|
+
constructor(message, reason) {
|
|
35
|
+
super(message);
|
|
36
|
+
this.name = 'WeComCliUnavailableError';
|
|
37
|
+
this.reason = reason;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export class WeComCliExecutor {
|
|
41
|
+
available = null;
|
|
42
|
+
log;
|
|
43
|
+
executable;
|
|
44
|
+
timeoutMs;
|
|
45
|
+
run;
|
|
46
|
+
constructor(log, executable, timeoutMs = DEFAULT_TIMEOUT_MS, run = execFileAsync) {
|
|
47
|
+
this.log = log;
|
|
48
|
+
this.executable = executable;
|
|
49
|
+
this.timeoutMs = timeoutMs;
|
|
50
|
+
this.run = run;
|
|
51
|
+
}
|
|
52
|
+
/** Check if wecom-cli is available. Result is cached after first check. */
|
|
53
|
+
async isAvailable() {
|
|
54
|
+
if (this.available !== null)
|
|
55
|
+
return this.available;
|
|
56
|
+
try {
|
|
57
|
+
const { stdout } = await this.run(this.executable, ['--version'], { timeout: 5_000 });
|
|
58
|
+
this.log.info({ version: stdout.trim() }, '[WeComCli] wecom-cli detected');
|
|
59
|
+
this.available = true;
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
this.log.warn('[WeComCli] wecom-cli not found — enterprise actions will be unavailable');
|
|
63
|
+
this.available = false;
|
|
64
|
+
}
|
|
65
|
+
return this.available;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Execute a wecom-cli command and parse JSON response.
|
|
69
|
+
*
|
|
70
|
+
* @param category - Command category (doc, todo, meeting, contact, etc.)
|
|
71
|
+
* @param method - Method name (create_doc, create_todo, etc.)
|
|
72
|
+
* @param params - JSON parameters to pass to the command
|
|
73
|
+
* @returns Parsed response (with errcode === 0 guaranteed)
|
|
74
|
+
* @throws WeComApiError if errcode !== 0
|
|
75
|
+
* @throws WeComCliUnavailableError if CLI is missing or crashes
|
|
76
|
+
*/
|
|
77
|
+
async exec(category, method, params) {
|
|
78
|
+
const available = await this.isAvailable();
|
|
79
|
+
if (!available) {
|
|
80
|
+
throw new WeComCliUnavailableError('wecom-cli is not installed or not configured');
|
|
81
|
+
}
|
|
82
|
+
const jsonParams = JSON.stringify(params);
|
|
83
|
+
const args = [category, method, jsonParams];
|
|
84
|
+
this.log.info({ category, method, params }, '[WeComCli] exec');
|
|
85
|
+
try {
|
|
86
|
+
const { stdout, stderr } = await this.run(this.executable, args, {
|
|
87
|
+
timeout: this.timeoutMs,
|
|
88
|
+
maxBuffer: 5 * 1024 * 1024, // 5MB for large responses (user lists)
|
|
89
|
+
});
|
|
90
|
+
if (stderr.trim()) {
|
|
91
|
+
this.log.debug({ category, method, stderr: stderr.trim() }, '[WeComCli] stderr');
|
|
92
|
+
}
|
|
93
|
+
const parsed = this.unwrapOutput(stdout.trim());
|
|
94
|
+
if (parsed.errcode !== 0) {
|
|
95
|
+
throw new WeComApiError(parsed.errcode, parsed.errmsg, category, method);
|
|
96
|
+
}
|
|
97
|
+
this.log.info({ category, method, errcode: parsed.errcode }, '[WeComCli] success');
|
|
98
|
+
return parsed;
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
if (err instanceof WeComApiError)
|
|
102
|
+
throw err;
|
|
103
|
+
const error = err;
|
|
104
|
+
if (error.killed) {
|
|
105
|
+
throw new WeComCliUnavailableError(`wecom-cli timed out after ${this.timeoutMs}ms`, err);
|
|
106
|
+
}
|
|
107
|
+
if (error.code === 'ENOENT') {
|
|
108
|
+
this.available = false;
|
|
109
|
+
throw new WeComCliUnavailableError('wecom-cli binary not found', err);
|
|
110
|
+
}
|
|
111
|
+
throw new WeComCliUnavailableError(`wecom-cli execution failed: ${error.message}`, err);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Unwrap wecom-cli output. The CLI returns MCP-style content wrapper:
|
|
116
|
+
* `{"content":[{"text":"{...actual JSON...}","type":"text"}],"isError":false}`
|
|
117
|
+
* This method handles both wrapped and raw JSON formats.
|
|
118
|
+
*/
|
|
119
|
+
unwrapOutput(raw) {
|
|
120
|
+
const outer = JSON.parse(raw);
|
|
121
|
+
// MCP content wrapper: extract text from content[0].text
|
|
122
|
+
if (Array.isArray(outer.content) && outer.content.length > 0) {
|
|
123
|
+
const first = outer.content[0];
|
|
124
|
+
if (first.text && first.type === 'text') {
|
|
125
|
+
return JSON.parse(first.text);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Raw JSON (no wrapper) — return as-is
|
|
129
|
+
return outer;
|
|
130
|
+
}
|
|
131
|
+
/** Reset cached availability (for testing) */
|
|
132
|
+
_resetCache() {
|
|
133
|
+
this.available = null;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=WeComCliExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WeComCliExecutor.js","sourceRoot":"","sources":["../src/WeComCliExecutor.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { createEnterpriseWorkflowPluginModule, EnterpriseToolError, type EnterpriseToolErrorCode, type EnterpriseWorkflowPluginModuleOptions, type LarkActions, type WeComActions, } from './plugin-entrypoint.js';
|
|
2
|
+
export { LarkActionService, type CreateBaseOpts as LarkCreateBaseOpts, type CreateCalendarEventOpts as LarkCreateCalendarEventOpts, type CreateDocOpts as LarkCreateDocOpts, type CreateSlidesOpts as LarkCreateSlidesOpts, type CreateTaskOpts as LarkCreateTaskOpts, type GoldenChainOpts as LarkGoldenChainOpts, } from './LarkActionService.js';
|
|
3
|
+
export * from './LarkCliExecutor.js';
|
|
4
|
+
export { WeComActionService, type CreateDocOpts as WeComCreateDocOpts, type CreateMeetingOpts as WeComCreateMeetingOpts, type CreateSmartTableOpts as WeComCreateSmartTableOpts, type CreateTodoOpts as WeComCreateTodoOpts, type GoldenChainOpts as WeComGoldenChainOpts, } from './WeComActionService.js';
|
|
5
|
+
export * from './WeComCliExecutor.js';
|
|
6
|
+
export * from './lark-types.js';
|
|
7
|
+
export * from './wecom-types.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oCAAoC,EACpC,mBAAmB,EACnB,KAAK,uBAAuB,EAC5B,KAAK,qCAAqC,EAC1C,KAAK,WAAW,EAChB,KAAK,YAAY,GAClB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,iBAAiB,EACjB,KAAK,cAAc,IAAI,kBAAkB,EACzC,KAAK,uBAAuB,IAAI,2BAA2B,EAC3D,KAAK,aAAa,IAAI,iBAAiB,EACvC,KAAK,gBAAgB,IAAI,oBAAoB,EAC7C,KAAK,cAAc,IAAI,kBAAkB,EACzC,KAAK,eAAe,IAAI,mBAAmB,GAC5C,MAAM,wBAAwB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,OAAO,EACL,kBAAkB,EAClB,KAAK,aAAa,IAAI,kBAAkB,EACxC,KAAK,iBAAiB,IAAI,sBAAsB,EAChD,KAAK,oBAAoB,IAAI,yBAAyB,EACtD,KAAK,cAAc,IAAI,mBAAmB,EAC1C,KAAK,eAAe,IAAI,oBAAoB,GAC7C,MAAM,yBAAyB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { createEnterpriseWorkflowPluginModule, EnterpriseToolError, } from './plugin-entrypoint.js';
|
|
2
|
+
export { LarkActionService, } from './LarkActionService.js';
|
|
3
|
+
export * from './LarkCliExecutor.js';
|
|
4
|
+
export { WeComActionService, } from './WeComActionService.js';
|
|
5
|
+
export * from './WeComCliExecutor.js';
|
|
6
|
+
export * from './lark-types.js';
|
|
7
|
+
export * from './wecom-types.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oCAAoC,EACpC,mBAAmB,GAKpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,iBAAiB,GAOlB,MAAM,wBAAwB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,OAAO,EACL,kBAAkB,GAMnB,MAAM,yBAAyB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* F162 Phase B: Lark/Feishu CLI type definitions.
|
|
3
|
+
*
|
|
4
|
+
* lark-cli is a Go-based CLI (@larksuite/cli). Output is raw JSON.
|
|
5
|
+
*
|
|
6
|
+
* Envelope (observed 2026-04-17 against v1.x user-token flow):
|
|
7
|
+
* success: { ok: true, identity: "user"|"bot", data: { ... } }
|
|
8
|
+
* failure: { ok: false, identity: "user"|"bot", error: { type, code, message, hint } }
|
|
9
|
+
*
|
|
10
|
+
* The CLI itself always exits 0; successful vs failed API calls are distinguished
|
|
11
|
+
* solely by the `ok` field in the JSON envelope.
|
|
12
|
+
*
|
|
13
|
+
* NOTE: lark-cli returns *flattened* fields under `data` (e.g. `doc_id`, `doc_url`),
|
|
14
|
+
* not the Lark Open API nested shape (`document.document_id`). Keep types aligned
|
|
15
|
+
* with the CLI's output — that's what we actually consume.
|
|
16
|
+
*/
|
|
17
|
+
/** Error detail included when ok=false */
|
|
18
|
+
export interface LarkCliErrorDetail {
|
|
19
|
+
type: string;
|
|
20
|
+
code: number;
|
|
21
|
+
message: string;
|
|
22
|
+
hint?: string;
|
|
23
|
+
}
|
|
24
|
+
/** Base envelope from lark-cli */
|
|
25
|
+
export interface LarkBaseResponse {
|
|
26
|
+
ok: boolean;
|
|
27
|
+
identity?: 'user' | 'bot';
|
|
28
|
+
data?: unknown;
|
|
29
|
+
error?: LarkCliErrorDetail;
|
|
30
|
+
}
|
|
31
|
+
/** lark-cli docs +create */
|
|
32
|
+
export interface LarkDocsCreateResponse extends LarkBaseResponse {
|
|
33
|
+
data?: {
|
|
34
|
+
doc_id: string;
|
|
35
|
+
doc_url: string;
|
|
36
|
+
log_id?: string;
|
|
37
|
+
message?: string;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** lark-cli base +base-create */
|
|
41
|
+
export interface LarkBaseCreateResponse extends LarkBaseResponse {
|
|
42
|
+
data?: {
|
|
43
|
+
base?: {
|
|
44
|
+
base_token: string;
|
|
45
|
+
name: string;
|
|
46
|
+
url: string;
|
|
47
|
+
folder_token?: string;
|
|
48
|
+
};
|
|
49
|
+
created?: boolean;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/** lark-cli task +create */
|
|
53
|
+
export interface LarkTaskCreateResponse extends LarkBaseResponse {
|
|
54
|
+
data?: {
|
|
55
|
+
guid: string;
|
|
56
|
+
url?: string;
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/** lark-cli calendar +create */
|
|
60
|
+
export interface LarkCalendarCreateResponse extends LarkBaseResponse {
|
|
61
|
+
data?: {
|
|
62
|
+
event_id: string;
|
|
63
|
+
summary?: string;
|
|
64
|
+
start?: string;
|
|
65
|
+
end?: string;
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/** lark-cli slides +create */
|
|
69
|
+
export interface LarkSlidesCreateResponse extends LarkBaseResponse {
|
|
70
|
+
data?: {
|
|
71
|
+
xml_presentation_id: string;
|
|
72
|
+
title?: string;
|
|
73
|
+
url?: string;
|
|
74
|
+
revision_id?: number;
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/** lark-cli contact +search-user (shape best-effort; gated by tenant scope) */
|
|
78
|
+
export interface LarkContactSearchResponse extends LarkBaseResponse {
|
|
79
|
+
data?: {
|
|
80
|
+
users?: Array<{
|
|
81
|
+
open_id: string;
|
|
82
|
+
name: string;
|
|
83
|
+
email?: string;
|
|
84
|
+
user_id?: string;
|
|
85
|
+
}>;
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
export interface LarkDocHandle {
|
|
89
|
+
documentId: string;
|
|
90
|
+
url: string;
|
|
91
|
+
title: string;
|
|
92
|
+
}
|
|
93
|
+
export interface LarkBaseHandle {
|
|
94
|
+
appToken: string;
|
|
95
|
+
url: string;
|
|
96
|
+
name: string;
|
|
97
|
+
}
|
|
98
|
+
export interface LarkTaskHandle {
|
|
99
|
+
guid: string;
|
|
100
|
+
summary: string;
|
|
101
|
+
url?: string;
|
|
102
|
+
}
|
|
103
|
+
export interface LarkCalendarEventHandle {
|
|
104
|
+
eventId: string;
|
|
105
|
+
calendarId: string;
|
|
106
|
+
summary: string;
|
|
107
|
+
}
|
|
108
|
+
export interface LarkSlideHandle {
|
|
109
|
+
presentationId: string;
|
|
110
|
+
url: string;
|
|
111
|
+
title: string;
|
|
112
|
+
}
|
|
113
|
+
export interface LarkGoldenChainResult {
|
|
114
|
+
doc: LarkDocHandle;
|
|
115
|
+
base: LarkBaseHandle;
|
|
116
|
+
tasks: LarkTaskHandle[];
|
|
117
|
+
calendarEvent: LarkCalendarEventHandle;
|
|
118
|
+
summary: string;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=lark-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lark-types.d.ts","sourceRoot":"","sources":["../src/lark-types.ts"],"names":[],"mappings":"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"}
|