@mrpatronz/nexusflow 1.9.1 → 2.1.1
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 +2 -1
- package/dist/agent/AcpCliAdapter.d.ts +75 -0
- package/dist/agent/AcpCliAdapter.d.ts.map +1 -0
- package/dist/agent/AcpCliAdapter.js +292 -0
- package/dist/agent/AcpCliAdapter.js.map +1 -0
- package/dist/agent/AcpCliAdapter.test.d.ts +2 -0
- package/dist/agent/AcpCliAdapter.test.d.ts.map +1 -0
- package/dist/agent/AcpCliAdapter.test.js +235 -0
- package/dist/agent/AcpCliAdapter.test.js.map +1 -0
- package/dist/agent/ClaudeCliAdapter.d.ts +40 -5
- package/dist/agent/ClaudeCliAdapter.d.ts.map +1 -1
- package/dist/agent/ClaudeCliAdapter.js +212 -15
- package/dist/agent/ClaudeCliAdapter.js.map +1 -1
- package/dist/agent/ClaudeCliAdapter.test.d.ts +2 -0
- package/dist/agent/ClaudeCliAdapter.test.d.ts.map +1 -0
- package/dist/agent/ClaudeCliAdapter.test.js +320 -0
- package/dist/agent/ClaudeCliAdapter.test.js.map +1 -0
- package/dist/agent/CliAdapterBase.d.ts +29 -12
- package/dist/agent/CliAdapterBase.d.ts.map +1 -1
- package/dist/agent/CliAdapterBase.js +76 -36
- package/dist/agent/CliAdapterBase.js.map +1 -1
- package/dist/agent/CodexCliAdapter.d.ts +51 -0
- package/dist/agent/CodexCliAdapter.d.ts.map +1 -0
- package/dist/agent/CodexCliAdapter.js +226 -0
- package/dist/agent/CodexCliAdapter.js.map +1 -0
- package/dist/agent/CodexCliAdapter.test.d.ts +2 -0
- package/dist/agent/CodexCliAdapter.test.d.ts.map +1 -0
- package/dist/agent/CodexCliAdapter.test.js +316 -0
- package/dist/agent/CodexCliAdapter.test.js.map +1 -0
- package/dist/agent/CopilotAcpAdapter.d.ts +7 -0
- package/dist/agent/CopilotAcpAdapter.d.ts.map +1 -0
- package/dist/agent/CopilotAcpAdapter.js +29 -0
- package/dist/agent/CopilotAcpAdapter.js.map +1 -0
- package/dist/agent/ProviderRegistry.d.ts +50 -3
- package/dist/agent/ProviderRegistry.d.ts.map +1 -1
- package/dist/agent/ProviderRegistry.js +43 -8
- package/dist/agent/ProviderRegistry.js.map +1 -1
- package/dist/agent/ProviderRegistry.test.js +53 -0
- package/dist/agent/ProviderRegistry.test.js.map +1 -1
- package/dist/agent/adapters.d.ts +16 -0
- package/dist/agent/adapters.d.ts.map +1 -1
- package/dist/agent/adapters.js +114 -4
- package/dist/agent/adapters.js.map +1 -1
- package/dist/agent/adapters.test.d.ts +2 -0
- package/dist/agent/adapters.test.d.ts.map +1 -0
- package/dist/agent/adapters.test.js +71 -0
- package/dist/agent/adapters.test.js.map +1 -0
- package/dist/agent/cliAvailability.d.ts +86 -0
- package/dist/agent/cliAvailability.d.ts.map +1 -0
- package/dist/agent/cliAvailability.js +231 -0
- package/dist/agent/cliAvailability.js.map +1 -0
- package/dist/agent/cliAvailability.test.d.ts +2 -0
- package/dist/agent/cliAvailability.test.d.ts.map +1 -0
- package/dist/agent/cliAvailability.test.js +192 -0
- package/dist/agent/cliAvailability.test.js.map +1 -0
- package/dist/agent/session.d.ts +2 -1
- package/dist/agent/session.d.ts.map +1 -1
- package/dist/agent/session.js +15 -4
- package/dist/agent/session.js.map +1 -1
- package/dist/agent/session.test.js +29 -8
- package/dist/agent/session.test.js.map +1 -1
- package/dist/analyzers/detect-deps.d.ts.map +1 -1
- package/dist/analyzers/detect-deps.js +16 -19
- package/dist/analyzers/detect-deps.js.map +1 -1
- package/dist/analyzers/index.d.ts +0 -2
- package/dist/analyzers/index.d.ts.map +1 -1
- package/dist/analyzers/index.js +6 -9
- package/dist/analyzers/index.js.map +1 -1
- package/dist/commands/commands.test.js +4 -3
- package/dist/commands/commands.test.js.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/knowledge.d.ts +10 -0
- package/dist/commands/knowledge.d.ts.map +1 -1
- package/dist/commands/knowledge.js +27 -1
- package/dist/commands/knowledge.js.map +1 -1
- package/dist/commands/knowledge.test.d.ts +2 -0
- package/dist/commands/knowledge.test.d.ts.map +1 -0
- package/dist/commands/knowledge.test.js +77 -0
- package/dist/commands/knowledge.test.js.map +1 -0
- package/dist/commands/refresh.d.ts +2 -4
- package/dist/commands/refresh.d.ts.map +1 -1
- package/dist/commands/refresh.js +4 -20
- package/dist/commands/refresh.js.map +1 -1
- package/dist/core/adapters/registry.d.ts.map +1 -1
- package/dist/core/adapters/registry.js +8 -3
- package/dist/core/adapters/registry.js.map +1 -1
- package/dist/core/adapters/storage.test.js +5 -24
- package/dist/core/adapters/storage.test.js.map +1 -1
- package/dist/core/analysis-cache.d.ts +15 -8
- package/dist/core/analysis-cache.d.ts.map +1 -1
- package/dist/core/analysis-cache.js +61 -10
- package/dist/core/analysis-cache.js.map +1 -1
- package/dist/core/analysis-cache.test.js +17 -4
- package/dist/core/analysis-cache.test.js.map +1 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +5 -4
- package/dist/core/config.js.map +1 -1
- package/dist/core/doctor.d.ts.map +1 -1
- package/dist/core/doctor.js +9 -5
- package/dist/core/doctor.js.map +1 -1
- package/dist/core/knowledge.d.ts +14 -4
- package/dist/core/knowledge.d.ts.map +1 -1
- package/dist/core/knowledge.js +64 -14
- package/dist/core/knowledge.js.map +1 -1
- package/dist/core/knowledge.test.js +54 -2
- package/dist/core/knowledge.test.js.map +1 -1
- package/dist/core/locks.d.ts +43 -0
- package/dist/core/locks.d.ts.map +1 -0
- package/dist/core/locks.js +102 -0
- package/dist/core/locks.js.map +1 -0
- package/dist/core/locks.test.d.ts +2 -0
- package/dist/core/locks.test.d.ts.map +1 -0
- package/dist/core/locks.test.js +95 -0
- package/dist/core/locks.test.js.map +1 -0
- package/dist/core/ports/storage.d.ts +3 -3
- package/dist/core/ports/storage.d.ts.map +1 -1
- package/dist/core/refresh.d.ts +12 -13
- package/dist/core/refresh.d.ts.map +1 -1
- package/dist/core/refresh.js +14 -11
- package/dist/core/refresh.js.map +1 -1
- package/dist/core/refresh.test.js +17 -11
- package/dist/core/refresh.test.js.map +1 -1
- package/dist/core/scheduler.d.ts.map +1 -1
- package/dist/core/scheduler.js +2 -65
- package/dist/core/scheduler.js.map +1 -1
- package/dist/core/sync.js +3 -3
- package/dist/core/sync.js.map +1 -1
- package/dist/core/worktree.js +2 -2
- package/dist/core/worktree.js.map +1 -1
- package/dist/core/worktree.test.js +2 -2
- package/dist/core/worktree.test.js.map +1 -1
- package/dist/generators/base.d.ts +31 -2
- package/dist/generators/base.d.ts.map +1 -1
- package/dist/generators/base.js +174 -238
- package/dist/generators/base.js.map +1 -1
- package/dist/generators/base.test.js +231 -24
- package/dist/generators/base.test.js.map +1 -1
- package/dist/generators/claude.d.ts +19 -5
- package/dist/generators/claude.d.ts.map +1 -1
- package/dist/generators/claude.js +33 -11
- package/dist/generators/claude.js.map +1 -1
- package/dist/generators/index.d.ts +10 -9
- package/dist/generators/index.d.ts.map +1 -1
- package/dist/generators/index.js +103 -118
- package/dist/generators/index.js.map +1 -1
- package/dist/generators/plan-generator.d.ts.map +1 -1
- package/dist/generators/plan-generator.js +217 -193
- package/dist/generators/plan-generator.js.map +1 -1
- package/dist/generators/plan-generator.test.d.ts +2 -0
- package/dist/generators/plan-generator.test.d.ts.map +1 -0
- package/dist/generators/plan-generator.test.js +217 -0
- package/dist/generators/plan-generator.test.js.map +1 -0
- package/dist/gui/assets/DashboardPage-BeAHHUtn.js +1 -0
- package/dist/gui/assets/GettingStartedPage-CFAyG0ar.js +1 -0
- package/dist/gui/assets/ProjectsPage-C0SmbBqW.js +1 -0
- package/dist/gui/assets/{ScaffoldRepoInline-DRipQsos.js → ScaffoldRepoInline-lfFwOnQu.js} +1 -1
- package/dist/gui/assets/SettingsPage-DIBk9fu8.js +1 -0
- package/dist/gui/assets/StartWorkPage-CWC5OujI.js +1 -0
- package/dist/gui/assets/{StrategiesPage-6LWOnKdk.js → StrategiesPage-Dcq10WZS.js} +2 -2
- package/dist/gui/assets/WorkspacesPage-BqOx6Gbe.js +6 -0
- package/dist/gui/assets/index-B5IYXvr6.css +2 -0
- package/dist/gui/assets/{index-CyYbQwRf.js → index-BCfJkb0T.js} +7 -7
- package/dist/gui/index.html +2 -2
- package/dist/index.js +2 -4
- package/dist/index.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +11 -15
- package/dist/mcp/tools.js.map +1 -1
- package/dist/resources/workflows/plan-implement-review.md +8 -0
- package/dist/resources/workflows/research-verify.md +6 -0
- package/dist/resources/workflows/solo-developer.md +3 -0
- package/dist/server.d.ts +13 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +154 -23
- package/dist/server.js.map +1 -1
- package/dist/server.test.js +147 -3
- package/dist/server.test.js.map +1 -1
- package/dist/types.d.ts +0 -24
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/prompts.js +2 -2
- package/dist/utils/prompts.js.map +1 -1
- package/dist/utils/resources.d.ts +28 -0
- package/dist/utils/resources.d.ts.map +1 -0
- package/dist/utils/resources.js +54 -0
- package/dist/utils/resources.js.map +1 -0
- package/dist/utils/session-finder.d.ts +3 -0
- package/dist/utils/session-finder.d.ts.map +1 -1
- package/dist/utils/session-finder.js +54 -10
- package/dist/utils/session-finder.js.map +1 -1
- package/dist/utils/session-finder.test.js +61 -2
- package/dist/utils/session-finder.test.js.map +1 -1
- package/dist/utils/workflow-advisor.d.ts.map +1 -1
- package/dist/utils/workflow-advisor.js +17 -27
- package/dist/utils/workflow-advisor.js.map +1 -1
- package/dist/utils/workflows.d.ts.map +1 -1
- package/dist/utils/workflows.js +6 -2
- package/dist/utils/workflows.js.map +1 -1
- package/package.json +8 -4
- package/resources/workflows/plan-implement-review.md +8 -0
- package/resources/workflows/research-verify.md +6 -0
- package/resources/workflows/solo-developer.md +3 -0
- package/dist/analyzers/detect-apis.d.ts +0 -19
- package/dist/analyzers/detect-apis.d.ts.map +0 -1
- package/dist/analyzers/detect-apis.js +0 -250
- package/dist/analyzers/detect-apis.js.map +0 -1
- package/dist/analyzers/messaging-analyzer.d.ts +0 -17
- package/dist/analyzers/messaging-analyzer.d.ts.map +0 -1
- package/dist/analyzers/messaging-analyzer.js +0 -229
- package/dist/analyzers/messaging-analyzer.js.map +0 -1
- package/dist/core/adapters/vault-storage.d.ts +0 -16
- package/dist/core/adapters/vault-storage.d.ts.map +0 -1
- package/dist/core/adapters/vault-storage.js +0 -77
- package/dist/core/adapters/vault-storage.js.map +0 -1
- package/dist/core/graph.d.ts +0 -35
- package/dist/core/graph.d.ts.map +0 -1
- package/dist/core/graph.js +0 -281
- package/dist/core/graph.js.map +0 -1
- package/dist/generators/diff-context.d.ts +0 -6
- package/dist/generators/diff-context.d.ts.map +0 -1
- package/dist/generators/diff-context.js +0 -70
- package/dist/generators/diff-context.js.map +0 -1
- package/dist/generators/map-generator.d.ts +0 -15
- package/dist/generators/map-generator.d.ts.map +0 -1
- package/dist/generators/map-generator.js +0 -514
- package/dist/generators/map-generator.js.map +0 -1
- package/dist/generators/map-generator.test.d.ts +0 -2
- package/dist/generators/map-generator.test.d.ts.map +0 -1
- package/dist/generators/map-generator.test.js +0 -147
- package/dist/generators/map-generator.test.js.map +0 -1
- package/dist/gui/assets/DashboardPage-C3NH97y2.js +0 -1
- package/dist/gui/assets/GettingStartedPage-og-Kv7Sm.js +0 -1
- package/dist/gui/assets/ProjectsPage-COqqadEr.js +0 -1
- package/dist/gui/assets/SettingsPage-CpU3V9oU.js +0 -1
- package/dist/gui/assets/StartWorkPage-DIND0hJy.js +0 -1
- package/dist/gui/assets/WorkspacesPage-BUqgOhuy.js +0 -6
- package/dist/gui/assets/index-CsA2SueF.css +0 -2
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module agent/cliAvailability
|
|
3
|
+
* Whether a local CLI agent can actually be driven headlessly.
|
|
4
|
+
*
|
|
5
|
+
* The CLI providers previously reported `isConfigured: () => true` with the note
|
|
6
|
+
* "assume the CLI is installed". That advertises a working provider in the UI even
|
|
7
|
+
* when it cannot run, so a chat opens, the first turn fails, and the message the
|
|
8
|
+
* user sees is whatever the CLI happened to print.
|
|
9
|
+
*
|
|
10
|
+
* Provider-owned status commands are the source of truth. In particular,
|
|
11
|
+
* NexusFlow must not infer Claude login from private credential-file shapes:
|
|
12
|
+
* newer installations may use a keychain or host-managed subscription login.
|
|
13
|
+
*
|
|
14
|
+
* Checks are synchronous because `ProviderAdapter.isConfigured()` is. Probe output
|
|
15
|
+
* is reduced to a closed setup state so account and credential details never cross
|
|
16
|
+
* the server boundary.
|
|
17
|
+
*/
|
|
18
|
+
export interface CliStatus {
|
|
19
|
+
/** Whether a turn stands a chance of succeeding. */
|
|
20
|
+
usable: boolean;
|
|
21
|
+
/** User-facing explanation. Present whenever `usable` is false. */
|
|
22
|
+
message?: string;
|
|
23
|
+
setupIssue?: 'missing-cli' | 'signed-out' | 'probe-failed';
|
|
24
|
+
recoveryCommand?: string;
|
|
25
|
+
recoveryLabel?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface DetectOptions {
|
|
28
|
+
/** Overrides for tests. */
|
|
29
|
+
env?: NodeJS.ProcessEnv;
|
|
30
|
+
/** Skips the PATH scan when availability is already known. */
|
|
31
|
+
hasBinary?: boolean;
|
|
32
|
+
}
|
|
33
|
+
export interface CodexDetectOptions extends DetectOptions {
|
|
34
|
+
/** Injected command outcome for deterministic tests. */
|
|
35
|
+
loginStatus?: {
|
|
36
|
+
exitCode: number | null;
|
|
37
|
+
error?: string;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export interface ClaudeDetectOptions extends DetectOptions {
|
|
41
|
+
/** Injected command outcome for deterministic tests. */
|
|
42
|
+
authStatus?: {
|
|
43
|
+
exitCode: number | null;
|
|
44
|
+
stdout?: string;
|
|
45
|
+
error?: string;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export interface CopilotDetectOptions extends DetectOptions {
|
|
49
|
+
/** Injected command outcome for deterministic tests. */
|
|
50
|
+
helpStatus?: {
|
|
51
|
+
exitCode: number | null;
|
|
52
|
+
output?: string;
|
|
53
|
+
error?: string;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Resolves an executable on PATH the way a shell would, honouring PATHEXT on
|
|
58
|
+
* Windows so `claude.cmd` and `claude.exe` both count.
|
|
59
|
+
*/
|
|
60
|
+
export declare function findExecutable(name: string, env?: NodeJS.ProcessEnv): string | null;
|
|
61
|
+
/**
|
|
62
|
+
* Whether `claude` can be driven in print mode.
|
|
63
|
+
*
|
|
64
|
+
* `claude auth status --json` is the provider-owned authority. NexusFlow only
|
|
65
|
+
* inspects the boolean `loggedIn` field and never reads or returns credential,
|
|
66
|
+
* account, auth-method, or provider values.
|
|
67
|
+
*/
|
|
68
|
+
export declare function detectClaudeCliStatus(options?: ClaudeDetectOptions): CliStatus;
|
|
69
|
+
/** Whether the Antigravity CLI is present. It manages its own auth. */
|
|
70
|
+
export declare function detectAntigravityCliStatus(options?: DetectOptions): CliStatus;
|
|
71
|
+
/**
|
|
72
|
+
* Whether Codex can run non-interactively with the user's existing CLI login.
|
|
73
|
+
* `codex login status` is the supported auth probe and does not expose or copy
|
|
74
|
+
* the credential store. A ChatGPT subscription login is sufficient; no API key
|
|
75
|
+
* is required.
|
|
76
|
+
*/
|
|
77
|
+
export declare function detectCodexCliStatus(options?: CodexDetectOptions): CliStatus;
|
|
78
|
+
/**
|
|
79
|
+
* Whether the installed Copilot CLI exposes its supported ACP server.
|
|
80
|
+
*
|
|
81
|
+
* Copilot has no documented non-interactive login-status command. Session
|
|
82
|
+
* creation is therefore the authentication authority; this probe only avoids
|
|
83
|
+
* advertising older installations that cannot speak ACP at all.
|
|
84
|
+
*/
|
|
85
|
+
export declare function detectCopilotCliStatus(options?: CopilotDetectOptions): CliStatus;
|
|
86
|
+
//# sourceMappingURL=cliAvailability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cliAvailability.d.ts","sourceRoot":"","sources":["../../src/agent/cliAvailability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,MAAM,WAAW,SAAS;IACxB,oDAAoD;IACpD,MAAM,EAAE,OAAO,CAAC;IAChB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,aAAa,GAAG,YAAY,GAAG,cAAc,CAAC;IAC3D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,2BAA2B;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,wDAAwD;IACxD,WAAW,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3D;AAED,MAAM,WAAW,mBAAoB,SAAQ,aAAa;IACxD,wDAAwD;IACxD,UAAU,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3E;AAED,MAAM,WAAW,oBAAqB,SAAQ,aAAa;IACzD,wDAAwD;IACxD,UAAU,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,GAAG,IAAI,CAsBhG;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,mBAAwB,GAAG,SAAS,CAgElF;AAED,uEAAuE;AACvE,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,aAAkB,GAAG,SAAS,CAUjF;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,kBAAuB,GAAG,SAAS,CAiDhF;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,oBAAyB,GAAG,SAAS,CAgDpF"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module agent/cliAvailability
|
|
3
|
+
* Whether a local CLI agent can actually be driven headlessly.
|
|
4
|
+
*
|
|
5
|
+
* The CLI providers previously reported `isConfigured: () => true` with the note
|
|
6
|
+
* "assume the CLI is installed". That advertises a working provider in the UI even
|
|
7
|
+
* when it cannot run, so a chat opens, the first turn fails, and the message the
|
|
8
|
+
* user sees is whatever the CLI happened to print.
|
|
9
|
+
*
|
|
10
|
+
* Provider-owned status commands are the source of truth. In particular,
|
|
11
|
+
* NexusFlow must not infer Claude login from private credential-file shapes:
|
|
12
|
+
* newer installations may use a keychain or host-managed subscription login.
|
|
13
|
+
*
|
|
14
|
+
* Checks are synchronous because `ProviderAdapter.isConfigured()` is. Probe output
|
|
15
|
+
* is reduced to a closed setup state so account and credential details never cross
|
|
16
|
+
* the server boundary.
|
|
17
|
+
*/
|
|
18
|
+
import * as fsSync from 'node:fs';
|
|
19
|
+
import * as path from 'node:path';
|
|
20
|
+
import { spawnSync } from 'node:child_process';
|
|
21
|
+
/**
|
|
22
|
+
* Resolves an executable on PATH the way a shell would, honouring PATHEXT on
|
|
23
|
+
* Windows so `claude.cmd` and `claude.exe` both count.
|
|
24
|
+
*/
|
|
25
|
+
export function findExecutable(name, env = process.env) {
|
|
26
|
+
const pathValue = env.PATH ?? env.Path ?? '';
|
|
27
|
+
if (!pathValue)
|
|
28
|
+
return null;
|
|
29
|
+
const separator = process.platform === 'win32' ? ';' : ':';
|
|
30
|
+
const extensions = process.platform === 'win32'
|
|
31
|
+
? (env.PATHEXT ?? '.COM;.EXE;.BAT;.CMD').split(';').filter(Boolean)
|
|
32
|
+
: [''];
|
|
33
|
+
for (const dir of pathValue.split(separator).filter(Boolean)) {
|
|
34
|
+
const base = path.join(dir.replace(/^"|"$/g, ''), name);
|
|
35
|
+
const candidates = [base, ...extensions.map((extension) => base + extension.toLowerCase())];
|
|
36
|
+
for (const candidate of candidates) {
|
|
37
|
+
try {
|
|
38
|
+
if (fsSync.statSync(candidate).isFile())
|
|
39
|
+
return candidate;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Not here; keep looking.
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Whether `claude` can be driven in print mode.
|
|
50
|
+
*
|
|
51
|
+
* `claude auth status --json` is the provider-owned authority. NexusFlow only
|
|
52
|
+
* inspects the boolean `loggedIn` field and never reads or returns credential,
|
|
53
|
+
* account, auth-method, or provider values.
|
|
54
|
+
*/
|
|
55
|
+
export function detectClaudeCliStatus(options = {}) {
|
|
56
|
+
const env = options.env ?? process.env;
|
|
57
|
+
const executable = options.hasBinary === false ? null : findExecutable('claude', env);
|
|
58
|
+
const hasBinary = options.hasBinary ?? executable !== null;
|
|
59
|
+
if (!hasBinary) {
|
|
60
|
+
return {
|
|
61
|
+
usable: false,
|
|
62
|
+
message: 'The Claude Code CLI was not found on PATH.',
|
|
63
|
+
setupIssue: 'missing-cli',
|
|
64
|
+
recoveryCommand: 'npm install -g @anthropic-ai/claude-code',
|
|
65
|
+
recoveryLabel: 'Copy install command',
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
if (env.ANTHROPIC_API_KEY
|
|
69
|
+
|| env.ANTHROPIC_AUTH_TOKEN
|
|
70
|
+
|| env.CLAUDE_CODE_USE_BEDROCK === '1'
|
|
71
|
+
|| env.CLAUDE_CODE_USE_VERTEX === '1'
|
|
72
|
+
|| env.CLAUDE_CODE_USE_FOUNDRY === '1')
|
|
73
|
+
return { usable: true };
|
|
74
|
+
let authStatus = options.authStatus;
|
|
75
|
+
if (!authStatus) {
|
|
76
|
+
const result = spawnSync(executable ?? 'claude', ['auth', 'status', '--json'], {
|
|
77
|
+
env,
|
|
78
|
+
encoding: 'utf-8',
|
|
79
|
+
timeout: 5_000,
|
|
80
|
+
windowsHide: true,
|
|
81
|
+
shell: process.platform === 'win32' && /\.(cmd|bat)$/i.test(executable ?? ''),
|
|
82
|
+
});
|
|
83
|
+
authStatus = {
|
|
84
|
+
exitCode: result.status,
|
|
85
|
+
stdout: result.stdout ?? '',
|
|
86
|
+
error: result.error?.message,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
if (!authStatus.error && typeof authStatus.stdout === 'string') {
|
|
90
|
+
try {
|
|
91
|
+
const parsed = JSON.parse(authStatus.stdout);
|
|
92
|
+
if (parsed.loggedIn === true)
|
|
93
|
+
return { usable: true };
|
|
94
|
+
if (parsed.loggedIn === false) {
|
|
95
|
+
return {
|
|
96
|
+
usable: false,
|
|
97
|
+
message: 'Claude Code is installed but not signed in. Use your Claude subscription; no API key is required.',
|
|
98
|
+
setupIssue: 'signed-out',
|
|
99
|
+
recoveryCommand: 'claude auth login',
|
|
100
|
+
recoveryLabel: 'Copy sign-in command',
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// A changed or malformed provider response is a compatibility failure,
|
|
106
|
+
// not evidence that the user is signed out.
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
usable: false,
|
|
111
|
+
message: 'NexusFlow could not verify Claude Code login. Check it in a terminal, then recheck.',
|
|
112
|
+
setupIssue: 'probe-failed',
|
|
113
|
+
recoveryCommand: 'claude auth status --json',
|
|
114
|
+
recoveryLabel: 'Copy status command',
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/** Whether the Antigravity CLI is present. It manages its own auth. */
|
|
118
|
+
export function detectAntigravityCliStatus(options = {}) {
|
|
119
|
+
const env = options.env ?? process.env;
|
|
120
|
+
const hasBinary = options.hasBinary ?? findExecutable('agy', env) !== null;
|
|
121
|
+
return hasBinary
|
|
122
|
+
? { usable: true }
|
|
123
|
+
: {
|
|
124
|
+
usable: false,
|
|
125
|
+
message: 'The Antigravity CLI (`agy`) was not found on PATH.',
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Whether Codex can run non-interactively with the user's existing CLI login.
|
|
130
|
+
* `codex login status` is the supported auth probe and does not expose or copy
|
|
131
|
+
* the credential store. A ChatGPT subscription login is sufficient; no API key
|
|
132
|
+
* is required.
|
|
133
|
+
*/
|
|
134
|
+
export function detectCodexCliStatus(options = {}) {
|
|
135
|
+
const env = options.env ?? process.env;
|
|
136
|
+
const executable = options.hasBinary === false ? null : findExecutable('codex', env);
|
|
137
|
+
const hasBinary = options.hasBinary ?? executable !== null;
|
|
138
|
+
if (!hasBinary) {
|
|
139
|
+
return {
|
|
140
|
+
usable: false,
|
|
141
|
+
message: 'The Codex CLI was not found on PATH.',
|
|
142
|
+
setupIssue: 'missing-cli',
|
|
143
|
+
recoveryCommand: 'npm install -g @openai/codex',
|
|
144
|
+
recoveryLabel: 'Copy install command',
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
let loginStatus = options.loginStatus;
|
|
148
|
+
if (!loginStatus) {
|
|
149
|
+
const result = spawnSync(executable ?? 'codex', ['login', 'status'], {
|
|
150
|
+
env,
|
|
151
|
+
encoding: 'utf-8',
|
|
152
|
+
timeout: 5_000,
|
|
153
|
+
windowsHide: true,
|
|
154
|
+
shell: process.platform === 'win32' && /\.(cmd|bat)$/i.test(executable ?? ''),
|
|
155
|
+
});
|
|
156
|
+
loginStatus = {
|
|
157
|
+
exitCode: result.status,
|
|
158
|
+
error: result.error?.message,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
if (!loginStatus.error && loginStatus.exitCode === 0)
|
|
162
|
+
return { usable: true };
|
|
163
|
+
if (!loginStatus.error && loginStatus.exitCode === 1) {
|
|
164
|
+
return {
|
|
165
|
+
usable: false,
|
|
166
|
+
message: 'Codex is installed but not signed in. Use your ChatGPT account; no API key is required.',
|
|
167
|
+
setupIssue: 'signed-out',
|
|
168
|
+
recoveryCommand: 'codex login',
|
|
169
|
+
recoveryLabel: 'Copy sign-in command',
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
usable: false,
|
|
174
|
+
message: 'NexusFlow could not verify Codex login. Check it in a terminal, then recheck.',
|
|
175
|
+
setupIssue: 'probe-failed',
|
|
176
|
+
recoveryCommand: 'codex login status',
|
|
177
|
+
recoveryLabel: 'Copy status command',
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Whether the installed Copilot CLI exposes its supported ACP server.
|
|
182
|
+
*
|
|
183
|
+
* Copilot has no documented non-interactive login-status command. Session
|
|
184
|
+
* creation is therefore the authentication authority; this probe only avoids
|
|
185
|
+
* advertising older installations that cannot speak ACP at all.
|
|
186
|
+
*/
|
|
187
|
+
export function detectCopilotCliStatus(options = {}) {
|
|
188
|
+
const env = options.env ?? process.env;
|
|
189
|
+
const executable = options.hasBinary === false ? null : findExecutable('copilot', env);
|
|
190
|
+
const hasBinary = options.hasBinary ?? executable !== null;
|
|
191
|
+
if (!hasBinary) {
|
|
192
|
+
return {
|
|
193
|
+
usable: false,
|
|
194
|
+
message: 'The GitHub Copilot CLI was not found on PATH. Install it, then run `copilot login`.',
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
// A classic PAT takes precedence over saved OAuth but is unsupported by the
|
|
198
|
+
// Copilot CLI, so this is one credential failure we can identify safely.
|
|
199
|
+
const token = env.COPILOT_GITHUB_TOKEN ?? env.GH_TOKEN ?? env.GITHUB_TOKEN;
|
|
200
|
+
if (token?.startsWith('ghp_')) {
|
|
201
|
+
return {
|
|
202
|
+
usable: false,
|
|
203
|
+
message: 'GitHub Copilot CLI does not support classic `ghp_` tokens. Remove the overriding token and run `copilot login`.',
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
let helpStatus = options.helpStatus;
|
|
207
|
+
if (!helpStatus) {
|
|
208
|
+
const result = spawnSync(executable ?? 'copilot', ['help'], {
|
|
209
|
+
env,
|
|
210
|
+
encoding: 'utf-8',
|
|
211
|
+
timeout: 5_000,
|
|
212
|
+
windowsHide: true,
|
|
213
|
+
shell: process.platform === 'win32' && /\.(cmd|bat)$/i.test(executable ?? ''),
|
|
214
|
+
});
|
|
215
|
+
helpStatus = {
|
|
216
|
+
exitCode: result.status,
|
|
217
|
+
output: `${result.stdout ?? ''}\n${result.stderr ?? ''}`,
|
|
218
|
+
error: result.error?.message,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
if (helpStatus.exitCode === 0 && /--acp\b/.test(helpStatus.output ?? '')) {
|
|
222
|
+
return { usable: true };
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
usable: false,
|
|
226
|
+
message: helpStatus.error
|
|
227
|
+
? `NexusFlow could not inspect GitHub Copilot CLI ACP support (${helpStatus.error}). Update Copilot CLI and try again.`
|
|
228
|
+
: 'The installed GitHub Copilot CLI does not expose ACP. Update it, then run `copilot login`.',
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=cliAvailability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cliAvailability.js","sourceRoot":"","sources":["../../src/agent/cliAvailability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cliAvailability.test.d.ts","sourceRoot":"","sources":["../../src/agent/cliAvailability.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import * as os from 'node:os';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
5
|
+
import { detectAntigravityCliStatus, detectClaudeCliStatus, detectCodexCliStatus, detectCopilotCliStatus, findExecutable, } from './cliAvailability.js';
|
|
6
|
+
let home = '';
|
|
7
|
+
beforeEach(async () => {
|
|
8
|
+
home = await fs.mkdtemp(path.join(os.tmpdir(), 'nexusflow-cliavail-'));
|
|
9
|
+
});
|
|
10
|
+
afterEach(async () => {
|
|
11
|
+
await fs.rm(home, { recursive: true, force: true, maxRetries: 5, retryDelay: 200 });
|
|
12
|
+
});
|
|
13
|
+
describe('findExecutable', () => {
|
|
14
|
+
it('finds a file on PATH', async () => {
|
|
15
|
+
const name = process.platform === 'win32' ? 'thing.cmd' : 'thing';
|
|
16
|
+
await fs.writeFile(path.join(home, name), '', 'utf-8');
|
|
17
|
+
expect(findExecutable('thing', { PATH: home, PATHEXT: '.CMD' })).not.toBeNull();
|
|
18
|
+
});
|
|
19
|
+
it('returns null when the name is not on PATH', () => {
|
|
20
|
+
expect(findExecutable('definitely-not-here', { PATH: home })).toBeNull();
|
|
21
|
+
});
|
|
22
|
+
it('returns null when PATH is empty', () => {
|
|
23
|
+
expect(findExecutable('claude', {})).toBeNull();
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe('detectClaudeCliStatus', () => {
|
|
27
|
+
it('is unusable when the binary is missing, and says so', () => {
|
|
28
|
+
const status = detectClaudeCliStatus({ hasBinary: false, env: {} });
|
|
29
|
+
expect(status.usable).toBe(false);
|
|
30
|
+
expect(status.message).toMatch(/not found on PATH/);
|
|
31
|
+
expect(status).toMatchObject({
|
|
32
|
+
setupIssue: 'missing-cli',
|
|
33
|
+
recoveryCommand: 'npm install -g @anthropic-ai/claude-code',
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
it('is usable when an API key is set without inspecting auth status', () => {
|
|
37
|
+
const status = detectClaudeCliStatus({
|
|
38
|
+
hasBinary: true,
|
|
39
|
+
env: { ANTHROPIC_API_KEY: 'sk-test' },
|
|
40
|
+
authStatus: { exitCode: 1, stdout: '{not json', error: 'must not leak' },
|
|
41
|
+
});
|
|
42
|
+
expect(status).toEqual({ usable: true });
|
|
43
|
+
});
|
|
44
|
+
it.each([
|
|
45
|
+
{ ANTHROPIC_AUTH_TOKEN: 'gateway-token' },
|
|
46
|
+
{ CLAUDE_CODE_USE_BEDROCK: '1' },
|
|
47
|
+
{ CLAUDE_CODE_USE_VERTEX: '1' },
|
|
48
|
+
{ CLAUDE_CODE_USE_FOUNDRY: '1' },
|
|
49
|
+
])('accepts a declared provider-owned external auth mode', (externalEnv) => {
|
|
50
|
+
expect(detectClaudeCliStatus({
|
|
51
|
+
hasBinary: true,
|
|
52
|
+
env: externalEnv,
|
|
53
|
+
authStatus: { exitCode: 1, stdout: JSON.stringify({ loggedIn: false }) },
|
|
54
|
+
})).toEqual({ usable: true });
|
|
55
|
+
});
|
|
56
|
+
it('accepts provider-owned subscription login without returning account metadata', () => {
|
|
57
|
+
const status = detectClaudeCliStatus({
|
|
58
|
+
hasBinary: true,
|
|
59
|
+
env: {},
|
|
60
|
+
authStatus: {
|
|
61
|
+
exitCode: 0,
|
|
62
|
+
stdout: JSON.stringify({ loggedIn: true, authMethod: 'claude.ai', apiProvider: 'firstParty', email: 'private@example.test' }),
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
expect(status).toEqual({ usable: true });
|
|
66
|
+
});
|
|
67
|
+
it('maps a parsed signed-out response to keyless Claude login recovery', () => {
|
|
68
|
+
const status = detectClaudeCliStatus({
|
|
69
|
+
hasBinary: true,
|
|
70
|
+
env: {},
|
|
71
|
+
authStatus: { exitCode: 1, stdout: JSON.stringify({ loggedIn: false }) },
|
|
72
|
+
});
|
|
73
|
+
expect(status).toMatchObject({
|
|
74
|
+
usable: false,
|
|
75
|
+
setupIssue: 'signed-out',
|
|
76
|
+
recoveryCommand: 'claude auth login',
|
|
77
|
+
recoveryLabel: 'Copy sign-in command',
|
|
78
|
+
});
|
|
79
|
+
expect(status.message).toMatch(/no API key is required/i);
|
|
80
|
+
});
|
|
81
|
+
it.each([
|
|
82
|
+
{ name: 'malformed output', authStatus: { exitCode: 0, stdout: '{ not json' } },
|
|
83
|
+
{ name: 'unknown schema', authStatus: { exitCode: 0, stdout: '{"authenticated":true}' } },
|
|
84
|
+
{ name: 'timeout', authStatus: { exitCode: null, stdout: '', error: 'timed out at C:\\private\\path' } },
|
|
85
|
+
])('sanitizes a $name auth probe failure', ({ authStatus }) => {
|
|
86
|
+
const status = detectClaudeCliStatus({ hasBinary: true, env: {}, authStatus });
|
|
87
|
+
expect(status).toMatchObject({
|
|
88
|
+
usable: false,
|
|
89
|
+
setupIssue: 'probe-failed',
|
|
90
|
+
recoveryCommand: 'claude auth status --json',
|
|
91
|
+
});
|
|
92
|
+
expect(status.message).not.toContain('private');
|
|
93
|
+
expect(status).not.toHaveProperty('stdout');
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
describe('detectAntigravityCliStatus', () => {
|
|
97
|
+
it('is usable when agy is on PATH', () => {
|
|
98
|
+
expect(detectAntigravityCliStatus({ hasBinary: true }).usable).toBe(true);
|
|
99
|
+
});
|
|
100
|
+
it('reports the missing binary otherwise', () => {
|
|
101
|
+
const status = detectAntigravityCliStatus({ hasBinary: false });
|
|
102
|
+
expect(status.usable).toBe(false);
|
|
103
|
+
expect(status.message).toMatch(/agy/);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
describe('detectCodexCliStatus', () => {
|
|
107
|
+
it('is unusable when the binary is missing', () => {
|
|
108
|
+
const status = detectCodexCliStatus({ hasBinary: false, env: {} });
|
|
109
|
+
expect(status.usable).toBe(false);
|
|
110
|
+
expect(status.message).toMatch(/not found on PATH/i);
|
|
111
|
+
expect(status).toMatchObject({
|
|
112
|
+
setupIssue: 'missing-cli',
|
|
113
|
+
recoveryCommand: 'npm install -g @openai/codex',
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
it('accepts a saved ChatGPT or API login reported by the CLI', () => {
|
|
117
|
+
const status = detectCodexCliStatus({
|
|
118
|
+
hasBinary: true,
|
|
119
|
+
env: {},
|
|
120
|
+
loginStatus: { exitCode: 0 },
|
|
121
|
+
});
|
|
122
|
+
expect(status).toEqual({ usable: true });
|
|
123
|
+
});
|
|
124
|
+
it('directs signed-out users to ChatGPT login without demanding an API key', () => {
|
|
125
|
+
const status = detectCodexCliStatus({
|
|
126
|
+
hasBinary: true,
|
|
127
|
+
env: {},
|
|
128
|
+
loginStatus: { exitCode: 1 },
|
|
129
|
+
});
|
|
130
|
+
expect(status.usable).toBe(false);
|
|
131
|
+
expect(status.message).toMatch(/no API key is required/i);
|
|
132
|
+
expect(status).toMatchObject({
|
|
133
|
+
setupIssue: 'signed-out',
|
|
134
|
+
recoveryCommand: 'codex login',
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
it('reports a timed-out or failed auth probe actionably', () => {
|
|
138
|
+
const status = detectCodexCliStatus({
|
|
139
|
+
hasBinary: true,
|
|
140
|
+
env: {},
|
|
141
|
+
loginStatus: { exitCode: null, error: 'timed out' },
|
|
142
|
+
});
|
|
143
|
+
expect(status.usable).toBe(false);
|
|
144
|
+
expect(status).toMatchObject({
|
|
145
|
+
setupIssue: 'probe-failed',
|
|
146
|
+
recoveryCommand: 'codex login status',
|
|
147
|
+
});
|
|
148
|
+
expect(status.message).not.toMatch(/timed out/);
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
describe('detectCopilotCliStatus', () => {
|
|
152
|
+
it('is unusable when the binary is missing', () => {
|
|
153
|
+
const status = detectCopilotCliStatus({ hasBinary: false, env: {} });
|
|
154
|
+
expect(status.usable).toBe(false);
|
|
155
|
+
expect(status.message).toMatch(/not found on PATH/i);
|
|
156
|
+
});
|
|
157
|
+
it('accepts an installation whose help advertises ACP', () => {
|
|
158
|
+
expect(detectCopilotCliStatus({
|
|
159
|
+
hasBinary: true,
|
|
160
|
+
env: {},
|
|
161
|
+
helpStatus: { exitCode: 0, output: ' --acp Start Agent Client Protocol server' },
|
|
162
|
+
})).toEqual({ usable: true });
|
|
163
|
+
});
|
|
164
|
+
it('asks users with an older CLI to update it', () => {
|
|
165
|
+
const status = detectCopilotCliStatus({
|
|
166
|
+
hasBinary: true,
|
|
167
|
+
env: {},
|
|
168
|
+
helpStatus: { exitCode: 0, output: 'Usage: copilot' },
|
|
169
|
+
});
|
|
170
|
+
expect(status.usable).toBe(false);
|
|
171
|
+
expect(status.message).toMatch(/does not expose ACP/i);
|
|
172
|
+
});
|
|
173
|
+
it('reports a failed or timed-out capability probe', () => {
|
|
174
|
+
const status = detectCopilotCliStatus({
|
|
175
|
+
hasBinary: true,
|
|
176
|
+
env: {},
|
|
177
|
+
helpStatus: { exitCode: null, error: 'timed out' },
|
|
178
|
+
});
|
|
179
|
+
expect(status.usable).toBe(false);
|
|
180
|
+
expect(status.message).toMatch(/timed out/);
|
|
181
|
+
});
|
|
182
|
+
it('rejects an overriding classic PAT that Copilot cannot use', () => {
|
|
183
|
+
const status = detectCopilotCliStatus({
|
|
184
|
+
hasBinary: true,
|
|
185
|
+
env: { COPILOT_GITHUB_TOKEN: 'ghp_classic' },
|
|
186
|
+
helpStatus: { exitCode: 0, output: '--acp' },
|
|
187
|
+
});
|
|
188
|
+
expect(status.usable).toBe(false);
|
|
189
|
+
expect(status.message).toMatch(/classic/i);
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
//# sourceMappingURL=cliAvailability.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cliAvailability.test.js","sourceRoot":"","sources":["../../src/agent/cliAvailability.test.ts"],"names":[],"mappings":"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"}
|
package/dist/agent/session.d.ts
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* @module agent/session
|
|
3
3
|
* Session identity for chat agents that support resumable conversations.
|
|
4
4
|
*/
|
|
5
|
+
import type { AgentExecutionProfile } from './ProviderRegistry.js';
|
|
5
6
|
/** A chat session to create or resume. `resume` means the session already has turns on disk. */
|
|
6
7
|
export interface AgentSession {
|
|
7
8
|
id: string;
|
|
@@ -21,5 +22,5 @@ export declare function isValidSessionUuid(id: unknown): id is string;
|
|
|
21
22
|
* --session-id on the first turn and every later turn resumes that id;
|
|
22
23
|
* resumed sessions use --resume from the start.
|
|
23
24
|
*/
|
|
24
|
-
export declare function buildClaudeTurnArgs(isFirstTurn: boolean, session?: AgentSession): string[];
|
|
25
|
+
export declare function buildClaudeTurnArgs(isFirstTurn: boolean, session?: AgentSession, executionProfile?: AgentExecutionProfile): string[];
|
|
25
26
|
//# sourceMappingURL=session.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/agent/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,gGAAgG;AAChG,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;CACjB;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,IAAI,MAAM,CAE5D;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/agent/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEnE,gGAAgG;AAChG,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;CACjB;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,IAAI,MAAM,CAE5D;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,OAAO,EACpB,OAAO,CAAC,EAAE,YAAY,EACtB,gBAAgB,GAAE,qBAAgC,GACjD,MAAM,EAAE,CAmBV"}
|
package/dist/agent/session.js
CHANGED
|
@@ -19,13 +19,24 @@ export function isValidSessionUuid(id) {
|
|
|
19
19
|
* --session-id on the first turn and every later turn resumes that id;
|
|
20
20
|
* resumed sessions use --resume from the start.
|
|
21
21
|
*/
|
|
22
|
-
export function buildClaudeTurnArgs(isFirstTurn, session) {
|
|
22
|
+
export function buildClaudeTurnArgs(isFirstTurn, session, executionProfile = 'review') {
|
|
23
|
+
const outputArgs = [
|
|
24
|
+
'--output-format', 'stream-json',
|
|
25
|
+
'--verbose',
|
|
26
|
+
'--include-partial-messages',
|
|
27
|
+
];
|
|
28
|
+
const permissionArgs = [
|
|
29
|
+
'--permission-mode',
|
|
30
|
+
executionProfile === 'workspace-write' ? 'acceptEdits' : 'plan',
|
|
31
|
+
];
|
|
23
32
|
if (!session) {
|
|
24
|
-
return isFirstTurn
|
|
33
|
+
return isFirstTurn
|
|
34
|
+
? ['-p', ...outputArgs, ...permissionArgs]
|
|
35
|
+
: ['-c', '-p', ...outputArgs, ...permissionArgs];
|
|
25
36
|
}
|
|
26
37
|
if (!session.resume && isFirstTurn) {
|
|
27
|
-
return ['-p', '--session-id', session.id];
|
|
38
|
+
return ['-p', ...outputArgs, ...permissionArgs, '--session-id', session.id];
|
|
28
39
|
}
|
|
29
|
-
return ['-p', '--resume', session.id];
|
|
40
|
+
return ['-p', ...outputArgs, ...permissionArgs, '--resume', session.id];
|
|
30
41
|
}
|
|
31
42
|
//# sourceMappingURL=session.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/agent/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/agent/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,OAAO,GAAG,iEAAiE,CAAC;AAElF;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAW;IAC5C,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACpD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CACjC,WAAoB,EACpB,OAAsB,EACtB,mBAA0C,QAAQ;IAElD,MAAM,UAAU,GAAG;QACjB,iBAAiB,EAAE,aAAa;QAChC,WAAW;QACX,4BAA4B;KAC7B,CAAC;IACF,MAAM,cAAc,GAAG;QACrB,mBAAmB;QACnB,gBAAgB,KAAK,iBAAiB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM;KAChE,CAAC;IACF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,WAAW;YAChB,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,UAAU,EAAE,GAAG,cAAc,CAAC;YAC1C,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,GAAG,cAAc,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,EAAE,GAAG,UAAU,EAAE,GAAG,cAAc,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,CAAC,IAAI,EAAE,GAAG,UAAU,EAAE,GAAG,cAAc,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;AAC1E,CAAC"}
|