@jiezhengj/subagent-oar-agy 0.2.8 → 0.3.0
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.md +45 -4
- package/docs/DETAIL.de.md +6 -0
- package/docs/DETAIL.en.md +6 -0
- package/docs/DETAIL.es.md +6 -0
- package/docs/DETAIL.fr.md +6 -0
- package/docs/DETAIL.ja.md +6 -0
- package/docs/DETAIL.pt.md +6 -0
- package/docs/DETAIL.ru.md +6 -0
- package/docs/DETAIL.zh.md +5 -1
- package/docs/INSTALL.md +7 -3
- package/package.json +6 -5
- package/provider/agy/errors.d.ts +6 -2
- package/provider/agy/errors.d.ts.map +1 -1
- package/provider/agy/errors.js +18 -0
- package/provider/agy/errors.js.map +1 -1
- package/provider/agy/spawn.d.ts +1 -1
- package/provider/agy/spawn.d.ts.map +1 -1
- package/provider/agy/spawn.js +3 -2
- package/provider/agy/spawn.js.map +1 -1
- package/provider/i18n.d.ts +10 -0
- package/provider/i18n.d.ts.map +1 -1
- package/provider/i18n.js +80 -0
- package/provider/i18n.js.map +1 -1
- package/provider/index.d.ts +10 -0
- package/provider/index.d.ts.map +1 -1
- package/provider/index.js +36 -2
- package/provider/index.js.map +1 -1
- package/provider/run.d.ts +9 -1
- package/provider/run.d.ts.map +1 -1
- package/provider/run.js +177 -43
- package/provider/run.js.map +1 -1
- package/provider/runs.d.ts +143 -0
- package/provider/runs.d.ts.map +1 -0
- package/provider/runs.js +280 -0
- package/provider/runs.js.map +1 -0
- package/tool.js +98 -2
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/** 有界的 AGY 运行登记表:状态快照、活动摘要、取消请求与终态保留。 */
|
|
2
|
+
import type { FailureCategory } from './agy/errors.js';
|
|
3
|
+
/** 运行状态。 */
|
|
4
|
+
export type RunState = 'starting' | 'running' | 'completed' | 'failed' | 'cancelled';
|
|
5
|
+
/** 活动类型;`stderr` 只作诊断记录,不重置静默计时。 */
|
|
6
|
+
export type ActivityKind = 'init' | 'step' | 'tool' | 'text' | 'result' | 'lifecycle' | 'stderr';
|
|
7
|
+
/** 状态快照中的最近协议事件类型;活动类型 `step`/`tool`/`text` 统一映射为 `step_update`。 */
|
|
8
|
+
export type ProtocolEventKind = 'init' | 'step_update' | 'result' | 'stderr' | 'lifecycle';
|
|
9
|
+
/** 一次活动摘要。 */
|
|
10
|
+
export interface ActivityEntry {
|
|
11
|
+
readonly seq: number;
|
|
12
|
+
readonly at: number;
|
|
13
|
+
readonly kind: ActivityKind;
|
|
14
|
+
readonly summary: string;
|
|
15
|
+
readonly stepIndex?: number;
|
|
16
|
+
readonly stepState?: string;
|
|
17
|
+
readonly toolName?: string;
|
|
18
|
+
readonly text?: string;
|
|
19
|
+
}
|
|
20
|
+
/** 运行记录;由提供方更新,查询时投影为快照。 */
|
|
21
|
+
export interface RunRecord {
|
|
22
|
+
readonly childId: string;
|
|
23
|
+
readonly parentId: string;
|
|
24
|
+
state: RunState;
|
|
25
|
+
readonly startedAt: number;
|
|
26
|
+
readyAt?: number;
|
|
27
|
+
endedAt?: number;
|
|
28
|
+
lastActivityAt?: number;
|
|
29
|
+
lastEventKind?: ProtocolEventKind;
|
|
30
|
+
pid?: number;
|
|
31
|
+
conversationId?: string;
|
|
32
|
+
stepIndex?: number;
|
|
33
|
+
stepState?: string;
|
|
34
|
+
toolName?: string;
|
|
35
|
+
lastText?: string;
|
|
36
|
+
stopReason?: string;
|
|
37
|
+
failureCategory?: FailureCategory;
|
|
38
|
+
cancelRequestedAt?: number;
|
|
39
|
+
readonly activity: ActivityEntry[];
|
|
40
|
+
/** 运行清理钩子;插件卸载时用来终止尚未结算的进程。 */
|
|
41
|
+
teardown?: () => Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
/** 状态查询输出中的一个运行。 */
|
|
44
|
+
export interface RunView {
|
|
45
|
+
readonly childId: string;
|
|
46
|
+
readonly state: RunState;
|
|
47
|
+
readonly startedAt: string;
|
|
48
|
+
readonly readyAt: string | null;
|
|
49
|
+
readonly endedAt: string | null;
|
|
50
|
+
readonly elapsedMs: number;
|
|
51
|
+
readonly lastActivityAt: string | null;
|
|
52
|
+
readonly lastEventKind: ProtocolEventKind | null;
|
|
53
|
+
readonly pid: number | null;
|
|
54
|
+
readonly conversationId: string | null;
|
|
55
|
+
readonly stepIndex: number | null;
|
|
56
|
+
readonly stepState: string | null;
|
|
57
|
+
readonly toolName: string | null;
|
|
58
|
+
readonly lastText: string | null;
|
|
59
|
+
readonly stopReason: string | null;
|
|
60
|
+
readonly failureCategory: FailureCategory | null;
|
|
61
|
+
readonly cancelRequestedAt: string | null;
|
|
62
|
+
readonly activity: readonly RunViewActivity[];
|
|
63
|
+
}
|
|
64
|
+
/** 快照中的活动摘要。 */
|
|
65
|
+
export interface RunViewActivity {
|
|
66
|
+
readonly seq: number;
|
|
67
|
+
readonly at: string;
|
|
68
|
+
readonly kind: ActivityKind;
|
|
69
|
+
readonly summary: string;
|
|
70
|
+
readonly stepIndex?: number;
|
|
71
|
+
readonly stepState?: string;
|
|
72
|
+
readonly toolName?: string;
|
|
73
|
+
readonly text?: string;
|
|
74
|
+
}
|
|
75
|
+
/** `status` 动作的完整输出。 */
|
|
76
|
+
export interface StatusSnapshot {
|
|
77
|
+
readonly action: 'status';
|
|
78
|
+
readonly generatedAt: string;
|
|
79
|
+
readonly found: boolean;
|
|
80
|
+
readonly runs: readonly RunView[];
|
|
81
|
+
}
|
|
82
|
+
/** 取消受理结果。 */
|
|
83
|
+
export interface CancelReceipt {
|
|
84
|
+
readonly accepted: boolean;
|
|
85
|
+
readonly reason: 'accepted' | 'already-requested' | 'already-ended' | 'not-found';
|
|
86
|
+
readonly requestedAt?: number;
|
|
87
|
+
}
|
|
88
|
+
/** 登记表配置。 */
|
|
89
|
+
export interface RunRegistryOptions {
|
|
90
|
+
readonly activityLimit?: number;
|
|
91
|
+
readonly maxRecordsPerParent?: number;
|
|
92
|
+
readonly terminalRetentionMs?: number;
|
|
93
|
+
readonly now?: () => number;
|
|
94
|
+
}
|
|
95
|
+
/** 有界登记表。 */
|
|
96
|
+
export declare class RunRegistry {
|
|
97
|
+
private readonly byParent;
|
|
98
|
+
private readonly byId;
|
|
99
|
+
private readonly timers;
|
|
100
|
+
private readonly activityLimit;
|
|
101
|
+
private readonly maxRecordsPerParent;
|
|
102
|
+
private readonly terminalRetentionMs;
|
|
103
|
+
private readonly now;
|
|
104
|
+
constructor(options?: RunRegistryOptions);
|
|
105
|
+
/** 登记一个新运行;childId 必须全局唯一。 */
|
|
106
|
+
register(parentId: string, childId: string, pid?: number): RunRecord;
|
|
107
|
+
/** 标记 `init` 已到达,进入 running。 */
|
|
108
|
+
markReady(record: RunRecord): void;
|
|
109
|
+
/** 记录一条协议事件/生命周期活动。 */
|
|
110
|
+
recordActivity(record: RunRecord, kind: Exclude<ActivityKind, 'stderr'>, data?: {
|
|
111
|
+
summary?: string;
|
|
112
|
+
stepIndex?: number;
|
|
113
|
+
stepState?: string;
|
|
114
|
+
toolName?: string;
|
|
115
|
+
text?: string;
|
|
116
|
+
}): void;
|
|
117
|
+
/** 记录 stderr 诊断;不重置静默计时,也不进入活动环。 */
|
|
118
|
+
recordStderr(record: RunRecord, summary: string): void;
|
|
119
|
+
/** 记录终态;重复调用无副作用。 */
|
|
120
|
+
recordTerminal(record: RunRecord, state: 'completed' | 'failed' | 'cancelled', info?: {
|
|
121
|
+
stopReason?: string;
|
|
122
|
+
failureCategory?: FailureCategory;
|
|
123
|
+
summary?: string;
|
|
124
|
+
}): void;
|
|
125
|
+
/** 请求取消;只登记请求,不直接改终态。 */
|
|
126
|
+
requestCancel(parentId: string, childId: string): CancelReceipt;
|
|
127
|
+
/** 生成状态快照;childId 指定时做父级隔离。 */
|
|
128
|
+
status(parentId: string, childId?: string): StatusSnapshot;
|
|
129
|
+
/** 停止全部计时器、终止未结算运行并清空登记表。 */
|
|
130
|
+
dispose(): Promise<void>;
|
|
131
|
+
/** 删除终态记录(测试与惰性清理共用)。 */
|
|
132
|
+
remove(record: RunRecord): void;
|
|
133
|
+
private pushActivity;
|
|
134
|
+
private armCleanup;
|
|
135
|
+
private cleanup;
|
|
136
|
+
private enforceLimit;
|
|
137
|
+
private view;
|
|
138
|
+
}
|
|
139
|
+
/** 取提供方与工具共用的默认登记表。 */
|
|
140
|
+
export declare function getDefaultRunRegistry(): RunRegistry;
|
|
141
|
+
/** 替换默认登记表(插件 apply 与测试使用)。 */
|
|
142
|
+
export declare function setDefaultRunRegistry(registry: RunRegistry | undefined): void;
|
|
143
|
+
//# sourceMappingURL=runs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../src/runs.ts"],"names":[],"mappings":"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"}
|
package/provider/runs.js
ADDED
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/** 有界的 AGY 运行登记表:状态快照、活动摘要、取消请求与终态保留。 */
|
|
2
|
+
const DEFAULT_ACTIVITY_LIMIT = 20;
|
|
3
|
+
const DEFAULT_MAX_RECORDS = 50;
|
|
4
|
+
const DEFAULT_RETENTION_MS = 300_000;
|
|
5
|
+
/** 活动类型到协议事件类型的映射;保持状态契约的 `step_update` 语义。 */
|
|
6
|
+
function protocolEventKind(kind) {
|
|
7
|
+
if (kind === 'step' || kind === 'tool' || kind === 'text')
|
|
8
|
+
return 'step_update';
|
|
9
|
+
return kind;
|
|
10
|
+
}
|
|
11
|
+
/** 截断字符串到最多 N 个 Unicode 码点,避免代理对截断。 */
|
|
12
|
+
function clip(text, max) {
|
|
13
|
+
const chars = Array.from(text);
|
|
14
|
+
return chars.length <= max ? text : chars.slice(0, max).join('');
|
|
15
|
+
}
|
|
16
|
+
/** 有界登记表。 */
|
|
17
|
+
export class RunRegistry {
|
|
18
|
+
byParent = new Map();
|
|
19
|
+
byId = new Map();
|
|
20
|
+
timers = new Map();
|
|
21
|
+
activityLimit;
|
|
22
|
+
maxRecordsPerParent;
|
|
23
|
+
terminalRetentionMs;
|
|
24
|
+
now;
|
|
25
|
+
constructor(options = {}) {
|
|
26
|
+
this.activityLimit = options.activityLimit ?? DEFAULT_ACTIVITY_LIMIT;
|
|
27
|
+
this.maxRecordsPerParent = options.maxRecordsPerParent ?? DEFAULT_MAX_RECORDS;
|
|
28
|
+
this.terminalRetentionMs = options.terminalRetentionMs ?? DEFAULT_RETENTION_MS;
|
|
29
|
+
this.now = options.now ?? (() => Date.now());
|
|
30
|
+
}
|
|
31
|
+
/** 登记一个新运行;childId 必须全局唯一。 */
|
|
32
|
+
register(parentId, childId, pid) {
|
|
33
|
+
this.cleanup();
|
|
34
|
+
const existing = this.byId.get(childId);
|
|
35
|
+
if (existing !== undefined)
|
|
36
|
+
return existing;
|
|
37
|
+
const record = {
|
|
38
|
+
childId,
|
|
39
|
+
parentId,
|
|
40
|
+
state: 'starting',
|
|
41
|
+
startedAt: this.now(),
|
|
42
|
+
...(pid === undefined ? {} : { pid }),
|
|
43
|
+
activity: [],
|
|
44
|
+
};
|
|
45
|
+
this.byId.set(childId, record);
|
|
46
|
+
const group = this.byParent.get(parentId);
|
|
47
|
+
if (group === undefined)
|
|
48
|
+
this.byParent.set(parentId, [record]);
|
|
49
|
+
else
|
|
50
|
+
group.push(record);
|
|
51
|
+
this.enforceLimit(parentId);
|
|
52
|
+
return record;
|
|
53
|
+
}
|
|
54
|
+
/** 标记 `init` 已到达,进入 running。 */
|
|
55
|
+
markReady(record) {
|
|
56
|
+
if (record.state !== 'starting')
|
|
57
|
+
return;
|
|
58
|
+
const at = this.now();
|
|
59
|
+
record.state = 'running';
|
|
60
|
+
record.readyAt = at;
|
|
61
|
+
record.lastActivityAt = at;
|
|
62
|
+
record.lastEventKind = 'init';
|
|
63
|
+
this.pushActivity(record, { at, kind: 'init', summary: 'AGY ready' });
|
|
64
|
+
}
|
|
65
|
+
/** 记录一条协议事件/生命周期活动。 */
|
|
66
|
+
recordActivity(record, kind, data = {}) {
|
|
67
|
+
if (record.state === 'completed' || record.state === 'failed' || record.state === 'cancelled')
|
|
68
|
+
return;
|
|
69
|
+
const at = this.now();
|
|
70
|
+
if (kind !== 'lifecycle' || record.state === 'running') {
|
|
71
|
+
record.lastActivityAt = at;
|
|
72
|
+
record.lastEventKind = protocolEventKind(kind);
|
|
73
|
+
}
|
|
74
|
+
if (data.stepIndex !== undefined)
|
|
75
|
+
record.stepIndex = data.stepIndex;
|
|
76
|
+
if (data.stepState !== undefined)
|
|
77
|
+
record.stepState = data.stepState;
|
|
78
|
+
if (data.toolName !== undefined)
|
|
79
|
+
record.toolName = data.toolName;
|
|
80
|
+
if (data.text !== undefined)
|
|
81
|
+
record.lastText = clip(data.text, 200);
|
|
82
|
+
const summary = clip(data.summary ?? data.text ?? kind, 160);
|
|
83
|
+
const last = record.activity[record.activity.length - 1];
|
|
84
|
+
if (kind === 'text' && last?.kind === 'text') {
|
|
85
|
+
// 连续 text_delta 只更新最后一条,避免 20 个槽位被 token 填满。
|
|
86
|
+
const merged = {
|
|
87
|
+
seq: last.seq,
|
|
88
|
+
at,
|
|
89
|
+
kind,
|
|
90
|
+
summary,
|
|
91
|
+
...(last.stepIndex === undefined ? {} : { stepIndex: last.stepIndex }),
|
|
92
|
+
...(last.stepState === undefined ? {} : { stepState: last.stepState }),
|
|
93
|
+
...(last.toolName === undefined ? {} : { toolName: last.toolName }),
|
|
94
|
+
...(data.text === undefined ? {} : { text: clip(data.text, 200) }),
|
|
95
|
+
};
|
|
96
|
+
record.activity[record.activity.length - 1] = merged;
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
this.pushActivity(record, {
|
|
100
|
+
at,
|
|
101
|
+
kind,
|
|
102
|
+
summary,
|
|
103
|
+
...(data.stepIndex === undefined ? {} : { stepIndex: data.stepIndex }),
|
|
104
|
+
...(data.stepState === undefined ? {} : { stepState: data.stepState }),
|
|
105
|
+
...(data.toolName === undefined ? {} : { toolName: data.toolName }),
|
|
106
|
+
...(data.text === undefined ? {} : { text: clip(data.text, 200) }),
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/** 记录 stderr 诊断;不重置静默计时,也不进入活动环。 */
|
|
110
|
+
recordStderr(record, summary) {
|
|
111
|
+
if (record.state === 'completed' || record.state === 'failed' || record.state === 'cancelled')
|
|
112
|
+
return;
|
|
113
|
+
record.lastEventKind = 'stderr';
|
|
114
|
+
void summary;
|
|
115
|
+
}
|
|
116
|
+
/** 记录终态;重复调用无副作用。 */
|
|
117
|
+
recordTerminal(record, state, info = {}) {
|
|
118
|
+
if (record.state === 'completed' || record.state === 'failed' || record.state === 'cancelled')
|
|
119
|
+
return;
|
|
120
|
+
const at = this.now();
|
|
121
|
+
record.state = state;
|
|
122
|
+
record.endedAt = at;
|
|
123
|
+
record.stopReason = info.stopReason;
|
|
124
|
+
record.failureCategory = info.failureCategory;
|
|
125
|
+
record.lastActivityAt = at;
|
|
126
|
+
record.lastEventKind = 'lifecycle';
|
|
127
|
+
this.pushActivity(record, {
|
|
128
|
+
at,
|
|
129
|
+
kind: 'lifecycle',
|
|
130
|
+
summary: clip(info.summary ?? `run ${state}`, 160),
|
|
131
|
+
});
|
|
132
|
+
this.armCleanup(record);
|
|
133
|
+
this.enforceLimit(record.parentId);
|
|
134
|
+
}
|
|
135
|
+
/** 请求取消;只登记请求,不直接改终态。 */
|
|
136
|
+
requestCancel(parentId, childId) {
|
|
137
|
+
this.cleanup();
|
|
138
|
+
const record = this.byId.get(childId);
|
|
139
|
+
if (record === undefined || record.parentId !== parentId) {
|
|
140
|
+
return { accepted: false, reason: 'not-found' };
|
|
141
|
+
}
|
|
142
|
+
if (record.state === 'completed' || record.state === 'failed' || record.state === 'cancelled') {
|
|
143
|
+
return { accepted: false, reason: 'already-ended' };
|
|
144
|
+
}
|
|
145
|
+
if (record.cancelRequestedAt !== undefined) {
|
|
146
|
+
return { accepted: false, reason: 'already-requested', requestedAt: record.cancelRequestedAt };
|
|
147
|
+
}
|
|
148
|
+
const at = this.now();
|
|
149
|
+
record.cancelRequestedAt = at;
|
|
150
|
+
return { accepted: true, reason: 'accepted', requestedAt: at };
|
|
151
|
+
}
|
|
152
|
+
/** 生成状态快照;childId 指定时做父级隔离。 */
|
|
153
|
+
status(parentId, childId) {
|
|
154
|
+
this.cleanup();
|
|
155
|
+
const generatedAt = new Date(this.now()).toISOString();
|
|
156
|
+
if (childId !== undefined) {
|
|
157
|
+
const record = this.byId.get(childId);
|
|
158
|
+
if (record === undefined || record.parentId !== parentId) {
|
|
159
|
+
return { action: 'status', generatedAt, found: false, runs: [] };
|
|
160
|
+
}
|
|
161
|
+
return { action: 'status', generatedAt, found: true, runs: [this.view(record)] };
|
|
162
|
+
}
|
|
163
|
+
const runs = (this.byParent.get(parentId) ?? [])
|
|
164
|
+
.slice()
|
|
165
|
+
.sort((a, b) => b.startedAt - a.startedAt)
|
|
166
|
+
.map(record => this.view(record));
|
|
167
|
+
return { action: 'status', generatedAt, found: true, runs };
|
|
168
|
+
}
|
|
169
|
+
/** 停止全部计时器、终止未结算运行并清空登记表。 */
|
|
170
|
+
async dispose() {
|
|
171
|
+
for (const timer of this.timers.values())
|
|
172
|
+
clearTimeout(timer);
|
|
173
|
+
this.timers.clear();
|
|
174
|
+
const records = [...this.byId.values()];
|
|
175
|
+
await Promise.allSettled(records
|
|
176
|
+
.filter(record => record.state === 'starting' || record.state === 'running')
|
|
177
|
+
.map(record => record.teardown?.()));
|
|
178
|
+
this.byId.clear();
|
|
179
|
+
this.byParent.clear();
|
|
180
|
+
}
|
|
181
|
+
/** 删除终态记录(测试与惰性清理共用)。 */
|
|
182
|
+
remove(record) {
|
|
183
|
+
const timer = this.timers.get(record.childId);
|
|
184
|
+
if (timer !== undefined) {
|
|
185
|
+
clearTimeout(timer);
|
|
186
|
+
this.timers.delete(record.childId);
|
|
187
|
+
}
|
|
188
|
+
if (this.byId.get(record.childId) !== record)
|
|
189
|
+
return;
|
|
190
|
+
this.byId.delete(record.childId);
|
|
191
|
+
const group = this.byParent.get(record.parentId);
|
|
192
|
+
if (group === undefined)
|
|
193
|
+
return;
|
|
194
|
+
const index = group.indexOf(record);
|
|
195
|
+
if (index !== -1)
|
|
196
|
+
group.splice(index, 1);
|
|
197
|
+
if (group.length === 0)
|
|
198
|
+
this.byParent.delete(record.parentId);
|
|
199
|
+
}
|
|
200
|
+
pushActivity(record, entry) {
|
|
201
|
+
const seq = record.activity.length === 0 ? 1 : record.activity[record.activity.length - 1].seq + 1;
|
|
202
|
+
record.activity.push({ seq, ...entry });
|
|
203
|
+
while (record.activity.length > this.activityLimit)
|
|
204
|
+
record.activity.shift();
|
|
205
|
+
}
|
|
206
|
+
armCleanup(record) {
|
|
207
|
+
const existing = this.timers.get(record.childId);
|
|
208
|
+
if (existing !== undefined)
|
|
209
|
+
clearTimeout(existing);
|
|
210
|
+
const timer = setTimeout(() => {
|
|
211
|
+
this.timers.delete(record.childId);
|
|
212
|
+
this.remove(record);
|
|
213
|
+
}, this.terminalRetentionMs);
|
|
214
|
+
timer.unref?.();
|
|
215
|
+
this.timers.set(record.childId, timer);
|
|
216
|
+
}
|
|
217
|
+
cleanup() {
|
|
218
|
+
const now = this.now();
|
|
219
|
+
for (const record of [...this.byId.values()]) {
|
|
220
|
+
if (record.endedAt !== undefined &&
|
|
221
|
+
now - record.endedAt >= this.terminalRetentionMs) {
|
|
222
|
+
this.remove(record);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
enforceLimit(parentId) {
|
|
227
|
+
const group = this.byParent.get(parentId);
|
|
228
|
+
if (group === undefined)
|
|
229
|
+
return;
|
|
230
|
+
while (group.length > this.maxRecordsPerParent) {
|
|
231
|
+
const index = group.findIndex(record => record.endedAt !== undefined && record.state !== 'starting' && record.state !== 'running');
|
|
232
|
+
if (index === -1)
|
|
233
|
+
break;
|
|
234
|
+
this.remove(group[index]);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
view(record) {
|
|
238
|
+
const now = this.now();
|
|
239
|
+
return {
|
|
240
|
+
childId: record.childId,
|
|
241
|
+
state: record.state,
|
|
242
|
+
startedAt: new Date(record.startedAt).toISOString(),
|
|
243
|
+
readyAt: record.readyAt === undefined ? null : new Date(record.readyAt).toISOString(),
|
|
244
|
+
endedAt: record.endedAt === undefined ? null : new Date(record.endedAt).toISOString(),
|
|
245
|
+
elapsedMs: Math.max(0, (record.endedAt ?? now) - record.startedAt),
|
|
246
|
+
lastActivityAt: record.lastActivityAt === undefined ? null : new Date(record.lastActivityAt).toISOString(),
|
|
247
|
+
lastEventKind: record.lastEventKind ?? null,
|
|
248
|
+
pid: record.pid ?? null,
|
|
249
|
+
conversationId: record.conversationId ?? null,
|
|
250
|
+
stepIndex: record.stepIndex ?? null,
|
|
251
|
+
stepState: record.stepState ?? null,
|
|
252
|
+
toolName: record.toolName ?? null,
|
|
253
|
+
lastText: record.lastText ?? null,
|
|
254
|
+
stopReason: record.stopReason ?? null,
|
|
255
|
+
failureCategory: record.failureCategory ?? null,
|
|
256
|
+
cancelRequestedAt: record.cancelRequestedAt === undefined ? null : new Date(record.cancelRequestedAt).toISOString(),
|
|
257
|
+
activity: record.activity.map(entry => ({
|
|
258
|
+
seq: entry.seq,
|
|
259
|
+
at: new Date(entry.at).toISOString(),
|
|
260
|
+
kind: entry.kind,
|
|
261
|
+
summary: entry.summary,
|
|
262
|
+
...(entry.stepIndex === undefined ? {} : { stepIndex: entry.stepIndex }),
|
|
263
|
+
...(entry.stepState === undefined ? {} : { stepState: entry.stepState }),
|
|
264
|
+
...(entry.toolName === undefined ? {} : { toolName: entry.toolName }),
|
|
265
|
+
...(entry.text === undefined ? {} : { text: entry.text }),
|
|
266
|
+
})),
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
let defaultRegistry;
|
|
271
|
+
/** 取提供方与工具共用的默认登记表。 */
|
|
272
|
+
export function getDefaultRunRegistry() {
|
|
273
|
+
defaultRegistry ??= new RunRegistry();
|
|
274
|
+
return defaultRegistry;
|
|
275
|
+
}
|
|
276
|
+
/** 替换默认登记表(插件 apply 与测试使用)。 */
|
|
277
|
+
export function setDefaultRunRegistry(registry) {
|
|
278
|
+
defaultRegistry = registry;
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=runs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runs.js","sourceRoot":"","sources":["../src/runs.ts"],"names":[],"mappings":"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"}
|
package/tool.js
CHANGED
|
@@ -9,9 +9,12 @@
|
|
|
9
9
|
|
|
10
10
|
import Schema from '@deepseek-ai/schemastery'
|
|
11
11
|
import { defineTool } from '@deepseek-ai/dsh-tools'
|
|
12
|
+
import { getDefaultRunRegistry } from './provider/runs.js'
|
|
13
|
+
import { redactSensitive } from './provider/agy/errors.js'
|
|
12
14
|
|
|
13
15
|
const OFFICIAL_TOOL = '@deepseek-ai/dsh-experimental-tool-subagent-oar'
|
|
14
16
|
const DEFAULT_TOOL_NAME = 'subagent_oar_agy'
|
|
17
|
+
const DEFAULT_CONTROL_TOOL_NAME = 'subagent_oar_agy_control'
|
|
15
18
|
|
|
16
19
|
/** 插件名(Cordis 识别用)。 */
|
|
17
20
|
export const name = 'subagent-oar-agy-tool'
|
|
@@ -23,6 +26,7 @@ export const inject = ['tools', 'subagents']
|
|
|
23
26
|
export const Config = Schema.object({
|
|
24
27
|
providers: Schema.dict(Schema.string().min(1)).required(),
|
|
25
28
|
toolName: Schema.string().min(1).default(DEFAULT_TOOL_NAME),
|
|
29
|
+
controlToolName: Schema.string().min(1).default(DEFAULT_CONTROL_TOOL_NAME),
|
|
26
30
|
})
|
|
27
31
|
|
|
28
32
|
/**
|
|
@@ -118,6 +122,95 @@ export function createFallbackTool(providers, toolName, ctx) {
|
|
|
118
122
|
})
|
|
119
123
|
}
|
|
120
124
|
|
|
125
|
+
|
|
126
|
+
/** 构造控制工具:status 只读快照,cancel 通过官方 interrupt 授权取消。 */
|
|
127
|
+
export function createControlTool(ctx, config, registry) {
|
|
128
|
+
return defineTool({
|
|
129
|
+
name: config.controlToolName ?? DEFAULT_CONTROL_TOOL_NAME,
|
|
130
|
+
description:
|
|
131
|
+
'Inspect or cancel an AGY delegation started by this parent session. status returns a bounded snapshot of direct AGY runs; cancel requests asynchronous cancellation. status never starts, resumes, or changes a run.',
|
|
132
|
+
parameters: {
|
|
133
|
+
action: {
|
|
134
|
+
type: 'string',
|
|
135
|
+
required: true,
|
|
136
|
+
enum: ['status', 'cancel'],
|
|
137
|
+
description: 'status: read-only snapshot; cancel: request cancellation of one childId.',
|
|
138
|
+
},
|
|
139
|
+
childId: {
|
|
140
|
+
type: 'string',
|
|
141
|
+
description: 'External child id from subagent_oar_agy. Optional for status (list) and required for cancel.',
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
output: {
|
|
145
|
+
schema: { type: 'object', additionalProperties: true },
|
|
146
|
+
render: (_args, value) => [{ type: 'text', text: JSON.stringify(value) }],
|
|
147
|
+
},
|
|
148
|
+
isConcurrencySafe: () => true,
|
|
149
|
+
async execute(args, exec) {
|
|
150
|
+
const parent = exec.agent
|
|
151
|
+
const action = args.action
|
|
152
|
+
if (parent === undefined) {
|
|
153
|
+
// 规则 7:取消缺少 exec.agent 时只返回不可用收据;status 仍需调用者身份。
|
|
154
|
+
if (action === 'cancel') {
|
|
155
|
+
return {
|
|
156
|
+
action: 'cancel',
|
|
157
|
+
childId: typeof args.childId === 'string' ? args.childId : '',
|
|
158
|
+
accepted: false,
|
|
159
|
+
reason: 'unavailable',
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
throw new Error(`${config.controlToolName ?? DEFAULT_CONTROL_TOOL_NAME} requires a calling agent`)
|
|
163
|
+
}
|
|
164
|
+
const parentId = String(parent.id)
|
|
165
|
+
const activeRegistry = registry ?? getDefaultRunRegistry()
|
|
166
|
+
if (action === 'status') return activeRegistry.status(parentId, args.childId)
|
|
167
|
+
if (typeof args.childId !== 'string' || args.childId.length === 0) {
|
|
168
|
+
throw new Error(`${config.controlToolName ?? DEFAULT_CONTROL_TOOL_NAME}: childId is required for cancel`)
|
|
169
|
+
}
|
|
170
|
+
const receipt = activeRegistry.requestCancel(parentId, args.childId)
|
|
171
|
+
const requestedAt = receipt.requestedAt === undefined
|
|
172
|
+
? undefined
|
|
173
|
+
: new Date(receipt.requestedAt).toISOString()
|
|
174
|
+
if (receipt.reason === 'not-found' || receipt.reason === 'already-ended') {
|
|
175
|
+
return {
|
|
176
|
+
action: 'cancel',
|
|
177
|
+
childId: args.childId,
|
|
178
|
+
accepted: false,
|
|
179
|
+
reason: receipt.reason,
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
try {
|
|
183
|
+
ctx.subagents.interrupt(args.childId, { kind: 'ancestor', agent: parent })
|
|
184
|
+
} catch (error) {
|
|
185
|
+
const message = error instanceof Error ? error.message : String(error)
|
|
186
|
+
if (typeof ctx.logger?.warn === 'function') ctx.logger.warn(`subagent_oar_agy_control cancel failed: ${redactSensitive(message)}`)
|
|
187
|
+
return {
|
|
188
|
+
action: 'cancel',
|
|
189
|
+
childId: args.childId,
|
|
190
|
+
accepted: false,
|
|
191
|
+
reason: 'unavailable',
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
action: 'cancel',
|
|
196
|
+
childId: args.childId,
|
|
197
|
+
// 规则 2:重复请求仍是已受理;首次与重复都返回 accepted:true。
|
|
198
|
+
accepted: receipt.reason === 'accepted' || receipt.reason === 'already-requested',
|
|
199
|
+
reason: receipt.reason,
|
|
200
|
+
...(requestedAt === undefined ? {} : { requestedAt }),
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
presentCall: args => ({ card: 'generic', title: args.action === 'cancel' ? 'cancel AGY delegation' : 'AGY run status', rawInput: args }),
|
|
204
|
+
})
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/** 注册控制工具,返回精确 disposer。 */
|
|
208
|
+
export function registerControlTool(ctx, config, registry) {
|
|
209
|
+
const name = config.controlToolName ?? DEFAULT_CONTROL_TOOL_NAME
|
|
210
|
+
if (name.trim().length === 0) throw new Error('subagent_oar_agy: controlToolName must be non-empty')
|
|
211
|
+
return ctx.tools.register(createControlTool(ctx, config, registry))
|
|
212
|
+
}
|
|
213
|
+
|
|
121
214
|
/**
|
|
122
215
|
* 注册内置回退工具。
|
|
123
216
|
* @param ctx - 插件上下文
|
|
@@ -141,16 +234,19 @@ export function registerFallback(ctx, config) {
|
|
|
141
234
|
* @param resolveTool - 官方模块解析器,测试可注入
|
|
142
235
|
* @returns `'official'` 或 `'fallback'`
|
|
143
236
|
*/
|
|
144
|
-
export async function mountTool(ctx, config, resolveTool = loadOfficialTool) {
|
|
237
|
+
export async function mountTool(ctx, config, resolveTool = loadOfficialTool, registry) {
|
|
145
238
|
const official = await resolveTool()
|
|
239
|
+
const officialConfig = { providers: config.providers, toolName: config.toolName ?? DEFAULT_TOOL_NAME }
|
|
146
240
|
if (official?.apply !== undefined) {
|
|
147
|
-
ctx.plugin(official,
|
|
241
|
+
ctx.plugin(official, officialConfig)
|
|
242
|
+
registerControlTool(ctx, config, registry)
|
|
148
243
|
return 'official'
|
|
149
244
|
}
|
|
150
245
|
const warning = `[subagent_oar_agy] ${OFFICIAL_TOOL} is not resolvable; using the bundled one-shot tool fallback. Install the official package to restore the official implementation.`
|
|
151
246
|
if (typeof ctx.logger?.warn === 'function') ctx.logger.warn(warning)
|
|
152
247
|
else console.warn(warning)
|
|
153
248
|
registerFallback(ctx, config)
|
|
249
|
+
registerControlTool(ctx, config, registry)
|
|
154
250
|
return 'fallback'
|
|
155
251
|
}
|
|
156
252
|
|