@namzu/cli 14.0.0 → 14.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -6
- package/dist/integrations/providers/discover.d.ts +14 -0
- package/dist/integrations/providers/discover.d.ts.map +1 -1
- package/dist/integrations/providers/discover.js +24 -0
- package/dist/integrations/providers/discover.js.map +1 -1
- package/dist/integrations/providers/index.d.ts +1 -1
- package/dist/integrations/providers/index.d.ts.map +1 -1
- package/dist/integrations/providers/index.js +1 -1
- package/dist/integrations/providers/index.js.map +1 -1
- package/dist/tui/App.d.ts +5 -5
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +182 -36
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/CopyPicker.d.ts +8 -0
- package/dist/tui/CopyPicker.d.ts.map +1 -0
- package/dist/tui/CopyPicker.js +20 -0
- package/dist/tui/CopyPicker.js.map +1 -0
- package/dist/tui/Picker.d.ts +8 -1
- package/dist/tui/Picker.d.ts.map +1 -1
- package/dist/tui/Picker.js +24 -11
- package/dist/tui/Picker.js.map +1 -1
- package/dist/tui/agent.d.ts +2 -5
- package/dist/tui/agent.d.ts.map +1 -1
- package/dist/tui/agent.js +5 -1
- package/dist/tui/agent.js.map +1 -1
- package/dist/tui/copy-targets.d.ts +23 -0
- package/dist/tui/copy-targets.d.ts.map +1 -0
- package/dist/tui/copy-targets.js +189 -0
- package/dist/tui/copy-targets.js.map +1 -0
- package/dist/tui/model-choices.d.ts.map +1 -1
- package/dist/tui/model-choices.js +6 -1
- package/dist/tui/model-choices.js.map +1 -1
- package/dist/tui/slashCommands.d.ts +1 -1
- package/dist/tui/slashCommands.d.ts.map +1 -1
- package/dist/tui/slashCommands.js +1 -1
- package/dist/tui/slashCommands.js.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -69,12 +69,14 @@ namzu login codex # create a Namzu-owned ChatGPT subscription session
|
|
|
69
69
|
```
|
|
70
70
|
|
|
71
71
|
On startup, Namzu first reuses usable `Claude` and `Codex` sessions already owned
|
|
72
|
-
by their installed command-line clients.
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
72
|
+
by their installed command-line clients. With no saved choice, one signed-in
|
|
73
|
+
subscription starts directly; if both are available, a narrowed picker asks
|
|
74
|
+
which one to use and proceeds with its default model. These borrowed credentials
|
|
75
|
+
remain read-only and are never copied into `~/.namzu`. A Namzu-owned sign-in is
|
|
76
|
+
needed only when no usable device session exists or when you explicitly want a
|
|
77
|
+
separate login. API keys remain optional alternatives through environment
|
|
78
|
+
variables or the session-only credential picker, and detecting one does not hide
|
|
79
|
+
the subscription sign-in action.
|
|
78
80
|
|
|
79
81
|
Repository policy stays live for the whole session. The CLI starts with the
|
|
80
82
|
applicable `AGENTS.md` chain, discovers nested instruction files after
|
|
@@ -146,6 +146,20 @@ export interface DiscoverOptions {
|
|
|
146
146
|
/** Skip namzu's own credential store (tests, and `--no-stored-credential`). */
|
|
147
147
|
readonly skipStored?: boolean;
|
|
148
148
|
}
|
|
149
|
+
/**
|
|
150
|
+
* Providers backed by a subscription session that is already usable now.
|
|
151
|
+
*
|
|
152
|
+
* This is intentionally narrower than "detected providers". An API key, a
|
|
153
|
+
* custom endpoint, and a local model are all valid optional choices, but none
|
|
154
|
+
* means the operator has already signed in to Claude or Codex. First-run
|
|
155
|
+
* routing uses this distinction to avoid asking for a second credential when
|
|
156
|
+
* the device already owns one.
|
|
157
|
+
*
|
|
158
|
+
* `CLAUDE_CODE_OAUTH_TOKEN` is included because it is the environment form of
|
|
159
|
+
* the same Claude device session. Generic Anthropic token/key variables are
|
|
160
|
+
* not: they are explicit API credentials and remain ordinary picker choices.
|
|
161
|
+
*/
|
|
162
|
+
export declare function signedInSubscriptionProviders(detected: readonly DetectedProvider[]): readonly DetectedProvider[];
|
|
149
163
|
export declare function discoverProviders(opts?: DiscoverOptions): Promise<readonly DetectedProvider[]>;
|
|
150
164
|
/** Resolve a single detected provider by id from the discovered list. */
|
|
151
165
|
export declare function findDetected(list: readonly DetectedProvider[], id: ProviderId): DetectedProvider | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/discover.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AAiBH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,EAAqB,KAAK,UAAU,EAAE,KAAK,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAE9F,MAAM,MAAM,eAAe,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACzD,sEAAsE;GACpE;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AACzD,uEAAuE;GACrE;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AACxD;;;;GAIG;GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AACpD;;;;;;;GAOG;GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,CAAA;AAE/B,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAA;IACrC,+CAA+C;IAC/C,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAA;IAChC,mDAAmD;IACnD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,iEAAiE;IACjE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB;;;;;;;;;OASG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE;QAChB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;QAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;QAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAA;KAClC,CAAA;IACD,qEAAqE;IACrE,QAAQ,CAAC,KAAK,CAAC,EAAE;QAChB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;QAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;QAC3B,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,QAAQ,CAAA;KACxC,CAAA;IACD,qEAAqE;IACrE,QAAQ,CAAC,YAAY,EAAE,SAAS,eAAe,EAAE,CAAA;CACjD;AAED,MAAM,WAAW,eAAe;IAC/B,wCAAwC;IACxC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IAChC,sCAAsC;IACtC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,oEAAoE;IACpE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;IAC7B,0CAA0C;IAC1C,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,0DAA0D;IAC1D,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B,6DAA6D;IAC7D,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAA;IAC/B,+EAA+E;IAC/E,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAC7B;AAID,wBAAsB,iBAAiB,CACtC,IAAI,GAAE,eAAoB,GACxB,OAAO,CAAC,SAAS,gBAAgB,EAAE,CAAC,CAsKtC;AAsBD,yEAAyE;AACzE,wBAAgB,YAAY,CAC3B,IAAI,EAAE,SAAS,gBAAgB,EAAE,EACjC,EAAE,EAAE,UAAU,GACZ,gBAAgB,GAAG,IAAI,CAEzB"}
|
|
1
|
+
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/discover.ts"],"names":[],"mappings":"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"}
|
|
@@ -61,6 +61,30 @@ import { credentialsPath, readStoredCodexCredential, readStoredSubscriptionCrede
|
|
|
61
61
|
import { claudeCredentialsPath, codexCredentialsPath, preferFresherCredential, readClaudeFileCredential, readCodexFileCredential, } from './harness-credentials.js';
|
|
62
62
|
import { KEYCHAIN_SERVICE, readAgentKeychainCredential } from './keychain.js';
|
|
63
63
|
import { PROVIDER_REGISTRY } from './registry.js';
|
|
64
|
+
/**
|
|
65
|
+
* Providers backed by a subscription session that is already usable now.
|
|
66
|
+
*
|
|
67
|
+
* This is intentionally narrower than "detected providers". An API key, a
|
|
68
|
+
* custom endpoint, and a local model are all valid optional choices, but none
|
|
69
|
+
* means the operator has already signed in to Claude or Codex. First-run
|
|
70
|
+
* routing uses this distinction to avoid asking for a second credential when
|
|
71
|
+
* the device already owns one.
|
|
72
|
+
*
|
|
73
|
+
* `CLAUDE_CODE_OAUTH_TOKEN` is included because it is the environment form of
|
|
74
|
+
* the same Claude device session. Generic Anthropic token/key variables are
|
|
75
|
+
* not: they are explicit API credentials and remain ordinary picker choices.
|
|
76
|
+
*/
|
|
77
|
+
export function signedInSubscriptionProviders(detected) {
|
|
78
|
+
return detected.filter((provider) => {
|
|
79
|
+
if (provider.entry.subscriptionLogin === undefined)
|
|
80
|
+
return false;
|
|
81
|
+
return [provider.source, ...provider.alternatives].some((source) => source.kind === 'claude-file' ||
|
|
82
|
+
source.kind === 'codex-file' ||
|
|
83
|
+
source.kind === 'keychain' ||
|
|
84
|
+
source.kind === 'stored' ||
|
|
85
|
+
(source.kind === 'env' && source.envName === 'CLAUDE_CODE_OAUTH_TOKEN'));
|
|
86
|
+
});
|
|
87
|
+
}
|
|
64
88
|
const DEFAULT_PROBE_TIMEOUT_MS = 500;
|
|
65
89
|
export async function discoverProviders(opts = {}) {
|
|
66
90
|
const env = opts.env ?? process.env;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../../src/integrations/providers/discover.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../../src/integrations/providers/discover.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { type DetectedProvider, type DetectionSource, type DiscoverOptions, discoverProviders, findDetected, } from './discover.js';
|
|
1
|
+
export { type DetectedProvider, type DetectionSource, type DiscoverOptions, discoverProviders, findDetected, signedInSubscriptionProviders, } from './discover.js';
|
|
2
2
|
export { type CodexOAuthCredential, claudeCredentialsPath, codexCredentialsPath, readClaudeCredentialFile, readClaudeFileCredential, readCodexCredentialFile, readCodexFileCredential, } from './harness-credentials.js';
|
|
3
3
|
export { type AgentOAuthCredential, isAnthropicOAuthToken, readAgentKeychainCredential, } from './keychain.js';
|
|
4
4
|
export { beginCodexDeviceLogin, CODEX_AUTH_ORIGIN, CODEX_OAUTH_CLIENT_ID, type CodexDeviceLogin, type CodexDeviceLoginOptions, type CodexDeviceLoginOutcome, } from './codex-device-login.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,iBAAiB,EACjB,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,iBAAiB,EACjB,YAAY,EACZ,6BAA6B,GAC7B,MAAM,eAAe,CAAA;AACtB,OAAO,EACN,KAAK,oBAAoB,EACzB,qBAAqB,EACrB,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,GACvB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACN,KAAK,oBAAoB,EACzB,qBAAqB,EACrB,2BAA2B,GAC3B,MAAM,eAAe,CAAA;AACtB,OAAO,EACN,qBAAqB,EACrB,iBAAiB,EACjB,qBAAqB,EACrB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,GAC5B,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACN,yBAAyB,EACzB,iCAAiC,EACjC,0BAA0B,EAC1B,wBAAwB,EACxB,oBAAoB,EACpB,eAAe,EACf,gCAAgC,EAChC,yBAAyB,EACzB,4BAA4B,EAC5B,KAAK,qBAAqB,EAC1B,iCAAiC,EACjC,0BAA0B,GAC1B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACN,gCAAgC,EAChC,KAAK,yBAAyB,GAC9B,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC1D,OAAO,EACN,0BAA0B,EAC1B,8BAA8B,EAC9B,wBAAwB,EACxB,KAAK,gBAAgB,EACrB,yBAAyB,EACzB,KAAK,aAAa,EAClB,0BAA0B,EAC1B,sBAAsB,EACtB,mBAAmB,GACnB,MAAM,YAAY,CAAA;AACnB,OAAO,EACN,sBAAsB,EACtB,KAAK,YAAY,EACjB,gBAAgB,EAChB,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,4BAA4B,GAC5B,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACN,KAAK,sBAAsB,EAC3B,4BAA4B,EAC5B,wBAAwB,EACxB,yBAAyB,EACzB,KAAK,kBAAkB,EACvB,iBAAiB,GACjB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACN,iBAAiB,EACjB,KAAK,WAAW,EAChB,wBAAwB,EACxB,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,eAAe,EACf,gBAAgB,GAChB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACN,gBAAgB,EAChB,wBAAwB,EACxB,iBAAiB,EACjB,KAAK,UAAU,EACf,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACpB,0BAA0B,GAC1B,MAAM,eAAe,CAAA;AACtB,OAAO,EACN,gBAAgB,EAChB,YAAY,EACZ,wBAAwB,GACxB,MAAM,eAAe,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { discoverProviders, findDetected, } from './discover.js';
|
|
1
|
+
export { discoverProviders, findDetected, signedInSubscriptionProviders, } from './discover.js';
|
|
2
2
|
export { claudeCredentialsPath, codexCredentialsPath, readClaudeCredentialFile, readClaudeFileCredential, readCodexCredentialFile, readCodexFileCredential, } from './harness-credentials.js';
|
|
3
3
|
export { isAnthropicOAuthToken, readAgentKeychainCredential, } from './keychain.js';
|
|
4
4
|
export { beginCodexDeviceLogin, CODEX_AUTH_ORIGIN, CODEX_OAUTH_CLIENT_ID, } from './codex-device-login.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,iBAAiB,EACjB,YAAY,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,iBAAiB,EACjB,YAAY,EACZ,6BAA6B,GAC7B,MAAM,eAAe,CAAA;AACtB,OAAO,EAEN,qBAAqB,EACrB,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,GACvB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAEN,qBAAqB,EACrB,2BAA2B,GAC3B,MAAM,eAAe,CAAA;AACtB,OAAO,EACN,qBAAqB,EACrB,iBAAiB,EACjB,qBAAqB,GAIrB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACN,yBAAyB,EACzB,iCAAiC,EACjC,0BAA0B,EAC1B,wBAAwB,EACxB,oBAAoB,EACpB,eAAe,EACf,gCAAgC,EAChC,yBAAyB,EACzB,4BAA4B,EAE5B,iCAAiC,EACjC,0BAA0B,GAC1B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACN,gCAAgC,GAEhC,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC1D,OAAO,EACN,0BAA0B,EAC1B,8BAA8B,EAC9B,wBAAwB,EAExB,yBAAyB,EAEzB,0BAA0B,EAC1B,sBAAsB,EACtB,mBAAmB,GACnB,MAAM,YAAY,CAAA;AACnB,OAAO,EACN,sBAAsB,EAEtB,gBAAgB,EAGhB,4BAA4B,GAC5B,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAEN,4BAA4B,EAC5B,wBAAwB,EACxB,yBAAyB,EAEzB,iBAAiB,GACjB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACN,iBAAiB,EAEjB,wBAAwB,EACxB,gBAAgB,EAChB,eAAe,EACf,eAAe,EAGf,eAAe,EACf,gBAAgB,GAChB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACN,gBAAgB,EAChB,wBAAwB,EACxB,iBAAiB,EAKjB,0BAA0B,GAC1B,MAAM,eAAe,CAAA;AACtB,OAAO,EACN,gBAAgB,EAChB,YAAY,EACZ,wBAAwB,GACxB,MAAM,eAAe,CAAA"}
|
package/dist/tui/App.d.ts
CHANGED
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Session lifecycle:
|
|
6
6
|
* 1. Mount → probeAgentSession() (readPreferences + discoverProviders).
|
|
7
|
-
* 2. If a
|
|
8
|
-
* 3.
|
|
9
|
-
*
|
|
10
|
-
* 4.
|
|
11
|
-
*
|
|
7
|
+
* 2. If a current preferences file exists → createAgentSession(prefs, detected) → ready.
|
|
8
|
+
* 3. With no preferences, reuse one signed-in installed-harness subscription
|
|
9
|
+
* directly, or ask between available subscriptions when there is a choice.
|
|
10
|
+
* 4. Otherwise show <Picker/>. An explicit picker choice is persisted;
|
|
11
|
+
* automatic reuse is not mistaken for a durable operator preference.
|
|
12
12
|
*/
|
|
13
13
|
import { type Message } from '@namzu/sdk';
|
|
14
14
|
import type { TranscriptMessage, TuiContext } from './types.js';
|
package/dist/tui/App.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAMN,KAAK,OAAO,EAYZ,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAMN,KAAK,OAAO,EAYZ,MAAM,YAAY,CAAA;AAqHnB,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAG/D,MAAM,WAAW,QAAQ;IACxB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAA;CACxB;AA+CD,sEAAsE;AACtE,wBAAgB,mBAAmB,CAClC,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,MAAM,EAAE,MAAM,MAAM,EACpB,iBAAiB,GAAE,SAAS,MAAM,EAAO,GACvC,SAAS,iBAAiB,EAAE,CA4D9B;AAgED,wBAAgB,GAAG,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,QAAQ,2CA05GhD"}
|
package/dist/tui/App.js
CHANGED
|
@@ -5,11 +5,11 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
5
5
|
*
|
|
6
6
|
* Session lifecycle:
|
|
7
7
|
* 1. Mount → probeAgentSession() (readPreferences + discoverProviders).
|
|
8
|
-
* 2. If a
|
|
9
|
-
* 3.
|
|
10
|
-
*
|
|
11
|
-
* 4.
|
|
12
|
-
*
|
|
8
|
+
* 2. If a current preferences file exists → createAgentSession(prefs, detected) → ready.
|
|
9
|
+
* 3. With no preferences, reuse one signed-in installed-harness subscription
|
|
10
|
+
* directly, or ask between available subscriptions when there is a choice.
|
|
11
|
+
* 4. Otherwise show <Picker/>. An explicit picker choice is persisted;
|
|
12
|
+
* automatic reuse is not mistaken for a durable operator preference.
|
|
13
13
|
*/
|
|
14
14
|
import { join, relative } from 'node:path';
|
|
15
15
|
import { DiskMessageFeedbackStore, GoalRoundLimitError, HostCommandRegistry, SessionGoalActivation, StaleGoalError, createAssistantMessage, createUserMessage, generateRunId, isCompactionMessage, kernelHostCommands, } from '@namzu/sdk';
|
|
@@ -19,7 +19,7 @@ import { pinTrustedProjectPath, resolveTrustedProjectContext, } from '../config/
|
|
|
19
19
|
import { visibleProjectInstructionPath } from '../context/project-path.js';
|
|
20
20
|
import { writeClipboardText } from '../integrations/clipboard/text.js';
|
|
21
21
|
import { terminalNotificationEnabled, writeTerminalNotification, } from '../integrations/notifications/terminal.js';
|
|
22
|
-
import { beginCodexDeviceLogin, beginSubscriptionLogin, clearAllStoredCredentials, credentialsPath, primaryProvider, readStoredCodexCredential, readStoredSubscriptionCredential, writePreferences, } from '../integrations/providers/index.js';
|
|
22
|
+
import { beginCodexDeviceLogin, beginSubscriptionLogin, clearAllStoredCredentials, credentialsPath, primaryProvider, readStoredCodexCredential, readStoredSubscriptionCredential, signedInSubscriptionProviders, writePreferences, } from '../integrations/providers/index.js';
|
|
23
23
|
import { appendMessages, forkConversation, forkConversationBeforeUser, listRecent, loadConversation, openSessions, replaceConversation, requireWritableConversation, setTitle, startConversation, titleOf, } from '../integrations/sessions/store.js';
|
|
24
24
|
import { conversationMarkdown, writeConversationExport, } from '../integrations/sessions/transcript-export.js';
|
|
25
25
|
import { isTrusted, trustDir } from '../integrations/trust/store.js';
|
|
@@ -28,6 +28,7 @@ import { appendMemory, composeMemoryPrompt, readMemory } from '../memory/store.j
|
|
|
28
28
|
import { composeSkillsPrompt, discoverSkills, loadSkillBody } from '../skills/store.js';
|
|
29
29
|
import { discoverUserCommands } from '../user-commands/store.js';
|
|
30
30
|
import { Composer } from './Composer.js';
|
|
31
|
+
import { CopyPicker } from './CopyPicker.js';
|
|
31
32
|
import { EditPromptPicker } from './EditPromptPicker.js';
|
|
32
33
|
import { LiveActivity, formatElapsed } from './LiveActivity.js';
|
|
33
34
|
import { PermissionOverlay } from './PermissionOverlay.js';
|
|
@@ -41,6 +42,7 @@ import { bottomSpacerRows } from './bottom-spacer.js';
|
|
|
41
42
|
import { keepRecentRows } from './compact-transcript.js';
|
|
42
43
|
import { approvalIsDeliberate } from './consent-timing.js';
|
|
43
44
|
import { planTurnPublication } from './conversation-history.js';
|
|
45
|
+
import { copyTargetsForResponse, } from './copy-targets.js';
|
|
44
46
|
import { editablePrompts } from './edit-prompts.js';
|
|
45
47
|
import { liveWindow, transcriptLines } from './live-window.js';
|
|
46
48
|
import { describeCodexDeviceLoginStart, describeLoginOutcome, describeLoginStart, describeLogout, } from './login-prompt.js';
|
|
@@ -215,6 +217,10 @@ export function App({ ctx: initialCtx }) {
|
|
|
215
217
|
const [keyEntryFor, setKeyEntryFor] = useState(null);
|
|
216
218
|
/** Which decision owns the next picker mount. */
|
|
217
219
|
const [pickerInitialView, setPickerInitialView] = useState('providers');
|
|
220
|
+
/** A narrowed first-run roster; null keeps the complete discovered list. */
|
|
221
|
+
const [pickerDetected, setPickerDetected] = useState(null);
|
|
222
|
+
/** Whether Enter accepts the provider directly or continues to model choice. */
|
|
223
|
+
const [pickerSelectionKind, setPickerSelectionKind] = useState('provider-and-model');
|
|
218
224
|
/** The chain read from disk, held while the picker repairs its credential. */
|
|
219
225
|
const savedPrefsRef = useRef(null);
|
|
220
226
|
/**
|
|
@@ -314,6 +320,14 @@ export function App({ ctx: initialCtx }) {
|
|
|
314
320
|
const [editList, setEditList] = useState([]);
|
|
315
321
|
const [selectedEdit, setSelectedEdit] = useState(0);
|
|
316
322
|
const editCommittedRef = useRef(false);
|
|
323
|
+
/** `/copy` owns this exact response snapshot until selection or cancellation. */
|
|
324
|
+
const [copyPicker, setCopyPickerState] = useState(null);
|
|
325
|
+
const copyPickerRef = useRef(null);
|
|
326
|
+
const [selectedCopy, setSelectedCopy] = useState(0);
|
|
327
|
+
const setCopyPicker = useCallback((next) => {
|
|
328
|
+
copyPickerRef.current = next;
|
|
329
|
+
setCopyPickerState(next);
|
|
330
|
+
}, []);
|
|
317
331
|
const [composerDraft, setComposerDraft] = useState(null);
|
|
318
332
|
const composerDraftTokenRef = useRef(0);
|
|
319
333
|
const exitArmedRef = useRef(false);
|
|
@@ -332,6 +346,9 @@ export function App({ ctx: initialCtx }) {
|
|
|
332
346
|
const loginRef = useRef(null);
|
|
333
347
|
const codexLoginRef = useRef(null);
|
|
334
348
|
const loginAbortCleanupRef = useRef(null);
|
|
349
|
+
/** Revokes automatic first-run construction when this App no longer exists. */
|
|
350
|
+
const [appLifetime] = useState(() => new AbortController());
|
|
351
|
+
useEffect(() => () => appLifetime.abort(new Error('The Namzu TUI was closed.')), [appLifetime]);
|
|
335
352
|
const cancelPendingLogin = useCallback(() => {
|
|
336
353
|
loginAbortCleanupRef.current?.();
|
|
337
354
|
loginAbortCleanupRef.current = null;
|
|
@@ -500,6 +517,42 @@ export function App({ ctx: initialCtx }) {
|
|
|
500
517
|
]);
|
|
501
518
|
return id;
|
|
502
519
|
}, [nextId]);
|
|
520
|
+
const sendCopyRequest = useCallback((index) => {
|
|
521
|
+
const picker = copyPickerRef.current;
|
|
522
|
+
const target = picker?.targets[index];
|
|
523
|
+
if (!picker || !target)
|
|
524
|
+
return;
|
|
525
|
+
// Release the overlay synchronously before its transcript notice lands.
|
|
526
|
+
// The queue pump still observes React state and can proceed only after
|
|
527
|
+
// this event has finished publishing the result.
|
|
528
|
+
setCopyPicker(null);
|
|
529
|
+
const result = writeClipboardText(target.text, {
|
|
530
|
+
isTTY: stdout.isTTY,
|
|
531
|
+
write: writeStdout,
|
|
532
|
+
});
|
|
533
|
+
const origin = picker.provenance === 'persisted'
|
|
534
|
+
? 'the latest persisted assistant output'
|
|
535
|
+
: 'the latest normally completed answer';
|
|
536
|
+
const selection = target.kind === 'whole' ? origin : `${target.label} from ${origin}`;
|
|
537
|
+
switch (result.kind) {
|
|
538
|
+
case 'request-sent':
|
|
539
|
+
pushMessage('system', `Copy request sent for ${selection} (${result.bytes.toLocaleString()} bytes). Terminal, multiplexer or remote-session policy may ignore OSC 52; if the clipboard did not change, enable terminal clipboard access.`);
|
|
540
|
+
break;
|
|
541
|
+
case 'unavailable':
|
|
542
|
+
pushMessage('system', `Cannot send a copy request here — ${result.detail}. /copy needs an interactive terminal with OSC 52 clipboard support.`);
|
|
543
|
+
break;
|
|
544
|
+
case 'too-large':
|
|
545
|
+
pushMessage('system', `Cannot send this selection to the terminal clipboard — it is ${result.bytes.toLocaleString()} bytes and the OSC 52 safety limit is ${result.limit.toLocaleString()}. Nothing was truncated.`);
|
|
546
|
+
break;
|
|
547
|
+
case 'write-failed':
|
|
548
|
+
pushMessage('system', `Could not send the terminal copy request: ${result.detail}`);
|
|
549
|
+
break;
|
|
550
|
+
default: {
|
|
551
|
+
const exhaustive = result;
|
|
552
|
+
void exhaustive;
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
}, [pushMessage, setCopyPicker, stdout.isTTY, writeStdout]);
|
|
503
556
|
const sendTerminalNotification = useCallback((notification) => {
|
|
504
557
|
if (!terminalNotificationEnabled(ctx.tui?.notifications, notification))
|
|
505
558
|
return;
|
|
@@ -695,6 +748,8 @@ export function App({ ctx: initialCtx }) {
|
|
|
695
748
|
cancelPendingLogin();
|
|
696
749
|
setPickerNotice(null);
|
|
697
750
|
setKeyEntryFor(null);
|
|
751
|
+
setPickerDetected(null);
|
|
752
|
+
setPickerSelectionKind('provider-and-model');
|
|
698
753
|
setPickerInitialView('subscriptions');
|
|
699
754
|
setPhase('picker');
|
|
700
755
|
}, [cancelPendingLogin, pushMessage]);
|
|
@@ -816,6 +871,9 @@ export function App({ ctx: initialCtx }) {
|
|
|
816
871
|
return;
|
|
817
872
|
setDetected(probe.detected);
|
|
818
873
|
if (probe.needsRepickReason) {
|
|
874
|
+
setPickerDetected(null);
|
|
875
|
+
setPickerSelectionKind('provider-and-model');
|
|
876
|
+
setPickerInitialView('providers');
|
|
819
877
|
pushMessage('system', probe.needsRepickReason);
|
|
820
878
|
setPickerNotice(probe.needsRepickReason);
|
|
821
879
|
setPhase('picker');
|
|
@@ -832,6 +890,9 @@ export function App({ ctx: initialCtx }) {
|
|
|
832
890
|
// so the chain it declares — model pins and fallbacks included — is
|
|
833
891
|
// still the operator's answer once one is supplied.
|
|
834
892
|
savedPrefsRef.current = probe.preferences;
|
|
893
|
+
setPickerDetected(null);
|
|
894
|
+
setPickerSelectionKind('provider-and-model');
|
|
895
|
+
setPickerInitialView('providers');
|
|
835
896
|
setKeyEntryFor(probe.credentialGap.providerId);
|
|
836
897
|
pushMessage('system', probe.credentialGap.reason);
|
|
837
898
|
setPickerNotice(probe.credentialGap.reason);
|
|
@@ -839,9 +900,51 @@ export function App({ ctx: initialCtx }) {
|
|
|
839
900
|
return;
|
|
840
901
|
}
|
|
841
902
|
if (probe.preferences) {
|
|
903
|
+
setPickerDetected(null);
|
|
904
|
+
setPickerSelectionKind('provider-and-model');
|
|
842
905
|
await hydrateSession(probe.preferences, probe.detected, signal);
|
|
843
906
|
return;
|
|
844
907
|
}
|
|
908
|
+
const signedIn = signedInSubscriptionProviders(probe.detected);
|
|
909
|
+
if (signedIn.length === 1) {
|
|
910
|
+
const chosen = signedIn[0];
|
|
911
|
+
if (!chosen)
|
|
912
|
+
throw new Error('A signed-in provider disappeared during discovery.');
|
|
913
|
+
const automaticPreferences = {
|
|
914
|
+
version: 3,
|
|
915
|
+
providers: [{ id: chosen.entry.id }],
|
|
916
|
+
subagents: { active: [] },
|
|
917
|
+
};
|
|
918
|
+
// Use the picker-grade transactional admission even though no picker had
|
|
919
|
+
// to be drawn. A provider-less candidate must leave an actionable choice,
|
|
920
|
+
// not strand first run on the disabled unhealthy screen.
|
|
921
|
+
const admissionSignal = signal ?? appLifetime.signal;
|
|
922
|
+
try {
|
|
923
|
+
await hydrateSession(automaticPreferences, probe.detected, admissionSignal);
|
|
924
|
+
return;
|
|
925
|
+
}
|
|
926
|
+
catch (error) {
|
|
927
|
+
if (admissionSignal.aborted)
|
|
928
|
+
return;
|
|
929
|
+
setPickerDetected(null);
|
|
930
|
+
setPickerSelectionKind('provider-and-model');
|
|
931
|
+
setPickerInitialView('providers');
|
|
932
|
+
setPickerNotice(`The signed-in ${chosen.entry.label} session could not start: ${error instanceof Error ? error.message : String(error)}`);
|
|
933
|
+
setPhase('picker');
|
|
934
|
+
return;
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
if (signedIn.length > 1) {
|
|
938
|
+
setPickerDetected(signedIn);
|
|
939
|
+
setPickerSelectionKind('signed-in-subscription');
|
|
940
|
+
setPickerInitialView('providers');
|
|
941
|
+
setPickerNotice('Claude and Codex subscriptions are already signed in on this device. Choose which one Namzu should use.');
|
|
942
|
+
setPhase('picker');
|
|
943
|
+
return;
|
|
944
|
+
}
|
|
945
|
+
setPickerDetected(null);
|
|
946
|
+
setPickerSelectionKind('provider-and-model');
|
|
947
|
+
setPickerInitialView('providers');
|
|
845
948
|
setPhase('picker');
|
|
846
949
|
}
|
|
847
950
|
catch (err) {
|
|
@@ -850,7 +953,7 @@ export function App({ ctx: initialCtx }) {
|
|
|
850
953
|
setPhase('unhealthy');
|
|
851
954
|
pushMessage('system', `Failed to probe agents: ${err instanceof Error ? err.message : String(err)}`);
|
|
852
955
|
}
|
|
853
|
-
}, [hydrateSession, pushMessage]);
|
|
956
|
+
}, [appLifetime.signal, hydrateSession, pushMessage]);
|
|
854
957
|
// `startOrFinishLogin` is declared above `runProbe` and calls it, so it
|
|
855
958
|
// reads the current one through a ref rather than closing over a stale
|
|
856
959
|
// binding or forcing the two into a declaration order that reads backwards.
|
|
@@ -1959,6 +2062,8 @@ export function App({ ctx: initialCtx }) {
|
|
|
1959
2062
|
// been solved — the session behind this picker is running.
|
|
1960
2063
|
setPickerNotice(null);
|
|
1961
2064
|
setKeyEntryFor(null);
|
|
2065
|
+
setPickerDetected(null);
|
|
2066
|
+
setPickerSelectionKind('provider-and-model');
|
|
1962
2067
|
setPickerInitialView('providers');
|
|
1963
2068
|
setPhase('picker');
|
|
1964
2069
|
return;
|
|
@@ -2392,30 +2497,11 @@ export function App({ ctx: initialCtx }) {
|
|
|
2392
2497
|
pushMessage('system', 'Nothing to copy yet — /copy applies to the latest assistant answer that finished normally.');
|
|
2393
2498
|
return;
|
|
2394
2499
|
}
|
|
2395
|
-
|
|
2396
|
-
|
|
2397
|
-
|
|
2500
|
+
setSelectedCopy(0);
|
|
2501
|
+
setCopyPicker({
|
|
2502
|
+
targets: copyTargetsForResponse(target.text),
|
|
2503
|
+
provenance: target.provenance,
|
|
2398
2504
|
});
|
|
2399
|
-
switch (result.kind) {
|
|
2400
|
-
case 'request-sent':
|
|
2401
|
-
pushMessage('system', `Copy request sent for the ${target.provenance === 'persisted'
|
|
2402
|
-
? 'latest persisted assistant output'
|
|
2403
|
-
: 'latest normally completed answer'} (${result.bytes.toLocaleString()} bytes). Terminal, multiplexer or remote-session policy may ignore OSC 52; if the clipboard did not change, enable terminal clipboard access.`);
|
|
2404
|
-
break;
|
|
2405
|
-
case 'unavailable':
|
|
2406
|
-
pushMessage('system', `Cannot send a copy request here — ${result.detail}. /copy needs an interactive terminal with OSC 52 clipboard support.`);
|
|
2407
|
-
break;
|
|
2408
|
-
case 'too-large':
|
|
2409
|
-
pushMessage('system', `Cannot send this answer to the terminal clipboard — it is ${result.bytes.toLocaleString()} bytes and the OSC 52 safety limit is ${result.limit.toLocaleString()}. Nothing was truncated.`);
|
|
2410
|
-
break;
|
|
2411
|
-
case 'write-failed':
|
|
2412
|
-
pushMessage('system', `Could not send the terminal copy request: ${result.detail}`);
|
|
2413
|
-
break;
|
|
2414
|
-
default: {
|
|
2415
|
-
const exhaustive = result;
|
|
2416
|
-
void exhaustive;
|
|
2417
|
-
}
|
|
2418
|
-
}
|
|
2419
2505
|
return;
|
|
2420
2506
|
}
|
|
2421
2507
|
case 'raw': {
|
|
@@ -2510,6 +2596,7 @@ export function App({ ctx: initialCtx }) {
|
|
|
2510
2596
|
pushMessage,
|
|
2511
2597
|
rawOutput,
|
|
2512
2598
|
resetTranscript,
|
|
2599
|
+
setCopyPicker,
|
|
2513
2600
|
setReasoningEffort,
|
|
2514
2601
|
slashCtx,
|
|
2515
2602
|
startFreshConversation,
|
|
@@ -2535,6 +2622,7 @@ export function App({ ctx: initialCtx }) {
|
|
|
2535
2622
|
conversationMutationRef.current ||
|
|
2536
2623
|
exportingRef.current ||
|
|
2537
2624
|
compactingRef.current ||
|
|
2625
|
+
copyPickerRef.current ||
|
|
2538
2626
|
goalCommandInFlightRef.current) {
|
|
2539
2627
|
return;
|
|
2540
2628
|
}
|
|
@@ -2559,6 +2647,7 @@ export function App({ ctx: initialCtx }) {
|
|
|
2559
2647
|
conversationMutationRef.current ||
|
|
2560
2648
|
exportingRef.current ||
|
|
2561
2649
|
compactingRef.current ||
|
|
2650
|
+
copyPickerRef.current ||
|
|
2562
2651
|
goalCommandInFlightRef.current ||
|
|
2563
2652
|
queuedRef.current.length > 0 ||
|
|
2564
2653
|
!goalActivation.isArmed(sessionId, armed)) {
|
|
@@ -2616,6 +2705,7 @@ export function App({ ctx: initialCtx }) {
|
|
|
2616
2705
|
conversationMutation,
|
|
2617
2706
|
session,
|
|
2618
2707
|
state,
|
|
2708
|
+
copyPicker,
|
|
2619
2709
|
wakeGoalDriver,
|
|
2620
2710
|
]);
|
|
2621
2711
|
// Drain the queue: when a turn settles (idle) and nothing is running,
|
|
@@ -2630,6 +2720,7 @@ export function App({ ctx: initialCtx }) {
|
|
|
2630
2720
|
conversationMutationRef.current ||
|
|
2631
2721
|
exportingRef.current ||
|
|
2632
2722
|
compactingRef.current ||
|
|
2723
|
+
copyPickerRef.current ||
|
|
2633
2724
|
goalCommandInFlightRef.current)
|
|
2634
2725
|
return;
|
|
2635
2726
|
// Read and remove from the synchronous source of truth. `queued` is the
|
|
@@ -2639,7 +2730,16 @@ export function App({ ctx: initialCtx }) {
|
|
|
2639
2730
|
const next = dequeueQueued();
|
|
2640
2731
|
if (next !== undefined)
|
|
2641
2732
|
void runTurn(next);
|
|
2642
|
-
}, [
|
|
2733
|
+
}, [
|
|
2734
|
+
state,
|
|
2735
|
+
phase,
|
|
2736
|
+
queued,
|
|
2737
|
+
queuePause,
|
|
2738
|
+
copyPicker,
|
|
2739
|
+
dequeueQueued,
|
|
2740
|
+
hasUnsettledTurn,
|
|
2741
|
+
runTurn,
|
|
2742
|
+
]);
|
|
2643
2743
|
// One-shot update check on launch.
|
|
2644
2744
|
// Best-effort; surfaces a single notice when something newer is out.
|
|
2645
2745
|
const updateCheckedRef = useRef(false);
|
|
@@ -2654,7 +2754,7 @@ export function App({ ctx: initialCtx }) {
|
|
|
2654
2754
|
pushMessage('system', `⬆ Update available:\n${lines.join('\n')}`);
|
|
2655
2755
|
});
|
|
2656
2756
|
}, [phase, ctx.version, pushMessage]);
|
|
2657
|
-
const hydrateFromPicker = useCallback(async (prefs, detectedNow, signal) => {
|
|
2757
|
+
const hydrateFromPicker = useCallback(async (prefs, detectedNow, signal, revealAllOnFailure = false) => {
|
|
2658
2758
|
try {
|
|
2659
2759
|
await hydrateSession(prefs, detectedNow, signal);
|
|
2660
2760
|
}
|
|
@@ -2664,6 +2764,11 @@ export function App({ ctx: initialCtx }) {
|
|
|
2664
2764
|
// choice stays on the picker with the actionable construction error.
|
|
2665
2765
|
if (signal.aborted)
|
|
2666
2766
|
return;
|
|
2767
|
+
if (revealAllOnFailure) {
|
|
2768
|
+
setPickerDetected(null);
|
|
2769
|
+
setPickerSelectionKind('provider-and-model');
|
|
2770
|
+
setPickerInitialView('providers');
|
|
2771
|
+
}
|
|
2667
2772
|
setPickerNotice(`Could not start the selected provider: ${err instanceof Error ? err.message : String(err)}`);
|
|
2668
2773
|
}
|
|
2669
2774
|
}, [hydrateSession]);
|
|
@@ -2679,6 +2784,8 @@ export function App({ ctx: initialCtx }) {
|
|
|
2679
2784
|
const next = [credential, ...detected.filter((d) => d.entry.id !== credential.entry.id)];
|
|
2680
2785
|
setDetected(next);
|
|
2681
2786
|
setKeyEntryFor(null);
|
|
2787
|
+
setPickerDetected(null);
|
|
2788
|
+
setPickerSelectionKind('provider-and-model');
|
|
2682
2789
|
setPickerNotice(null);
|
|
2683
2790
|
// The disposition, not the key. `credential` never reaches a message.
|
|
2684
2791
|
pushMessage('system', disposition);
|
|
@@ -2720,7 +2827,9 @@ export function App({ ctx: initialCtx }) {
|
|
|
2720
2827
|
pushMessage('system', `Could not save preferences: ${err instanceof Error ? err.message : String(err)}`);
|
|
2721
2828
|
return;
|
|
2722
2829
|
}
|
|
2723
|
-
|
|
2830
|
+
// Keep a narrowed signed-in roster stable while construction is pending.
|
|
2831
|
+
// Only a real refusal broadens back to the general, sign-in-capable picker.
|
|
2832
|
+
void hydrateFromPicker(prefs, detected, signal, true);
|
|
2724
2833
|
}, [detected, hydrateFromPicker, pushMessage]);
|
|
2725
2834
|
/**
|
|
2726
2835
|
* Leaving the picker returns to whatever was on screen before it.
|
|
@@ -2742,6 +2851,8 @@ export function App({ ctx: initialCtx }) {
|
|
|
2742
2851
|
*/
|
|
2743
2852
|
const handlePickerCancel = useCallback(() => {
|
|
2744
2853
|
setPickerInitialView('providers');
|
|
2854
|
+
setPickerDetected(null);
|
|
2855
|
+
setPickerSelectionKind('provider-and-model');
|
|
2745
2856
|
if (session?.hasProvider) {
|
|
2746
2857
|
setPhase('ready');
|
|
2747
2858
|
return;
|
|
@@ -2867,6 +2978,34 @@ export function App({ ctx: initialCtx }) {
|
|
|
2867
2978
|
resolvePermission({ kind: 'approve-all' });
|
|
2868
2979
|
return;
|
|
2869
2980
|
}
|
|
2981
|
+
// `/copy` holds a source snapshot, not a lifecycle phase. Permission
|
|
2982
|
+
// stays above it in this handler so an approval request that arrives
|
|
2983
|
+
// while the picker is open cannot have its keys stolen by the chooser.
|
|
2984
|
+
if (copyPickerRef.current) {
|
|
2985
|
+
const targets = copyPickerRef.current.targets;
|
|
2986
|
+
if (key.escape || (key.ctrl && input === 'c')) {
|
|
2987
|
+
setCopyPicker(null);
|
|
2988
|
+
return;
|
|
2989
|
+
}
|
|
2990
|
+
if (key.upArrow) {
|
|
2991
|
+
setSelectedCopy((index) => Math.max(0, index - 1));
|
|
2992
|
+
return;
|
|
2993
|
+
}
|
|
2994
|
+
if (key.downArrow) {
|
|
2995
|
+
setSelectedCopy((index) => Math.min(targets.length - 1, index + 1));
|
|
2996
|
+
return;
|
|
2997
|
+
}
|
|
2998
|
+
if (key.return) {
|
|
2999
|
+
sendCopyRequest(selectedCopy);
|
|
3000
|
+
return;
|
|
3001
|
+
}
|
|
3002
|
+
if (/^[1-9]$/.test(input)) {
|
|
3003
|
+
const index = Number(input) - 1;
|
|
3004
|
+
if (targets[index])
|
|
3005
|
+
sendCopyRequest(index);
|
|
3006
|
+
}
|
|
3007
|
+
return;
|
|
3008
|
+
}
|
|
2870
3009
|
// Esc interrupts a running turn (Ctrl+C stays reserved for exit). Mirrors
|
|
2871
3010
|
// the Ctrl+C interrupt path: abort, drop the queue, one "Interrupted." line.
|
|
2872
3011
|
if (key.escape && abortRef.current) {
|
|
@@ -2943,12 +3082,15 @@ export function App({ ctx: initialCtx }) {
|
|
|
2943
3082
|
// Background is left natural — we inherit the terminal's own background
|
|
2944
3083
|
// and only theme the foreground. Forcing
|
|
2945
3084
|
// a filled bg left mismatched patches around bordered areas, so we don't.
|
|
2946
|
-
return (_jsxs(Box, { flexDirection: "column", children: [phase !== 'ready' ? (_jsx(Banner, { version: ctx.version, session: session, permissionMode: permissionMode, cwd: ctx.cwd })) : null, _jsxs(Box, { flexDirection: "column", paddingX: 1, children: [phase === 'trust' ? (_jsx(TrustPrompt, { cwd: ctx.cwd })) : phase === 'resume' ? (_jsx(ResumePicker, { conversations: resumeList, selected: selectedResume })) : phase === 'edit' ? (_jsx(EditPromptPicker, { prompts: editList, selected: selectedEdit })) : phase === 'picker' ? (_jsx(Picker, { detected: detected, currentProvider: currentProvider, currentModel: session?.modelSummary ?? null, initialView: pickerInitialView, onSubmit: handlePickerSubmit, onCancel: handlePickerCancel, onCredential: handleTypedCredential, onLogin: (provider, signal) => void startLoginFromPicker(provider, signal), keyEntryFor: keyEntryFor, notice: pickerNotice })) : (_jsxs(_Fragment, { children: [_jsx(TranscriptFrame, { children: _jsx(Transcript, { messages: finalized, pending: messages.find((m) => m.pending) ?? null, state: state, settled: window.settled, resetKey: resetKey, raw: rawOutput, header: phase === 'ready' ? (_jsx(Banner, { version: ctx.version, session: session, permissionMode: permissionMode, cwd: ctx.cwd })) : undefined }) }), spacerRows > 0 ? _jsx(Box, { height: spacerRows }) : null, _jsx(LiveActivity, { activeTools: activeTools, thinking: state === 'thinking' && !messages.some((m) => m.pending) }), permission ? _jsx(PermissionOverlay, { toolCalls: permission.toolCalls }) :
|
|
3085
|
+
return (_jsxs(Box, { flexDirection: "column", children: [phase !== 'ready' ? (_jsx(Banner, { version: ctx.version, session: session, permissionMode: permissionMode, cwd: ctx.cwd })) : null, _jsxs(Box, { flexDirection: "column", paddingX: 1, children: [phase === 'trust' ? (_jsx(TrustPrompt, { cwd: ctx.cwd })) : phase === 'resume' ? (_jsx(ResumePicker, { conversations: resumeList, selected: selectedResume })) : phase === 'edit' ? (_jsx(EditPromptPicker, { prompts: editList, selected: selectedEdit })) : phase === 'picker' ? (_jsx(Picker, { detected: pickerDetected ?? detected, currentProvider: currentProvider, selectionKind: pickerSelectionKind, currentModel: session?.modelSummary ?? null, initialView: pickerInitialView, onSubmit: handlePickerSubmit, onCancel: handlePickerCancel, onCredential: handleTypedCredential, onLogin: (provider, signal) => void startLoginFromPicker(provider, signal), keyEntryFor: keyEntryFor, notice: pickerNotice })) : (_jsxs(_Fragment, { children: [_jsx(TranscriptFrame, { children: _jsx(Transcript, { messages: finalized, pending: messages.find((m) => m.pending) ?? null, state: state, settled: window.settled, resetKey: resetKey, raw: rawOutput, header: phase === 'ready' ? (_jsx(Banner, { version: ctx.version, session: session, permissionMode: permissionMode, cwd: ctx.cwd })) : undefined }) }), spacerRows > 0 ? _jsx(Box, { height: spacerRows }) : null, _jsx(LiveActivity, { activeTools: activeTools, thinking: state === 'thinking' && !messages.some((m) => m.pending) }), permission ? (_jsx(PermissionOverlay, { toolCalls: permission.toolCalls })) : copyPicker ? (_jsx(CopyPicker, { targets: copyPicker.targets, selected: selectedCopy })) : null, _jsxs(ComposerFrame, { focus: state === 'idle' &&
|
|
3086
|
+
phase === 'ready' &&
|
|
3087
|
+
conversationMutation === null &&
|
|
3088
|
+
copyPicker === null, hidden: permission !== null || copyPicker !== null, children: [queued.length > 0 && permission === null && copyPicker === null ? (_jsx(Box, { paddingX: 1, children: _jsxs(Text, { color: theme.text.muted, children: [queuePause ? '⏸' : '⏎', " ", queued.length, " message", queued.length > 1 ? 's' : '', " queued \u2014", ' ', queuePause
|
|
2947
3089
|
? `paused after a ${queuePause.outcome} turn; send a message or change model to continue`
|
|
2948
3090
|
: 'sending when ready'] }) })) : null, _jsx(Composer, { disabled: phase !== 'ready' ||
|
|
2949
3091
|
state === 'awaiting-permission' ||
|
|
2950
3092
|
compacting ||
|
|
2951
|
-
conversationMutation !== null, hidden: permission !== null,
|
|
3093
|
+
conversationMutation !== null, hidden: permission !== null || copyPicker !== null,
|
|
2952
3094
|
// A turn is running, so Esc is the interrupt and not
|
|
2953
3095
|
// the composer's clear.
|
|
2954
3096
|
escapeInterrupts: !compacting && (state === 'thinking' || state === 'tool'), onSubmit: handleSubmit, onNotice: (text) => pushMessage('system', text), onEditPrevious: openPromptEditor, draftToRestore: composerDraft, onDraftRestored: (token) => setComposerDraft((draft) => (draft?.token === token ? null : draft)), userCommands: userCommands, history: history })] })] })), _jsx(Box, { paddingTop: 1, children: _jsx(StatusBar, { cwd: ctx.cwd, provider: session?.providerSummary ?? null, model: session?.modelSummary
|
|
@@ -2961,7 +3103,11 @@ export function App({ ctx: initialCtx }) {
|
|
|
2961
3103
|
? 'starting a fresh conversation — input is paused'
|
|
2962
3104
|
: compacting
|
|
2963
3105
|
? 'compacting conversation — input is paused'
|
|
2964
|
-
:
|
|
3106
|
+
: permission
|
|
3107
|
+
? hintForPhase(phase, state, session?.hasProvider === true)
|
|
3108
|
+
: copyPicker
|
|
3109
|
+
? 'copy target open — ↑↓ / 1–9 select · esc cancel'
|
|
3110
|
+
: hintForPhase(phase, state, session?.hasProvider === true), usage: usage, context: context }) })] })] }));
|
|
2965
3111
|
}
|
|
2966
3112
|
function Banner({ version, session, permissionMode, cwd, }) {
|
|
2967
3113
|
const cols = process.stdout.columns ?? 80;
|