@jingyi0605/codingns 0.3.6 → 0.4.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.
Files changed (185) hide show
  1. package/README.md +3 -0
  2. package/bin/codingns.mjs +489 -1
  3. package/dist/public/assets/{TerminalPage-D00S4KM6.js → TerminalPage-6jHZV9Mh.js} +17 -17
  4. package/dist/public/assets/index-CSVhg7I8.js +123 -0
  5. package/dist/public/assets/index-Ce1VX19m.css +1 -0
  6. package/dist/public/index.html +2 -2
  7. package/dist/server/modules/assistant-capability/assistant-capability-controller.d.ts +173 -0
  8. package/dist/server/modules/assistant-capability/assistant-capability-controller.js +307 -0
  9. package/dist/server/modules/assistant-capability/assistant-capability-controller.js.map +1 -1
  10. package/dist/server/modules/assistant-capability/assistant-capability-service.d.ts +199 -2
  11. package/dist/server/modules/assistant-capability/assistant-capability-service.js +565 -3
  12. package/dist/server/modules/assistant-capability/assistant-capability-service.js.map +1 -1
  13. package/dist/server/modules/butler/assistant-automation-service.d.ts +110 -0
  14. package/dist/server/modules/butler/assistant-automation-service.js +786 -0
  15. package/dist/server/modules/butler/assistant-automation-service.js.map +1 -0
  16. package/dist/server/modules/butler/assistant-automation-trigger.d.ts +94 -0
  17. package/dist/server/modules/butler/assistant-automation-trigger.js +400 -0
  18. package/dist/server/modules/butler/assistant-automation-trigger.js.map +1 -0
  19. package/dist/server/modules/butler/assistant-sandbox-service.d.ts +55 -0
  20. package/dist/server/modules/butler/assistant-sandbox-service.js +266 -0
  21. package/dist/server/modules/butler/assistant-sandbox-service.js.map +1 -0
  22. package/dist/server/modules/butler/butler-action-context-service.d.ts +4 -1
  23. package/dist/server/modules/butler/butler-action-context-service.js +8 -2
  24. package/dist/server/modules/butler/butler-action-context-service.js.map +1 -1
  25. package/dist/server/modules/butler/butler-control-session-service.d.ts +8 -1
  26. package/dist/server/modules/butler/butler-control-session-service.js +154 -40
  27. package/dist/server/modules/butler/butler-control-session-service.js.map +1 -1
  28. package/dist/server/modules/butler/butler-control-timer-scheduler.d.ts +32 -0
  29. package/dist/server/modules/butler/butler-control-timer-scheduler.js +93 -0
  30. package/dist/server/modules/butler/butler-control-timer-scheduler.js.map +1 -0
  31. package/dist/server/modules/butler/butler-control-timer-service.d.ts +42 -0
  32. package/dist/server/modules/butler/butler-control-timer-service.js +132 -0
  33. package/dist/server/modules/butler/butler-control-timer-service.js.map +1 -0
  34. package/dist/server/modules/butler/butler-controller.d.ts +42 -2
  35. package/dist/server/modules/butler/butler-controller.js +79 -12
  36. package/dist/server/modules/butler/butler-controller.js.map +1 -1
  37. package/dist/server/modules/butler/butler-follow-up-service.d.ts +9 -1
  38. package/dist/server/modules/butler/butler-follow-up-service.js +273 -181
  39. package/dist/server/modules/butler/butler-follow-up-service.js.map +1 -1
  40. package/dist/server/modules/butler/butler-inbox-analysis-service.d.ts +4 -1
  41. package/dist/server/modules/butler/butler-inbox-analysis-service.js +18 -4
  42. package/dist/server/modules/butler/butler-inbox-analysis-service.js.map +1 -1
  43. package/dist/server/modules/butler/butler-profile-service.js +2 -5
  44. package/dist/server/modules/butler/butler-profile-service.js.map +1 -1
  45. package/dist/server/modules/butler/butler-project-service.d.ts +3 -1
  46. package/dist/server/modules/butler/butler-project-service.js +7 -1
  47. package/dist/server/modules/butler/butler-project-service.js.map +1 -1
  48. package/dist/server/modules/butler/butler-session-service.d.ts +3 -1
  49. package/dist/server/modules/butler/butler-session-service.js +12 -1
  50. package/dist/server/modules/butler/butler-session-service.js.map +1 -1
  51. package/dist/server/modules/butler/butler-session-summary-service.js +2 -1
  52. package/dist/server/modules/butler/butler-session-summary-service.js.map +1 -1
  53. package/dist/server/modules/butler/butler-workspace-context.d.ts +3 -0
  54. package/dist/server/modules/butler/butler-workspace-context.js +164 -44
  55. package/dist/server/modules/butler/butler-workspace-context.js.map +1 -1
  56. package/dist/server/modules/butler/patrol-execution-service.js +2 -1
  57. package/dist/server/modules/butler/patrol-execution-service.js.map +1 -1
  58. package/dist/server/modules/butler/provider-adapter-registry.d.ts +3 -0
  59. package/dist/server/modules/butler/provider-adapter-registry.js +18 -1
  60. package/dist/server/modules/butler/provider-adapter-registry.js.map +1 -1
  61. package/dist/server/modules/butler/verification-run-service.d.ts +9 -2
  62. package/dist/server/modules/butler/verification-run-service.js +188 -34
  63. package/dist/server/modules/butler/verification-run-service.js.map +1 -1
  64. package/dist/server/modules/debug-target/debug-target-controller.js +1 -1
  65. package/dist/server/modules/debug-target/debug-target-controller.js.map +1 -1
  66. package/dist/server/modules/debug-target/debug-target-service.d.ts +7 -2
  67. package/dist/server/modules/debug-target/debug-target-service.js +563 -100
  68. package/dist/server/modules/debug-target/debug-target-service.js.map +1 -1
  69. package/dist/server/modules/git/git-command-helper-client.d.ts +1 -0
  70. package/dist/server/modules/git/git-command-helper-client.js +19 -26
  71. package/dist/server/modules/git/git-command-helper-client.js.map +1 -1
  72. package/dist/server/modules/git/git-command-runner.js +19 -1
  73. package/dist/server/modules/git/git-command-runner.js.map +1 -1
  74. package/dist/server/modules/preferences/profile-service.d.ts +3 -1
  75. package/dist/server/modules/preferences/profile-service.js +74 -3
  76. package/dist/server/modules/preferences/profile-service.js.map +1 -1
  77. package/dist/server/modules/provider/provider-discovery-helper-client.d.ts +5 -3
  78. package/dist/server/modules/provider/provider-discovery-helper-client.js +129 -43
  79. package/dist/server/modules/provider/provider-discovery-helper-client.js.map +1 -1
  80. package/dist/server/modules/provider/provider-discovery-helper-process.js +44 -0
  81. package/dist/server/modules/provider/provider-discovery-helper-process.js.map +1 -1
  82. package/dist/server/modules/provider/provider-discovery-runtime.js +83 -3
  83. package/dist/server/modules/provider/provider-discovery-runtime.js.map +1 -1
  84. package/dist/server/modules/sessions/claude-runtime-helper-client.js +23 -1
  85. package/dist/server/modules/sessions/claude-runtime-helper-client.js.map +1 -1
  86. package/dist/server/modules/sessions/session-history-service.d.ts +7 -1
  87. package/dist/server/modules/sessions/session-history-service.js +251 -41
  88. package/dist/server/modules/sessions/session-history-service.js.map +1 -1
  89. package/dist/server/modules/sessions/session-live-runtime-service.d.ts +6 -0
  90. package/dist/server/modules/sessions/session-live-runtime-service.js +97 -11
  91. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  92. package/dist/server/modules/sessions/session-message-origin-utils.d.ts +12 -0
  93. package/dist/server/modules/sessions/session-message-origin-utils.js +45 -0
  94. package/dist/server/modules/sessions/session-message-origin-utils.js.map +1 -0
  95. package/dist/server/modules/sessions/session-permission-request-service.js +167 -0
  96. package/dist/server/modules/sessions/session-permission-request-service.js.map +1 -1
  97. package/dist/server/modules/skills/builtin-skill-service.js +1 -1
  98. package/dist/server/modules/skills/builtin-skill-service.js.map +1 -1
  99. package/dist/server/modules/skills/builtin-skills/codingns-assistant/SKILL.md +19 -12
  100. package/dist/server/modules/skills/builtin-skills/codingns-assistant/references/cli-workflow.md +9 -3
  101. package/dist/server/modules/tasks/task-helper-client.d.ts +5 -2
  102. package/dist/server/modules/tasks/task-helper-client.js +118 -38
  103. package/dist/server/modules/tasks/task-helper-client.js.map +1 -1
  104. package/dist/server/modules/tasks/task-helper-process.js +94 -3
  105. package/dist/server/modules/tasks/task-helper-process.js.map +1 -1
  106. package/dist/server/modules/tasks/task-types.d.ts +3 -0
  107. package/dist/server/modules/tasks/task-types.js +4 -1
  108. package/dist/server/modules/tasks/task-types.js.map +1 -1
  109. package/dist/server/modules/terminal/command-template-service.d.ts +9 -0
  110. package/dist/server/modules/terminal/command-template-service.js +87 -5
  111. package/dist/server/modules/terminal/command-template-service.js.map +1 -1
  112. package/dist/server/modules/terminal/terminal-controller.d.ts +3 -0
  113. package/dist/server/modules/terminal/terminal-controller.js +41 -0
  114. package/dist/server/modules/terminal/terminal-controller.js.map +1 -1
  115. package/dist/server/modules/workbench/workbench-service.d.ts +3 -0
  116. package/dist/server/modules/workbench/workbench-service.js +4 -3
  117. package/dist/server/modules/workbench/workbench-service.js.map +1 -1
  118. package/dist/server/modules/workbench/workspace-file-watcher.d.ts +14 -6
  119. package/dist/server/modules/workbench/workspace-file-watcher.js +267 -57
  120. package/dist/server/modules/workbench/workspace-file-watcher.js.map +1 -1
  121. package/dist/server/modules/workbench/workspace-panel-snapshot-service.d.ts +2 -0
  122. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js +32 -3
  123. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js.map +1 -1
  124. package/dist/server/modules/worktree/worktree-manager.d.ts +9 -1
  125. package/dist/server/modules/worktree/worktree-manager.js +9 -1
  126. package/dist/server/modules/worktree/worktree-manager.js.map +1 -1
  127. package/dist/server/routes/assistant.js +19 -0
  128. package/dist/server/routes/assistant.js.map +1 -1
  129. package/dist/server/routes/butler.js +5 -0
  130. package/dist/server/routes/butler.js.map +1 -1
  131. package/dist/server/server/create-server.d.ts +8 -0
  132. package/dist/server/server/create-server.js +36 -13
  133. package/dist/server/server/create-server.js.map +1 -1
  134. package/dist/server/storage/repositories/assistant-automation-run-repository.d.ts +12 -0
  135. package/dist/server/storage/repositories/assistant-automation-run-repository.js +139 -0
  136. package/dist/server/storage/repositories/assistant-automation-run-repository.js.map +1 -0
  137. package/dist/server/storage/repositories/assistant-automation-task-repository.d.ts +15 -0
  138. package/dist/server/storage/repositories/assistant-automation-task-repository.js +173 -0
  139. package/dist/server/storage/repositories/assistant-automation-task-repository.js.map +1 -0
  140. package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.d.ts +17 -0
  141. package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.js +164 -0
  142. package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.js.map +1 -0
  143. package/dist/server/storage/repositories/butler-control-session-repository.js +27 -3
  144. package/dist/server/storage/repositories/butler-control-session-repository.js.map +1 -1
  145. package/dist/server/storage/repositories/butler-control-timer-repository.d.ts +15 -0
  146. package/dist/server/storage/repositories/butler-control-timer-repository.js +157 -0
  147. package/dist/server/storage/repositories/butler-control-timer-repository.js.map +1 -0
  148. package/dist/server/storage/repositories/user-preference-profile-repository.js +6 -3
  149. package/dist/server/storage/repositories/user-preference-profile-repository.js.map +1 -1
  150. package/dist/server/storage/sqlite/client.js +239 -2
  151. package/dist/server/storage/sqlite/client.js.map +1 -1
  152. package/dist/server/storage/sqlite/schema.sql +107 -1
  153. package/dist/server/types/domain.d.ts +89 -2
  154. package/dist/server/ws/workbench-ws-hub.d.ts +14 -8
  155. package/dist/server/ws/workbench-ws-hub.js +299 -163
  156. package/dist/server/ws/workbench-ws-hub.js.map +1 -1
  157. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.d.ts +4 -1
  158. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js +111 -3
  159. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js.map +1 -1
  160. package/node_modules/@codingns/session-sync-core/dist/providers/codex.d.ts +6 -1
  161. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +306 -31
  162. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
  163. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.d.ts +5 -1
  164. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js +187 -26
  165. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js.map +1 -1
  166. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.d.ts +4 -1
  167. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.js +98 -1
  168. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.js.map +1 -1
  169. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.d.ts +2 -0
  170. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js +71 -8
  171. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js.map +1 -1
  172. package/node_modules/@codingns/session-sync-core/dist/providers/utils.d.ts +1 -0
  173. package/node_modules/@codingns/session-sync-core/dist/providers/utils.js +4 -1
  174. package/node_modules/@codingns/session-sync-core/dist/providers/utils.js.map +1 -1
  175. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js +44 -0
  176. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js.map +1 -1
  177. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +9 -3
  178. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
  179. package/node_modules/@codingns/session-sync-core/dist/runtime/types.d.ts +1 -0
  180. package/node_modules/@codingns/session-sync-core/dist/services.js +17 -8
  181. package/node_modules/@codingns/session-sync-core/dist/services.js.map +1 -1
  182. package/node_modules/@codingns/session-sync-core/dist/types.d.ts +4 -0
  183. package/package.json +1 -1
  184. package/dist/public/assets/index-BlOinYqR.js +0 -122
  185. package/dist/public/assets/index-Dg_7g6lA.css +0 -1
