@agentdock/agent-runtime-core 0.0.97

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.
Files changed (231) hide show
  1. package/dist/acpTypes.d.ts +171 -0
  2. package/dist/acpTypes.js +1 -0
  3. package/dist/adapters/dingtalk.d.ts +11 -0
  4. package/dist/adapters/dingtalk.js +7 -0
  5. package/dist/adapters/feishu.d.ts +13 -0
  6. package/dist/adapters/feishu.js +1 -0
  7. package/dist/adapters/webhookClient.d.ts +8 -0
  8. package/dist/adapters/webhookClient.js +1 -0
  9. package/dist/agentSettings.d.ts +42 -0
  10. package/dist/agentSettings.js +1 -0
  11. package/dist/agentSpawnTypes.d.ts +76 -0
  12. package/dist/agentSpawnTypes.js +1 -0
  13. package/dist/agentStderrPolicy.d.ts +6 -0
  14. package/dist/agentStderrPolicy.js +1 -0
  15. package/dist/boundedSet.d.ts +12 -0
  16. package/dist/boundedSet.js +1 -0
  17. package/dist/brand.d.ts +27 -0
  18. package/dist/brand.js +1 -0
  19. package/dist/checkpointService.d.ts +40 -0
  20. package/dist/checkpointService.js +2 -0
  21. package/dist/cli-arg-access.d.ts +1 -0
  22. package/dist/cli-arg-access.js +1 -0
  23. package/dist/cli-args.d.ts +75 -0
  24. package/dist/cli-args.js +1 -0
  25. package/dist/cli-handoff-args.d.ts +22 -0
  26. package/dist/cli-handoff-args.js +1 -0
  27. package/dist/constants.d.ts +1 -0
  28. package/dist/constants.js +1 -0
  29. package/dist/containerEnvPrompt.d.ts +1 -0
  30. package/dist/containerEnvPrompt.js +1 -0
  31. package/dist/contextUsageQuery.d.ts +14 -0
  32. package/dist/contextUsageQuery.js +1 -0
  33. package/dist/conversationRollback.d.ts +12 -0
  34. package/dist/conversationRollback.js +4 -0
  35. package/dist/debugMode.d.ts +2 -0
  36. package/dist/debugMode.js +1 -0
  37. package/dist/decodeChildOutput.d.ts +12 -0
  38. package/dist/decodeChildOutput.js +1 -0
  39. package/dist/dekMethods.d.ts +9 -0
  40. package/dist/dekMethods.js +1 -0
  41. package/dist/deployment.d.ts +16 -0
  42. package/dist/deployment.js +1 -0
  43. package/dist/deploymentBinding.d.ts +15 -0
  44. package/dist/deploymentBinding.js +1 -0
  45. package/dist/directEnvelopeDelivery.d.ts +27 -0
  46. package/dist/directEnvelopeDelivery.js +1 -0
  47. package/dist/envSanitize.d.ts +14 -0
  48. package/dist/envSanitize.js +2 -0
  49. package/dist/envelopeOutbound.d.ts +8 -0
  50. package/dist/envelopeOutbound.js +1 -0
  51. package/dist/fetchRetry.d.ts +9 -0
  52. package/dist/fetchRetry.js +1 -0
  53. package/dist/fileReceiver.d.ts +32 -0
  54. package/dist/fileReceiver.js +1 -0
  55. package/dist/fileWatcher.d.ts +1 -0
  56. package/dist/fileWatcher.js +1 -0
  57. package/dist/index.d.ts +1 -0
  58. package/dist/index.js +1 -0
  59. package/dist/ingest/claudePaths.d.ts +11 -0
  60. package/dist/ingest/claudePaths.js +1 -0
  61. package/dist/ingest/claudeSessionScanner.d.ts +11 -0
  62. package/dist/ingest/claudeSessionScanner.js +1 -0
  63. package/dist/ingest/index.d.ts +3 -0
  64. package/dist/ingest/index.js +1 -0
  65. package/dist/ingest/types.d.ts +82 -0
  66. package/dist/ingest/types.js +1 -0
  67. package/dist/jsonFileUtils.d.ts +3 -0
  68. package/dist/jsonFileUtils.js +1 -0
  69. package/dist/jsonlIndexService.d.ts +26 -0
  70. package/dist/jsonlIndexService.js +1 -0
  71. package/dist/jsonrpc-stdio.d.ts +52 -0
  72. package/dist/jsonrpc-stdio.js +3 -0
  73. package/dist/keepAlive.d.ts +45 -0
  74. package/dist/keepAlive.js +1 -0
  75. package/dist/knownProjects.d.ts +3 -0
  76. package/dist/knownProjects.js +1 -0
  77. package/dist/languageSettingsFile.d.ts +3 -0
  78. package/dist/languageSettingsFile.js +1 -0
  79. package/dist/lock.d.ts +12 -0
  80. package/dist/lock.js +1 -0
  81. package/dist/logger.d.ts +16 -0
  82. package/dist/logger.js +1 -0
  83. package/dist/messageQueue.d.ts +40 -0
  84. package/dist/messageQueue.js +1 -0
  85. package/dist/migration.d.ts +1 -0
  86. package/dist/migration.js +2 -0
  87. package/dist/modeLoop.d.ts +48 -0
  88. package/dist/modeLoop.js +1 -0
  89. package/dist/notificationChannels.d.ts +14 -0
  90. package/dist/notificationChannels.js +1 -0
  91. package/dist/notificationDispatcher.d.ts +11 -0
  92. package/dist/notificationDispatcher.js +1 -0
  93. package/dist/outbox.d.ts +49 -0
  94. package/dist/outbox.js +1 -0
  95. package/dist/paths.d.ts +24 -0
  96. package/dist/paths.js +1 -0
  97. package/dist/plaintextEnvelope.d.ts +5 -0
  98. package/dist/plaintextEnvelope.js +1 -0
  99. package/dist/processTree.d.ts +9 -0
  100. package/dist/processTree.js +5 -0
  101. package/dist/registerMachineOnConnect.d.ts +5 -0
  102. package/dist/registerMachineOnConnect.js +1 -0
  103. package/dist/responseLanguage.d.ts +5 -0
  104. package/dist/responseLanguage.js +5 -0
  105. package/dist/runtimeTargetGuard.d.ts +8 -0
  106. package/dist/runtimeTargetGuard.js +1 -0
  107. package/dist/sendClearedContextUsage.d.ts +4 -0
  108. package/dist/sendClearedContextUsage.js +1 -0
  109. package/dist/serverClient.d.ts +107 -0
  110. package/dist/serverClient.js +1 -0
  111. package/dist/serverClientEventHandlers.d.ts +6 -0
  112. package/dist/serverClientEventHandlers.js +1 -0
  113. package/dist/serverClientFactory.d.ts +3 -0
  114. package/dist/serverClientFactory.js +1 -0
  115. package/dist/serverClientTypes.d.ts +67 -0
  116. package/dist/serverClientTypes.js +1 -0
  117. package/dist/serverSettingsCache.d.ts +5 -0
  118. package/dist/serverSettingsCache.js +1 -0
  119. package/dist/session/backgroundTaskHandler.d.ts +29 -0
  120. package/dist/session/backgroundTaskHandler.js +1 -0
  121. package/dist/session/interactionDetector.d.ts +32 -0
  122. package/dist/session/interactionDetector.js +1 -0
  123. package/dist/session/modeHash.d.ts +6 -0
  124. package/dist/session/modeHash.js +1 -0
  125. package/dist/session/sessionBridge.d.ts +44 -0
  126. package/dist/session/sessionBridge.js +7 -0
  127. package/dist/session/sessionCompactBoundaryMapper.d.ts +17 -0
  128. package/dist/session/sessionCompactBoundaryMapper.js +1 -0
  129. package/dist/session/sessionMapper.d.ts +36 -0
  130. package/dist/session/sessionMapper.js +1 -0
  131. package/dist/session/sourceAgentRouting.d.ts +3 -0
  132. package/dist/session/sourceAgentRouting.js +1 -0
  133. package/dist/session/textAccumulator.d.ts +21 -0
  134. package/dist/session/textAccumulator.js +1 -0
  135. package/dist/session/turnTiming.d.ts +15 -0
  136. package/dist/session/turnTiming.js +1 -0
  137. package/dist/session/turnUsage.d.ts +17 -0
  138. package/dist/session/turnUsage.js +1 -0
  139. package/dist/session/workflowTracker.d.ts +63 -0
  140. package/dist/session/workflowTracker.js +1 -0
  141. package/dist/sessionBootstrap.d.ts +21 -0
  142. package/dist/sessionBootstrap.js +13 -0
  143. package/dist/sessionDeliveryDraft.d.ts +17 -0
  144. package/dist/sessionDeliveryDraft.js +1 -0
  145. package/dist/sessionDeliveryProtocol.d.ts +22 -0
  146. package/dist/sessionDeliveryProtocol.js +3 -0
  147. package/dist/sessionDeliverySubmit.d.ts +13 -0
  148. package/dist/sessionDeliverySubmit.js +1 -0
  149. package/dist/sessionDeliveryTool.d.ts +10 -0
  150. package/dist/sessionDeliveryTool.js +3 -0
  151. package/dist/sessionHandoffSystemPrompt.d.ts +10 -0
  152. package/dist/sessionHandoffSystemPrompt.js +3 -0
  153. package/dist/sessionMcpBootstrap.d.ts +13 -0
  154. package/dist/sessionMcpBootstrap.js +1 -0
  155. package/dist/sessionMcpInjection.d.ts +41 -0
  156. package/dist/sessionMcpInjection.js +1 -0
  157. package/dist/sessionMcpServer.d.ts +2 -0
  158. package/dist/sessionMcpServer.js +2 -0
  159. package/dist/sessionPrompt.d.ts +7 -0
  160. package/dist/sessionPrompt.js +3 -0
  161. package/dist/sessionRegistry.d.ts +42 -0
  162. package/dist/sessionRegistry.js +1 -0
  163. package/dist/sessionStatsCollector.d.ts +20 -0
  164. package/dist/sessionStatsCollector.js +1 -0
  165. package/dist/shellSanitizer.d.ts +1 -0
  166. package/dist/shellSanitizer.js +1 -0
  167. package/dist/shutdownHelper.d.ts +24 -0
  168. package/dist/shutdownHelper.js +1 -0
  169. package/dist/skillCache.d.ts +4 -0
  170. package/dist/skillCache.js +1 -0
  171. package/dist/skillParser.d.ts +20 -0
  172. package/dist/skillParser.js +6 -0
  173. package/dist/spawnConsole.d.ts +9 -0
  174. package/dist/spawnConsole.js +21 -0
  175. package/dist/startAbortHandler.d.ts +15 -0
  176. package/dist/startAbortHandler.js +1 -0
  177. package/dist/startAcpInitialPrompt.d.ts +51 -0
  178. package/dist/startAcpInitialPrompt.js +7 -0
  179. package/dist/startAcpPermission.d.ts +20 -0
  180. package/dist/startAcpPermission.js +1 -0
  181. package/dist/startAcpSwitchHelpers.d.ts +52 -0
  182. package/dist/startAcpSwitchHelpers.js +1 -0
  183. package/dist/startCancelTaskHandler.d.ts +17 -0
  184. package/dist/startCancelTaskHandler.js +1 -0
  185. package/dist/startCommandDaemonDebug.d.ts +8 -0
  186. package/dist/startCommandDaemonDebug.js +1 -0
  187. package/dist/startCommandRuntime.d.ts +162 -0
  188. package/dist/startCommandRuntime.js +5 -0
  189. package/dist/startCommandTypes.d.ts +33 -0
  190. package/dist/startCommandTypes.js +1 -0
  191. package/dist/startRpcHandler.d.ts +41 -0
  192. package/dist/startRpcHandler.js +1 -0
  193. package/dist/state.d.ts +29 -0
  194. package/dist/state.js +1 -0
  195. package/dist/statsAccumulator.d.ts +50 -0
  196. package/dist/statsAccumulator.js +1 -0
  197. package/dist/statsBuckets.d.ts +55 -0
  198. package/dist/statsBuckets.js +1 -0
  199. package/dist/subagentIds.d.ts +1 -0
  200. package/dist/subagentIds.js +1 -0
  201. package/dist/suggestedOptionsPrompt.d.ts +16 -0
  202. package/dist/suggestedOptionsPrompt.js +7 -0
  203. package/dist/taskTitle.d.ts +3 -0
  204. package/dist/taskTitle.js +1 -0
  205. package/dist/telemetryCollector.d.ts +15 -0
  206. package/dist/telemetryCollector.js +1 -0
  207. package/dist/terminalReset.d.ts +1 -0
  208. package/dist/terminalReset.js +1 -0
  209. package/dist/titleUpdater.d.ts +25 -0
  210. package/dist/titleUpdater.js +1 -0
  211. package/dist/tokenAuth.d.ts +6 -0
  212. package/dist/tokenAuth.js +1 -0
  213. package/dist/toolResultTruncation.d.ts +3 -0
  214. package/dist/toolResultTruncation.js +5 -0
  215. package/dist/transport.d.ts +13 -0
  216. package/dist/transport.js +1 -0
  217. package/dist/typeGuards.d.ts +7 -0
  218. package/dist/typeGuards.js +1 -0
  219. package/dist/userConfig.d.ts +5 -0
  220. package/dist/userConfig.js +1 -0
  221. package/dist/version.d.ts +1 -0
  222. package/dist/version.g.d.ts +1 -0
  223. package/dist/version.g.js +1 -0
  224. package/dist/version.js +1 -0
  225. package/dist/waitForConnection.d.ts +2 -0
  226. package/dist/waitForConnection.js +1 -0
  227. package/dist/windowsCommandShim.d.ts +6 -0
  228. package/dist/windowsCommandShim.js +1 -0
  229. package/dist/zombieReaper.d.ts +34 -0
  230. package/dist/zombieReaper.js +1 -0
  231. package/package.json +42 -0
