@jingyi0605/codingns 0.1.5 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -0
- package/bin/codingns.mjs +640 -53
- package/dist/public/assets/{TerminalPage-4p6EBqrR.js → TerminalPage-BkjqU9NG.js} +19 -19
- package/dist/public/assets/index-C6U8-9jg.css +1 -0
- package/dist/public/assets/index-CKSumuV2.js +109 -0
- package/dist/public/index.html +2 -2
- package/dist/server/config/env.d.ts +2 -0
- package/dist/server/config/env.js +8 -1
- package/dist/server/config/env.js.map +1 -1
- package/dist/server/modules/assistant-capability/assistant-capability-controller.d.ts +89 -0
- package/dist/server/modules/assistant-capability/assistant-capability-controller.js +138 -0
- package/dist/server/modules/assistant-capability/assistant-capability-controller.js.map +1 -0
- package/dist/server/modules/assistant-capability/assistant-capability-service.d.ts +115 -0
- package/dist/server/modules/assistant-capability/assistant-capability-service.js +241 -0
- package/dist/server/modules/assistant-capability/assistant-capability-service.js.map +1 -0
- package/dist/server/modules/butler/butler-control-session-service.js +69 -30
- package/dist/server/modules/butler/butler-control-session-service.js.map +1 -1
- package/dist/server/modules/butler/butler-follow-up-scheduler.d.ts +9 -0
- package/dist/server/modules/butler/butler-follow-up-scheduler.js +47 -11
- package/dist/server/modules/butler/butler-follow-up-scheduler.js.map +1 -1
- package/dist/server/modules/butler/butler-follow-up-service.d.ts +7 -1
- package/dist/server/modules/butler/butler-follow-up-service.js +10 -0
- package/dist/server/modules/butler/butler-follow-up-service.js.map +1 -1
- package/dist/server/modules/butler/butler-session-service.d.ts +2 -1
- package/dist/server/modules/butler/butler-session-service.js +10 -1
- package/dist/server/modules/butler/butler-session-service.js.map +1 -1
- package/dist/server/modules/butler/butler-session-summary-service.d.ts +8 -1
- package/dist/server/modules/butler/butler-session-summary-service.js +34 -7
- package/dist/server/modules/butler/butler-session-summary-service.js.map +1 -1
- package/dist/server/modules/butler/context-aggregator.js +44 -13
- package/dist/server/modules/butler/context-aggregator.js.map +1 -1
- package/dist/server/modules/butler/patrol-scheduler.d.ts +9 -0
- package/dist/server/modules/butler/patrol-scheduler.js +63 -9
- package/dist/server/modules/butler/patrol-scheduler.js.map +1 -1
- package/dist/server/modules/butler/session-summary-scheduler.d.ts +9 -0
- package/dist/server/modules/butler/session-summary-scheduler.js +47 -11
- package/dist/server/modules/butler/session-summary-scheduler.js.map +1 -1
- package/dist/server/modules/debug-target/debug-runtime-reconciliation-scheduler.d.ts +38 -0
- package/dist/server/modules/debug-target/debug-runtime-reconciliation-scheduler.js +99 -0
- package/dist/server/modules/debug-target/debug-runtime-reconciliation-scheduler.js.map +1 -0
- package/dist/server/modules/debug-target/debug-target-controller.d.ts +70 -0
- package/dist/server/modules/debug-target/debug-target-controller.js +113 -0
- package/dist/server/modules/debug-target/debug-target-controller.js.map +1 -0
- package/dist/server/modules/debug-target/debug-target-service.d.ts +102 -0
- package/dist/server/modules/debug-target/debug-target-service.js +1484 -0
- package/dist/server/modules/debug-target/debug-target-service.js.map +1 -0
- package/dist/server/modules/debug-target/framework-compatibility-matrix.d.ts +4 -0
- package/dist/server/modules/debug-target/framework-compatibility-matrix.js +45 -0
- package/dist/server/modules/debug-target/framework-compatibility-matrix.js.map +1 -0
- package/dist/server/modules/debug-target/launch-adapter-registry.d.ts +25 -0
- package/dist/server/modules/debug-target/launch-adapter-registry.js +445 -0
- package/dist/server/modules/debug-target/launch-adapter-registry.js.map +1 -0
- package/dist/server/modules/file/file-content-service.d.ts +2 -1
- package/dist/server/modules/file/file-content-service.js +53 -0
- package/dist/server/modules/file/file-content-service.js.map +1 -1
- package/dist/server/modules/file/file-controller.d.ts +12 -1
- package/dist/server/modules/file/file-controller.js +72 -1
- package/dist/server/modules/file/file-controller.js.map +1 -1
- package/dist/server/modules/file/file-preview-link-service.d.ts +22 -0
- package/dist/server/modules/file/file-preview-link-service.js +160 -0
- package/dist/server/modules/file/file-preview-link-service.js.map +1 -0
- package/dist/server/modules/git/commit-orchestrator.d.ts +4 -1
- package/dist/server/modules/git/commit-orchestrator.js +18 -1
- package/dist/server/modules/git/commit-orchestrator.js.map +1 -1
- package/dist/server/modules/git/git-auth.d.ts +25 -0
- package/dist/server/modules/git/git-auth.js +88 -0
- package/dist/server/modules/git/git-auth.js.map +1 -0
- package/dist/server/modules/git/git-controller.d.ts +6 -0
- package/dist/server/modules/git/git-controller.js +5 -1
- package/dist/server/modules/git/git-controller.js.map +1 -1
- package/dist/server/modules/git/git-read-service.d.ts +2 -1
- package/dist/server/modules/git/git-read-service.js +19 -2
- package/dist/server/modules/git/git-read-service.js.map +1 -1
- package/dist/server/modules/git/git-remote-credential-service.d.ts +9 -0
- package/dist/server/modules/git/git-remote-credential-service.js +76 -0
- package/dist/server/modules/git/git-remote-credential-service.js.map +1 -0
- package/dist/server/modules/git/git-write-service.d.ts +5 -2
- package/dist/server/modules/git/git-write-service.js +33 -17
- package/dist/server/modules/git/git-write-service.js.map +1 -1
- package/dist/server/modules/git/types.d.ts +3 -0
- package/dist/server/modules/git/workspace-repo-guard.js +3 -2
- package/dist/server/modules/git/workspace-repo-guard.js.map +1 -1
- package/dist/server/modules/provider/codex-model-options.d.ts +3 -1
- package/dist/server/modules/provider/codex-model-options.js +4 -1
- package/dist/server/modules/provider/codex-model-options.js.map +1 -1
- package/dist/server/modules/provider/opencode-model-options.d.ts +3 -1
- package/dist/server/modules/provider/opencode-model-options.js +5 -1
- package/dist/server/modules/provider/opencode-model-options.js.map +1 -1
- package/dist/server/modules/provider/provider-discovery-helper-client.d.ts +24 -0
- package/dist/server/modules/provider/provider-discovery-helper-client.js +14 -0
- package/dist/server/modules/provider/provider-discovery-helper-client.js.map +1 -1
- package/dist/server/modules/provider/provider-discovery-helper-process.js +54 -0
- package/dist/server/modules/provider/provider-discovery-helper-process.js.map +1 -1
- package/dist/server/modules/sessions/codex-app-server-helper-client.d.ts +2 -1
- package/dist/server/modules/sessions/codex-app-server-helper-client.js +103 -0
- package/dist/server/modules/sessions/codex-app-server-helper-client.js.map +1 -1
- package/dist/server/modules/sessions/codex-app-server-helper-process.js +106 -1
- package/dist/server/modules/sessions/codex-app-server-helper-process.js.map +1 -1
- package/dist/server/modules/sessions/session-controller.d.ts +26 -0
- package/dist/server/modules/sessions/session-controller.js +39 -1
- package/dist/server/modules/sessions/session-controller.js.map +1 -1
- package/dist/server/modules/sessions/session-history-service.d.ts +51 -5
- package/dist/server/modules/sessions/session-history-service.js +906 -59
- package/dist/server/modules/sessions/session-history-service.js.map +1 -1
- package/dist/server/modules/sessions/session-live-runtime-service.d.ts +5 -0
- package/dist/server/modules/sessions/session-live-runtime-service.js +59 -2
- package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
- package/dist/server/modules/sessions/session-provider-error-mapper.js +66 -0
- package/dist/server/modules/sessions/session-provider-error-mapper.js.map +1 -1
- package/dist/server/modules/tasks/event-loop-monitor.d.ts +21 -0
- package/dist/server/modules/tasks/event-loop-monitor.js +64 -0
- package/dist/server/modules/tasks/event-loop-monitor.js.map +1 -0
- package/dist/server/modules/tasks/observability-controller.d.ts +30 -0
- package/dist/server/modules/tasks/observability-controller.js +44 -0
- package/dist/server/modules/tasks/observability-controller.js.map +1 -0
- package/dist/server/modules/tasks/observability-service.d.ts +32 -0
- package/dist/server/modules/tasks/observability-service.js +104 -0
- package/dist/server/modules/tasks/observability-service.js.map +1 -0
- package/dist/server/modules/tasks/scheduler-metrics.d.ts +41 -0
- package/dist/server/modules/tasks/scheduler-metrics.js +92 -0
- package/dist/server/modules/tasks/scheduler-metrics.js.map +1 -0
- package/dist/server/modules/tasks/task-activity-log.d.ts +39 -0
- package/dist/server/modules/tasks/task-activity-log.js +43 -0
- package/dist/server/modules/tasks/task-activity-log.js.map +1 -0
- package/dist/server/modules/tasks/task-helper-client.d.ts +11 -0
- package/dist/server/modules/tasks/task-helper-client.js +132 -0
- package/dist/server/modules/tasks/task-helper-client.js.map +1 -0
- package/dist/server/modules/tasks/task-helper-process-handlers.d.ts +16 -0
- package/dist/server/modules/tasks/task-helper-process-handlers.js +14 -0
- package/dist/server/modules/tasks/task-helper-process-handlers.js.map +1 -0
- package/dist/server/modules/tasks/task-helper-process.d.ts +1 -0
- package/dist/server/modules/tasks/task-helper-process.js +49 -0
- package/dist/server/modules/tasks/task-helper-process.js.map +1 -0
- package/dist/server/modules/tasks/task-lane-executors.d.ts +2 -0
- package/dist/server/modules/tasks/task-lane-executors.js +15 -0
- package/dist/server/modules/tasks/task-lane-executors.js.map +1 -0
- package/dist/server/modules/tasks/task-manager.d.ts +15 -0
- package/dist/server/modules/tasks/task-manager.js +36 -0
- package/dist/server/modules/tasks/task-manager.js.map +1 -0
- package/dist/server/modules/tasks/task-metrics.d.ts +9 -0
- package/dist/server/modules/tasks/task-metrics.js +81 -0
- package/dist/server/modules/tasks/task-metrics.js.map +1 -0
- package/dist/server/modules/tasks/task-registry.d.ts +7 -0
- package/dist/server/modules/tasks/task-registry.js +21 -0
- package/dist/server/modules/tasks/task-registry.js.map +1 -0
- package/dist/server/modules/tasks/task-scheduler.d.ts +31 -0
- package/dist/server/modules/tasks/task-scheduler.js +473 -0
- package/dist/server/modules/tasks/task-scheduler.js.map +1 -0
- package/dist/server/modules/tasks/task-types.d.ts +106 -0
- package/dist/server/modules/tasks/task-types.js +23 -0
- package/dist/server/modules/tasks/task-types.js.map +1 -0
- package/dist/server/modules/terminal/command-template-service.d.ts +4 -0
- package/dist/server/modules/terminal/command-template-service.js +5 -3
- package/dist/server/modules/terminal/command-template-service.js.map +1 -1
- package/dist/server/modules/terminal/runtime/terminal-log-spooler.d.ts +7 -3
- package/dist/server/modules/terminal/runtime/terminal-log-spooler.js +95 -15
- package/dist/server/modules/terminal/runtime/terminal-log-spooler.js.map +1 -1
- package/dist/server/modules/terminal/runtime/terminal-log-writer-client.d.ts +21 -0
- package/dist/server/modules/terminal/runtime/terminal-log-writer-client.js +144 -0
- package/dist/server/modules/terminal/runtime/terminal-log-writer-client.js.map +1 -0
- package/dist/server/modules/terminal/runtime/terminal-log-writer-process.d.ts +1 -0
- package/dist/server/modules/terminal/runtime/terminal-log-writer-process.js +187 -0
- package/dist/server/modules/terminal/runtime/terminal-log-writer-process.js.map +1 -0
- package/dist/server/modules/terminal/terminal-service.d.ts +12 -0
- package/dist/server/modules/terminal/terminal-service.js +34 -17
- package/dist/server/modules/terminal/terminal-service.js.map +1 -1
- package/dist/server/modules/workbench/workbench-service.d.ts +23 -2
- package/dist/server/modules/workbench/workbench-service.js +126 -15
- package/dist/server/modules/workbench/workbench-service.js.map +1 -1
- package/dist/server/modules/workbench/workspace-panel-snapshot-service.d.ts +5 -1
- package/dist/server/modules/workbench/workspace-panel-snapshot-service.js +88 -19
- package/dist/server/modules/workbench/workspace-panel-snapshot-service.js.map +1 -1
- package/dist/server/modules/workspace/workspace-code-composition.d.ts +2 -0
- package/dist/server/modules/workspace/workspace-code-composition.js +154 -0
- package/dist/server/modules/workspace/workspace-code-composition.js.map +1 -0
- package/dist/server/modules/workspace/workspace-controller.d.ts +14 -0
- package/dist/server/modules/workspace/workspace-controller.js +19 -0
- package/dist/server/modules/workspace/workspace-controller.js.map +1 -1
- package/dist/server/modules/workspace/workspace-service.d.ts +21 -14
- package/dist/server/modules/workspace/workspace-service.js +183 -234
- package/dist/server/modules/workspace/workspace-service.js.map +1 -1
- package/dist/server/modules/worktree/worktree-cleanup-service.d.ts +35 -0
- package/dist/server/modules/worktree/worktree-cleanup-service.js +210 -0
- package/dist/server/modules/worktree/worktree-cleanup-service.js.map +1 -0
- package/dist/server/modules/worktree/worktree-controller.d.ts +44 -0
- package/dist/server/modules/worktree/worktree-controller.js +40 -0
- package/dist/server/modules/worktree/worktree-controller.js.map +1 -0
- package/dist/server/modules/worktree/worktree-manager.d.ts +34 -0
- package/dist/server/modules/worktree/worktree-manager.js +292 -0
- package/dist/server/modules/worktree/worktree-manager.js.map +1 -0
- package/dist/server/modules/worktree/worktree-merge-service.d.ts +52 -0
- package/dist/server/modules/worktree/worktree-merge-service.js +293 -0
- package/dist/server/modules/worktree/worktree-merge-service.js.map +1 -0
- package/dist/server/modules/worktree/worktree-sync-service.d.ts +23 -0
- package/dist/server/modules/worktree/worktree-sync-service.js +166 -0
- package/dist/server/modules/worktree/worktree-sync-service.js.map +1 -0
- package/dist/server/routes/assistant.d.ts +3 -0
- package/dist/server/routes/assistant.js +15 -0
- package/dist/server/routes/assistant.js.map +1 -0
- package/dist/server/routes/debug-targets.d.ts +3 -0
- package/dist/server/routes/debug-targets.js +15 -0
- package/dist/server/routes/debug-targets.js.map +1 -0
- package/dist/server/routes/files.js +2 -0
- package/dist/server/routes/files.js.map +1 -1
- package/dist/server/routes/git.js +1 -0
- package/dist/server/routes/git.js.map +1 -1
- package/dist/server/routes/observability.d.ts +3 -0
- package/dist/server/routes/observability.js +7 -0
- package/dist/server/routes/observability.js.map +1 -0
- package/dist/server/routes/sessions.js +1 -0
- package/dist/server/routes/sessions.js.map +1 -1
- package/dist/server/routes/workspaces.js +2 -0
- package/dist/server/routes/workspaces.js.map +1 -1
- package/dist/server/routes/worktrees.d.ts +3 -0
- package/dist/server/routes/worktrees.js +8 -0
- package/dist/server/routes/worktrees.js.map +1 -0
- package/dist/server/server/create-server.d.ts +38 -0
- package/dist/server/server/create-server.js +106 -11
- package/dist/server/server/create-server.js.map +1 -1
- package/dist/server/shared/utils/command-availability.d.ts +1 -0
- package/dist/server/shared/utils/command-availability.js +83 -0
- package/dist/server/shared/utils/command-availability.js.map +1 -0
- package/dist/server/shared/utils/secret-box.d.ts +2 -0
- package/dist/server/shared/utils/secret-box.js +29 -0
- package/dist/server/shared/utils/secret-box.js.map +1 -0
- package/dist/server/shared/utils/terminal-debug-log.js +5 -3
- package/dist/server/shared/utils/terminal-debug-log.js.map +1 -1
- package/dist/server/storage/repositories/ai-fallback-edit-repository.d.ts +11 -0
- package/dist/server/storage/repositories/ai-fallback-edit-repository.js +118 -0
- package/dist/server/storage/repositories/ai-fallback-edit-repository.js.map +1 -0
- package/dist/server/storage/repositories/debug-runtime-session-repository.d.ts +11 -0
- package/dist/server/storage/repositories/debug-runtime-session-repository.js +100 -0
- package/dist/server/storage/repositories/debug-runtime-session-repository.js.map +1 -0
- package/dist/server/storage/repositories/debug-service-repository.d.ts +9 -0
- package/dist/server/storage/repositories/debug-service-repository.js +99 -0
- package/dist/server/storage/repositories/debug-service-repository.js.map +1 -0
- package/dist/server/storage/repositories/debug-target-repository.d.ts +11 -0
- package/dist/server/storage/repositories/debug-target-repository.js +100 -0
- package/dist/server/storage/repositories/debug-target-repository.js.map +1 -0
- package/dist/server/storage/repositories/framework-analysis-result-repository.d.ts +9 -0
- package/dist/server/storage/repositories/framework-analysis-result-repository.js +98 -0
- package/dist/server/storage/repositories/framework-analysis-result-repository.js.map +1 -0
- package/dist/server/storage/repositories/git-remote-credential-repository.d.ts +9 -0
- package/dist/server/storage/repositories/git-remote-credential-repository.js +51 -0
- package/dist/server/storage/repositories/git-remote-credential-repository.js.map +1 -0
- package/dist/server/storage/repositories/port-lease-repository.d.ts +12 -0
- package/dist/server/storage/repositories/port-lease-repository.js +124 -0
- package/dist/server/storage/repositories/port-lease-repository.js.map +1 -0
- package/dist/server/storage/repositories/runtime-binding-repository.d.ts +10 -0
- package/dist/server/storage/repositories/runtime-binding-repository.js +89 -0
- package/dist/server/storage/repositories/runtime-binding-repository.js.map +1 -0
- package/dist/server/storage/repositories/session-fork-repository.d.ts +8 -0
- package/dist/server/storage/repositories/session-fork-repository.js +69 -0
- package/dist/server/storage/repositories/session-fork-repository.js.map +1 -0
- package/dist/server/storage/repositories/session-index-repository.js +40 -2
- package/dist/server/storage/repositories/session-index-repository.js.map +1 -1
- package/dist/server/storage/repositories/terminal-command-template-repository.js +77 -4
- package/dist/server/storage/repositories/terminal-command-template-repository.js.map +1 -1
- package/dist/server/storage/repositories/terminal-instance-repository.js +89 -7
- package/dist/server/storage/repositories/terminal-instance-repository.js.map +1 -1
- package/dist/server/storage/repositories/workspace-navigation-state-repository.d.ts +9 -0
- package/dist/server/storage/repositories/workspace-navigation-state-repository.js +49 -0
- package/dist/server/storage/repositories/workspace-navigation-state-repository.js.map +1 -0
- package/dist/server/storage/repositories/workspace-repository.d.ts +7 -1
- package/dist/server/storage/repositories/workspace-repository.js +32 -8
- package/dist/server/storage/repositories/workspace-repository.js.map +1 -1
- package/dist/server/storage/repositories/workspace-worktree-repository.d.ts +13 -0
- package/dist/server/storage/repositories/workspace-worktree-repository.js +158 -0
- package/dist/server/storage/repositories/workspace-worktree-repository.js.map +1 -0
- package/dist/server/storage/sqlite/client.js +408 -0
- package/dist/server/storage/sqlite/client.js.map +1 -1
- package/dist/server/storage/sqlite/schema.sql +268 -0
- package/dist/server/types/domain.d.ts +256 -1
- package/dist/server/ws/workbench-ws-hub.js +33 -9
- package/dist/server/ws/workbench-ws-hub.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.d.ts +6 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js +240 -7
- package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/codex.d.ts +26 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +507 -2
- package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js +94 -5
- package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/opencode.d.ts +5 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js +293 -3
- package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/utils.d.ts +1 -0
- package/node_modules/@codingns/session-sync-core/dist/providers/utils.js +117 -17
- package/node_modules/@codingns/session-sync-core/dist/providers/utils.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.d.ts +10 -0
- package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +128 -8
- package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/services.d.ts +2 -1
- package/node_modules/@codingns/session-sync-core/dist/services.js +55 -8
- package/node_modules/@codingns/session-sync-core/dist/services.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/types.d.ts +33 -0
- package/package.json +1 -1
- package/dist/public/assets/index-CxeghocY.css +0 -1
- package/dist/public/assets/index-DXusStl0.js +0 -108
package/bin/codingns.mjs
CHANGED
|
@@ -14,61 +14,328 @@ if (!command || command === "help" || command === "--help" || command === "-h")
|
|
|
14
14
|
printHelp(0);
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
switch (command) {
|
|
18
|
+
case "start":
|
|
19
|
+
await runStartCommand(argv);
|
|
20
|
+
break;
|
|
21
|
+
case "assistant":
|
|
22
|
+
await runAssistantCommand(argv);
|
|
23
|
+
break;
|
|
24
|
+
default:
|
|
25
|
+
console.error(`[codingns] 不支持的命令:${command}`);
|
|
26
|
+
printHelp(1);
|
|
20
27
|
}
|
|
21
28
|
|
|
22
|
-
|
|
29
|
+
async function runStartCommand(argv) {
|
|
30
|
+
const options = parseArgs(argv, {
|
|
31
|
+
supportedOptions: ["host", "port", "data-dir"],
|
|
32
|
+
supportedFlags: ["demo"]
|
|
33
|
+
});
|
|
23
34
|
|
|
24
|
-
if (options.help) {
|
|
25
|
-
|
|
35
|
+
if (options.help) {
|
|
36
|
+
printHelp(0);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (options.errors.length > 0) {
|
|
40
|
+
for (const error of options.errors) {
|
|
41
|
+
console.error(`[codingns] ${error}`);
|
|
42
|
+
}
|
|
43
|
+
printHelp(1);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const host = readStringOption(
|
|
47
|
+
options.values.host,
|
|
48
|
+
process.env.HOST,
|
|
49
|
+
process.env.CODINGNS_HOST,
|
|
50
|
+
"0.0.0.0"
|
|
51
|
+
);
|
|
52
|
+
const port = parsePort(
|
|
53
|
+
readStringOption(options.values.port, process.env.PORT, process.env.CODINGNS_PORT, "3002")
|
|
54
|
+
);
|
|
55
|
+
const dataDir = resolveDataDir(
|
|
56
|
+
readStringOption(
|
|
57
|
+
options.values["data-dir"],
|
|
58
|
+
process.env.CODINGNS_DATA_DIR,
|
|
59
|
+
path.join(os.homedir(), ".codingns")
|
|
60
|
+
)
|
|
61
|
+
);
|
|
62
|
+
const demoMode = options.flags.demo || process.env.DEMO_MODE === "true";
|
|
63
|
+
|
|
64
|
+
fs.mkdirSync(dataDir, { recursive: true });
|
|
65
|
+
fs.mkdirSync(path.join(dataDir, "releases"), { recursive: true });
|
|
66
|
+
|
|
67
|
+
const { startHost } = await import("../dist/server/server/start-host.js");
|
|
68
|
+
|
|
69
|
+
await startHost({
|
|
70
|
+
host,
|
|
71
|
+
port,
|
|
72
|
+
webUiDir: path.join(distRoot, "public"),
|
|
73
|
+
databasePath: path.join(dataDir, "host.sqlite"),
|
|
74
|
+
releaseManifestRoot: path.join(dataDir, "releases"),
|
|
75
|
+
serverUpdatePackageName: "@jingyi0605/codingns",
|
|
76
|
+
demoMode
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
async function runAssistantCommand(argv) {
|
|
81
|
+
const [group, action, ...rest] = argv;
|
|
82
|
+
|
|
83
|
+
if (!group || group === "help" || group === "--help" || group === "-h") {
|
|
84
|
+
const topic = buildAssistantHelpTopic(action, rest);
|
|
85
|
+
printAssistantHelpTopic(topic, 0);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (!action || action === "help" || action === "--help" || action === "-h") {
|
|
89
|
+
printAssistantHelpTopic(group, 0);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (rest.length > 0 && isHelpToken(rest[0])) {
|
|
93
|
+
printAssistantHelpTopic(`${group}.${action}`, 0);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
switch (`${group}:${action ?? ""}`) {
|
|
97
|
+
case "capabilities:list":
|
|
98
|
+
await printAssistantResponse(await requestAssistant({
|
|
99
|
+
method: "GET",
|
|
100
|
+
path: "/api/assistant/capabilities",
|
|
101
|
+
argv: rest,
|
|
102
|
+
helpTopic: "capabilities.list"
|
|
103
|
+
}));
|
|
104
|
+
return;
|
|
105
|
+
case "projects:list":
|
|
106
|
+
await printAssistantResponse(await requestAssistant({
|
|
107
|
+
method: "GET",
|
|
108
|
+
path: "/api/assistant/projects",
|
|
109
|
+
argv: rest,
|
|
110
|
+
supportedOptions: ["workspace-id", "status", "risk-level"],
|
|
111
|
+
helpTopic: "projects.list"
|
|
112
|
+
}, (options) => ({
|
|
113
|
+
workspaceId: readOptionalTrimmedValue(options.values["workspace-id"]),
|
|
114
|
+
status: readOptionalTrimmedValue(options.values.status),
|
|
115
|
+
riskLevel: readOptionalTrimmedValue(options.values["risk-level"])
|
|
116
|
+
})));
|
|
117
|
+
return;
|
|
118
|
+
case "projects:get": {
|
|
119
|
+
const [projectId, ...tail] = rest;
|
|
120
|
+
await printAssistantResponse(await requestAssistant({
|
|
121
|
+
method: "GET",
|
|
122
|
+
path: `/api/assistant/projects/${requirePositional(projectId, "projectId")}`,
|
|
123
|
+
argv: tail,
|
|
124
|
+
helpTopic: "projects.get"
|
|
125
|
+
}));
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
case "sessions:list": {
|
|
129
|
+
await printAssistantResponse(await requestAssistant({
|
|
130
|
+
method: "GET",
|
|
131
|
+
path: `/api/assistant/projects/${requireOptionPositional(rest, "--project", "projectId")}/sessions`,
|
|
132
|
+
argv: stripConsumedOption(rest, "--project"),
|
|
133
|
+
supportedOptions: [],
|
|
134
|
+
helpTopic: "sessions.list"
|
|
135
|
+
}));
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
case "sessions:get": {
|
|
139
|
+
const [sessionId, ...tail] = rest;
|
|
140
|
+
await printAssistantResponse(await requestAssistant({
|
|
141
|
+
method: "GET",
|
|
142
|
+
path: `/api/assistant/sessions/${requirePositional(sessionId, "sessionId")}`,
|
|
143
|
+
argv: tail,
|
|
144
|
+
helpTopic: "sessions.get"
|
|
145
|
+
}));
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
case "sessions:messages": {
|
|
149
|
+
const [sessionId, ...tail] = rest;
|
|
150
|
+
await printAssistantResponse(await requestAssistant({
|
|
151
|
+
method: "GET",
|
|
152
|
+
path: `/api/assistant/sessions/${requirePositional(sessionId, "sessionId")}/messages`,
|
|
153
|
+
argv: tail,
|
|
154
|
+
supportedOptions: ["cursor", "limit", "direction"],
|
|
155
|
+
helpTopic: "sessions.messages"
|
|
156
|
+
}, (options) => ({
|
|
157
|
+
cursor: readOptionalTrimmedValue(options.values.cursor),
|
|
158
|
+
limit: readOptionalTrimmedValue(options.values.limit),
|
|
159
|
+
direction: readOptionalTrimmedValue(options.values.direction)
|
|
160
|
+
})));
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
case "sessions:runtime": {
|
|
164
|
+
const [sessionId, ...tail] = rest;
|
|
165
|
+
await printAssistantResponse(await requestAssistant({
|
|
166
|
+
method: "GET",
|
|
167
|
+
path: `/api/assistant/sessions/${requirePositional(sessionId, "sessionId")}/runtime`,
|
|
168
|
+
argv: tail,
|
|
169
|
+
helpTopic: "sessions.runtime"
|
|
170
|
+
}));
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
case "sessions:send": {
|
|
174
|
+
const [sessionId, ...tail] = rest;
|
|
175
|
+
await printAssistantResponse(await requestAssistant({
|
|
176
|
+
method: "POST",
|
|
177
|
+
path: `/api/assistant/sessions/${requirePositional(sessionId, "sessionId")}/messages`,
|
|
178
|
+
argv: tail,
|
|
179
|
+
supportedOptions: ["message", "client-request-id", "model", "reasoning-level", "permission-mode"],
|
|
180
|
+
helpTopic: "sessions.send"
|
|
181
|
+
}, (options) => ({
|
|
182
|
+
content: requireOptionValue(options.values.message, "message"),
|
|
183
|
+
clientRequestId: readOptionalTrimmedValue(options.values["client-request-id"]),
|
|
184
|
+
model: readOptionalTrimmedValue(options.values.model),
|
|
185
|
+
reasoningLevel: readOptionalTrimmedValue(options.values["reasoning-level"]),
|
|
186
|
+
permissionMode: readOptionalTrimmedValue(options.values["permission-mode"])
|
|
187
|
+
})));
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
case "sessions:fork": {
|
|
191
|
+
const [sessionId, ...tail] = rest;
|
|
192
|
+
await printAssistantResponse(await requestAssistant({
|
|
193
|
+
method: "POST",
|
|
194
|
+
path: `/api/assistant/sessions/${requirePositional(sessionId, "sessionId")}/forks`,
|
|
195
|
+
argv: tail,
|
|
196
|
+
supportedOptions: ["source-type", "message-id", "strategy", "target-provider"],
|
|
197
|
+
helpTopic: "sessions.fork"
|
|
198
|
+
}, (options) => ({
|
|
199
|
+
sourceType: readOptionalTrimmedValue(options.values["source-type"]),
|
|
200
|
+
sourceMessageId: readOptionalTrimmedValue(options.values["message-id"]),
|
|
201
|
+
strategy: readOptionalTrimmedValue(options.values.strategy),
|
|
202
|
+
targetProvider: readOptionalTrimmedValue(options.values["target-provider"])
|
|
203
|
+
})));
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
case "terminals:list":
|
|
207
|
+
await printAssistantResponse(await requestAssistant({
|
|
208
|
+
method: "GET",
|
|
209
|
+
path: "/api/assistant/terminals",
|
|
210
|
+
argv: rest,
|
|
211
|
+
supportedOptions: ["workspace-id", "project-id"],
|
|
212
|
+
helpTopic: "terminals.list"
|
|
213
|
+
}, (options) => ({
|
|
214
|
+
workspaceId: readOptionalTrimmedValue(options.values["workspace-id"]),
|
|
215
|
+
projectId: readOptionalTrimmedValue(options.values["project-id"])
|
|
216
|
+
})));
|
|
217
|
+
return;
|
|
218
|
+
case "terminals:history": {
|
|
219
|
+
const [terminalId, ...tail] = rest;
|
|
220
|
+
await printAssistantResponse(await requestAssistant({
|
|
221
|
+
method: "GET",
|
|
222
|
+
path: `/api/assistant/terminals/${requirePositional(terminalId, "terminalId")}/history`,
|
|
223
|
+
argv: tail,
|
|
224
|
+
supportedOptions: ["before-seq", "limit"],
|
|
225
|
+
helpTopic: "terminals.history"
|
|
226
|
+
}, (options) => ({
|
|
227
|
+
beforeSeq: readOptionalTrimmedValue(options.values["before-seq"]),
|
|
228
|
+
limit: readOptionalTrimmedValue(options.values.limit)
|
|
229
|
+
})));
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
case "terminals:send": {
|
|
233
|
+
const [terminalId, ...tail] = rest;
|
|
234
|
+
await printAssistantResponse(await requestAssistant({
|
|
235
|
+
method: "POST",
|
|
236
|
+
path: `/api/assistant/terminals/${requirePositional(terminalId, "terminalId")}/input`,
|
|
237
|
+
argv: tail,
|
|
238
|
+
supportedOptions: ["input"],
|
|
239
|
+
helpTopic: "terminals.send"
|
|
240
|
+
}, (options) => ({
|
|
241
|
+
content: requireOptionValue(options.values.input, "input")
|
|
242
|
+
})));
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
default:
|
|
246
|
+
console.error(`[codingns] 不支持的 assistant 子命令:${group}${action ? ` ${action}` : ""}`);
|
|
247
|
+
printAssistantHelpTopic("assistant", 1);
|
|
248
|
+
}
|
|
26
249
|
}
|
|
27
250
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
);
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
)
|
|
50
|
-
);
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
251
|
+
async function requestAssistant(command, buildPayload) {
|
|
252
|
+
const options = parseArgs(command.argv, {
|
|
253
|
+
supportedOptions: [
|
|
254
|
+
"base-url",
|
|
255
|
+
"token",
|
|
256
|
+
...(command.supportedOptions ?? [])
|
|
257
|
+
]
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
if (options.help) {
|
|
261
|
+
printAssistantHelpTopic(command.helpTopic ?? "assistant", 0);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
if (options.errors.length > 0) {
|
|
265
|
+
for (const error of options.errors) {
|
|
266
|
+
console.error(`[codingns] ${error}`);
|
|
267
|
+
}
|
|
268
|
+
printAssistantHelpTopic(command.helpTopic ?? "assistant", 1);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
const baseUrl = resolveAssistantBaseUrl(options.values["base-url"]);
|
|
272
|
+
const accessToken = resolveAssistantAccessToken(options.values.token);
|
|
273
|
+
const url = new URL(command.path, appendTrailingSlash(baseUrl));
|
|
274
|
+
const payload = buildPayload ? buildPayload(options) : null;
|
|
275
|
+
|
|
276
|
+
if (command.method === "GET" && payload) {
|
|
277
|
+
for (const [key, value] of Object.entries(payload)) {
|
|
278
|
+
if (typeof value === "string" && value.length > 0) {
|
|
279
|
+
url.searchParams.set(key, value);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
let response;
|
|
285
|
+
|
|
286
|
+
try {
|
|
287
|
+
response = await fetch(url, {
|
|
288
|
+
method: command.method,
|
|
289
|
+
headers: {
|
|
290
|
+
Authorization: `Bearer ${accessToken}`,
|
|
291
|
+
...(command.method === "POST" ? { "Content-Type": "application/json" } : {})
|
|
292
|
+
},
|
|
293
|
+
body: command.method === "POST" ? JSON.stringify(payload ?? {}) : undefined
|
|
294
|
+
});
|
|
295
|
+
} catch (error) {
|
|
296
|
+
const message = error instanceof Error ? error.message : "未知网络错误";
|
|
297
|
+
console.error(JSON.stringify({
|
|
298
|
+
ok: false,
|
|
299
|
+
detail: `助手能力请求失败:${message}`,
|
|
300
|
+
target: url.toString()
|
|
301
|
+
}, null, 2));
|
|
302
|
+
process.exit(1);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
const rawBody = await response.text();
|
|
306
|
+
const responseBody = tryParseJson(rawBody);
|
|
307
|
+
|
|
308
|
+
if (!response.ok) {
|
|
309
|
+
const detail = typeof responseBody?.detail === "string"
|
|
310
|
+
? responseBody.detail
|
|
311
|
+
: `HTTP ${response.status}`;
|
|
312
|
+
console.error(JSON.stringify({
|
|
313
|
+
ok: false,
|
|
314
|
+
status: response.status,
|
|
315
|
+
detail,
|
|
316
|
+
body: responseBody ?? rawBody
|
|
317
|
+
}, null, 2));
|
|
318
|
+
process.exit(1);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
return responseBody ?? rawBody;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
async function printAssistantResponse(payload) {
|
|
325
|
+
if (typeof payload === "string") {
|
|
326
|
+
console.log(payload);
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
function parseArgs(argv, input = {}) {
|
|
69
334
|
const values = {};
|
|
70
335
|
const flags = {};
|
|
71
336
|
const errors = [];
|
|
337
|
+
const supportedOptions = new Set(input.supportedOptions ?? []);
|
|
338
|
+
const supportedFlags = new Set(input.supportedFlags ?? []);
|
|
72
339
|
let index = 0;
|
|
73
340
|
|
|
74
341
|
while (index < argv.length) {
|
|
@@ -98,13 +365,13 @@ function parseArgs(argv) {
|
|
|
98
365
|
}
|
|
99
366
|
|
|
100
367
|
// 布尔标志(不需要值)
|
|
101
|
-
if (
|
|
368
|
+
if (supportedFlags.has(rawName)) {
|
|
102
369
|
flags[rawName] = true;
|
|
103
370
|
index += 1;
|
|
104
371
|
continue;
|
|
105
372
|
}
|
|
106
373
|
|
|
107
|
-
if (!
|
|
374
|
+
if (!supportedOptions.has(rawName)) {
|
|
108
375
|
errors.push(`不支持的参数:${token}`);
|
|
109
376
|
index += 1;
|
|
110
377
|
continue;
|
|
@@ -136,12 +403,33 @@ function parseArgs(argv) {
|
|
|
136
403
|
};
|
|
137
404
|
}
|
|
138
405
|
|
|
139
|
-
function
|
|
140
|
-
|
|
406
|
+
function resolveAssistantBaseUrl(input) {
|
|
407
|
+
const baseUrl = readStringOption(
|
|
408
|
+
input,
|
|
409
|
+
process.env.CODINGNS_BASE_URL,
|
|
410
|
+
process.env.CODINGNS_SERVER_BASE_URL,
|
|
411
|
+
"http://127.0.0.1:3002"
|
|
412
|
+
);
|
|
413
|
+
|
|
414
|
+
try {
|
|
415
|
+
return new URL(baseUrl).toString();
|
|
416
|
+
} catch {
|
|
417
|
+
fail(`助手调用 baseUrl 非法:${baseUrl}`);
|
|
418
|
+
}
|
|
141
419
|
}
|
|
142
420
|
|
|
143
|
-
function
|
|
144
|
-
|
|
421
|
+
function resolveAssistantAccessToken(input) {
|
|
422
|
+
const accessToken = readStringOption(
|
|
423
|
+
input,
|
|
424
|
+
process.env.CODINGNS_ACCESS_TOKEN,
|
|
425
|
+
process.env.CODINGNS_TOKEN
|
|
426
|
+
);
|
|
427
|
+
|
|
428
|
+
if (!accessToken) {
|
|
429
|
+
fail("缺少助手调用 access token,请传 --token 或设置 CODINGNS_ACCESS_TOKEN");
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
return accessToken;
|
|
145
433
|
}
|
|
146
434
|
|
|
147
435
|
function readStringOption(...values) {
|
|
@@ -154,6 +442,79 @@ function readStringOption(...values) {
|
|
|
154
442
|
return "";
|
|
155
443
|
}
|
|
156
444
|
|
|
445
|
+
function readOptionalTrimmedValue(value) {
|
|
446
|
+
const normalized = typeof value === "string" ? value.trim() : "";
|
|
447
|
+
return normalized.length > 0 ? normalized : null;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
function requireOptionValue(value, field) {
|
|
451
|
+
const normalized = readOptionalTrimmedValue(value);
|
|
452
|
+
|
|
453
|
+
if (!normalized) {
|
|
454
|
+
fail(`参数 --${field} 不能为空`);
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
return normalized;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
function requirePositional(value, field) {
|
|
461
|
+
const normalized = typeof value === "string" ? value.trim() : "";
|
|
462
|
+
|
|
463
|
+
if (!normalized) {
|
|
464
|
+
fail(`缺少位置参数:${field}`);
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
return normalized;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
function requireOptionPositional(argv, optionName, field) {
|
|
471
|
+
const index = argv.findIndex((token) => token === optionName || token.startsWith(`${optionName}=`));
|
|
472
|
+
|
|
473
|
+
if (index < 0) {
|
|
474
|
+
fail(`缺少必要参数:${optionName}`);
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
const token = argv[index];
|
|
478
|
+
|
|
479
|
+
if (token.includes("=")) {
|
|
480
|
+
return requirePositional(token.split("=", 2)[1], field);
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
return requirePositional(argv[index + 1], field);
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
function stripConsumedOption(argv, optionName) {
|
|
487
|
+
const index = argv.findIndex((token) => token === optionName || token.startsWith(`${optionName}=`));
|
|
488
|
+
|
|
489
|
+
if (index < 0) {
|
|
490
|
+
return argv;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
const token = argv[index];
|
|
494
|
+
|
|
495
|
+
if (token.includes("=")) {
|
|
496
|
+
return argv.filter((_, currentIndex) => currentIndex !== index);
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
return argv.filter((_, currentIndex) => currentIndex !== index && currentIndex !== index + 1);
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
function appendTrailingSlash(value) {
|
|
503
|
+
return value.endsWith("/") ? value : `${value}/`;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
function tryParseJson(input) {
|
|
507
|
+
if (!input) {
|
|
508
|
+
return null;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
try {
|
|
512
|
+
return JSON.parse(input);
|
|
513
|
+
} catch {
|
|
514
|
+
return null;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
|
|
157
518
|
function parsePort(input) {
|
|
158
519
|
const port = Number.parseInt(input, 10);
|
|
159
520
|
|
|
@@ -187,6 +548,7 @@ function printHelp(exitCode) {
|
|
|
187
548
|
codingns 用法:
|
|
188
549
|
|
|
189
550
|
codingns start [--host 0.0.0.0] [--port 3002] [--data-dir ~/.codingns] [--demo]
|
|
551
|
+
codingns assistant <group> <action> [options]
|
|
190
552
|
|
|
191
553
|
说明:
|
|
192
554
|
|
|
@@ -195,6 +557,13 @@ codingns 用法:
|
|
|
195
557
|
--data-dir 数据目录,默认 ~/.codingns
|
|
196
558
|
--demo 以演示模式启动(自动创建 demo 账户、15 分钟会话超时、开放 CORS)
|
|
197
559
|
--help 显示帮助
|
|
560
|
+
|
|
561
|
+
assistant 例子:
|
|
562
|
+
|
|
563
|
+
codingns assistant capabilities list --token <token>
|
|
564
|
+
codingns assistant projects list --status active --token <token>
|
|
565
|
+
codingns assistant sessions send <sessionId> --message "继续修复类型错误" --token <token>
|
|
566
|
+
codingns assistant terminals send <terminalId> --input "npm test\\n" --token <token>
|
|
198
567
|
`.trim();
|
|
199
568
|
|
|
200
569
|
if (exitCode === 0) {
|
|
@@ -206,6 +575,224 @@ codingns 用法:
|
|
|
206
575
|
process.exit(exitCode);
|
|
207
576
|
}
|
|
208
577
|
|
|
578
|
+
function printAssistantHelpTopic(topic, exitCode) {
|
|
579
|
+
const output = getAssistantHelpText(topic);
|
|
580
|
+
|
|
581
|
+
if (exitCode === 0) {
|
|
582
|
+
console.log(output);
|
|
583
|
+
} else {
|
|
584
|
+
console.error(output);
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
process.exit(exitCode);
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
function getAssistantHelpText(topic) {
|
|
591
|
+
switch (topic) {
|
|
592
|
+
case "capabilities":
|
|
593
|
+
case "capabilities.list":
|
|
594
|
+
return `
|
|
595
|
+
codingns assistant capabilities
|
|
596
|
+
|
|
597
|
+
用途:
|
|
598
|
+
查看当前 Host 开放了哪些助手能力,以及版本和限制。
|
|
599
|
+
|
|
600
|
+
用法:
|
|
601
|
+
codingns assistant capabilities list [--base-url http://127.0.0.1:3002] --token <token>
|
|
602
|
+
`.trim();
|
|
603
|
+
case "projects":
|
|
604
|
+
return `
|
|
605
|
+
codingns assistant projects
|
|
606
|
+
|
|
607
|
+
可用动作:
|
|
608
|
+
list 列出托管项目
|
|
609
|
+
get 读取单个项目详情
|
|
610
|
+
|
|
611
|
+
示例:
|
|
612
|
+
codingns assistant projects list --status active --token <token>
|
|
613
|
+
codingns assistant projects get <projectId> --token <token>
|
|
614
|
+
`.trim();
|
|
615
|
+
case "projects.list":
|
|
616
|
+
return `
|
|
617
|
+
codingns assistant projects list
|
|
618
|
+
|
|
619
|
+
用途:
|
|
620
|
+
按工作区、生命周期、风险等级筛选托管项目。
|
|
621
|
+
|
|
622
|
+
用法:
|
|
623
|
+
codingns assistant projects list [--workspace-id <id>] [--status active|paused|archived] [--risk-level low|medium|high] --token <token>
|
|
624
|
+
`.trim();
|
|
625
|
+
case "projects.get":
|
|
626
|
+
return `
|
|
627
|
+
codingns assistant projects get
|
|
628
|
+
|
|
629
|
+
用途:
|
|
630
|
+
读取项目详情、概况,以及该项目下可操作会话。
|
|
631
|
+
|
|
632
|
+
用法:
|
|
633
|
+
codingns assistant projects get <projectId> --token <token>
|
|
634
|
+
`.trim();
|
|
635
|
+
case "sessions":
|
|
636
|
+
return `
|
|
637
|
+
codingns assistant sessions
|
|
638
|
+
|
|
639
|
+
可用动作:
|
|
640
|
+
list 列出指定项目下的会话
|
|
641
|
+
get 读取会话详情
|
|
642
|
+
messages 读取消息窗口
|
|
643
|
+
runtime 读取运行态
|
|
644
|
+
send 向真实项目会话发送消息
|
|
645
|
+
fork 从会话或消息点 fork 新会话
|
|
646
|
+
|
|
647
|
+
示例:
|
|
648
|
+
codingns assistant sessions list --project <projectId> --token <token>
|
|
649
|
+
codingns assistant sessions send <sessionId> --message "继续修复" --token <token>
|
|
650
|
+
`.trim();
|
|
651
|
+
case "sessions.list":
|
|
652
|
+
return `
|
|
653
|
+
codingns assistant sessions list
|
|
654
|
+
|
|
655
|
+
用途:
|
|
656
|
+
列出指定项目下当前可操作的真实会话。
|
|
657
|
+
|
|
658
|
+
用法:
|
|
659
|
+
codingns assistant sessions list --project <projectId> --token <token>
|
|
660
|
+
`.trim();
|
|
661
|
+
case "sessions.get":
|
|
662
|
+
return `
|
|
663
|
+
codingns assistant sessions get
|
|
664
|
+
|
|
665
|
+
用途:
|
|
666
|
+
读取会话详情,包括当前状态和可继续操作的引用。
|
|
667
|
+
|
|
668
|
+
用法:
|
|
669
|
+
codingns assistant sessions get <sessionId> --token <token>
|
|
670
|
+
`.trim();
|
|
671
|
+
case "sessions.messages":
|
|
672
|
+
return `
|
|
673
|
+
codingns assistant sessions messages
|
|
674
|
+
|
|
675
|
+
用途:
|
|
676
|
+
分页读取某个会话的消息窗口。
|
|
677
|
+
|
|
678
|
+
用法:
|
|
679
|
+
codingns assistant sessions messages <sessionId> [--cursor <cursor>] [--limit 40] [--direction forward|backward] --token <token>
|
|
680
|
+
`.trim();
|
|
681
|
+
case "sessions.runtime":
|
|
682
|
+
return `
|
|
683
|
+
codingns assistant sessions runtime
|
|
684
|
+
|
|
685
|
+
用途:
|
|
686
|
+
读取会话当前运行态,用来判断能否继续发送或是否还在执行。
|
|
687
|
+
|
|
688
|
+
用法:
|
|
689
|
+
codingns assistant sessions runtime <sessionId> --token <token>
|
|
690
|
+
`.trim();
|
|
691
|
+
case "sessions.send":
|
|
692
|
+
return `
|
|
693
|
+
codingns assistant sessions send
|
|
694
|
+
|
|
695
|
+
用途:
|
|
696
|
+
向真实项目会话发送消息,推进开发,但不直接改本地代码。
|
|
697
|
+
|
|
698
|
+
用法:
|
|
699
|
+
codingns assistant sessions send <sessionId> --message "..." [--client-request-id <id>] [--model <model>] [--reasoning-level <level>] [--permission-mode <mode>] --token <token>
|
|
700
|
+
`.trim();
|
|
701
|
+
case "sessions.fork":
|
|
702
|
+
return `
|
|
703
|
+
codingns assistant sessions fork
|
|
704
|
+
|
|
705
|
+
用途:
|
|
706
|
+
从现有会话或消息点 fork 一个新分支会话。
|
|
707
|
+
|
|
708
|
+
用法:
|
|
709
|
+
codingns assistant sessions fork <sessionId> [--source-type session|message] [--message-id <id>] [--strategy auto|native-only|reconstruct-only] [--target-provider <provider>] --token <token>
|
|
710
|
+
`.trim();
|
|
711
|
+
case "terminals":
|
|
712
|
+
return `
|
|
713
|
+
codingns assistant terminals
|
|
714
|
+
|
|
715
|
+
可用动作:
|
|
716
|
+
list 列出项目或工作区下的终端
|
|
717
|
+
history 读取终端历史输出
|
|
718
|
+
send 向受控终端发送输入
|
|
719
|
+
|
|
720
|
+
示例:
|
|
721
|
+
codingns assistant terminals list --project-id <projectId> --token <token>
|
|
722
|
+
codingns assistant terminals send <terminalId> --input "npm test\\n" --token <token>
|
|
723
|
+
`.trim();
|
|
724
|
+
case "terminals.list":
|
|
725
|
+
return `
|
|
726
|
+
codingns assistant terminals list
|
|
727
|
+
|
|
728
|
+
用途:
|
|
729
|
+
列出指定项目或工作区下的受控终端。
|
|
730
|
+
|
|
731
|
+
用法:
|
|
732
|
+
codingns assistant terminals list [--workspace-id <id> | --project-id <id>] --token <token>
|
|
733
|
+
`.trim();
|
|
734
|
+
case "terminals.history":
|
|
735
|
+
return `
|
|
736
|
+
codingns assistant terminals history
|
|
737
|
+
|
|
738
|
+
用途:
|
|
739
|
+
分页读取终端历史输出。
|
|
740
|
+
|
|
741
|
+
用法:
|
|
742
|
+
codingns assistant terminals history <terminalId> [--before-seq <n>] [--limit 20] --token <token>
|
|
743
|
+
`.trim();
|
|
744
|
+
case "terminals.send":
|
|
745
|
+
return `
|
|
746
|
+
codingns assistant terminals send
|
|
747
|
+
|
|
748
|
+
用途:
|
|
749
|
+
向受控终端发送输入,比如测试命令或构建命令。
|
|
750
|
+
|
|
751
|
+
用法:
|
|
752
|
+
codingns assistant terminals send <terminalId> --input "npm test\\n" --token <token>
|
|
753
|
+
`.trim();
|
|
754
|
+
default:
|
|
755
|
+
return `
|
|
756
|
+
codingns assistant 用法:
|
|
757
|
+
|
|
758
|
+
codingns assistant help [capabilities|projects|sessions|terminals] [action]
|
|
759
|
+
codingns assistant capabilities list [--base-url http://127.0.0.1:3002] --token <token>
|
|
760
|
+
codingns assistant projects list [--workspace-id <id>] [--status active|paused|archived] [--risk-level low|medium|high] --token <token>
|
|
761
|
+
codingns assistant projects get <projectId> [--base-url ...] --token <token>
|
|
762
|
+
codingns assistant sessions list --project <projectId> [--base-url ...] --token <token>
|
|
763
|
+
codingns assistant sessions get <sessionId> [--base-url ...] --token <token>
|
|
764
|
+
codingns assistant sessions messages <sessionId> [--cursor <cursor>] [--limit 40] [--direction forward|backward] --token <token>
|
|
765
|
+
codingns assistant sessions runtime <sessionId> [--base-url ...] --token <token>
|
|
766
|
+
codingns assistant sessions send <sessionId> --message "..." [--client-request-id <id>] [--model <model>] [--reasoning-level <level>] [--permission-mode <mode>] --token <token>
|
|
767
|
+
codingns assistant sessions fork <sessionId> [--source-type session|message] [--message-id <id>] [--strategy auto|native-only|reconstruct-only] [--target-provider <provider>] --token <token>
|
|
768
|
+
codingns assistant terminals list [--workspace-id <id> | --project-id <id>] --token <token>
|
|
769
|
+
codingns assistant terminals history <terminalId> [--before-seq <n>] [--limit 20] --token <token>
|
|
770
|
+
codingns assistant terminals send <terminalId> --input "npm test\\n" --token <token>
|
|
771
|
+
|
|
772
|
+
环境变量:
|
|
773
|
+
|
|
774
|
+
CODINGNS_BASE_URL 默认 Host 地址,未传时默认 http://127.0.0.1:3002
|
|
775
|
+
CODINGNS_ACCESS_TOKEN 默认 Bearer token
|
|
776
|
+
`.trim();
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
function buildAssistantHelpTopic(action, rest) {
|
|
781
|
+
if (!action || action === "--help" || action === "-h") {
|
|
782
|
+
return "assistant";
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
if (rest.length === 0) {
|
|
786
|
+
return action;
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
return `${action}.${rest[0]}`;
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
function isHelpToken(value) {
|
|
793
|
+
return value === "help" || value === "--help" || value === "-h";
|
|
794
|
+
}
|
|
795
|
+
|
|
209
796
|
function fail(message) {
|
|
210
797
|
console.error(`[codingns] ${message}`);
|
|
211
798
|
process.exit(1);
|