package/README.md CHANGED
@@ -64,6 +64,7 @@ codingns assistant help workspaces
64
64
  codingns assistant help worktrees
65
65
  codingns assistant help debug-targets
66
66
  codingns assistant help sessions
67
+ codingns assistant help timers
67
68
  codingns assistant sessions send --help
68
69
  codingns assistant capabilities list
69
70
  codingns assistant projects list --status active
@@ -78,11 +79,13 @@ codingns assistant workspaces management workspace-123
78
79
  codingns assistant worktrees tree --root-workspace-id workspace-123
79
80
  codingns assistant worktrees create --source-workspace-id workspace-123 --branch-name feature/demo
80
81
  codingns assistant sessions list --project project-123
82
+ codingns assistant sessions start --project project-123 --message "继续推进这个任务"
81
83
  codingns assistant sessions get session-123
82
84
  codingns assistant sessions messages session-123 --limit 20
83
85
  codingns assistant sessions runtime session-123
84
86
  codingns assistant sessions send session-123 --message "继续修复类型错误"
85
87
  codingns assistant sessions fork session-123 --message-id msg-123
88
+ codingns assistant timers create --after-seconds 300 --message "5 分钟后检查真实会话的最新回复" --project-id project-123 --session-id session-123
86
89
  codingns assistant terminals list --project-id project-123
