@lemoncat7/dsh-partner 1.4.1 → 1.5.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 +39 -0
- package/docs/architecture.md +99 -0
- package/lib/agent-runtime.d.ts +31 -8
- package/lib/agent-runtime.d.ts.map +1 -1
- package/lib/agent-runtime.js +236 -52
- package/lib/agent-runtime.js.map +1 -1
- package/lib/api/features/workspace-api.d.ts +18 -0
- package/lib/api/features/workspace-api.d.ts.map +1 -0
- package/lib/api/features/workspace-api.js +188 -0
- package/lib/api/features/workspace-api.js.map +1 -0
- package/lib/api/http.d.ts +12 -0
- package/lib/api/http.d.ts.map +1 -0
- package/lib/api/http.js +53 -0
- package/lib/api/http.js.map +1 -0
- package/lib/api.d.ts +10 -0
- package/lib/api.d.ts.map +1 -1
- package/lib/api.js +48 -63
- package/lib/api.js.map +1 -1
- package/lib/autonomy.d.ts.map +1 -1
- package/lib/autonomy.js +2 -1
- package/lib/autonomy.js.map +1 -1
- package/lib/channels/manager.d.ts +4 -1
- package/lib/channels/manager.d.ts.map +1 -1
- package/lib/channels/manager.js +20 -3
- package/lib/channels/manager.js.map +1 -1
- package/lib/client-api.d.ts +157 -1
- package/lib/client-api.d.ts.map +1 -1
- package/lib/client-api.js.map +1 -1
- package/lib/client-controller.d.ts +15 -0
- package/lib/client-controller.d.ts.map +1 -0
- package/lib/client-controller.js +69 -0
- package/lib/client-controller.js.map +1 -0
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +2702 -885
- package/lib/client.js.map +4 -4
- package/lib/collaboration/composition.d.ts +27 -0
- package/lib/collaboration/composition.d.ts.map +1 -0
- package/lib/collaboration/composition.js +345 -0
- package/lib/collaboration/composition.js.map +1 -0
- package/lib/collaboration/domain.d.ts +38 -0
- package/lib/collaboration/domain.d.ts.map +1 -0
- package/lib/collaboration/domain.js +3 -0
- package/lib/collaboration/domain.js.map +1 -0
- package/lib/collaboration/retry-policy.d.ts +4 -0
- package/lib/collaboration/retry-policy.d.ts.map +1 -0
- package/lib/collaboration/retry-policy.js +18 -0
- package/lib/collaboration/retry-policy.js.map +1 -0
- package/lib/collaboration/service.d.ts +76 -0
- package/lib/collaboration/service.d.ts.map +1 -0
- package/lib/collaboration/service.js +370 -0
- package/lib/collaboration/service.js.map +1 -0
- package/lib/companions/service.d.ts +13 -0
- package/lib/companions/service.d.ts.map +1 -0
- package/lib/companions/service.js +51 -0
- package/lib/companions/service.js.map +1 -0
- package/lib/concern-domain.d.ts +8 -1
- package/lib/concern-domain.d.ts.map +1 -1
- package/lib/concern-domain.js +25 -1
- package/lib/concern-domain.js.map +1 -1
- package/lib/concern-store.d.ts.map +1 -1
- package/lib/concern-store.js +2 -1
- package/lib/concern-store.js.map +1 -1
- package/lib/concern-tool.d.ts +6 -0
- package/lib/concern-tool.d.ts.map +1 -1
- package/lib/concern-tool.js +35 -9
- package/lib/concern-tool.js.map +1 -1
- package/lib/core/collections.d.ts +2 -0
- package/lib/core/collections.d.ts.map +1 -0
- package/lib/core/collections.js +6 -0
- package/lib/core/collections.js.map +1 -0
- package/lib/core/semaphore.d.ts +10 -0
- package/lib/core/semaphore.d.ts.map +1 -0
- package/lib/core/semaphore.js +32 -0
- package/lib/core/semaphore.js.map +1 -0
- package/lib/core/validation.d.ts +7 -0
- package/lib/core/validation.d.ts.map +1 -0
- package/lib/core/validation.js +40 -0
- package/lib/core/validation.js.map +1 -0
- package/lib/domain.d.ts +28 -2
- package/lib/domain.d.ts.map +1 -1
- package/lib/domain.js +3 -3
- package/lib/domain.js.map +1 -1
- package/lib/execution/agent-support.d.ts +12 -0
- package/lib/execution/agent-support.d.ts.map +1 -0
- package/lib/execution/agent-support.js +48 -0
- package/lib/execution/agent-support.js.map +1 -0
- package/lib/execution/domain.d.ts +17 -0
- package/lib/execution/domain.d.ts.map +1 -0
- package/lib/execution/domain.js +2 -0
- package/lib/execution/domain.js.map +1 -0
- package/lib/execution/service.d.ts +52 -0
- package/lib/execution/service.d.ts.map +1 -0
- package/lib/execution/service.js +175 -0
- package/lib/execution/service.js.map +1 -0
- package/lib/heartbeat-command.d.ts +15 -0
- package/lib/heartbeat-command.d.ts.map +1 -0
- package/lib/heartbeat-command.js +211 -0
- package/lib/heartbeat-command.js.map +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +42 -3
- package/lib/index.js.map +1 -1
- package/lib/memory-reflection.js +2 -2
- package/lib/memory-reflection.js.map +1 -1
- package/lib/scheduler/domain.d.ts +25 -0
- package/lib/scheduler/domain.d.ts.map +1 -0
- package/lib/scheduler/domain.js +2 -0
- package/lib/scheduler/domain.js.map +1 -0
- package/lib/scheduler/service.d.ts +26 -0
- package/lib/scheduler/service.d.ts.map +1 -0
- package/lib/scheduler/service.js +177 -0
- package/lib/scheduler/service.js.map +1 -0
- package/lib/skills/builtin.d.ts +7 -0
- package/lib/skills/builtin.d.ts.map +1 -0
- package/lib/skills/builtin.js +16 -0
- package/lib/skills/builtin.js.map +1 -0
- package/lib/skills/domain.d.ts +52 -0
- package/lib/skills/domain.d.ts.map +1 -0
- package/lib/skills/domain.js +2 -0
- package/lib/skills/domain.js.map +1 -0
- package/lib/skills/loader.d.ts +18 -0
- package/lib/skills/loader.d.ts.map +1 -0
- package/lib/skills/loader.js +134 -0
- package/lib/skills/loader.js.map +1 -0
- package/lib/skills/markets/adapters.d.ts +8 -0
- package/lib/skills/markets/adapters.d.ts.map +1 -0
- package/lib/skills/markets/adapters.js +72 -0
- package/lib/skills/markets/adapters.js.map +1 -0
- package/lib/skills/markets/builtin.d.ts +10 -0
- package/lib/skills/markets/builtin.d.ts.map +1 -0
- package/lib/skills/markets/builtin.js +19 -0
- package/lib/skills/markets/builtin.js.map +1 -0
- package/lib/skills/network.d.ts +14 -0
- package/lib/skills/network.d.ts.map +1 -0
- package/lib/skills/network.js +174 -0
- package/lib/skills/network.js.map +1 -0
- package/lib/skills/repository.d.ts +17 -0
- package/lib/skills/repository.d.ts.map +1 -0
- package/lib/skills/repository.js +76 -0
- package/lib/skills/repository.js.map +1 -0
- package/lib/skills/service.d.ts +48 -0
- package/lib/skills/service.d.ts.map +1 -0
- package/lib/skills/service.js +248 -0
- package/lib/skills/service.js.map +1 -0
- package/lib/skills/zip.d.ts +3 -0
- package/lib/skills/zip.d.ts.map +1 -0
- package/lib/skills/zip.js +59 -0
- package/lib/skills/zip.js.map +1 -0
- package/lib/store.d.ts.map +1 -1
- package/lib/store.js +69 -3
- package/lib/store.js.map +1 -1
- package/lib/tasks/domain.d.ts +39 -0
- package/lib/tasks/domain.d.ts.map +1 -0
- package/lib/tasks/domain.js +3 -0
- package/lib/tasks/domain.js.map +1 -0
- package/lib/tasks/result.d.ts +14 -0
- package/lib/tasks/result.d.ts.map +1 -0
- package/lib/tasks/result.js +109 -0
- package/lib/tasks/result.js.map +1 -0
- package/lib/tasks/service.d.ts +39 -0
- package/lib/tasks/service.d.ts.map +1 -0
- package/lib/tasks/service.js +334 -0
- package/lib/tasks/service.js.map +1 -0
- package/lib/ui/companion-access-panel.d.ts +4 -0
- package/lib/ui/companion-access-panel.d.ts.map +1 -0
- package/lib/ui/companion-access-panel.js +46 -0
- package/lib/ui/companion-access-panel.js.map +1 -0
- package/lib/ui/companion-create.d.ts +11 -0
- package/lib/ui/companion-create.d.ts.map +1 -0
- package/lib/ui/companion-create.js +30 -0
- package/lib/ui/companion-create.js.map +1 -0
- package/lib/ui/partner-components.d.ts +36 -0
- package/lib/ui/partner-components.d.ts.map +1 -0
- package/lib/ui/partner-components.js +32 -0
- package/lib/ui/partner-components.js.map +1 -0
- package/lib/ui/schedule-panel.d.ts +5 -0
- package/lib/ui/schedule-panel.d.ts.map +1 -0
- package/lib/ui/schedule-panel.js +86 -0
- package/lib/ui/schedule-panel.js.map +1 -0
- package/lib/ui/skills-panel.d.ts +5 -0
- package/lib/ui/skills-panel.d.ts.map +1 -0
- package/lib/ui/skills-panel.js +236 -0
- package/lib/ui/skills-panel.js.map +1 -0
- package/lib/ui/task-board-panel.d.ts +2 -0
- package/lib/ui/task-board-panel.d.ts.map +1 -0
- package/lib/ui/task-board-panel.js +231 -0
- package/lib/ui/task-board-panel.js.map +1 -0
- package/lib/ui/workspace-components.d.ts +40 -0
- package/lib/ui/workspace-components.d.ts.map +1 -0
- package/lib/ui/workspace-components.js +61 -0
- package/lib/ui/workspace-components.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-support.d.ts","sourceRoot":"","sources":["../../src/execution/agent-support.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAA;AACnF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAE7C,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,GAAE,cAAc,GAAG,OAAO,GAAG,WAAW,GAAG,WAA4B,GAAG,MAAM,CAgBjJ;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAS3C;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAUxE;AAED,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,uBAAuB,EAAE,SAAS,EAAE,SAAS;;;;EAMrG"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export function renderPartnerPersona(companion, surface = 'conversation') {
|
|
2
|
+
const capabilities = companion.capabilities.length > 0 ? companion.capabilities.join('、') : '由当前 Agent Preset 提供的基础能力';
|
|
3
|
+
return [
|
|
4
|
+
`你当前以长期工作伙伴「${companion.name}」的身份工作。`,
|
|
5
|
+
`角色:${companion.role}`,
|
|
6
|
+
companion.description ? `定位:${companion.description}` : '',
|
|
7
|
+
companion.instructions ? `长期行为准则:\n${companion.instructions}` : '',
|
|
8
|
+
`用户为此伙伴启用的能力范围:${capabilities}。能力标识不等于授权;只能调用当前会话实际提供且已经通过权限校验的工具。`,
|
|
9
|
+
surface === 'heartbeat'
|
|
10
|
+
? '这是一轮独立的伙伴心跳,不是用户聊天的延续。只根据本轮真实可读信息行动,最终结果由渠道适配器决定是否发送。'
|
|
11
|
+
: surface === 'ephemeral'
|
|
12
|
+
? '这是一个有明确边界的临时工作会话。只处理本轮任务,使用真实工具结果,完成后给出可审计的结果摘要;不得读取或推断其他伙伴的私有会话、凭据与长期记忆。'
|
|
13
|
+
: surface === 'local'
|
|
14
|
+
? '这是用户在 DSH 中与你直接建立的本地伙伴会话,不依赖任何外部渠道。保持连续上下文并正常使用已授权能力;不要假定消息来自微信。'
|
|
15
|
+
: '这个会话由 DSH 网页与微信私聊渠道共同使用。保持同一上下文,不要假定每条消息都来自微信;渠道回传由适配器负责。回答兼顾网页与移动端阅读,执行外部操作前继续遵守工具自身的授权与审批边界。',
|
|
16
|
+
].filter(Boolean).join('\n\n');
|
|
17
|
+
}
|
|
18
|
+
export function renderToolProtocol() {
|
|
19
|
+
return [
|
|
20
|
+
'DSH 工具调用协议(必须遵守):工具 SDK 中出现某项能力,不代表它可以作为顶层函数直接调用。',
|
|
21
|
+
'先以当前请求真正暴露的顶层工具清单为准。若顶层只提供 `run_code`,则它是唯一允许直接调用的工具;`web_search`、知识库、SSH 等 SDK 能力必须放进 `run_code` 程序,通过生成的 `tools` SDK 按准确签名调用,例如 `await tools.web_search(...)`。绝不要直接发起名为 `web_search` 的顶层工具调用。',
|
|
22
|
+
'`run_code` 的程序只返回完成当前任务所需的精简结果。需要顺序依赖时逐个 `await`,互不依赖的只读调用才可并行。',
|
|
23
|
+
'若工具结果提示 “only `run_code` is callable directly”,立即在同一轮改用 `run_code` 重试。只有规范重试也失败时,才说明真正的失败原因。',
|
|
24
|
+
'若当前请求原生暴露了目标工具,则可以直接调用;不要臆造未出现在顶层清单或生成 SDK 中的工具。',
|
|
25
|
+
'需要交付图片或文档时,最终回复必须用 Markdown 链接明确引用伙伴工作目录中的真实文件。',
|
|
26
|
+
].join('\n');
|
|
27
|
+
}
|
|
28
|
+
export function assistantTextAfter(agent, fromSeq) {
|
|
29
|
+
const messages = [];
|
|
30
|
+
for (const event of agent.session.events) {
|
|
31
|
+
if (event.seq < fromSeq || event.type !== 'assistant/message' || event.data.interrupted)
|
|
32
|
+
continue;
|
|
33
|
+
const text = event.data.message.content
|
|
34
|
+
.filter((block) => block.type === 'text')
|
|
35
|
+
.map(block => block.text.trim()).filter(Boolean).join('\n');
|
|
36
|
+
if (text)
|
|
37
|
+
messages.push(text);
|
|
38
|
+
}
|
|
39
|
+
return messages.join('\n\n').trim();
|
|
40
|
+
}
|
|
41
|
+
export function resolvePartnerAgentOptions(defaultModel, companion) {
|
|
42
|
+
return {
|
|
43
|
+
...defaultModel.currentSelection(),
|
|
44
|
+
...(companion.provider ? { provider: companion.provider } : {}),
|
|
45
|
+
...(companion.model ? { model: companion.model } : {}),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=agent-support.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-support.js","sourceRoot":"","sources":["../../src/execution/agent-support.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,oBAAoB,CAAC,SAAoB,EAAE,UAAgE,cAAc;IACvI,MAAM,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,0BAA0B,CAAA;IACtH,OAAO;QACL,cAAc,SAAS,CAAC,IAAI,SAAS;QACrC,MAAM,SAAS,CAAC,IAAI,EAAE;QACtB,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE;QAC1D,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE;QAClE,iBAAiB,YAAY,sCAAsC;QACnE,OAAO,KAAK,WAAW;YACrB,CAAC,CAAC,uDAAuD;YACzD,CAAC,CAAC,OAAO,KAAK,WAAW;gBACvB,CAAC,CAAC,2EAA2E;gBAC7E,CAAC,CAAC,OAAO,KAAK,OAAO;oBACnB,CAAC,CAAC,kEAAkE;oBACpE,CAAC,CAAC,gGAAgG;KACzG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AAChC,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,mDAAmD;QACnD,iMAAiM;QACjM,iEAAiE;QACjE,8FAA8F;QAC9F,kDAAkD;QAClD,iDAAiD;KAClD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAY,EAAE,OAAe;IAC9D,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACzC,IAAI,KAAK,CAAC,GAAG,GAAG,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW;YAAE,SAAQ;QACjG,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO;aACpC,MAAM,CAAC,CAAC,KAAK,EAA2C,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;aACjF,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC7D,IAAI,IAAI;YAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC/B,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAA;AACrC,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,YAAqC,EAAE,SAAoB;IACpG,OAAO;QACL,GAAG,YAAY,CAAC,gBAAgB,EAAE;QAClC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvD,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type ExecutionKind = 'schedule' | 'delegation' | 'review' | 'skill';
|
|
2
|
+
export type ExecutionStatus = 'queued' | 'running' | 'completed' | 'failed' | 'canceled' | 'timed-out';
|
|
3
|
+
export interface ExecutionRun {
|
|
4
|
+
id: string;
|
|
5
|
+
kind: ExecutionKind;
|
|
6
|
+
ownerCompanionId: string;
|
|
7
|
+
sessionId: string;
|
|
8
|
+
sourceId: string;
|
|
9
|
+
status: ExecutionStatus;
|
|
10
|
+
destroyAfterRun: boolean;
|
|
11
|
+
startedAt: number;
|
|
12
|
+
completedAt?: number;
|
|
13
|
+
outputSummary?: string;
|
|
14
|
+
error?: string;
|
|
15
|
+
toolNames: string[];
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=domain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain.d.ts","sourceRoot":"","sources":["../../src/execution/domain.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAA;AAC1E,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAA;AAEtG,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,aAAa,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,eAAe,CAAA;IACvB,eAAe,EAAE,OAAO,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain.js","sourceRoot":"","sources":["../../src/execution/domain.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
import type { AgentDefaultModelConfig } from '@deepseek-ai/dsh-agent-default-model';
|
|
3
|
+
import type { AgentPresets } from '@deepseek-ai/dsh-agent-presets';
|
|
4
|
+
import type { ToolRuntime } from '@deepseek-ai/dsh-tools';
|
|
5
|
+
import type { WorkspaceRegistry } from '@deepseek-ai/dsh-workspace';
|
|
6
|
+
import type { Companion } from '../domain.js';
|
|
7
|
+
import type { PartnerStore } from '../store.js';
|
|
8
|
+
import type { ExecutionKind, ExecutionRun } from './domain.js';
|
|
9
|
+
type ExecutionContext = Context & {
|
|
10
|
+
agents: Context['agents'];
|
|
11
|
+
agentDefaultModel: AgentDefaultModelConfig;
|
|
12
|
+
agentPresets: AgentPresets;
|
|
13
|
+
tools: ToolRuntime;
|
|
14
|
+
workspaceRegistry: WorkspaceRegistry;
|
|
15
|
+
};
|
|
16
|
+
export interface EphemeralExecutionRequest {
|
|
17
|
+
kind: ExecutionKind;
|
|
18
|
+
sourceId: string;
|
|
19
|
+
companion: Companion;
|
|
20
|
+
prompt: string;
|
|
21
|
+
cwd?: string;
|
|
22
|
+
parentSessionId?: string;
|
|
23
|
+
allowedTools?: string[];
|
|
24
|
+
systemInstruction?: string;
|
|
25
|
+
timeoutMinutes?: number;
|
|
26
|
+
destroyAfterRun?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface EphemeralExecutionResult {
|
|
29
|
+
run: ExecutionRun;
|
|
30
|
+
output: string;
|
|
31
|
+
}
|
|
32
|
+
export declare class EphemeralExecutionService {
|
|
33
|
+
private readonly ctx;
|
|
34
|
+
private readonly store;
|
|
35
|
+
private readonly defaultCwd;
|
|
36
|
+
private readonly semaphore;
|
|
37
|
+
private readonly retained;
|
|
38
|
+
private readonly active;
|
|
39
|
+
private closed;
|
|
40
|
+
constructor(ctx: ExecutionContext, store: PartnerStore, defaultCwd: string);
|
|
41
|
+
execute(request: EphemeralExecutionRequest): Promise<EphemeralExecutionResult>;
|
|
42
|
+
reconcileInterruptedRuns(): Promise<number>;
|
|
43
|
+
close(): Promise<void>;
|
|
44
|
+
private run;
|
|
45
|
+
private saveRun;
|
|
46
|
+
}
|
|
47
|
+
export declare class ExecutionFailedError extends Error {
|
|
48
|
+
readonly run: ExecutionRun;
|
|
49
|
+
constructor(run: ExecutionRun);
|
|
50
|
+
}
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/execution/service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAA;AACnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAGlE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAGnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAmB,MAAM,aAAa,CAAA;AAG/E,KAAK,gBAAgB,GAAG,OAAO,GAAG;IAChC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IACzB,iBAAiB,EAAE,uBAAuB,CAAA;IAC1C,YAAY,EAAE,YAAY,CAAA;IAC1B,KAAK,EAAE,WAAW,CAAA;IAClB,iBAAiB,EAAE,iBAAiB,CAAA;CACrC,CAAA;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,aAAa,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,SAAS,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,MAAM,WAAW,wBAAwB;IAAG,GAAG,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAE/E,qBAAa,yBAAyB;IAMxB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAAoB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAAgB,OAAO,CAAC,QAAQ,CAAC,UAAU;IALrH,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwB;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiC;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IACxD,OAAO,CAAC,MAAM,CAAQ;gBAEO,GAAG,EAAE,gBAAgB,EAAmB,KAAK,EAAE,YAAY,EAAmB,UAAU,EAAE,MAAM;IAE7H,OAAO,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAKxE,wBAAwB,IAAI,OAAO,CAAC,MAAM,CAAC;IAe3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAQd,GAAG;YA4EH,OAAO;CAMtB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IACjC,QAAQ,CAAC,GAAG,EAAE,YAAY;gBAAjB,GAAG,EAAE,YAAY;CACvC"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { mkdir } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { createUserMessage } from '@deepseek-ai/dsh-llm';
|
|
5
|
+
import { appendBounded } from '../core/collections.js';
|
|
6
|
+
import { AsyncSemaphore } from '../core/semaphore.js';
|
|
7
|
+
import { assistantTextAfter, renderPartnerPersona, renderToolProtocol, resolvePartnerAgentOptions } from './agent-support.js';
|
|
8
|
+
export class EphemeralExecutionService {
|
|
9
|
+
ctx;
|
|
10
|
+
store;
|
|
11
|
+
defaultCwd;
|
|
12
|
+
semaphore = new AsyncSemaphore(3);
|
|
13
|
+
retained = new Map();
|
|
14
|
+
active = new Map();
|
|
15
|
+
closed = false;
|
|
16
|
+
constructor(ctx, store, defaultCwd) {
|
|
17
|
+
this.ctx = ctx;
|
|
18
|
+
this.store = store;
|
|
19
|
+
this.defaultCwd = defaultCwd;
|
|
20
|
+
}
|
|
21
|
+
execute(request) {
|
|
22
|
+
if (this.closed)
|
|
23
|
+
return Promise.reject(new Error('Ephemeral execution service is closed'));
|
|
24
|
+
return this.semaphore.use(() => this.run(request));
|
|
25
|
+
}
|
|
26
|
+
async reconcileInterruptedRuns() {
|
|
27
|
+
let recovered = 0;
|
|
28
|
+
await this.store.update(state => {
|
|
29
|
+
const now = Date.now();
|
|
30
|
+
for (const run of state.executionRuns) {
|
|
31
|
+
if (run.status !== 'queued' && run.status !== 'running')
|
|
32
|
+
continue;
|
|
33
|
+
run.status = 'failed';
|
|
34
|
+
run.completedAt = now;
|
|
35
|
+
run.error = 'DSH restarted before this execution completed; its durable owner will decide whether to resume it';
|
|
36
|
+
recovered += 1;
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
return recovered;
|
|
40
|
+
}
|
|
41
|
+
async close() {
|
|
42
|
+
this.closed = true;
|
|
43
|
+
for (const handle of this.active.values())
|
|
44
|
+
handle.agent.cancel({ kind: 'disposed' });
|
|
45
|
+
await Promise.all([...new Set([...this.active.values(), ...this.retained.values()])].map(handle => handle.dispose().catch(() => { })));
|
|
46
|
+
this.active.clear();
|
|
47
|
+
this.retained.clear();
|
|
48
|
+
}
|
|
49
|
+
async run(request) {
|
|
50
|
+
if (this.closed)
|
|
51
|
+
throw new Error('Ephemeral execution service is closed');
|
|
52
|
+
const sessionId = `partner-run-${randomUUID()}`;
|
|
53
|
+
const runId = `run-${randomUUID()}`;
|
|
54
|
+
const destroyAfterRun = request.destroyAfterRun ?? true;
|
|
55
|
+
const run = {
|
|
56
|
+
id: runId, kind: request.kind, ownerCompanionId: request.companion.id, sessionId, sourceId: request.sourceId,
|
|
57
|
+
status: 'running', destroyAfterRun, startedAt: Date.now(), toolNames: request.allowedTools ?? [],
|
|
58
|
+
};
|
|
59
|
+
await this.saveRun(run);
|
|
60
|
+
const cwd = request.cwd ?? join(this.defaultCwd, 'partners', request.companion.id, 'runs', runId);
|
|
61
|
+
await mkdir(cwd, { recursive: true, mode: 0o700 });
|
|
62
|
+
let handle;
|
|
63
|
+
let status = 'failed';
|
|
64
|
+
let output = '';
|
|
65
|
+
let error;
|
|
66
|
+
const timeoutMs = Math.min(120, Math.max(1, request.timeoutMinutes ?? 10)) * 60_000;
|
|
67
|
+
let timedOut = false;
|
|
68
|
+
try {
|
|
69
|
+
handle = await this.ctx.agents.create({
|
|
70
|
+
sessionId: sessionId,
|
|
71
|
+
meta: {
|
|
72
|
+
cwd,
|
|
73
|
+
...(request.parentSessionId ? { parentSession: request.parentSessionId, origin: 'subagent', delegationDepth: 1 } : {}),
|
|
74
|
+
...(request.companion.presetId ? { agentPreset: request.companion.presetId } : {}),
|
|
75
|
+
},
|
|
76
|
+
agentOptions: resolvePartnerAgentOptions(this.ctx.agentDefaultModel, request.companion),
|
|
77
|
+
setup: async (agentCtx) => {
|
|
78
|
+
const presets = agentCtx.get('agentPresets');
|
|
79
|
+
if (!presets)
|
|
80
|
+
throw new Error('Temporary partner session is missing Agent Presets');
|
|
81
|
+
await presets.mount(agentCtx, request.companion.presetId);
|
|
82
|
+
agentCtx.systemPrompt.section({ name: 'partner-identity', order: -10, text: renderPartnerPersona(request.companion, 'ephemeral') });
|
|
83
|
+
agentCtx.systemPrompt.section({ name: 'partner-tool-routing', order: -9, text: renderToolProtocol() });
|
|
84
|
+
if (request.systemInstruction)
|
|
85
|
+
agentCtx.systemPrompt.section({ name: 'partner-ephemeral-task', order: -8, text: request.systemInstruction });
|
|
86
|
+
agentCtx.tools.presentAs('native');
|
|
87
|
+
if (request.allowedTools !== undefined)
|
|
88
|
+
restrictTools(agentCtx, request.allowedTools);
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
this.active.set(sessionId, handle);
|
|
92
|
+
if (this.closed)
|
|
93
|
+
throw new Error('Ephemeral execution service closed while creating a session');
|
|
94
|
+
if (!destroyAfterRun) {
|
|
95
|
+
const workspace = await this.ctx.workspaceRegistry.create(cwd, `伙伴任务 · ${request.companion.name}`);
|
|
96
|
+
await workspace.attachSession(sessionId);
|
|
97
|
+
}
|
|
98
|
+
const startSeq = handle.agent.session.seq;
|
|
99
|
+
handle.agent.followup(createUserMessage({
|
|
100
|
+
content: [{ type: 'text', text: request.prompt }],
|
|
101
|
+
source: { kind: 'plugin', plugin: '@lemoncat7/dsh-partner', form: 'notice', summary: executionSummary(request.kind) },
|
|
102
|
+
}));
|
|
103
|
+
const timer = setTimeout(() => { timedOut = true; handle?.agent.cancel({ kind: 'hook', reason: 'partner temporary execution timed out' }); }, timeoutMs);
|
|
104
|
+
timer.unref?.();
|
|
105
|
+
try {
|
|
106
|
+
await handle.agent.whenIdle();
|
|
107
|
+
}
|
|
108
|
+
finally {
|
|
109
|
+
clearTimeout(timer);
|
|
110
|
+
}
|
|
111
|
+
output = assistantTextAfter(handle.agent, startSeq);
|
|
112
|
+
if (timedOut) {
|
|
113
|
+
status = 'timed-out';
|
|
114
|
+
error = 'Temporary execution exceeded its time limit';
|
|
115
|
+
}
|
|
116
|
+
else if (!output) {
|
|
117
|
+
status = 'failed';
|
|
118
|
+
error = 'Temporary execution produced no text result';
|
|
119
|
+
}
|
|
120
|
+
else
|
|
121
|
+
status = 'completed';
|
|
122
|
+
}
|
|
123
|
+
catch (reason) {
|
|
124
|
+
error = reason instanceof Error ? reason.message : String(reason);
|
|
125
|
+
status = timedOut ? 'timed-out' : 'failed';
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
Object.assign(run, {
|
|
129
|
+
status, completedAt: Date.now(),
|
|
130
|
+
...(output ? { outputSummary: output.slice(0, 2000) } : {}),
|
|
131
|
+
...(error ? { error } : {}),
|
|
132
|
+
});
|
|
133
|
+
await this.saveRun(run);
|
|
134
|
+
if (handle) {
|
|
135
|
+
this.active.delete(sessionId);
|
|
136
|
+
if (destroyAfterRun || status !== 'completed')
|
|
137
|
+
await handle.dispose().catch(() => { });
|
|
138
|
+
else
|
|
139
|
+
this.retained.set(sessionId, handle);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (status !== 'completed')
|
|
143
|
+
throw new ExecutionFailedError(run);
|
|
144
|
+
return { run, output };
|
|
145
|
+
}
|
|
146
|
+
async saveRun(run) {
|
|
147
|
+
await this.store.update(state => {
|
|
148
|
+
state.executionRuns = state.executionRuns.filter(item => item.id !== run.id);
|
|
149
|
+
appendBounded(state.executionRuns, structuredClone(run), 500);
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
export class ExecutionFailedError extends Error {
|
|
154
|
+
run;
|
|
155
|
+
constructor(run) {
|
|
156
|
+
super(run.error ?? 'Temporary execution failed');
|
|
157
|
+
this.run = run;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function restrictTools(ctx, requested) {
|
|
161
|
+
const agent = ctx.agent;
|
|
162
|
+
if (!agent)
|
|
163
|
+
throw new Error('Temporary agent scope is unavailable');
|
|
164
|
+
const visible = ctx.tools.schemas(agent).map(tool => tool.name).filter(name => name !== 'run_code');
|
|
165
|
+
const requestedSet = new Set(requested);
|
|
166
|
+
const allowed = visible.filter(name => requestedSet.has(name));
|
|
167
|
+
if (allowed.length > 0)
|
|
168
|
+
ctx.tools.restrict({ allow: allowed });
|
|
169
|
+
else if (visible.length > 0)
|
|
170
|
+
ctx.tools.restrict({ deny: visible });
|
|
171
|
+
}
|
|
172
|
+
function executionSummary(kind) {
|
|
173
|
+
return ({ skill: '伙伴执行 Skill', delegation: '伙伴执行委派任务', review: '伙伴核验看板任务', schedule: '伙伴执行定时任务' })[kind];
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/execution/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ToolDefinition } from '@deepseek-ai/dsh-tools';
|
|
2
|
+
export declare const HEARTBEAT_LOCAL_COMMAND = "heartbeat_local_command";
|
|
3
|
+
export interface AuthorizedHeartbeatCommand {
|
|
4
|
+
file: string;
|
|
5
|
+
args: string[];
|
|
6
|
+
command: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* One heartbeat-only command surface. It never invokes a shell and accepts only
|
|
10
|
+
* exact read-only inspection forms, so a knowledge document cannot smuggle in
|
|
11
|
+
* operators, scripts, environment changes or arbitrary executables.
|
|
12
|
+
*/
|
|
13
|
+
export declare function heartbeatLocalCommandTool(cwd: string): ToolDefinition;
|
|
14
|
+
export declare function authorizeHeartbeatCommand(command: string): AuthorizedHeartbeatCommand;
|
|
15
|
+
//# sourceMappingURL=heartbeat-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat-command.d.ts","sourceRoot":"","sources":["../src/heartbeat-command.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAE5D,eAAO,MAAM,uBAAuB,4BAA4B,CAAA;AAOhE,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAoCrE;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,0BAA0B,CAWrF"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
export const HEARTBEAT_LOCAL_COMMAND = 'heartbeat_local_command';
|
|
3
|
+
const COMMAND_TIMEOUT_MS = 8_000;
|
|
4
|
+
const COMMAND_MAX_BUFFER = 64 * 1024;
|
|
5
|
+
const COMMAND_MAX_LENGTH = 300;
|
|
6
|
+
const PACKAGE_NAME = /^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/i;
|
|
7
|
+
/**
|
|
8
|
+
* One heartbeat-only command surface. It never invokes a shell and accepts only
|
|
9
|
+
* exact read-only inspection forms, so a knowledge document cannot smuggle in
|
|
10
|
+
* operators, scripts, environment changes or arbitrary executables.
|
|
11
|
+
*/
|
|
12
|
+
export function heartbeatLocalCommandTool(cwd) {
|
|
13
|
+
return {
|
|
14
|
+
name: HEARTBEAT_LOCAL_COMMAND,
|
|
15
|
+
description: [
|
|
16
|
+
'Run one tightly controlled read-only local inspection command when a user-managed knowledge document explicitly requires that command as evidence.',
|
|
17
|
+
'Use this instead of guessing a local version from workspace files. The command runs without a shell, in the current partner workspace, with an 8 second timeout and bounded output.',
|
|
18
|
+
'Supported forms: dsh/node/npm/pnpm/yarn/python/python3/docker/podman/git version; npm or pnpm view/info <package> version|dist-tags.latest; npm list -g <package> --depth=0 --json; and a small set of read-only git status/describe/rev-parse/log commands.',
|
|
19
|
+
'Pipes, redirects, command substitution, scripts, arbitrary programs and unsupported arguments are rejected. If rejected or failed, report that the local fact was not verified; do not silently replace it with a file search.',
|
|
20
|
+
].join(' '),
|
|
21
|
+
parameters: {
|
|
22
|
+
type: 'object', additionalProperties: false,
|
|
23
|
+
properties: {
|
|
24
|
+
command: { type: 'string', description: 'Exact command from the knowledge procedure, without surrounding Markdown or sentence punctuation.' },
|
|
25
|
+
},
|
|
26
|
+
required: ['command'],
|
|
27
|
+
},
|
|
28
|
+
output: {
|
|
29
|
+
schema: { type: 'string' },
|
|
30
|
+
render: (_args, value) => [{ type: 'text', text: String(value) }],
|
|
31
|
+
},
|
|
32
|
+
presentCall: () => ({ card: 'generic', title: '核验本地状态' }),
|
|
33
|
+
timeoutMs: COMMAND_TIMEOUT_MS + 1_000,
|
|
34
|
+
isConcurrencySafe: () => true,
|
|
35
|
+
async execute(value, exec) {
|
|
36
|
+
const input = record(value);
|
|
37
|
+
if (typeof input.command !== 'string')
|
|
38
|
+
throw new Error('command must be a string');
|
|
39
|
+
const authorized = authorizeHeartbeatCommand(input.command);
|
|
40
|
+
const result = await runAuthorizedCommand(authorized, cwd, exec.signal);
|
|
41
|
+
return [
|
|
42
|
+
`Command: ${authorized.command}`,
|
|
43
|
+
`Exit code: ${result.exitCode}`,
|
|
44
|
+
result.stdout ? `stdout:\n${result.stdout}` : 'stdout: (empty)',
|
|
45
|
+
result.stderr ? `stderr:\n${result.stderr}` : '',
|
|
46
|
+
].filter(Boolean).join('\n');
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export function authorizeHeartbeatCommand(command) {
|
|
51
|
+
const normalized = command.normalize('NFKC').trim();
|
|
52
|
+
if (!normalized || normalized.length > COMMAND_MAX_LENGTH)
|
|
53
|
+
throw new Error(`command must contain 1-${COMMAND_MAX_LENGTH} characters`);
|
|
54
|
+
if (/[\r\n\0]/u.test(normalized))
|
|
55
|
+
throw new Error('multiline commands are not allowed');
|
|
56
|
+
const tokens = tokenizeCommand(normalized);
|
|
57
|
+
if (tokens.length === 0 || tokens.length > 8)
|
|
58
|
+
throw new Error('command has an unsupported number of arguments');
|
|
59
|
+
const [file, ...args] = tokens;
|
|
60
|
+
if (allowedVersionCommand(file, args) || allowedRegistryCommand(file, args) || allowedGlobalPackageQuery(file, args) || allowedGitCommand(file, args)) {
|
|
61
|
+
return { file, args, command: tokens.map(quoteDisplayToken).join(' ') };
|
|
62
|
+
}
|
|
63
|
+
throw new Error(`command is not in the heartbeat read-only allowlist: ${file}`);
|
|
64
|
+
}
|
|
65
|
+
function allowedVersionCommand(file, args) {
|
|
66
|
+
const versionArgs = {
|
|
67
|
+
dsh: ['-V', '--version'],
|
|
68
|
+
node: ['-v', '--version'],
|
|
69
|
+
npm: ['-v', '--version'],
|
|
70
|
+
pnpm: ['-v', '--version'],
|
|
71
|
+
yarn: ['-v', '--version'],
|
|
72
|
+
python: ['-V', '--version'],
|
|
73
|
+
python3: ['-V', '--version'],
|
|
74
|
+
docker: ['-v', '--version'],
|
|
75
|
+
podman: ['-v', '--version'],
|
|
76
|
+
git: ['--version'],
|
|
77
|
+
};
|
|
78
|
+
return args.length === 1 && versionArgs[file]?.includes(args[0] ?? '') === true;
|
|
79
|
+
}
|
|
80
|
+
function allowedRegistryCommand(file, args) {
|
|
81
|
+
if (file !== 'npm' && file !== 'pnpm')
|
|
82
|
+
return false;
|
|
83
|
+
if (args.length !== 3 || (args[0] !== 'view' && args[0] !== 'info'))
|
|
84
|
+
return false;
|
|
85
|
+
return PACKAGE_NAME.test(args[1] ?? '') && (args[2] === 'version' || args[2] === 'dist-tags.latest');
|
|
86
|
+
}
|
|
87
|
+
function allowedGlobalPackageQuery(file, args) {
|
|
88
|
+
if (file !== 'npm' || args.length !== 5)
|
|
89
|
+
return false;
|
|
90
|
+
return args[0] === 'list' && args[1] === '-g' && PACKAGE_NAME.test(args[2] ?? '') && args[3] === '--depth=0' && args[4] === '--json';
|
|
91
|
+
}
|
|
92
|
+
function allowedGitCommand(file, args) {
|
|
93
|
+
if (file !== 'git')
|
|
94
|
+
return false;
|
|
95
|
+
const joined = args.join('\0');
|
|
96
|
+
return new Set([
|
|
97
|
+
'status\0--short\0--branch',
|
|
98
|
+
'describe\0--tags\0--always',
|
|
99
|
+
'describe\0--tags\0--always\0--dirty',
|
|
100
|
+
'rev-parse\0HEAD',
|
|
101
|
+
'rev-parse\0--short\0HEAD',
|
|
102
|
+
'branch\0--show-current',
|
|
103
|
+
'log\0-1\0--format=%H',
|
|
104
|
+
'log\0-1\0--format=%h',
|
|
105
|
+
]).has(joined);
|
|
106
|
+
}
|
|
107
|
+
function tokenizeCommand(value) {
|
|
108
|
+
const tokens = [];
|
|
109
|
+
let current = '';
|
|
110
|
+
let quote;
|
|
111
|
+
let escaping = false;
|
|
112
|
+
let started = false;
|
|
113
|
+
for (const character of value) {
|
|
114
|
+
if (escaping) {
|
|
115
|
+
current += character;
|
|
116
|
+
escaping = false;
|
|
117
|
+
started = true;
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (character === '\\' && quote !== "'") {
|
|
121
|
+
escaping = true;
|
|
122
|
+
started = true;
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (quote !== undefined) {
|
|
126
|
+
if (character === quote)
|
|
127
|
+
quote = undefined;
|
|
128
|
+
else
|
|
129
|
+
current += character;
|
|
130
|
+
started = true;
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (character === "'" || character === '"') {
|
|
134
|
+
quote = character;
|
|
135
|
+
started = true;
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (/\s/u.test(character)) {
|
|
139
|
+
if (started) {
|
|
140
|
+
tokens.push(current);
|
|
141
|
+
current = '';
|
|
142
|
+
started = false;
|
|
143
|
+
}
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if ('|&;<>`$(){}'.includes(character))
|
|
147
|
+
throw new Error(`shell metacharacter is not allowed: ${character}`);
|
|
148
|
+
current += character;
|
|
149
|
+
started = true;
|
|
150
|
+
}
|
|
151
|
+
if (quote !== undefined || escaping)
|
|
152
|
+
throw new Error('command contains an unfinished quote or escape');
|
|
153
|
+
if (started)
|
|
154
|
+
tokens.push(current);
|
|
155
|
+
return tokens;
|
|
156
|
+
}
|
|
157
|
+
function runAuthorizedCommand(command, cwd, signal) {
|
|
158
|
+
return new Promise((resolve, reject) => {
|
|
159
|
+
execFile(command.file, command.args, {
|
|
160
|
+
cwd,
|
|
161
|
+
signal,
|
|
162
|
+
timeout: COMMAND_TIMEOUT_MS,
|
|
163
|
+
maxBuffer: COMMAND_MAX_BUFFER,
|
|
164
|
+
windowsHide: true,
|
|
165
|
+
encoding: 'utf8',
|
|
166
|
+
env: commandEnvironment(),
|
|
167
|
+
}, (error, stdout, stderr) => {
|
|
168
|
+
const output = { stdout: cleanOutput(stdout), stderr: cleanOutput(stderr), exitCode: exitCode(error) };
|
|
169
|
+
if (error !== null) {
|
|
170
|
+
const detail = output.stderr || output.stdout || error.message;
|
|
171
|
+
reject(new Error(`read-only command failed (exit ${output.exitCode}): ${detail}`));
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
resolve(output);
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
function commandEnvironment() {
|
|
179
|
+
const inherited = [
|
|
180
|
+
'PATH', 'HTTP_PROXY', 'HTTPS_PROXY', 'ALL_PROXY', 'NO_PROXY',
|
|
181
|
+
'http_proxy', 'https_proxy', 'all_proxy', 'no_proxy', 'npm_config_registry',
|
|
182
|
+
];
|
|
183
|
+
const env = {};
|
|
184
|
+
for (const name of inherited)
|
|
185
|
+
if (process.env[name] !== undefined)
|
|
186
|
+
env[name] = process.env[name];
|
|
187
|
+
return {
|
|
188
|
+
...env,
|
|
189
|
+
CI: '1', NO_COLOR: '1', PAGER: 'cat', GIT_PAGER: 'cat', GIT_TERMINAL_PROMPT: '0',
|
|
190
|
+
NPM_CONFIG_AUDIT: 'false', NPM_CONFIG_FUND: 'false', NPM_CONFIG_UPDATE_NOTIFIER: 'false', NPM_CONFIG_COLOR: 'false',
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
function cleanOutput(value) {
|
|
194
|
+
const cleaned = value.replace(/\x1B\[[0-?]*[ -/]*[@-~]/gu, '').trim();
|
|
195
|
+
return cleaned.length <= 16_000 ? cleaned : `${cleaned.slice(0, 15_999)}…`;
|
|
196
|
+
}
|
|
197
|
+
function exitCode(error) {
|
|
198
|
+
if (error === null)
|
|
199
|
+
return 0;
|
|
200
|
+
const code = error.code;
|
|
201
|
+
return typeof code === 'number' ? code : code === 'ETIMEDOUT' ? 124 : 1;
|
|
202
|
+
}
|
|
203
|
+
function quoteDisplayToken(value) {
|
|
204
|
+
return /^[a-zA-Z0-9@%_./:=+-]+$/u.test(value) ? value : JSON.stringify(value);
|
|
205
|
+
}
|
|
206
|
+
function record(value) {
|
|
207
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
208
|
+
throw new Error('arguments must be an object');
|
|
209
|
+
return value;
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=heartbeat-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat-command.js","sourceRoot":"","sources":["../src/heartbeat-command.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAOlD,OAAO,EAAE,MAAM,IAAI,YAAY,EAAiB,KAAK,MAAM,IAAI,aAAa,EAAE,MAAM,aAAa,CAAA;AAsBjG,eAAO,MAAM,MAAM,0DAAe,CAAA;AAClC,MAAM,MAAM,MAAM,GAAG,aAAa,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,eAAO,MAAM,IAAI,gBAAgB,CAAA;AACjC,eAAO,MAAM,MAAM,UAA6J,CAAA;AAYhL,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAwFnE"}
|