@@ -0,0 +1,171 @@
1
+ export type ProcessState = 'idle' | 'running' | 'error' | 'disposed';
2
+
3
+ export interface AgentMessageRouting {
4
+ readonly parentToolUseId?: string;
5
+
6
+ readonly sourceAgent?: {
7
+ readonly threadId: string;
8
+ readonly label: string;
9
+
10
+ readonly parentSpawnCallId?: string;
11
+ };
12
+ }
13
+
14
+ export type AgentMessage = ({
15
+ readonly type: 'text';
16
+ readonly content: string;
17
+ readonly thinking: boolean;
18
+ } & AgentMessageRouting) | ({
19
+ readonly type: 'tool-call';
20
+ readonly toolCallId: string;
21
+ readonly toolName: string;
22
+ readonly input: unknown;
23
+
24
+ readonly toolTitle?: string;
25
+
26
+ readonly atomic?: boolean;
27
+ } & AgentMessageRouting) | ({
28
+ readonly type: 'tool-result';
29
+ readonly toolCallId: string;
30
+ readonly output: string;
31
+ readonly isError: boolean;
32
+ } & AgentMessageRouting) | {
33
+ readonly type: 'status';
34
+ readonly status: 'idle' | 'working' | 'error' | 'cancelled';
35
+ } | {
36
+ readonly type: 'error';
37
+ readonly message: string;
38
+ } | {
39
+ readonly type: 'warning';
40
+ readonly message: string;
41
+ } | ({
42
+ readonly type: 'permission-request';
43
+ readonly requestId: string;
44
+ readonly toolCallId: string;
45
+ readonly toolName: string;
46
+ readonly input: unknown;
47
+
48
+ readonly toolTitle?: string;
49
+ } & AgentMessageRouting) | {
50
+ readonly type: 'result';
51
+ readonly totalCostUsd?: number;
52
+ readonly inputTokens?: number;
53
+ readonly outputTokens?: number;
54
+ readonly durationMs?: number;
55
+ readonly cliSessionId?: string;
56
+ readonly isError?: boolean;
57
+
58
+ readonly errorMessage?: string;
59
+ readonly numTurns?: number;
60
+ } | {
61
+ readonly type: 'usage';
62
+ readonly model?: string;
63
+ readonly inputTokens: number;
64
+ readonly outputTokens: number;
65
+ readonly cacheReadTokens: number;
66
+ readonly cacheWriteTokens: number;
67
+ } | {
68
+ readonly type: 'session-id';
69
+ readonly cliSessionId: string;
70
+ } | {
71
+ readonly type: 'event';
72
+ readonly name: string;
73
+ readonly payload: unknown;
74
+ } | {
75
+ readonly type: 'task-lifecycle';
76
+ readonly subtype: 'task_started' | 'task_progress' | 'task_notification' | 'task_updated';
77
+ readonly taskId: string;
78
+ readonly toolUseId?: string;
79
+ readonly taskType?: string;
80
+ readonly taskStatus?: 'completed' | 'failed' | 'stopped' | 'killed' | 'pending' | 'running';
81
+ readonly description?: string;
82
+ readonly summary?: string;
83
+ readonly isBackgrounded?: boolean;
84
+ readonly taskUsage?: {
85
+ readonly totalTokens: number;
86
+ readonly toolUses: number;
87
+ readonly durationMs: number;
88
+ };
89
+ } | {
90
+ readonly type: 'tool-progress';
91
+ readonly toolUseId: string;
92
+ readonly toolName: string;
93
+ readonly parentToolUseId: string | null;
94
+ readonly elapsedTimeSeconds: number;
95
+ readonly taskId?: string;
96
+ } | {
97
+ readonly type: 'compact-boundary';
98
+
99
+ readonly trigger: 'manual' | 'auto' | 'unknown';
100
+ readonly preTokens?: number;
101
+ readonly postTokens?: number;
102
+ readonly durationMs?: number;
103
+
104
+ readonly summary?: string;
105
+ } | {
106
+ readonly type: 'hook-event';
107
+ readonly subtype: 'hook_started' | 'hook_response';
108
+ readonly hookName?: string;
109
+ readonly hookEvent?: string;
110
+ readonly hookMessage?: string;
111
+ } | {
112
+
113
+ readonly type: 'collaboration';
114
+ readonly action: 'started' | 'interacted' | 'interrupted' | 'waiting' | 'resumed' | 'closed';
115
+ readonly agent: {
116
+ readonly threadId: string;
117
+ readonly label: string;
118
+ };
119
+ };
120
+
121
+ export type MessageListener = (message: AgentMessage) => void;
122
+
123
+ export type CompactThreadResult = {
124
+ readonly status: 'compacted';
125
+ readonly threadId: string;
126
+ } | {
127
+ readonly status: 'aborted';
128
+ } | {
129
+ readonly status: 'failed';
130
+ readonly reason?: string;
131
+ };
132
+
133
+ export interface AgentBackend {
134
+
135
+ start(): Promise<void>;
136
+
137
+ sendMessage(text: string, images?: ReadonlyArray<{
138
+ data: string;
139
+ mediaType: string;
140
+ }>, messageUuid?: string): Promise<void>;
141
+
142
+ cancel(): Promise<void>;
143
+
144
+ dispose(): Promise<void>;
145
+
146
+ onMessage(listener: MessageListener): void;
147
+
148
+ onSessionId?(listener: (id: string) => void): void;
149
+
150
+ getState(): ProcessState;
151
+
152
+ resolvePermission?: (requestId: string, approved: boolean, reason?: string, inputOverrides?: Record<string, unknown>) => Promise<void>;
153
+
154
+ addAllowedTools?: (tools: readonly string[]) => void;
155
+
156
+ getAllowedTools?: () => readonly string[];
157
+
158
+ setPermissionMode?: (mode: string) => void;
159
+
160
+ setAutoApproveEdits?: (value: boolean) => void;
161
+
162
+ getCurrentModel?: () => string | undefined;
163
+
164
+ switchModel?: (modelId: string) => Promise<boolean>;
165
+
166
+ switchMode?: (modeId: string) => Promise<boolean>;
167
+
168
+ compactThread?: () => Promise<CompactThreadResult>;
169
+
170
+ sendControlRequest?: (subtype: string, params: Record<string, unknown>) => Promise<Record<string, unknown>>;
171
+ }
@@ -0,0 +1 @@
1
+ "use strict";export{};
@@ -0,0 +1,11 @@
1
+ export interface DingtalkMarkdownParams {
2
+ readonly title: string;
3
+ readonly body: string;
4
+ readonly footer?: string;
5
+ }
6
+ export declare function sendDingtalkMarkdown(webhookUrl: string, params: DingtalkMarkdownParams): Promise<{
7
+ ok: true;
8
+ } | {
9
+ ok: false;
10
+ error: string;
11
+ }>;
@@ -0,0 +1,7 @@
1
+ "use strict";import{postWebhookJson as k}from"./webhookClient.js";function i(o){const n=o;return n.errcode!==0?`dingtalk error: ${n.errmsg??"unknown"}`:null}export async function sendDingtalkMarkdown(o,n){const t=n.footer||"",r=t?`
2
+
3
+ > CCPark \xB7 ${t}`:`
4
+
5
+ > CCPark`,e={msgtype:"markdown",markdown:{title:"CCPark \u901A\u77E5",text:`## ${n.title}
6
+
7
+ ${n.body}${r}`}};return k(o,e,i,"dingtalk")}
@@ -0,0 +1,13 @@
1
+ export interface FeishuCardParams {
2
+ readonly title: string;
3
+ readonly body: string;
4
+ readonly color: 'red' | 'yellow' | 'green' | 'blue';
5
+ readonly footer: string;
6
+ readonly url?: string;
7
+ }
8
+ export declare function sendFeishuCard(webhookUrl: string, params: FeishuCardParams): Promise<{
9
+ ok: true;
10
+ } | {
11
+ ok: false;
12
+ error: string;
13
+ }>;
@@ -0,0 +1 @@
1
+ "use strict";import{postWebhookJson as r}from"./webhookClient.js";function i(n){const t=n;return t.code!==0?`feishu error: ${t.msg??"unknown"}`:null}export async function sendFeishuCard(n,t){const e=[{tag:"div",text:{tag:"lark_md",content:t.body}}];t.url&&e.push({tag:"action",actions:[{tag:"button",text:{tag:"plain_text",content:"\u67E5\u770B\u8BE6\u60C5"},type:"default",url:t.url}]}),e.push({tag:"hr"}),e.push({tag:"note",elements:[{tag:"plain_text",content:`CCPark \xB7 ${t.footer}`}]});const o={msg_type:"interactive",card:{header:{title:{tag:"plain_text",content:t.title},template:t.color},elements:e}};return r(n,o,i,"feishu")}
@@ -0,0 +1,8 @@
1
+ export declare const IM_WEBHOOK_TIMEOUT_MS = 10000;
2
+
3
+ export declare function postWebhookJson(webhookUrl: string, payload: unknown, parseResponse: (json: unknown) => string | null, adapterName: string): Promise<{
4
+ ok: true;
5
+ } | {
6
+ ok: false;
7
+ error: string;
8
+ }>;
@@ -0,0 +1 @@
1
+ "use strict";export const IM_WEBHOOK_TIMEOUT_MS=1e4;export async function postWebhookJson(e,n,s,r){try{const t=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n),signal:AbortSignal.timeout(1e4)});if(!t.ok){const i=await t.text().catch(()=>"");return{ok:!1,error:`${r} returned ${t.status}: ${i.slice(0,200)}`}}const a=await t.json(),o=s(a);return o!==null?{ok:!1,error:o}:{ok:!0}}catch(t){return{ok:!1,error:`${r} fetch failed: ${String(t)}`}}}
@@ -0,0 +1,42 @@
1
+ import type { AgentSettings, AgentEnvConfig, ModelSource, LocalAgentSettings } from '@agentdock/wire';
2
+ import type { Logger } from './logger.js';
3
+ export declare function projectAiHelperConfig(settings: LocalAgentSettings): AgentSettings['aiHelper'];
4
+
5
+ export declare function sanitizeAgentSettingsForRpc(settings: AgentSettings): Record<string, unknown>;
6
+
7
+ export declare function mergeAgentSettings(settings: LocalAgentSettings, update: AgentSettings): LocalAgentSettings;
8
+
9
+ export declare function mergeAiHelperEnabled(settings: LocalAgentSettings, enabled: boolean): LocalAgentSettings;
10
+ export declare function getAgentSettingsPath(): string;
11
+
12
+ export declare function loadAgentSettings(): LocalAgentSettings;
13
+
14
+ export declare function loadAgentSettingsForRpc(): AgentSettings;
15
+
16
+ export declare function updateAgentSettings(update: AgentSettings): {
17
+ ok: true;
18
+ } | {
19
+ ok: false;
20
+ error: string;
21
+ };
22
+
23
+ export declare function validateAgentSettingsFile(log?: Logger): {
24
+ ok: true;
25
+ data: LocalAgentSettings;
26
+ } | {
27
+ ok: false;
28
+ error: string;
29
+ };
30
+
31
+ export declare function saveAgentSettings(settings: LocalAgentSettings): void;
32
+
33
+ export declare function resolveAgentEnv(agentType: string, overrideEnv?: Record<string, string>): Record<string, string> | undefined;
34
+ export declare function buildEnvFromConfig(config: AgentEnvConfig): Record<string, string>;
35
+
36
+ export declare function getAllCustomModels(): Record<string, readonly {
37
+ id: string;
38
+ displayName: string;
39
+ isDefault: boolean;
40
+ hidden: boolean;
41
+ source: ModelSource;
42
+ }[]>;
@@ -0,0 +1 @@
1
+ "use strict";import y from"node:path";import h from"node:fs";import{AgentSettingsSchema as x,LocalAgentSettingsSchema as f,AiHelperConfigSchema as S,AGENT_ENV_NONE as p,SPAWNABLE_AGENTS as A,getAgentCapability as P}from"@agentdock/wire";import{getDaemonDir as b}from"./paths.js";import{readJsonFile as d,writeJsonFile as E}from"./jsonFileUtils.js";import{errnoCode as m,isRecord as c}from"./typeGuards.js";const H="agent-settings.json";export function projectAiHelperConfig(e){return e.aiHelper?{enabled:e.aiHelper.enabled}:void 0}export function sanitizeAgentSettingsForRpc(e){const{notification:t,aiHelper:r,...o}=e,s={};for(const[n,i]of Object.entries(o))if(n==="defaults"||typeof i=="object"&&i!==null&&!Array.isArray(i)){const a=i,{customEnv:g,...l}=a;s[n]=l}else s[n]=i;return r&&(s.aiHelper=r),s}export function mergeAgentSettings(e,t){const r={...e};for(const[o,s]of Object.entries(t))if(!(o==="version"||s===void 0))if(typeof s=="object"&&s!==null&&!Array.isArray(s)){const n=r[o]??{};r[o]={...n,...s}}else r[o]=s;return r}export function mergeAiHelperEnabled(e,t){return mergeAgentSettings(e,{aiHelper:{enabled:t}})}export function getAgentSettingsPath(){return y.join(b(),H)}function u(){return getAgentSettingsPath()}export function loadAgentSettings(){const e=d(u(),null);if(e===null)return{};if(c(e)&&e.version!==void 0&&e.version!==1)return{};const t=f.safeParse(e);return t.success?t.data:{}}export function loadAgentSettingsForRpc(){const e=d(u(),null);if(e===null)return{};if(c(e)&&e.version!==void 0&&e.version!==1)return{};const t=f.safeParse(e);if(t.success){const{version:g,aiHelper:l,...v}=t.data;return{...v,aiHelper:projectAiHelperConfig({aiHelper:l})}}if(!c(e))return{};const r=e,{aiHelper:o,version:s,...n}=r,i=x.omit({aiHelper:!0}).safeParse(n),a=c(o)&&typeof o.enabled=="boolean"?S.safeParse({enabled:o.enabled}):{success:!1};return i.success&&a.success?{...i.data,aiHelper:a.data}:{}}export function updateAgentSettings(e){const t=d(u(),null);return t!==null&&!c(t)?{ok:!1,error:"agent-settings-local-config-invalid"}:c(t)&&t.version!==void 0&&t.version!==1?{ok:!1,error:"agent-settings-local-config-version-unsupported"}:(saveAgentSettings(mergeAgentSettings(t??{},e)),{ok:!0})}export function validateAgentSettingsFile(e){const t=u();let r;try{r=h.readFileSync(t,"utf-8")}catch(n){if(m(n)!=="ENOENT"){const i=`agent-settings.json could not be read: ${n instanceof Error?n.message:String(n)}`;return e?.warn({err:n,errno:m(n),filePath:t,module:"daemon:settings"},i),{ok:!1,error:i}}return{ok:!0,data:{}}}let o;try{o=JSON.parse(r)}catch(n){return e&&e.warn({err:n,module:"daemon:settings"},"agent-settings.json contains invalid JSON"),{ok:!1,error:`Invalid JSON: ${String(n)}`}}const s=f.safeParse(o);return s.success?{ok:!0,data:s.data}:(e&&e.warn({error:s.error.message,module:"daemon:settings"},"agent-settings.json failed schema validation"),{ok:!1,error:s.error.message})}export function saveAgentSettings(e){E(u(),{version:1,...e})}function j(e,t){const r=(n,i)=>{if(n!==p)return n??i},o=e?.customEnv||t?.customEnv?Object.fromEntries(Object.entries({...e?.customEnv,...t?.customEnv}).filter(([,n])=>n!==p)):void 0,s=e?.customModels||t?.customModels?[...e?.customModels??[],...t?.customModels??[]]:void 0;return{httpProxy:r(t?.httpProxy,e?.httpProxy),httpsProxy:r(t?.httpsProxy,e?.httpsProxy),customEnv:o&&Object.keys(o).length>0?o:void 0,customModels:s&&s.length>0?s:void 0}}export function resolveAgentEnv(e,t){const r=loadAgentSettings(),o=r[e],s=j(r.defaults,o),n=buildEnvFromConfig(s);if(!(Object.keys(n).length===0&&!t))return{...n,...t}}export function buildEnvFromConfig(e){const t={};if(e.httpProxy&&(t.HTTP_PROXY=e.httpProxy,t.http_proxy=e.httpProxy),e.httpsProxy&&(t.HTTPS_PROXY=e.httpsProxy,t.https_proxy=e.httpsProxy),e.customEnv)for(const[r,o]of Object.entries(e.customEnv))t[r]=o;return t}export function getAllCustomModels(){const e=loadAgentSettings(),t={};for(const r of A){if(!P(r).acceptsCustomModels)continue;const o=e.defaults?.customModels??[],n=(c(e)?e[r]:void 0)?.customModels??[],i=new Map;for(const a of o)i.set(a.id,{id:a.id,displayName:a.label,isDefault:!1,hidden:!1,source:"custom"});for(const a of n)i.set(a.id,{id:a.id,displayName:a.label,isDefault:!1,hidden:!1,source:"custom"});i.size>0&&(t[r]=[...i.values()])}return t}
@@ -0,0 +1,76 @@
1
+ import type { AccountLanguage, ModelSource } from '@agentdock/wire';
2
+ import type { Logger } from './logger.js';
3
+
4
+ export interface AgentSpawnConfig {
5
+ readonly cwd: string;
6
+ readonly prompt: string;
7
+
8
+ readonly responseLanguage?: AccountLanguage;
9
+ readonly env?: Record<string, string>;
10
+ readonly customCommand?: string;
11
+ readonly customArgs?: readonly string[];
12
+ readonly model?: string;
13
+ readonly appendSystemPrompt?: string;
14
+ readonly allowedTools?: readonly string[];
15
+ readonly disallowedTools?: readonly string[];
16
+ readonly mcpConfig?: string;
17
+ readonly mcpServers?: readonly {
18
+ readonly name: string;
19
+ readonly command: string;
20
+ readonly args?: readonly string[];
21
+ readonly env?: Readonly<Record<string, string>>;
22
+ }[];
23
+ readonly developerInstructions?: string;
24
+ readonly permissionMode?: string;
25
+ readonly resumeSessionId?: string;
26
+ readonly maxTurns?: number;
27
+ readonly onSessionId?: (id: string) => void;
28
+ readonly onModelsRefreshed?: (models: readonly {
29
+ id: string;
30
+ displayName: string;
31
+ isDefault: boolean;
32
+ hidden: boolean;
33
+ source?: ModelSource;
34
+ }[]) => void;
35
+ readonly onModesRefreshed?: (modes: readonly {
36
+ id: string;
37
+ label: string;
38
+ }[]) => void;
39
+ readonly onStderr?: (line: string) => void;
40
+ readonly onCompatibilityFailure?: (failure: {
41
+ readonly detectedVersion: string | null;
42
+ readonly reasonCode: 'protocol_handshake_failed' | 'required_capability_missing';
43
+ readonly policyVersion: string;
44
+ readonly stage: 'acp_initialize';
45
+ }) => void;
46
+ readonly logger?: Logger;
47
+ readonly isScheduled?: boolean;
48
+ readonly systemPrompt?: string;
49
+ readonly systemPromptFile?: string;
50
+ readonly appendSystemPromptFile?: string;
51
+ readonly fallbackModel?: string;
52
+ readonly maxBudgetUsd?: number;
53
+ readonly tools?: readonly string[];
54
+ readonly effort?: 'low' | 'medium' | 'high' | 'xhigh' | 'max';
55
+ readonly addDirs?: readonly string[];
56
+ readonly agent?: string;
57
+ readonly agents?: string;
58
+ readonly jsonSchema?: string;
59
+ readonly strictMcpConfig?: boolean;
60
+ readonly chrome?: boolean;
61
+ readonly worktree?: boolean | string;
62
+ readonly forkSession?: boolean;
63
+ readonly sessionId?: string;
64
+ readonly settings?: string;
65
+ readonly betas?: readonly string[];
66
+ readonly brief?: boolean;
67
+ readonly noSessionPersistence?: boolean;
68
+ readonly includePartialMessages?: boolean;
69
+ readonly replayUserMessages?: boolean;
70
+ readonly settingSources?: string;
71
+ readonly disableSlashCommands?: boolean;
72
+ readonly files?: readonly string[];
73
+ readonly pluginDirs?: readonly string[];
74
+ readonly dangerouslySkipPermissions?: boolean;
75
+ readonly allowDangerouslySkipPermissions?: boolean;
76
+ }
@@ -0,0 +1 @@
1
+ "use strict";export{};
@@ -0,0 +1,6 @@
1
+ import type { Logger } from './logger.js';
2
+ export declare const AGENT_STDERR_SUPPRESSED = "[agent stderr suppressed]";
3
+ export declare function agentStderrBytes(value: string): number;
4
+ export declare function logAgentStderr(log: Logger, module: string, line: string): void;
5
+ export declare function agentProcessExitMessage(code: number | null, stderr: string): string;
6
+ export declare function redactedAgentStderr(stderr: string): string;
@@ -0,0 +1 @@
1
+ "use strict";export const AGENT_STDERR_SUPPRESSED="[agent stderr suppressed]";export function agentStderrBytes(e){return Buffer.byteLength(e,"utf8")}export function logAgentStderr(e,r,t){e.debug({source:"agent-stderr",module:r,stderrBytes:agentStderrBytes(t)},"agent emitted stderr; raw output suppressed")}export function agentProcessExitMessage(e,r){const t=`process exited (code ${e??"null"})`;return r?`${t}; stderr suppressed`:t}export function redactedAgentStderr(e){return e?AGENT_STDERR_SUPPRESSED:""}
@@ -0,0 +1,12 @@
1
+ export declare class BoundedSet<T> {
2
+ private readonly set;
3
+ private readonly queue;
4
+ private readonly maxSize;
5
+ constructor(maxSize: number);
6
+
7
+ has(value: T): boolean;
8
+
9
+ add(value: T): this;
10
+
11
+ get size(): number;
12
+ }
@@ -0,0 +1 @@
1
+ "use strict";export class BoundedSet{set=new Set;queue=[];maxSize;constructor(e){if(e<1)throw new Error("BoundedSet maxSize must be >= 1");this.maxSize=e}has(e){return this.set.has(e)}add(e){if(this.set.has(e))return this;if(this.set.size>=this.maxSize){const t=this.queue.shift();t!==void 0&&this.set.delete(t)}return this.set.add(e),this.queue.push(e),this}get size(){return this.set.size}}
@@ -0,0 +1,27 @@
1
+ import type { AccountLanguage } from '@agentdock/wire';
2
+ export interface BrandConfig {
3
+
4
+ readonly npmPkg: string;
5
+
6
+ readonly binCommand: string;
7
+
8
+ readonly dataDir: string;
9
+
10
+ readonly scope: string;
11
+
12
+ readonly daemonPkg: string;
13
+
14
+ readonly description: string;
15
+
16
+ readonly serverUrl: string;
17
+
18
+ readonly defaultAccountLanguage: AccountLanguage;
19
+ }
20
+
21
+ export declare function detectBrandFromPath(url?: string): BrandConfig | undefined;
22
+
23
+ export declare function getBrand(): BrandConfig;
24
+
25
+ export declare function getDefaultBrand(): BrandConfig;
26
+
27
+ export declare function isAltBrand(): boolean;
package/dist/brand.js ADDED
@@ -0,0 +1 @@
1
+ "use strict";import{fileURLToPath as s}from"node:url";const r={agentdock:{npmPkg:"agentdock",binCommand:"agentdock",dataDir:".agentdock",scope:"@agentdock",daemonPkg:"@agentdock/daemon",description:"AgentDock",serverUrl:"https://agentdock-api.yungujia.com",defaultAccountLanguage:"zh-Hans"},yarkai:{npmPkg:"yarkai",binCommand:"yarkai",dataDir:".yarkai",scope:"@agentdock",daemonPkg:"@agentdock/daemon",description:"YarkAI",serverUrl:"https://app-api.yark.ai",defaultAccountLanguage:"en"},ccpark:{npmPkg:"ccpark",binCommand:"ccpark",dataDir:".ccpark",scope:"@agentdock",daemonPkg:"@agentdock/daemon",description:"CCPark",serverUrl:"https://ccpark-api.yungujia.com",defaultAccountLanguage:"zh-Hans"}},d="agentdock",a=new Map;export function detectBrandFromPath(n){const t=(n??s(import.meta.url)).replace(/\\/g,"/");for(const e of Object.values(r)){const c=`node_modules/${e.npmPkg}/node_modules/${e.daemonPkg}`;if(t.includes(`/${c}/`))return e}}export function getBrand(){const n=process.env.AGENTDOCK_NPM_PACKAGE;if(n){const o=a.get(n);if(o)return o;const i=r[n];if(i)return a.set(n,i),i}const t="__path__";if(!a.has(t)){const o=detectBrandFromPath();o&&a.set(t,o)}const e=a.get(t);if(e)return e;const c=r[d];return a.set(d,c),c}export function getDefaultBrand(){return r[d]}export function isAltBrand(){return getBrand().npmPkg!==d}
@@ -0,0 +1,40 @@
1
+ import type { Logger } from './logger.js';
2
+ import type { CheckpointEntry, CheckpointDiffResult, CheckpointRollbackResult, RollbackMode } from '@agentdock/wire';
3
+ interface TrackedFileBackup {
4
+ backupFileName: string | null;
5
+ version: number;
6
+ backupTime: string;
7
+ }
8
+ interface ParsedSnapshot {
9
+ messageId: string;
10
+ trackedFileBackups: Record<string, TrackedFileBackup>;
11
+ timestamp: string;
12
+ }
13
+
14
+ export declare function findJsonlPath(claudeSessionId: string, home?: string): Promise<string | null>;
15
+
16
+ export declare function parseSnapshots(jsonlPath: string): Promise<ParsedSnapshot[]>;
17
+
18
+ export declare function listCheckpoints(claudeSessionId: string, home?: string): Promise<CheckpointEntry[]>;
19
+
20
+ export declare function diffCheckpoint(claudeSessionId: string, messageId: string, home?: string): Promise<CheckpointDiffResult>;
21
+
22
+ export declare function rollbackCheckpoint(claudeSessionId: string, target: {
23
+ messageId?: string;
24
+ timestamp?: string;
25
+ toolCallId?: string;
26
+ }, opts?: {
27
+ force?: boolean;
28
+ home?: string;
29
+ log?: Logger;
30
+ mode?: RollbackMode;
31
+ }): Promise<CheckpointRollbackResult>;
32
+
33
+ export declare function rewindFilesViaClaude(sendControl: (subtype: string, params: Record<string, unknown>) => Promise<Record<string, unknown>>, userMessageId: string, dryRun?: boolean): Promise<{
34
+ canRewind: boolean;
35
+ error?: string;
36
+ filesChanged?: number;
37
+ insertions?: number;
38
+ deletions?: number;
39
+ }>;
40
+ export {};
@@ -0,0 +1,2 @@
1
+ "use strict";import{createReadStream as E}from"node:fs";import{createInterface as z}from"node:readline";import{join as j,dirname as N,isAbsolute as I,resolve as L,sep as R}from"node:path";import{copyFile as J,unlink as _,stat as D,readFile as O,mkdir as U,readFile as q}from"node:fs/promises";import{getClaudeHome as A,getProjectsDir as H,decodeProjectDirName as V}from"./ingest/claudePaths.js";import{listJsonlFiles as W}from"./ingest/claudeSessionScanner.js";import{truncateConversation as $}from"./conversationRollback.js";import{isRecord as P}from"./typeGuards.js";function B(n,o){return j(A(o),"file-history",n)}export async function findJsonlPath(n,o){const r=H(o);let d;try{const{readdir:t}=await import("node:fs/promises");d=(await t(r,{withFileTypes:!0})).filter(i=>i.isDirectory()).map(i=>i.name)}catch{return null}for(const t of d){const e=j(r,t);if((await W(e)).includes(n))return j(e,`${n}.jsonl`)}return null}export async function parseSnapshots(n){const o=[],r=z({input:E(n),crlfDelay:1/0});for await(const d of r)if(d.includes("file-history-snapshot"))try{const t=JSON.parse(d);if(!P(t)||t.type!=="file-history-snapshot")continue;const e=P(t.snapshot)?t.snapshot:void 0,i=(typeof t.messageId=="string"?t.messageId:void 0)??(e&&typeof e.messageId=="string"?e.messageId:void 0),p=t.trackedFileBackups??e?.trackedFileBackups,k=(typeof t.timestamp=="string"?t.timestamp:void 0)??(e&&typeof e.timestamp=="string"?e.timestamp:void 0);if(!i||!p||!k)continue;o.push({messageId:i,trackedFileBackups:p,timestamp:k})}catch{}return o}export async function listCheckpoints(n,o){const r=await findJsonlPath(n,o);return r?(await parseSnapshots(r)).map((t,e)=>({messageId:t.messageId,timestamp:t.timestamp,trackedFileCount:Object.keys(t.trackedFileBackups).length,sequence:e})):[]}export async function diffCheckpoint(n,o,r){const d=await findJsonlPath(n,r);if(!d)return{files:[],hasExternalChanges:!1,externallyModifiedFiles:[]};const e=(await parseSnapshots(d)).find(f=>f.messageId===o);if(!e)return{files:[],hasExternalChanges:!1,externallyModifiedFiles:[]};const i=[],p=[],k=new Date(e.timestamp).getTime(),m=B(n,r);for(const[f,T]of Object.entries(e.trackedFileBackups)){let F=!1,g=0,y=0;try{const w=await D(f);F=!0,g=w.size,y=w.mtimeMs}catch{}if(T.backupFileName===null)F&&i.push({filePath:f,status:"created",currentSize:g,snapshotSize:0});else{const w=j(m,T.backupFileName);let C=0;try{C=(await D(w)).size}catch{}if(!F)i.push({filePath:f,status:"deleted",currentSize:0,snapshotSize:C});else if(g!==C)i.push({filePath:f,status:"modified",currentSize:g,snapshotSize:C});else try{const x=await O(f),s=await O(w);x.equals(s)||i.push({filePath:f,status:"modified",currentSize:g,snapshotSize:C})}catch{i.push({filePath:f,status:"modified",currentSize:g,snapshotSize:C})}}F&&y>k&&p.push(f)}return{files:i,hasExternalChanges:p.length>0,externallyModifiedFiles:p}}export async function rollbackCheckpoint(n,o,r){const d=r?.force??!1,t=r?.home,e=r?.log,i=r?.mode??"code",p=await findJsonlPath(n,t);if(!p)return e?.warn({claudeSessionId:n,module:"daemon:checkpoint"},"rollback: jsonl not found"),{restoredCount:0,deletedCount:0,skippedFiles:[],mode:i};const k=await parseSnapshots(p);let m;if(o.messageId)m=k.find(s=>s.messageId===o.messageId);else if(o.timestamp){const s=new Date(o.timestamp).getTime(),h=12e4;let u,l;for(let c=k.length-1;c>=0;c--){const a=k[c];if(!a)continue;if(new Date(a.timestamp).getTime()<=s){u=a;break}}for(let c=k.length-1;c>=0;c--){const a=k[c];if(!a)continue;const v=new Date(a.timestamp).getTime();if(v>s&&v<=s+h){l=a;break}}l&&(!u||Object.keys(l.trackedFileBackups).length>Object.keys(u.trackedFileBackups).length)?m=l:m=u}const f=i==="code"||i==="both",T=i==="conversation"||i==="both";if(i==="code"&&!m)return e?.warn({claudeSessionId:n,target:o,totalSnapshots:k.length,module:"daemon:checkpoint"},"rollback: no matching checkpoint found for code restore"),{restoredCount:0,deletedCount:0,skippedFiles:[],mode:i};let F=0,g=0;const y=[];let w=0,C,x;if(f&&m){const s=B(n,t),h=new Date(m.timestamp).getTime(),u=N(p),l=u.split(/[/\\]/).pop()??u,c=V(l);for(const a of Object.keys(m.trackedFileBackups)){const v=m.trackedFileBackups[a];if(!v)continue;const b=I(a)?a:L(c,a);if(!I(a)&&b!==c&&!b.startsWith(c+R)){e?.warn({rawPath:a,projectRoot:c,module:"daemon:checkpoint"},"rollback skipped file escaping project root"),y.push(b);continue}if(!d)try{if((await D(b)).mtimeMs>h){y.push(b);continue}}catch{}if(v.backupFileName===null)try{await _(b),g++}catch{y.push(b)}else{const M=j(s,v.backupFileName);try{await U(N(b),{recursive:!0}),await J(M,b),F++}catch{y.push(b)}}}}if(T){let s;if(o.messageId){s=o.messageId;try{const h=await q(p,"utf-8");for(const u of h.split(`
2
+ `))if(u.includes(o.messageId)){const l=JSON.parse(u);P(l)&&typeof l.timestamp=="string"&&(C=l.timestamp);break}}catch{}}else if(o.toolCallId){const{buildOneTimeIndex:h,walkToUserPrompt:u}=await import("./jsonlIndexService.js");e?.info({claudeSessionId:n,toolCallId:o.toolCallId,module:"daemon:checkpoint"},"rollback: building on-demand JSONL index");const{index:l,targetEntry:c}=await h(p,o.toolCallId);if(e?.info({claudeSessionId:n,uuidEntries:l.uuidMap.size,totalLines:l.totalLines,foundTarget:!!c,module:"daemon:checkpoint"},"rollback: on-demand index built"),c){const a=u(l,c.uuid);a?(s=a.uuid,e?.info({claudeSessionId:n,toolCallId:o.toolCallId,targetUuid:c.uuid.slice(0,16),pivotUuid:s.slice(0,16),pivotLine:a.line,hops:0,module:"daemon:checkpoint"},"rollback: pivot found via on-demand index")):e?.warn({claudeSessionId:n,toolCallId:o.toolCallId,module:"daemon:checkpoint"},"rollback: walkToUserPrompt returned null \u2014 no user prompt found in chain")}else e?.warn({claudeSessionId:n,toolCallId:o.toolCallId,uuidEntries:l.uuidMap.size,module:"daemon:checkpoint"},"rollback: toolCallId not found in JSONL")}if(s){x=s,e?.info({claudeSessionId:n,mode:i,pivotMsgId:s,jsonlPath:p,module:"daemon:checkpoint"},"rollback: truncating conversation");try{const h=await $(p,s);w=h.truncatedCount,e?.info({claudeSessionId:n,pivotMsgId:s,pivotLine:h.pivotLine,truncatedMessageCount:w,module:"daemon:checkpoint"},"rollback: conversation truncated")}catch(h){e?.warn({claudeSessionId:n,pivotMsgId:s,error:String(h),module:"daemon:checkpoint"},"rollback: conversation truncation failed")}}else e?.warn({claudeSessionId:n,target:o,module:"daemon:checkpoint"},"rollback: no pivot message found for conversation truncation")}return e?.info({claudeSessionId:n,mode:i,restoredCount:F,deletedCount:g,skippedCount:y.length,truncatedMessageCount:w,snapshotTimestamp:m?.timestamp,module:"daemon:checkpoint"},"rollback completed"),y.length>0&&e?.warn({claudeSessionId:n,skippedFiles:y,module:"daemon:checkpoint"},"rollback: some files were skipped"),{restoredCount:F,deletedCount:g,skippedFiles:y,truncatedMessageCount:w,pivotTimestamp:C,pivotMessageUuid:x,mode:i}}export async function rewindFilesViaClaude(n,o,r){const d=await n("rewind_files",{user_message_id:o,dry_run:r??!1}),t=P(d.response)?d.response:{};return{canRewind:t.canRewind===!0,error:typeof t.error=="string"?t.error:void 0,filesChanged:typeof t.filesChanged=="number"?t.filesChanged:void 0,insertions:typeof t.insertions=="number"?t.insertions:void 0,deletions:typeof t.deletions=="number"?t.deletions:void 0}}
@@ -0,0 +1 @@
1
+ export declare function reqArg(arr: readonly string[], i: number): string;
@@ -0,0 +1 @@
1
+ "use strict";export function reqArg(n,r){const e=n[r];if(e===void 0)throw new Error(`Missing required argument at index ${r}`);return e}
@@ -0,0 +1,75 @@
1
+ export { reqArg } from './cli-arg-access.js';
2
+
3
+ export declare function optArg(arr: readonly string[], i: number): string | undefined;
4
+
5
+ export type CommandName = 'start' | 'stop' | 'restart' | 'status' | 'pair' | 'unpair' | 'run' | 'add-device' | 'invite' | 'handoff' | 'stats' | 'upgrade' | 'daemon' | 'debug' | 'config' | 'help' | 'version';
6
+
7
+ export interface StartOptions {
8
+ readonly port?: number;
9
+ readonly detach?: boolean;
10
+ readonly server?: string;
11
+ readonly token?: string;
12
+ readonly label?: string;
13
+ readonly json?: boolean;
14
+ readonly model?: string;
15
+ readonly permissionMode?: string;
16
+ readonly resume?: string;
17
+
18
+ readonly name?: string;
19
+
20
+ readonly profile?: string;
21
+
22
+ readonly registry?: string;
23
+
24
+ readonly yes?: boolean;
25
+
26
+ readonly agent?: string;
27
+
28
+ readonly extraArgs?: readonly string[];
29
+
30
+ readonly appendSystemPrompt?: string;
31
+
32
+ readonly source?: string;
33
+
34
+ readonly serverSessionId?: string;
35
+
36
+ readonly spawnToken?: string;
37
+
38
+ readonly takeoverToken?: string;
39
+
40
+ readonly sessionBootstrapFile?: string;
41
+ }
42
+
43
+ export interface RunOptions {
44
+ readonly agent?: string;
45
+ readonly prompt?: string;
46
+ readonly cwd?: string;
47
+ readonly model?: string;
48
+ readonly permissionMode?: string;
49
+ readonly maxTurns?: number;
50
+ readonly appendSystemPrompt?: string;
51
+ readonly resume?: string;
52
+
53
+ readonly server?: string;
54
+ }
55
+
56
+ export interface InviteOptions {
57
+ readonly label?: string;
58
+ }
59
+ import type { HandoffOptions } from './cli-handoff-args.js';
60
+ export type { HandoffOptions };
61
+
62
+ export interface CliCommand {
63
+ readonly command: CommandName;
64
+ readonly options: StartOptions;
65
+ readonly runOptions?: RunOptions;
66
+ readonly inviteOptions?: InviteOptions;
67
+ readonly handoffOptions?: HandoffOptions;
68
+ readonly debugAction?: 'on' | 'off';
69
+ readonly configSubcommand?: 'list' | 'get' | 'set' | 'unset';
70
+ readonly configKey?: string;
71
+ readonly configValue?: string;
72
+ }
73
+ export declare const VALID_AGENTS: Set<string>;
74
+
75
+ export declare function parseArgs(args: readonly string[]): CliCommand;
@@ -0,0 +1 @@
1
+ "use strict";import{CLI_AGENT_TYPES as h}from"@agentdock/wire";import{parseHandoffCommand as a}from"./cli-handoff-args.js";import{reqArg as r}from"./cli-arg-access.js";export{reqArg}from"./cli-arg-access.js";const u=new Set(["start","stop","restart","status","pair","unpair","run","add-device","invite","handoff","stats","upgrade","daemon","debug","config","help"]);export function optArg(e,t){return e[t]}function v(e){return u.has(e)}export const VALID_AGENTS=new Set(h);export function parseArgs(e){if(e.length===0)return{command:"start",options:{agent:"claude"}};const t=r(e,0);if(t==="--help"||t==="-h")return{command:"help",options:{}};if(t==="--version"||t==="-v")return{command:"version",options:{}};if(VALID_AGENTS.has(t))return m(["start",...e]);if(t==="start")return m(e);if(t.startsWith("-")&&!u.has(t))return m(["start",...e]);if(!v(t))return{command:"help",options:{}};const i=t,o=c(e);if(i==="stats"){const n=e.includes("--json");return{command:i,options:{json:n,profile:o}}}if(i==="run")return b(e);if(i==="add-device"||i==="invite")return k(e);if(i==="handoff")return a(e);if(i==="daemon")return d("daemon",e);if(i==="pair")return d("pair",e);if(i==="debug"){const n=optArg(e,1);return{command:i,options:{profile:o},debugAction:n==="on"||n==="off"?n:void 0}}if(i==="config")return y(e);if(i==="upgrade"){const n=p(e,"--registry"),s=e.includes("--yes");return{command:i,options:{profile:o,registry:n,yes:s}}}if(i==="unpair"){const n=p(e,"--server"),s=e.includes("--yes");return{command:i,options:{profile:o,server:n,yes:s}}}if(i==="restart"){const n=p(e,"--server");return{command:i,options:{profile:o,server:n}}}return{command:i,options:{profile:o}}}function p(e,t){for(let i=1;i<e.length;i++)if(e[i]===t&&i+1<e.length)return r(e,i+1)}function c(e){for(let t=1;t<e.length;t++)if(e[t]==="--profile"&&t+1<e.length)return r(e,t+1)}const S=new Set(["--port","--server","--token","--model","--permission-mode","--resume","--name","--profile","--detach","--agent","--source","--server-session-id","--spawn-token","--takeover-token","--session-bootstrap-file","--daemon-gen"]);function m(e){const t={};let i=!1;const o=[];for(let n=1;n<e.length;n++){const s=r(e,n);if(!i&&!s.startsWith("-")&&VALID_AGENTS.has(s))t.agent=s,i=!0;else if(s==="--port"&&n+1<e.length){const l=r(e,n+1),f=parseInt(l,10);!isNaN(f)&&f>0&&(t.port=f),n++}else if(s==="--server"&&n+1<e.length)t.server=r(e,n+1),n++;else if(s==="--token"&&n+1<e.length)t.token=r(e,n+1),n++;else if(s==="--model"&&n+1<e.length)t.model=r(e,n+1),n++;else if(s==="--permission-mode"&&n+1<e.length)t.permissionMode=r(e,n+1),n++;else if(s==="--resume"&&n+1<e.length)t.resume=r(e,n+1),n++;else if(s==="--name"&&n+1<e.length)t.name=r(e,n+1),n++;else if(s==="--profile"&&n+1<e.length)t.profile=r(e,n+1),n++;else if(s==="--detach")t.detach=!0;else if(s==="--agent"&&n+1<e.length)t.agent=r(e,n+1),i=!0,n++;else if(s==="--append-system-prompt"&&n+1<e.length)t.appendSystemPrompt=r(e,n+1),n++;else if(s==="--source"&&n+1<e.length)t.source=r(e,n+1),n++;else if(s==="--server-session-id"&&n+1<e.length)t.serverSessionId=r(e,n+1),n++;else if(s==="--spawn-token"&&n+1<e.length)t.spawnToken=r(e,n+1),n++;else if(s==="--takeover-token"&&n+1<e.length)t.takeoverToken=r(e,n+1),n++;else if(s==="--session-bootstrap-file"&&n+1<e.length)t.sessionBootstrapFile=r(e,n+1),n++;else if(s==="--daemon-gen"&&n+1<e.length)n++;else if(s.startsWith("-")&&!S.has(s)&&(o.push(s),n+1<e.length)){const l=r(e,n+1);l.startsWith("-")||(o.push(l),n++)}}return t.agent||(t.agent="claude"),o.length>0&&(t.extraArgs=o),{command:"start",options:t}}function d(e,t){const i={};for(let o=1;o<t.length;o++){const n=r(t,o);if(n==="--port"&&o+1<t.length){const s=r(t,o+1),l=parseInt(s,10);!isNaN(l)&&l>0&&(i.port=l),o++}else n==="--server"&&o+1<t.length?(i.server=r(t,o+1),o++):n==="--token"&&o+1<t.length?(i.token=r(t,o+1),o++):n==="--label"&&o+1<t.length?(i.label=r(t,o+1),o++):n==="--model"&&o+1<t.length?(i.model=r(t,o+1),o++):n==="--permission-mode"&&o+1<t.length?(i.permissionMode=r(t,o+1),o++):n==="--resume"&&o+1<t.length?(i.resume=r(t,o+1),o++):n==="--name"&&o+1<t.length?(i.name=r(t,o+1),o++):n==="--profile"&&o+1<t.length?(i.profile=r(t,o+1),o++):n==="--detach"&&(i.detach=!0)}return{command:e,options:i}}function b(e){const t={};let i=!1;for(let o=1;o<e.length;o++){const n=r(e,o);if((n==="-p"||n==="--prompt")&&o+1<e.length)t.prompt=r(e,o+1),o++;else if(n==="--cwd"&&o+1<e.length)t.cwd=r(e,o+1),o++;else if(n==="--model"&&o+1<e.length)t.model=r(e,o+1),o++;else if(n==="--permission-mode"&&o+1<e.length)t.permissionMode=r(e,o+1),o++;else if(n==="--max-turns"&&o+1<e.length){const s=parseInt(r(e,o+1),10);!isNaN(s)&&s>0&&(t.maxTurns=s),o++}else n==="--append-system-prompt"&&o+1<e.length?(t.appendSystemPrompt=r(e,o+1),o++):n==="--server"&&o+1<e.length?(t.server=r(e,o+1),o++):n==="--resume"&&o+1<e.length?(t.resume=r(e,o+1),o++):!i&&!n.startsWith("-")&&VALID_AGENTS.has(n)&&(t.agent=n,i=!0)}return{command:"run",options:{},runOptions:t}}function k(e){const t={};for(let i=1;i<e.length;i++)r(e,i)==="--label"&&i+1<e.length&&(t.label=r(e,i+1),i++);return{command:"add-device",options:{},inviteOptions:t}}function y(e){const t=optArg(e,1),i=c(e);if(!t||t==="list")return{command:"config",options:{profile:i},configSubcommand:"list"};const o=optArg(e,2);return t==="get"||t==="unset"?o?{command:"config",options:{profile:i},configSubcommand:t,configKey:o}:{command:"help",options:{}}:t==="set"?!o||e[3]===void 0?{command:"help",options:{}}:{command:"config",options:{profile:i},configSubcommand:"set",configKey:o,configValue:r(e,3)}:{command:"help",options:{}}}
@@ -0,0 +1,22 @@
1
+ export interface HandoffOptions {
2
+ readonly sessionId?: string;
3
+ readonly title?: string;
4
+ readonly summary?: string;
5
+ readonly brief?: string;
6
+ readonly briefFile?: string;
7
+ readonly sourceReferences: readonly string[];
8
+ readonly server?: string;
9
+ }
10
+ export declare function parseHandoffCommand(args: readonly string[]): {
11
+ command: "handoff";
12
+ options: {};
13
+ handoffOptions: {
14
+ sourceReferences: string[];
15
+ server: string | undefined;
16
+ briefFile?: string | undefined;
17
+ brief: string | undefined;
18
+ summary?: string | undefined;
19
+ title?: string | undefined;
20
+ sessionId: string | undefined;
21
+ };
22
+ };
@@ -0,0 +1 @@
1
+ "use strict";import{reqArg as l}from"./cli-arg-access.js";export function parseHandoffCommand(t){const h=[];let m,f,i,r,o,s;for(let e=1;e<t.length;e++){const n=l(t,e);n==="--session"&&e+1<t.length?m=l(t,++e):n==="--title"&&e+1<t.length?f=l(t,++e):n==="--summary"&&e+1<t.length?i=l(t,++e):n==="--brief"&&e+1<t.length?r=l(t,++e):n==="--brief-file"&&e+1<t.length?o=l(t,++e):n==="--source-reference"&&e+1<t.length?h.push(l(t,++e)):n==="--server"&&e+1<t.length&&(s=l(t,++e))}return{command:"handoff",options:{},handoffOptions:{sessionId:m,...f?{title:f}:{},...i?{summary:i}:{},brief:r,...o?{briefFile:o}:{},sourceReferences:h,server:s}}}
@@ -0,0 +1 @@
1
+ export declare const DEFAULT_SERVER = "https://agentdock-api.yungujia.com";
@@ -0,0 +1 @@
1
+ "use strict";export const DEFAULT_SERVER="https://agentdock-api.yungujia.com";
@@ -0,0 +1 @@
1
+ export declare const ENTERPRISE_CONTAINER_ENV_PROMPT = "## \u8FD0\u884C\u73AF\u5883\uFF1A\u4F01\u4E1A\u7248\u5BB9\u5668\n\n\u4F60\u6B63\u8FD0\u884C\u5728\u4E00\u4E2A **Docker \u5BB9\u5668** \u4E2D\uFF0C\u62E5\u6709\u5B8C\u6574\u7684 Linux \u7CFB\u7EDF\u8BBF\u95EE\u6743\u9650\u3002\n\n### \u7CFB\u7EDF\u6743\u9650\n\n- \u5F53\u524D\u7528\u6237 `agent`\uFF0C\u62E5\u6709 **passwordless sudo**\u3002\n- `sudo apt install`\u3001`sudo pip install`\u3001`sudo npm install -g` \u5747\u53EF\u6B63\u5E38\u4F7F\u7528\u3002\n- \u6587\u4EF6\u7CFB\u7EDF\u5B8C\u5168\u53EF\u5199\uFF08\u975E\u53EA\u8BFB\uFF09\u3002\n\n### \u6301\u4E45\u5316\u8BF4\u660E\n\n\u5BB9\u5668\u5347\u7EA7\u65F6\u4EE5\u4E0B\u8DEF\u5F84\u7684\u6570\u636E**\u4F1A\u4FDD\u7559**\uFF08bind mount \u5230\u5BBF\u4E3B\u673A\uFF09\uFF1A\n\n| \u8DEF\u5F84 | \u7528\u9014 |\n|------|------|\n| `/workspace` | \u7528\u6237\u5DE5\u4F5C\u533A |\n| `/home/agent/.claude` | Claude Code \u8BBE\u7F6E\u548C\u4F1A\u8BDD |\n| `/home/agent/.local` | \u7528\u6237\u672C\u5730\u5305\uFF08`npm install -g` \u9ED8\u8BA4\u5199\u8FD9\u91CC\uFF09 |\n| `/home/agent/.cache` | \u5305\u7BA1\u7406\u5668\u7F13\u5B58 |\n| `/home/agent/.config` | \u7528\u6237\u7EA7\u914D\u7F6E |\n\n\u4EE5\u4E0B\u8DEF\u5F84\u5347\u7EA7\u540E**\u4F1A\u4E22\u5931**\uFF08\u5EFA\u8BAE\u7528 git \u7BA1\u7406\uFF09\uFF1A\n\n| \u8DEF\u5F84 | \u8BF4\u660E |\n|------|------|\n| `/tmp` | \u4E34\u65F6\u6587\u4EF6\uFF08tmpfs\uFF0C\u4E0A\u9650 256MB\uFF09 |\n| \u7CFB\u7EDF\u8DEF\u5F84\uFF08`/usr`, `/etc` \u7B49\uFF09 | apt \u5B89\u88C5\u7684\u7CFB\u7EDF\u5305 |\n\n> **\u91CD\u8981**\uFF1A`sudo apt install` \u5B89\u88C5\u7684\u7CFB\u7EDF\u5305\u5728\u5BB9\u5668\u5347\u7EA7\u540E\u4F1A\u4E22\u5931\u3002\u5982\u9700\u6301\u4E45\u5316\u7CFB\u7EDF\u7EA7\u8F6F\u4EF6\uFF0C\u8BF7\u5728 `/workspace` \u6216 `~/.local` \u4E2D\u5B89\u88C5 portable \u7248\u672C\u3002\n\n### \u64CD\u4F5C\u6307\u5F15\n\n1. **`sudo apt install <pkg>`**\uFF1A\u5B89\u88C5\u7CFB\u7EDF\u5305\uFF08\u5347\u7EA7\u540E\u4F1A\u4E22\u5931\uFF0C\u9700\u8981\u65F6\u91CD\u88C5\u5373\u53EF\uFF09\u3002\n2. **`npm install -g`**\uFF1A\u9ED8\u8BA4\u5199\u5165 `~/.local`\uFF0C\u5347\u7EA7\u540E\u4FDD\u7559\u3002\u5B89\u88C5\u540E\u7684\u547D\u4EE4\u5728 `~/.local/bin` \u4E0B\uFF0C\u5DF2\u52A0\u5165 PATH\u3002\n3. **`pip install --user`**\uFF1A\u5199\u5165 `~/.local`\uFF0C\u5347\u7EA7\u540E\u4FDD\u7559\u3002\n4. **`npx`**\uFF1A\u65E0\u9700\u5B89\u88C5\u5373\u53EF\u8FD0\u884C\uFF0C\u63A8\u8350\u4F18\u5148\u4F7F\u7528\u3002\n5. **`pnpm`/`yarn`**\uFF1A\u5728 `/workspace` \u5185\u6B63\u5E38\u4F7F\u7528\u3002\n6. **`curl`/`wget`**\uFF1A\u4E0B\u8F7D\u6587\u4EF6\u6B63\u5E38\u53EF\u7528\u3002\n\n### \u5DF2\u9884\u88C5\u7684\u5DE5\u5177\n\n`git`\u3001`curl`\u3001`ps`\uFF08procps\uFF09\u3001`sudo`\u3001`node`\uFF08\u542B npm/npx\uFF09";
@@ -0,0 +1 @@
1
+ "use strict";export const ENTERPRISE_CONTAINER_ENV_PROMPT="## \u8FD0\u884C\u73AF\u5883\uFF1A\u4F01\u4E1A\u7248\u5BB9\u5668\n\n\u4F60\u6B63\u8FD0\u884C\u5728\u4E00\u4E2A **Docker \u5BB9\u5668** \u4E2D\uFF0C\u62E5\u6709\u5B8C\u6574\u7684 Linux \u7CFB\u7EDF\u8BBF\u95EE\u6743\u9650\u3002\n\n### \u7CFB\u7EDF\u6743\u9650\n\n- \u5F53\u524D\u7528\u6237 `agent`\uFF0C\u62E5\u6709 **passwordless sudo**\u3002\n- `sudo apt install`\u3001`sudo pip install`\u3001`sudo npm install -g` \u5747\u53EF\u6B63\u5E38\u4F7F\u7528\u3002\n- \u6587\u4EF6\u7CFB\u7EDF\u5B8C\u5168\u53EF\u5199\uFF08\u975E\u53EA\u8BFB\uFF09\u3002\n\n### \u6301\u4E45\u5316\u8BF4\u660E\n\n\u5BB9\u5668\u5347\u7EA7\u65F6\u4EE5\u4E0B\u8DEF\u5F84\u7684\u6570\u636E**\u4F1A\u4FDD\u7559**\uFF08bind mount \u5230\u5BBF\u4E3B\u673A\uFF09\uFF1A\n\n| \u8DEF\u5F84 | \u7528\u9014 |\n|------|------|\n| `/workspace` | \u7528\u6237\u5DE5\u4F5C\u533A |\n| `/home/agent/.claude` | Claude Code \u8BBE\u7F6E\u548C\u4F1A\u8BDD |\n| `/home/agent/.local` | \u7528\u6237\u672C\u5730\u5305\uFF08`npm install -g` \u9ED8\u8BA4\u5199\u8FD9\u91CC\uFF09 |\n| `/home/agent/.cache` | \u5305\u7BA1\u7406\u5668\u7F13\u5B58 |\n| `/home/agent/.config` | \u7528\u6237\u7EA7\u914D\u7F6E |\n\n\u4EE5\u4E0B\u8DEF\u5F84\u5347\u7EA7\u540E**\u4F1A\u4E22\u5931**\uFF08\u5EFA\u8BAE\u7528 git \u7BA1\u7406\uFF09\uFF1A\n\n| \u8DEF\u5F84 | \u8BF4\u660E |\n|------|------|\n| `/tmp` | \u4E34\u65F6\u6587\u4EF6\uFF08tmpfs\uFF0C\u4E0A\u9650 256MB\uFF09 |\n| \u7CFB\u7EDF\u8DEF\u5F84\uFF08`/usr`, `/etc` \u7B49\uFF09 | apt \u5B89\u88C5\u7684\u7CFB\u7EDF\u5305 |\n\n> **\u91CD\u8981**\uFF1A`sudo apt install` \u5B89\u88C5\u7684\u7CFB\u7EDF\u5305\u5728\u5BB9\u5668\u5347\u7EA7\u540E\u4F1A\u4E22\u5931\u3002\u5982\u9700\u6301\u4E45\u5316\u7CFB\u7EDF\u7EA7\u8F6F\u4EF6\uFF0C\u8BF7\u5728 `/workspace` \u6216 `~/.local` \u4E2D\u5B89\u88C5 portable \u7248\u672C\u3002\n\n### \u64CD\u4F5C\u6307\u5F15\n\n1. **`sudo apt install <pkg>`**\uFF1A\u5B89\u88C5\u7CFB\u7EDF\u5305\uFF08\u5347\u7EA7\u540E\u4F1A\u4E22\u5931\uFF0C\u9700\u8981\u65F6\u91CD\u88C5\u5373\u53EF\uFF09\u3002\n2. **`npm install -g`**\uFF1A\u9ED8\u8BA4\u5199\u5165 `~/.local`\uFF0C\u5347\u7EA7\u540E\u4FDD\u7559\u3002\u5B89\u88C5\u540E\u7684\u547D\u4EE4\u5728 `~/.local/bin` \u4E0B\uFF0C\u5DF2\u52A0\u5165 PATH\u3002\n3. **`pip install --user`**\uFF1A\u5199\u5165 `~/.local`\uFF0C\u5347\u7EA7\u540E\u4FDD\u7559\u3002\n4. **`npx`**\uFF1A\u65E0\u9700\u5B89\u88C5\u5373\u53EF\u8FD0\u884C\uFF0C\u63A8\u8350\u4F18\u5148\u4F7F\u7528\u3002\n5. **`pnpm`/`yarn`**\uFF1A\u5728 `/workspace` \u5185\u6B63\u5E38\u4F7F\u7528\u3002\n6. **`curl`/`wget`**\uFF1A\u4E0B\u8F7D\u6587\u4EF6\u6B63\u5E38\u53EF\u7528\u3002\n\n### \u5DF2\u9884\u88C5\u7684\u5DE5\u5177\n\n`git`\u3001`curl`\u3001`ps`\uFF08procps\uFF09\u3001`sudo`\u3001`node`\uFF08\u542B npm/npx\uFF09";