87
90
  codingns assistant terminals history terminal-123 --limit 50
88
91
  codingns assistant terminals send terminal-123 --input "npm test\n"
package/bin/codingns.mjs CHANGED
@@ -139,6 +139,32 @@ async function runAssistantCommand(argv) {
139
139
  }));
140
140
  return;
141
141
  }
142
+ case "sessions:start": {
143
+ await printAssistantResponse(await requestAssistant({
144
+ method: "POST",
145
+ path: "/api/assistant/sessions/start",
146
+ argv: rest,
147
+ supportedOptions: [
148
+ "project",
149
+ "workspace",
150
+ "sandbox",
151
+ "message",
152
+ "provider",
153
+ "model",
154
+ "reasoning-level",
155
+ "permission-mode"
156
+ ],
157
+ helpTopic: "sessions.start"
158
+ }, (options) => ({
159
+ ...resolveAssistantSessionStartTarget(options.values),
160
+ content: requireOptionValue(options.values.message, "message"),
161
+ providerId: readOptionalTrimmedValue(options.values.provider),
162
+ model: readOptionalTrimmedValue(options.values.model),
163
+ reasoningLevel: readOptionalTrimmedValue(options.values["reasoning-level"]),
164
+ permissionMode: readOptionalTrimmedValue(options.values["permission-mode"])
165
+ })));
166
+ return;
167
+ }
142
168
  case "sessions:get": {
143
169
  const [sessionId, ...tail] = rest;
144
170
  await printAssistantResponse(await requestAssistant({
@@ -207,6 +233,237 @@ async function runAssistantCommand(argv) {
207
233
  })));
208
234
  return;
209
235
  }
236
+ case "automations:list":
237
+ await printAssistantResponse(await requestAssistant({
238
+ method: "GET",
239
+ path: "/api/assistant/automations",
240
+ argv: rest,
241
+ supportedOptions: ["status", "control-session-id"],
242
+ helpTopic: "automations.list"
243
+ }, (options) => ({
244
+ status: readOptionalTrimmedValue(options.values.status),
245
+ controlSessionId: readOptionalTrimmedValue(options.values["control-session-id"])
246
+ })));
247
+ return;
248
+ case "automations:get": {
249
+ const [automationId, ...tail] = rest;
250
+ await printAssistantResponse(await requestAssistant({
251
+ method: "GET",
252
+ path: `/api/assistant/automations/${requirePositional(automationId, "automationId")}`,
253
+ argv: tail,
254
+ helpTopic: "automations.get"
255
+ }));
256
+ return;
257
+ }
258
+ case "automations:create":
259
+ await printAssistantResponse(await requestAssistant({
260
+ method: "POST",
261
+ path: "/api/assistant/automations",
262
+ argv: rest,
263
+ supportedOptions: [
264
+ "message",
265
+ "trigger",
266
+ "title",
267
+ "due-at",
268
+ "after-seconds",
269
+ "every-seconds",
270
+ "every-minutes",
271
+ "every-hours",
272
+ "stop-at",
273
+ "cron-minute",
274
+ "cron-hour",
275
+ "cron-day-of-week",
276
+ "condition-kind",
277
+ "repository-url",
278
+ "poll-interval-seconds",
279
+ "expires-at",
280
+ "max-checks",
281
+ "condition-session-id",
282
+ "control-session-id",
283
+ "project-id",
284
+ "session-id"
285
+ ],
286
+ supportedFlags: ["include-trigger-context"],
287
+ repeatableOptions: ["cron-day-of-week"],
288
+ helpTopic: "automations.create"
289
+ }, (options) => ({
290
+ content: requireOptionValue(options.values.message, "message"),
291
+ triggerType: readOptionalTrimmedValue(options.values.trigger),
292
+ title: readOptionalTrimmedValue(options.values.title),
293
+ dueAt: readOptionalTrimmedValue(options.values["due-at"]),
294
+ afterSeconds: readOptionalTrimmedValue(options.values["after-seconds"]),
295
+ everySeconds: readOptionalTrimmedValue(options.values["every-seconds"]),
296
+ everyMinutes: readOptionalTrimmedValue(options.values["every-minutes"]),
297
+ everyHours: readOptionalTrimmedValue(options.values["every-hours"]),
298
+ stopAt: readOptionalTrimmedValue(options.values["stop-at"]),
299
+ cronMinute: readOptionalTrimmedValue(options.values["cron-minute"]),
300
+ cronHour: readOptionalTrimmedValue(options.values["cron-hour"]),
301
+ cronDaysOfWeek: readMultiOptionValues(options.values["cron-day-of-week"]),
302
+ conditionKind: readOptionalTrimmedValue(options.values["condition-kind"]),
303
+ repositoryUrl: readOptionalTrimmedValue(options.values["repository-url"]),
304
+ pollIntervalSeconds: readOptionalTrimmedValue(options.values["poll-interval-seconds"]),
305
+ expiresAt: readOptionalTrimmedValue(options.values["expires-at"]),
306
+ maxChecks: readOptionalTrimmedValue(options.values["max-checks"]),
307
+ conditionSessionId: readOptionalTrimmedValue(options.values["condition-session-id"]),
308
+ includeTriggerContext: options.flags["include-trigger-context"] === true,
309
+ controlSessionId: readOptionalTrimmedValue(options.values["control-session-id"]),
310
+ projectId: readOptionalTrimmedValue(options.values["project-id"]),
311
+ targetSessionId: readOptionalTrimmedValue(options.values["session-id"])
312
+ })));
313
+ return;
314
+ case "automations:cancel": {
315
+ const [automationId, ...tail] = rest;
316
+ await printAssistantResponse(await requestAssistant({
317
+ method: "POST",
318
+ path: `/api/assistant/automations/${requirePositional(automationId, "automationId")}/cancel`,
319
+ argv: tail,
320
+ helpTopic: "automations.cancel"
321
+ }));
322
+ return;
323
+ }
324
+ case "automations:runs": {
325
+ const [automationId, ...tail] = rest;
326
+ await printAssistantResponse(await requestAssistant({
327
+ method: "GET",
328
+ path: `/api/assistant/automations/${requirePositional(automationId, "automationId")}/runs`,
329
+ argv: tail,
330
+ helpTopic: "automations.runs"
331
+ }));
332
+ return;
333
+ }
334
+ case "sandboxes:list":
335
+ await printAssistantResponse(await requestAssistant({
336
+ method: "GET",
337
+ path: "/api/assistant/sandboxes",
338
+ argv: rest,
339
+ supportedOptions: ["status"],
340
+ helpTopic: "sandboxes.list"
341
+ }, (options) => ({
342
+ status: readOptionalTrimmedValue(options.values.status)
343
+ })));
344
+ return;
345
+ case "sandboxes:create":
346
+ await printAssistantResponse(await requestAssistant({
347
+ method: "POST",
348
+ path: "/api/assistant/sandboxes",
349
+ argv: rest,
350
+ supportedOptions: [
351
+ "title",
352
+ "description",
353
+ "purpose",
354
+ "expires-at",
355
+ "source-kind",
356
+ "repository-url",
357
+ "directory-name",
358
+ "auth-mode",
359
+ "username",
360
+ "password",
361
+ "auth-token"
362
+ ],
363
+ helpTopic: "sandboxes.create"
364
+ }, (options) => ({
365
+ title: readOptionalTrimmedValue(options.values.title),
366
+ description: readOptionalTrimmedValue(options.values.description),
367
+ purpose: readOptionalTrimmedValue(options.values.purpose),
368
+ expiresAt: readOptionalTrimmedValue(options.values["expires-at"]),
369
+ sourceKind: readOptionalTrimmedValue(options.values["source-kind"]),
370
+ repositoryUrl: readOptionalTrimmedValue(options.values["repository-url"]),
371
+ directoryName: readOptionalTrimmedValue(options.values["directory-name"]),
372
+ auth: buildWorkspaceCloneAuth(options.values)
373
+ })));
374
+ return;
375
+ case "sandboxes:promote": {
376
+ const [sandboxId, ...tail] = rest;
377
+ await printAssistantResponse(await requestAssistant({
378
+ method: "POST",
379
+ path: `/api/assistant/sandboxes/${requirePositional(sandboxId, "sandboxId")}/promote`,
380
+ argv: tail,
381
+ supportedOptions: ["mode", "project-name", "provider"],
382
+ helpTopic: "sandboxes.promote"
383
+ }, (options) => ({
384
+ mode: readOptionalTrimmedValue(options.values.mode),
385
+ projectName: readOptionalTrimmedValue(options.values["project-name"]),
386
+ defaultProvider: readOptionalTrimmedValue(options.values.provider)
387
+ })));
388
+ return;
389
+ }
390
+ case "sandboxes:expire": {
391
+ const [sandboxId, ...tail] = rest;
392
+ await printAssistantResponse(await requestAssistant({
393
+ method: "POST",
394
+ path: `/api/assistant/sandboxes/${requirePositional(sandboxId, "sandboxId")}/expire`,
395
+ argv: tail,
396
+ helpTopic: "sandboxes.expire"
397
+ }));
398
+ return;
399
+ }
400
+ case "sandboxes:remove": {
401
+ const [sandboxId, ...tail] = rest;
402
+ await printAssistantResponse(await requestAssistant({
403
+ method: "DELETE",
404
+ path: `/api/assistant/sandboxes/${requirePositional(sandboxId, "sandboxId")}`,
405
+ argv: tail,
406
+ helpTopic: "sandboxes.remove"
407
+ }));
408
+ return;
409
+ }
410
+ case "timers:list":
411
+ await printAssistantResponse(await requestAssistant({
412
+ method: "GET",
413
+ path: "/api/assistant/timers",
414
+ argv: rest,
415
+ supportedOptions: ["status", "control-session-id"],
416
+ helpTopic: "timers.list"
417
+ }, (options) => ({
418
+ status: readOptionalTrimmedValue(options.values.status),
419
+ controlSessionId: readOptionalTrimmedValue(options.values["control-session-id"])
420
+ })));
421
+ return;
422
+ case "timers:get": {
423
+ const [timerId, ...tail] = rest;
424
+ await printAssistantResponse(await requestAssistant({
425
+ method: "GET",
426
+ path: `/api/assistant/timers/${requirePositional(timerId, "timerId")}`,
427
+ argv: tail,
428
+ helpTopic: "timers.get"
429
+ }));
430
+ return;
431
+ }
432
+ case "timers:create":
433
+ await printAssistantResponse(await requestAssistant({
434
+ method: "POST",
435
+ path: "/api/assistant/timers",
436
+ argv: rest,
437
+ supportedOptions: [
438
+ "message",
439
+ "title",
440
+ "due-at",
441
+ "after-seconds",
442
+ "control-session-id",
443
+ "project-id",
444
+ "session-id"
445
+ ],
446
+ helpTopic: "timers.create"
447
+ }, (options) => ({
448
+ content: requireOptionValue(options.values.message, "message"),
449
+ title: readOptionalTrimmedValue(options.values.title),
450
+ dueAt: readOptionalTrimmedValue(options.values["due-at"]),
451
+ afterSeconds: readOptionalTrimmedValue(options.values["after-seconds"]),
452
+ controlSessionId: readOptionalTrimmedValue(options.values["control-session-id"]),
453
+ projectId: readOptionalTrimmedValue(options.values["project-id"]),
454
+ targetSessionId: readOptionalTrimmedValue(options.values["session-id"])
455
+ })));
456
+ return;
457
+ case "timers:cancel": {
458
+ const [timerId, ...tail] = rest;
459
+ await printAssistantResponse(await requestAssistant({
460
+ method: "POST",
461
+ path: `/api/assistant/timers/${requirePositional(timerId, "timerId")}/cancel`,
462
+ argv: tail,
463
+ helpTopic: "timers.cancel"
464
+ }));
465
+ return;
466
+ }
210
467
  case "terminals:list":
211
468
  await printAssistantResponse(await requestAssistant({
212
469
  method: "GET",
@@ -1376,6 +1633,7 @@ codingns assistant sessions
1376
1633
 
1377
1634
  可用动作:
1378
1635
  list 列出指定项目下的会话
1636
+ start 按 project/workspace/sandbox 目标新建真实会话
1379
1637
  get 读取会话详情
1380
1638
  messages 读取消息窗口
1381
1639
  runtime 读取运行态
@@ -1384,6 +1642,7 @@ codingns assistant sessions
1384
1642
 
1385
1643
  示例:
1386
1644
  codingns assistant sessions list --project <projectId> --token <token>
1645
+ codingns assistant sessions start --project <projectId> --message "继续处理这个问题" --token <token>
1387
1646
  codingns assistant sessions send <sessionId> --message "继续修复" --token <token>
1388
1647
  `.trim();
1389
1648
  case "sessions.list":
@@ -1395,6 +1654,16 @@ codingns assistant sessions list
1395
1654
 
1396
1655
  用法:
1397
1656
  codingns assistant sessions list --project <projectId> --token <token>
1657
+ `.trim();
1658
+ case "sessions.start":
1659
+ return `
1660
+ codingns assistant sessions start
1661
+
1662
+ 用途:
1663
+ 在指定 project/workspace/sandbox 目标下新建真实会话;如果不显式传 provider/model,会默认继承当前助手控制会话的配置。
1664
+
1665
+ 用法:
1666
+ codingns assistant sessions start (--project <projectId> | --workspace <workspaceId> | --sandbox <sandboxId>) --message "..." [--provider <provider>] [--model <model>] [--reasoning-level <level>] [--permission-mode <mode>] --token <token>
1398
1667
  `.trim();
1399
1668
  case "sessions.get":
1400
1669
  return `
@@ -1445,6 +1714,193 @@ codingns assistant sessions fork
1445
1714
 
1446
1715
  用法:
1447
1716
  codingns assistant sessions fork <sessionId> [--source-type session|message] [--message-id <id>] [--strategy auto|native-only|reconstruct-only] [--target-provider <provider>] --token <token>
1717
+ `.trim();
1718
+ case "sandboxes":
1719
+ return `
1720
+ codingns assistant sandboxes
1721
+
1722
+ 可用动作:
1723
+ list 列出当前助手沙箱
1724
+ create 创建新的临时沙箱工作区
1725
+ promote 把沙箱保留为 pinned,或晋升成正式项目
1726
+ expire 标记沙箱过期
1727
+ remove 清理沙箱
1728
+
1729
+ 示例:
1730
+ codingns assistant sandboxes list --status active --token <token>
1731
+ codingns assistant sandboxes create --title "CodingNS 临时沙箱" --source-kind clone --repository-url <url> --token <token>
1732
+ `.trim();
1733
+ case "sandboxes.list":
1734
+ return `
1735
+ codingns assistant sandboxes list
1736
+
1737
+ 用途:
1738
+ 列出当前用户可见的助手沙箱。
1739
+
1740
+ 用法:
1741
+ codingns assistant sandboxes list [--status active|archived|expired|deleted] --token <token>
1742
+ `.trim();
1743
+ case "sandboxes.create":
1744
+ return `
1745
+ codingns assistant sandboxes create
1746
+
1747
+ 用途:
1748
+ 创建新的临时沙箱工作区;默认空白沙箱,也可以直接 clone 仓库。
1749
+
1750
+ 用法:
1751
+ codingns assistant sandboxes create [--title <title>] [--description <text>] [--purpose <text>] [--expires-at <isoTime>] [--source-kind blank|clone] [--repository-url <url>] [--directory-name <name>] [--auth-mode none|basic|token] [--username <name>] [--password <password>] [--auth-token <token>] --token <token>
1752
+ `.trim();
1753
+ case "sandboxes.promote":
1754
+ return `
1755
+ codingns assistant sandboxes promote
1756
+
1757
+ 用途:
1758
+ 把沙箱保留为 pinned,或者直接晋升成正式项目。
1759
+
1760
+ 用法:
1761
+ codingns assistant sandboxes promote <sandboxId> [--mode pin|project] [--project-name <name>] [--provider <provider>] --token <token>
1762
+ `.trim();
1763
+ case "sandboxes.expire":
1764
+ return `
1765
+ codingns assistant sandboxes expire
1766
+
1767
+ 用途:
1768
+ 把指定沙箱标记为过期,后续不能再拿它启动会话。
1769
+
1770
+ 用法:
1771
+ codingns assistant sandboxes expire <sandboxId> --token <token>
1772
+ `.trim();
1773
+ case "sandboxes.remove":
1774
+ return `
1775
+ codingns assistant sandboxes remove
1776
+
1777
+ 用途:
1778
+ 删除指定沙箱并尝试清理对应工作区入口。
1779
+
1780
+ 用法:
1781
+ codingns assistant sandboxes remove <sandboxId> --token <token>
1782
+ `.trim();
1783
+ case "automations":
1784
+ return `
1785
+ codingns assistant automations
1786
+
1787
+ 可用动作:
1788
+ list 列出正式自动化任务
1789
+ get 读取单个自动化详情
1790
+ create 创建正式自动化任务
1791
+ cancel 取消自动化任务
1792
+ runs 查看自动化执行记录
1793
+
1794
+ 示例:
1795
+ codingns assistant automations create --after-seconds 3600 --message "1 小时后检查 codingns 新 tag" --session-id <sessionId> --project-id <projectId> --token <token>
1796
+ codingns assistant automations create --trigger interval --every-hours 1 --message "每小时检查一次" --token <token>
1797
+ codingns assistant automations create --trigger cron --cron-minute 30 --cron-hour 9 --cron-day-of-week 1 --cron-day-of-week 2 --message "工作日早上检查" --token <token>
1798
+ codingns assistant automations create --trigger condition --condition-kind git.remote_tag_changed --repository-url <url> --poll-interval-seconds 3600 --message "发现新 tag 后通知我" --include-trigger-context --token <token>
1799
+ codingns assistant automations list --status active --token <token>
1800
+ `.trim();
1801
+ case "automations.list":
1802
+ return `
1803
+ codingns assistant automations list
1804
+
1805
+ 用途:
1806
+ 查看当前助手控制会话下的正式自动化任务。
1807
+
1808
+ 用法:
1809
+ codingns assistant automations list [--status active|completed|cancelled|failed] [--control-session-id <id>] --token <token>
1810
+ `.trim();
1811
+ case "automations.get":
1812
+ return `
1813
+ codingns assistant automations get
1814
+
1815
+ 用途:
1816
+ 读取单个自动化任务详情。
1817
+
1818
+ 用法:
1819
+ codingns assistant automations get <automationId> --token <token>
1820
+ `.trim();
1821
+ case "automations.create":
1822
+ return `
1823
+ codingns assistant automations create
1824
+
1825
+ 用途:
1826
+ 创建正式自动化;支持 once / interval / cron / condition 四种触发器。
1827
+
1828
+ 用法:
1829
+ codingns assistant automations create --message "..." [--trigger once|interval|cron|condition] [--title <title>] [--due-at <isoTime> | --after-seconds <seconds>] [--every-seconds <n> | --every-minutes <n> | --every-hours <n>] [--stop-at <isoTime>] [--cron-minute <0-59>] [--cron-hour <0-23>] [--cron-day-of-week <0-6>] [--condition-kind git.remote_tag_changed|session.runtime_idle] [--repository-url <url>] [--condition-session-id <sessionId>] [--poll-interval-seconds <n>] [--expires-at <isoTime>] [--max-checks <n>] [--include-trigger-context] [--control-session-id <id>] [--project-id <projectId>] [--session-id <sessionId>] --token <token>
1830
+ `.trim();
1831
+ case "automations.cancel":
1832
+ return `
1833
+ codingns assistant automations cancel
1834
+
1835
+ 用途:
1836
+ 取消一个尚未执行的自动化任务。
1837
+
1838
+ 用法:
1839
+ codingns assistant automations cancel <automationId> --token <token>
1840
+ `.trim();
1841
+ case "automations.runs":
1842
+ return `
1843
+ codingns assistant automations runs
1844
+
1845
+ 用途:
1846
+ 查看某个自动化任务的执行记录。
1847
+
1848
+ 用法:
1849
+ codingns assistant automations runs <automationId> --token <token>
1850
+ `.trim();
1851
+ case "timers":
1852
+ return `
1853
+ codingns assistant timers
1854
+
1855
+ 可用动作:
1856
+ list 列出当前助手会话相关的计时器
1857
+ get 读取单个计时器详情
1858
+ create 创建到点后继续助手会话的计时器
1859
+ cancel 取消计时器
1860
+
1861
+ 示例:
1862
+ codingns assistant timers create --after-seconds 300 --message "5 分钟后检查真实会话最新回复" --session-id <sessionId> --project-id <projectId> --token <token>
1863
+ codingns assistant timers list --status active --token <token>
1864
+ `.trim();
1865
+ case "timers.list":
1866
+ return `
1867
+ codingns assistant timers list
1868
+
1869
+ 用途:
1870
+ 查看当前助手会话下仍在等待、已完成或已失败的计时器。
1871
+
1872
+ 用法:
1873
+ codingns assistant timers list [--status active|completed|cancelled|failed] [--control-session-id <id>] --token <token>
1874
+ `.trim();
1875
+ case "timers.get":
1876
+ return `
1877
+ codingns assistant timers get
1878
+
1879
+ 用途:
1880
+ 读取单个计时器详情,包括计划触发时间和最后错误。
1881
+
1882
+ 用法:
1883
+ codingns assistant timers get <timerId> --token <token>
1884
+ `.trim();
1885
+ case "timers.create":
1886
+ return `
1887
+ codingns assistant timers create
1888
+
1889
+ 用途:
1890
+ 创建一个一次性计时器;到期后系统会自动向同一个助手控制会话发送消息,继续工作。
1891
+
1892
+ 用法:
1893
+ codingns assistant timers create --message "..." [--title <title>] [--due-at <isoTime> | --after-seconds <seconds>] [--control-session-id <id>] [--project-id <projectId>] [--session-id <sessionId>] --token <token>
1894
+ `.trim();
1895
+ case "timers.cancel":
1896
+ return `
1897
+ codingns assistant timers cancel
1898
+
1899
+ 用途:
1900
+ 取消一个尚未触发的计时器。
1901
+
1902
+ 用法:
1903
+ codingns assistant timers cancel <timerId> --token <token>
1448
1904
  `.trim();
1449
1905
  case "terminals":
1450
1906
  return `
@@ -1687,7 +2143,7 @@ codingns assistant worktrees cleanup
1687
2143
  return `
1688
2144
  codingns assistant 用法:
1689
2145
 
1690
- codingns assistant help [capabilities|projects|sessions|terminals|debug-targets|debug-runtimes|workspaces|worktrees] [action]
2146
+ codingns assistant help [capabilities|projects|sessions|sandboxes|automations|timers|terminals|debug-targets|debug-runtimes|workspaces|worktrees] [action]
1691
2147
  codingns assistant capabilities list [--base-url http://127.0.0.1:3002] --token <token>
1692
2148
  codingns assistant projects list [--workspace-id <id>] [--status active|paused|archived] [--risk-level low|medium|high] --token <token>
1693
2149
  codingns assistant projects get <projectId> [--base-url ...] --token <token>
@@ -1710,11 +2166,26 @@ codingns assistant 用法:
1710
2166
  codingns assistant workspaces nav-state <workspaceId> [--collapsed true|false] [--background-color #RRGGBB|none] [--base-url ...] --token <token>
1711
2167
  codingns assistant workspaces remove <workspaceId> [--base-url ...] --token <token>
1712
2168
  codingns assistant sessions list --project <projectId> [--base-url ...] --token <token>
2169
+ codingns assistant sessions start (--project <projectId> | --workspace <workspaceId> | --sandbox <sandboxId>) --message "..." [--provider <provider>] [--model <model>] [--reasoning-level <level>] [--permission-mode <mode>] --token <token>
1713
2170
  codingns assistant sessions get <sessionId> [--base-url ...] --token <token>
1714
2171
  codingns assistant sessions messages <sessionId> [--cursor <cursor>] [--limit 40] [--direction forward|backward] --token <token>
1715
2172
  codingns assistant sessions runtime <sessionId> [--base-url ...] --token <token>
1716
2173
  codingns assistant sessions send <sessionId> --message "..." [--client-request-id <id>] [--model <model>] [--reasoning-level <level>] [--permission-mode <mode>] --token <token>
1717
2174
  codingns assistant sessions fork <sessionId> [--source-type session|message] [--message-id <id>] [--strategy auto|native-only|reconstruct-only] [--target-provider <provider>] --token <token>
2175
+ codingns assistant sandboxes list [--status active|archived|expired|deleted] [--base-url ...] --token <token>
2176
+ codingns assistant sandboxes create [--title <title>] [--description <text>] [--purpose <text>] [--expires-at <isoTime>] [--source-kind blank|clone] [--repository-url <url>] [--directory-name <name>] [--auth-mode none|basic|token] [--username <name>] [--password <password>] [--auth-token <token>] [--base-url ...] --token <token>
2177
+ codingns assistant sandboxes promote <sandboxId> [--mode pin|project] [--project-name <name>] [--provider <provider>] [--base-url ...] --token <token>
2178
+ codingns assistant sandboxes expire <sandboxId> [--base-url ...] --token <token>
2179
+ codingns assistant sandboxes remove <sandboxId> [--base-url ...] --token <token>
2180
+ codingns assistant automations list [--status active|completed|cancelled|failed] [--control-session-id <id>] --token <token>
2181
+ codingns assistant automations get <automationId> [--base-url ...] --token <token>
2182
+ codingns assistant automations create --message "..." [--trigger once|interval|cron|condition] [--title <title>] [--due-at <isoTime> | --after-seconds <seconds>] [--every-seconds <n> | --every-minutes <n> | --every-hours <n>] [--stop-at <isoTime>] [--cron-minute <0-59>] [--cron-hour <0-23>] [--cron-day-of-week <0-6>] [--condition-kind git.remote_tag_changed|session.runtime_idle] [--repository-url <url>] [--condition-session-id <sessionId>] [--poll-interval-seconds <n>] [--expires-at <isoTime>] [--max-checks <n>] [--include-trigger-context] [--control-session-id <id>] [--project-id <projectId>] [--session-id <sessionId>] --token <token>
2183
+ codingns assistant automations cancel <automationId> [--base-url ...] --token <token>
2184
+ codingns assistant automations runs <automationId> [--base-url ...] --token <token>
2185
+ codingns assistant timers list [--status active|completed|cancelled|failed] [--control-session-id <id>] --token <token>
2186
+ codingns assistant timers get <timerId> [--base-url ...] --token <token>
2187
+ codingns assistant timers create --message "..." [--title <title>] [--due-at <isoTime> | --after-seconds <seconds>] [--control-session-id <id>] [--project-id <projectId>] [--session-id <sessionId>] --token <token>
2188
+ codingns assistant timers cancel <timerId> [--base-url ...] --token <token>
1718
2189
  codingns assistant terminals list [--workspace-id <id> | --project-id <id>] --token <token>
1719
2190
  codingns assistant terminals history <terminalId> [--before-seq <n>] [--limit 20] --token <token>
1720
2191
  codingns assistant terminals send <terminalId> --input "npm test\\n" --token <token>
@@ -1806,6 +2277,23 @@ function buildAssistantHelpTopic(action, rest) {
1806
2277
  return `${action}.${rest[0]}`;
1807
2278
  }
1808
2279
 
2280
+ function resolveAssistantSessionStartTarget(values) {
2281
+ const projectId = readOptionalTrimmedValue(values.project);
2282
+ const workspaceId = readOptionalTrimmedValue(values.workspace);
2283
+ const sandboxId = readOptionalTrimmedValue(values.sandbox);
2284
+ const targets = [
2285
+ projectId ? { projectId } : null,
2286
+ workspaceId ? { workspaceId } : null,
2287
+ sandboxId ? { sandboxId } : null
2288
+ ].filter((item) => item !== null);
2289
+
2290
+ if (targets.length !== 1) {
2291
+ fail("sessions start 必须且只能提供 --project、--workspace、--sandbox 其中一个");
2292
+ }
2293
+
2294
+ return targets[0];
2295
+ }
2296
+
1809
2297
  function buildWorkspaceCloneAuth(values) {
1810
2298
  const authMode = readOptionalTrimmedValue(values["auth-mode"]);
1811
2299