syntaur 0.14.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/dashboard/dist/assets/{_basePickBy-qEDLAY_J.js → _basePickBy-B1S22H85.js} +1 -1
  2. package/dashboard/dist/assets/{_baseUniq-7tDs18Gn.js → _baseUniq-CJIRCCsh.js} +1 -1
  3. package/dashboard/dist/assets/{arc-Brdw0dYW.js → arc-CdlNYTcd.js} +1 -1
  4. package/dashboard/dist/assets/{architectureDiagram-2XIMDMQ5-BiEdLT9m.js → architectureDiagram-2XIMDMQ5-KVI0HWOy.js} +1 -1
  5. package/dashboard/dist/assets/{blockDiagram-WCTKOSBZ-HC-j_hPZ.js → blockDiagram-WCTKOSBZ-ClnG7gaq.js} +1 -1
  6. package/dashboard/dist/assets/{c4Diagram-IC4MRINW-DA_rWbl7.js → c4Diagram-IC4MRINW-BD9lkttL.js} +1 -1
  7. package/dashboard/dist/assets/channel-Cm_FzKJq.js +1 -0
  8. package/dashboard/dist/assets/{chunk-4BX2VUAB-CF3hguyj.js → chunk-4BX2VUAB-BM3DXZMG.js} +1 -1
  9. package/dashboard/dist/assets/{chunk-55IACEB6-BTeCeIc_.js → chunk-55IACEB6-DUIbFJ3r.js} +1 -1
  10. package/dashboard/dist/assets/{chunk-FMBD7UC4-8qVvxmks.js → chunk-FMBD7UC4-B_cxCRkA.js} +1 -1
  11. package/dashboard/dist/assets/{chunk-JSJVCQXG-DCf8n7EO.js → chunk-JSJVCQXG-2mLf1WoM.js} +1 -1
  12. package/dashboard/dist/assets/{chunk-KX2RTZJC-CcpjTmME.js → chunk-KX2RTZJC-BMz3ND2R.js} +1 -1
  13. package/dashboard/dist/assets/{chunk-NQ4KR5QH-BnFPKo4-.js → chunk-NQ4KR5QH-DiCxpw3L.js} +1 -1
  14. package/dashboard/dist/assets/{chunk-QZHKN3VN-IPMVLLv2.js → chunk-QZHKN3VN-BcaWPzd5.js} +1 -1
  15. package/dashboard/dist/assets/{chunk-WL4C6EOR-D1pQmHqX.js → chunk-WL4C6EOR-BbsfhS6J.js} +1 -1
  16. package/dashboard/dist/assets/classDiagram-VBA2DB6C-Bdan2Dp5.js +1 -0
  17. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-Bdan2Dp5.js +1 -0
  18. package/dashboard/dist/assets/clone-9PoPEM_s.js +1 -0
  19. package/dashboard/dist/assets/{cose-bilkent-S5V4N54A-tvJjvBQr.js → cose-bilkent-S5V4N54A-iuQzyyrA.js} +1 -1
  20. package/dashboard/dist/assets/{dagre-KLK3FWXG-qp1vt6LY.js → dagre-KLK3FWXG-C0TB1zg5.js} +1 -1
  21. package/dashboard/dist/assets/{diagram-E7M64L7V-VF5eizNr.js → diagram-E7M64L7V-Ck8tvxP2.js} +1 -1
  22. package/dashboard/dist/assets/{diagram-IFDJBPK2-C3pCbJ1e.js → diagram-IFDJBPK2-rQKIi-sc.js} +1 -1
  23. package/dashboard/dist/assets/{diagram-P4PSJMXO-D-taXZwH.js → diagram-P4PSJMXO-DS1RGSgx.js} +1 -1
  24. package/dashboard/dist/assets/{erDiagram-INFDFZHY-QjY-NHVs.js → erDiagram-INFDFZHY-BqWCybWW.js} +1 -1
  25. package/dashboard/dist/assets/{flowDiagram-PKNHOUZH-FjO8P5Tq.js → flowDiagram-PKNHOUZH-BCoQtyQ5.js} +1 -1
  26. package/dashboard/dist/assets/{ganttDiagram-A5KZAMGK-Bsn7CyK3.js → ganttDiagram-A5KZAMGK-CD1BmicP.js} +1 -1
  27. package/dashboard/dist/assets/{gitGraphDiagram-K3NZZRJ6-BZ8DjhnF.js → gitGraphDiagram-K3NZZRJ6-tGDYOZuO.js} +1 -1
  28. package/dashboard/dist/assets/{graph-AdliIYqX.js → graph-BT0s-094.js} +1 -1
  29. package/dashboard/dist/assets/index-BdSkANCC.js +510 -0
  30. package/dashboard/dist/assets/index-D2Yoi6DJ.css +1 -0
  31. package/dashboard/dist/assets/{infoDiagram-LFFYTUFH-BfZjLA86.js → infoDiagram-LFFYTUFH-E4dVb8BD.js} +1 -1
  32. package/dashboard/dist/assets/{ishikawaDiagram-PHBUUO56-BSgSGMp5.js → ishikawaDiagram-PHBUUO56-CubuM_ev.js} +1 -1
  33. package/dashboard/dist/assets/{journeyDiagram-4ABVD52K-BlQ7qeMC.js → journeyDiagram-4ABVD52K-DfyJbgMF.js} +1 -1
  34. package/dashboard/dist/assets/{kanban-definition-K7BYSVSG-CifO0AUu.js → kanban-definition-K7BYSVSG-BXamajyZ.js} +1 -1
  35. package/dashboard/dist/assets/{layout-B9r-gpD9.js → layout-6b_SlWD_.js} +1 -1
  36. package/dashboard/dist/assets/{linear-CaaIRxVZ.js → linear-BE0O-66A.js} +1 -1
  37. package/dashboard/dist/assets/{mermaid.core-C8wCWYw-.js → mermaid.core-DM3qWr07.js} +4 -4
  38. package/dashboard/dist/assets/{mindmap-definition-YRQLILUH-BpX5T7iT.js → mindmap-definition-YRQLILUH-puOtERrG.js} +1 -1
  39. package/dashboard/dist/assets/{pieDiagram-SKSYHLDU-BNGYtWrc.js → pieDiagram-SKSYHLDU-cE6l8UBX.js} +1 -1
  40. package/dashboard/dist/assets/{quadrantDiagram-337W2JSQ-CR4GeM9D.js → quadrantDiagram-337W2JSQ-CgDAyZQP.js} +1 -1
  41. package/dashboard/dist/assets/{requirementDiagram-Z7DCOOCP-CXrPkMLl.js → requirementDiagram-Z7DCOOCP-CJrai_8U.js} +1 -1
  42. package/dashboard/dist/assets/{sankeyDiagram-WA2Y5GQK-CIzof7Dm.js → sankeyDiagram-WA2Y5GQK-Bf72l7UW.js} +1 -1
  43. package/dashboard/dist/assets/{sequenceDiagram-2WXFIKYE-BJZLt0O2.js → sequenceDiagram-2WXFIKYE-0D8RN7ds.js} +1 -1
  44. package/dashboard/dist/assets/{stateDiagram-RAJIS63D-x9gC6zy6.js → stateDiagram-RAJIS63D-B8LucUIt.js} +1 -1
  45. package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-D0dc7wxQ.js +1 -0
  46. package/dashboard/dist/assets/{timeline-definition-YZTLITO2-D_ZSQn1K.js → timeline-definition-YZTLITO2-DL3Hq8ii.js} +1 -1
  47. package/dashboard/dist/assets/{treemap-KZPCXAKY-LPpMEco4.js → treemap-KZPCXAKY-wF1X4_uI.js} +1 -1
  48. package/dashboard/dist/assets/{vennDiagram-LZ73GAT5-CRFZQpr7.js → vennDiagram-LZ73GAT5-DDAjoGTZ.js} +1 -1
  49. package/dashboard/dist/assets/{xychartDiagram-JWTSCODW-Bivutynw.js → xychartDiagram-JWTSCODW-T-YmzRW8.js} +1 -1
  50. package/dashboard/dist/index.html +2 -2
  51. package/dist/dashboard/server.js +7664 -5884
  52. package/dist/dashboard/server.js.map +1 -1
  53. package/dist/db/leases-db.js.map +1 -1
  54. package/dist/index.js +6438 -2094
  55. package/dist/index.js.map +1 -1
  56. package/dist/launch/index.d.ts +318 -0
  57. package/dist/launch/index.js +3122 -0
  58. package/dist/launch/index.js.map +1 -0
  59. package/package.json +15 -2
  60. package/platforms/claude-code/commands/track-session/track-session.md +2 -1
  61. package/platforms/claude-code/hooks/session-start.sh +14 -1
  62. package/platforms/claude-code/references/protocol-summary.md +1 -1
  63. package/platforms/claude-code/skills/capture-artifacts/SKILL.md +2 -1
  64. package/platforms/claude-code/skills/complete-assignment/SKILL.md +2 -0
  65. package/platforms/claude-code/skills/syntaur-protocol/references/protocol-summary.md +1 -1
  66. package/platforms/claude-code/skills/track-session/SKILL.md +2 -1
  67. package/platforms/codex/agents/syntaur-operator.md +2 -2
  68. package/platforms/codex/references/protocol-summary.md +1 -1
  69. package/platforms/codex/skills/capture-artifacts/SKILL.md +2 -1
  70. package/platforms/codex/skills/complete-assignment/SKILL.md +2 -0
  71. package/platforms/codex/skills/syntaur-protocol/references/protocol-summary.md +1 -1
  72. package/platforms/codex/skills/track-session/SKILL.md +2 -1
  73. package/scripts/install-macos-url-handler.mjs +540 -0
  74. package/skills/capture-artifacts/SKILL.md +2 -1
  75. package/skills/complete-assignment/SKILL.md +2 -0
  76. package/skills/syntaur-protocol/references/protocol-summary.md +1 -1
  77. package/skills/track-session/SKILL.md +2 -1
  78. package/dashboard/dist/assets/channel-D2-caOn6.js +0 -1
  79. package/dashboard/dist/assets/classDiagram-VBA2DB6C-HFOb_XEt.js +0 -1
  80. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-HFOb_XEt.js +0 -1
  81. package/dashboard/dist/assets/clone-BrYOwgIq.js +0 -1
  82. package/dashboard/dist/assets/index-BoR_oyUZ.css +0 -1
  83. package/dashboard/dist/assets/index-RCBI4aX2.js +0 -525
  84. package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-CN5Dcv7u.js +0 -1
@@ -0,0 +1,318 @@
1
+ import { SpawnOptions, ChildProcess } from 'node:child_process';
2
+
3
+ type OpenUrlErrorCode = 'bad-scheme' | 'bad-host' | 'missing-id' | 'both-ids' | 'malformed' | 'duplicate-param' | 'bad-mode';
4
+ declare class OpenUrlError extends Error {
5
+ readonly code: OpenUrlErrorCode;
6
+ constructor(code: OpenUrlErrorCode, message: string);
7
+ }
8
+ type SessionMode = 'resume' | 'fork';
9
+ interface ParsedOpenUrl {
10
+ kind: 'assignment' | 'session';
11
+ id: string;
12
+ /**
13
+ * Only set when `kind === 'session'`. Defaults to `'resume'` when the URL
14
+ * has no `mode` query param. Distinguishes "continue this session under the
15
+ * same id" (resume) from "branch a new session id at this point in
16
+ * history" (fork) so the dashboard can disable Resume while the original
17
+ * process may still be writing the transcript.
18
+ */
19
+ mode?: SessionMode;
20
+ }
21
+ /**
22
+ * Parse a `syntaur://open?assignment=<id>` or `syntaur://open?session=<id>` URL.
23
+ *
24
+ * Validation:
25
+ * - scheme must be `syntaur:`
26
+ * - host must be `open`
27
+ * - exactly one of `assignment` or `session` query params must be present
28
+ * - neither param may be duplicated
29
+ * - when `session` is present, optional `mode=resume|fork` (default `resume`)
30
+ *
31
+ * Throws OpenUrlError with a structured code on any failure.
32
+ */
33
+ declare function parseOpenUrl(input: string): ParsedOpenUrl;
34
+
35
+ type BindableActionKind = 'new-workspace' | 'new-project' | 'new-todo' | 'new-assignment';
36
+
37
+ type PromptArgPosition = 'first' | 'last' | 'none';
38
+ /**
39
+ * Per-agent argv recipe for continuing a recorded session in a specific mode.
40
+ *
41
+ * `args` is a literal argv list with the substring `{id}` substituted for the
42
+ * agent's session id at launch time. `command` overrides the agent's main
43
+ * `command` field — used by subcommand-style agents (e.g. `codex resume <id>`
44
+ * is documented as command=codex, args=['resume','{id}']; the override exists
45
+ * for future agents whose subcommand binary differs).
46
+ */
47
+ interface SessionInvocation {
48
+ command?: string;
49
+ args: string[];
50
+ }
51
+ interface AgentConfig {
52
+ id: string;
53
+ label: string;
54
+ command: string;
55
+ args?: string[];
56
+ promptArgPosition?: PromptArgPosition;
57
+ default?: boolean;
58
+ resolveFromShellAliases?: boolean;
59
+ resume?: SessionInvocation;
60
+ fork?: SessionInvocation;
61
+ }
62
+
63
+ interface StatusDefinition {
64
+ id: string;
65
+ label: string;
66
+ description?: string;
67
+ color?: string;
68
+ icon?: string;
69
+ terminal?: boolean;
70
+ }
71
+ interface StatusTransition {
72
+ from: string;
73
+ command: string;
74
+ to: string;
75
+ label?: string;
76
+ description?: string;
77
+ requiresReason?: boolean;
78
+ }
79
+ interface StatusConfig {
80
+ statuses: StatusDefinition[];
81
+ order: string[];
82
+ transitions: StatusTransition[];
83
+ }
84
+ interface TypeDefinition {
85
+ id: string;
86
+ label?: string;
87
+ description?: string;
88
+ color?: string;
89
+ icon?: string;
90
+ }
91
+ interface TypesConfig {
92
+ definitions: TypeDefinition[];
93
+ default: string;
94
+ }
95
+ interface IntegrationConfig {
96
+ claudePluginDir: string | null;
97
+ codexPluginDir: string | null;
98
+ codexMarketplacePath: string | null;
99
+ }
100
+ interface OnboardingConfig {
101
+ completed: boolean;
102
+ }
103
+ interface BackupConfig {
104
+ repo: string | null;
105
+ categories: string;
106
+ lastBackup: string | null;
107
+ lastRestore: string | null;
108
+ }
109
+ type AutoCreateWorktree = 'skip' | 'ask' | 'always';
110
+ interface PlaybooksConfig {
111
+ disabled: string[];
112
+ }
113
+ interface ThemeConfig {
114
+ preset: string;
115
+ }
116
+ interface HotkeyBindingsConfig {
117
+ bindings: Partial<Record<BindableActionKind, string>>;
118
+ }
119
+ type TerminalChoice = 'terminal-app' | 'iterm' | 'ghostty' | 'alacritty' | 'warp' | 'kitty';
120
+ interface SyntaurConfig {
121
+ version: string;
122
+ defaultProjectDir: string;
123
+ onboarding: OnboardingConfig;
124
+ agentDefaults: {
125
+ trustLevel: 'low' | 'medium' | 'high';
126
+ autoApprove: boolean;
127
+ autoCreateWorktree: AutoCreateWorktree;
128
+ };
129
+ integrations: IntegrationConfig;
130
+ backup: BackupConfig | null;
131
+ statuses: StatusConfig | null;
132
+ types: TypesConfig | null;
133
+ agents: AgentConfig[] | null;
134
+ playbooks: PlaybooksConfig;
135
+ theme: ThemeConfig | null;
136
+ hotkeys: HotkeyBindingsConfig | null;
137
+ terminal: TerminalChoice | null;
138
+ }
139
+
140
+ /**
141
+ * The resolved command + args shape returned by both fresh-launch and
142
+ * resume-launch argv builders. When `resolveFromShellAliases: true` is set on
143
+ * the agent, `command` is rewritten to the user's shell (or /bin/sh fallback)
144
+ * and `args` becomes `['-i', '-c', '<quoted invocation>']` — so callers must
145
+ * consume both fields, not just args.
146
+ */
147
+ interface ResolvedArgv {
148
+ command: string;
149
+ args: string[];
150
+ }
151
+ interface BuiltArgv {
152
+ argv: ResolvedArgv;
153
+ shellFallbackWarning: string | null;
154
+ }
155
+
156
+ type LaunchErrorCode = 'no-agents-configured' | 'assignment-not-found' | 'session-not-found' | 'agent-not-configured' | 'mode-not-supported';
157
+ declare class LaunchError extends Error {
158
+ readonly code: LaunchErrorCode;
159
+ constructor(code: LaunchErrorCode, message: string);
160
+ }
161
+ interface LaunchPlan {
162
+ terminal: TerminalChoice;
163
+ cwd: string;
164
+ argv: ResolvedArgv;
165
+ env: NodeJS.ProcessEnv;
166
+ agentId: string;
167
+ /** Non-fatal warning about a fallback cwd (worktree path missing). */
168
+ fallbackWarning: string | null;
169
+ /** Non-fatal warning from shell-alias resolution falling back to /bin/sh. */
170
+ shellFallbackWarning: string | null;
171
+ }
172
+ interface ResolveLaunchPlanInput {
173
+ kind: 'assignment' | 'session';
174
+ id: string;
175
+ /**
176
+ * Only consulted when `kind === 'session'`. Defaults to `'resume'` so
177
+ * callers that haven't been updated to thread the URL mode through still
178
+ * get the prior behavior (continue the same session id).
179
+ */
180
+ mode?: SessionMode;
181
+ config: SyntaurConfig;
182
+ projectsDir: string;
183
+ assignmentsDir: string;
184
+ }
185
+ /**
186
+ * Pick the agent the "Open in agent" flow should use. Order of preference:
187
+ * - the first agent with `default: true`
188
+ * - else the first entry in the list
189
+ * Throws LaunchError('no-agents-configured') if the list is empty (only
190
+ * possible when the user explicitly wrote `agents: []` — absence falls back to
191
+ * BUILTIN_AGENTS via `getAgents()`).
192
+ */
193
+ declare function pickAgent(config: SyntaurConfig): AgentConfig;
194
+ /**
195
+ * Resolve the launch plan for a "Open in agent" click. Reads the assignment or
196
+ * session record, picks the cwd + agent, builds the argv, and returns a
197
+ * structured plan that `executeLaunchPlan` (or an Electron caller) can run.
198
+ */
199
+ declare function resolveLaunchPlan(input: ResolveLaunchPlanInput): Promise<LaunchPlan>;
200
+
201
+ declare class TerminalNotFoundError extends Error {
202
+ readonly terminal: TerminalChoice;
203
+ readonly remediation: string;
204
+ constructor(terminal: TerminalChoice, remediation: string);
205
+ }
206
+ /**
207
+ * Test hook: a function that replaces `child_process.spawn` so unit tests can
208
+ * assert exactly what the launcher invoked without spawning real processes.
209
+ * Must return a `ChildProcess`-shaped object — `executeLaunchPlan` listens for
210
+ * `'error'`, `'spawn'`, and `'exit'` events to detect missing terminals.
211
+ */
212
+ type SpawnFn = (command: string, args: readonly string[], options: SpawnOptions) => ChildProcess;
213
+ /**
214
+ * Run the launch plan: spawn the configured terminal in a new window with the
215
+ * resolved cwd + agent argv. Returns once the spawn has been initiated and
216
+ * confirmed; for wrapper commands (osascript/open) it briefly waits for the
217
+ * wrapper to exit so that missing apps surface as a non-zero CLI exit.
218
+ *
219
+ * Throws `TerminalNotFoundError` when the spawn errors (ENOENT on direct CLI
220
+ * launchers) or when a wrapper exits non-zero (target app missing).
221
+ */
222
+ declare function executeLaunchPlan(plan: LaunchPlan, spawnFn?: SpawnFn): Promise<void>;
223
+ interface TerminalInvocation {
224
+ command: string;
225
+ args: string[];
226
+ }
227
+ /**
228
+ * Build the argv that will be handed to `spawn` to open `plan.argv` in a new
229
+ * window of `plan.terminal` at `plan.cwd`. Exported for unit testing.
230
+ */
231
+ declare function buildTerminalInvocation(plan: LaunchPlan): TerminalInvocation;
232
+
233
+ /**
234
+ * Build argv for an agent launch. Handles:
235
+ * - `resolveFromShellAliases: true` → `$SHELL -i -c '<quoted...>'`
236
+ * - `promptArgPosition: 'first' | 'last' | 'none'`
237
+ * - plain absolute or bare-name command.
238
+ */
239
+ declare function buildAgentArgv(agent: AgentConfig, prompt: string, env?: NodeJS.ProcessEnv): BuiltArgv;
240
+
241
+ /**
242
+ * Re-export the fresh-launch argv builder under a parallel name so the launch
243
+ * core has a single import surface: `buildFreshArgv` (new run) and
244
+ * `buildSessionArgv` (resume/fork an existing session).
245
+ */
246
+ declare const buildFreshArgv: typeof buildAgentArgv;
247
+ /**
248
+ * Build argv for continuing an existing agent session under a specific mode.
249
+ *
250
+ * The argv shape per agent is declared in `AgentConfig.resume` / `.fork`
251
+ * (`SessionInvocation`):
252
+ * - `args` is a literal argv list. The substring `{id}` is replaced with
253
+ * `sessionId`.
254
+ * - `command` optionally overrides `agent.command` for subcommand-style
255
+ * agents whose binary differs (none in builtins).
256
+ *
257
+ * Existing `agent.args` (the base flags applied to a fresh launch — e.g.
258
+ * `--dangerously-skip-permissions`) are preserved and prefixed before the
259
+ * invocation args, matching the prior `buildResumeArgv` behavior.
260
+ *
261
+ * The `resolveFromShellAliases` rewriting is preserved identically: the
262
+ * command is rewritten to `$SHELL`/`/bin/sh` and args become
263
+ * `['-i', '-c', '<quoted>']`. The quoted command line uses the (possibly
264
+ * overridden) executable.
265
+ *
266
+ * Throws `LaunchError('mode-not-supported', ...)` when the agent has no
267
+ * entry for the requested mode.
268
+ */
269
+ declare function buildSessionArgv(agent: AgentConfig, sessionId: string, mode: SessionMode, env?: NodeJS.ProcessEnv): BuiltArgv;
270
+
271
+ type InstallKind = 'npx' | 'global' | 'local' | 'unknown';
272
+ interface DetectOptions {
273
+ realpath?: (p: string) => string;
274
+ readFile?: (p: string) => string;
275
+ envUserAgent?: string;
276
+ }
277
+ /**
278
+ * Classify the install origin of the running CLI.
279
+ *
280
+ * Decision order:
281
+ * 1. npx-style cache patterns (anchored to `/node_modules/` suffix).
282
+ * 2. `npm_config_user_agent` containing `npx/` (some pnpm-shim invocations
283
+ * don't put dlx in the path).
284
+ * 3. Canonical npm global layout `/lib/node_modules/syntaur/`.
285
+ * 4. Local checkout (walks up to find a `package.json` named `syntaur`
286
+ * whose dir is not under any `node_modules/`).
287
+ * 5. `unknown` — the subcommand refuses these alongside `npx` to avoid
288
+ * registering a bundle path that may not survive.
289
+ */
290
+ declare function detectInstallKind(scriptUrl: string, opts?: DetectOptions): InstallKind;
291
+ /**
292
+ * Extract the cache-hash segment from an npx-style script URL.
293
+ * Returns null for global/local/unknown installs.
294
+ */
295
+ declare function extractNpxHash(scriptUrl: string, opts?: DetectOptions): string | null;
296
+ declare function nudgeStampDir(): string;
297
+ declare function nudgeStampPath(hash: string): string;
298
+ declare function hasNudgedHash(hash: string): Promise<boolean>;
299
+ declare function recordNudge(hash: string): Promise<void>;
300
+ /**
301
+ * Truthiness rules for `SYNTAUR_SKIP_HANDLER_NUDGE`:
302
+ * - `'1'`, `'true'`, `'yes'` (case-insensitive, trimmed) → disabled
303
+ * - empty, unset, `'0'`, `'false'`, whitespace → enabled
304
+ *
305
+ * Deliberately narrow so users who set the var to `'0'` to mean "off the
306
+ * skip" don't accidentally disable the nudge.
307
+ */
308
+ declare function isHandlerNudgeDisabled(): boolean;
309
+ declare function nudgeMessage(): string;
310
+ declare function shouldNudgeForNpx(hash: string | null): Promise<boolean>;
311
+ /**
312
+ * Pre-Commander startup hook. Mirrors `maybePromptInstall` from
313
+ * `src/utils/npx-prompt.ts` in shape so `src/index.ts` can call them
314
+ * back-to-back.
315
+ */
316
+ declare function maybeNudgeForNpxInstall(scriptUrl: string): Promise<void>;
317
+
318
+ export { type BuiltArgv, type InstallKind, LaunchError, type LaunchErrorCode, type LaunchPlan, OpenUrlError, type OpenUrlErrorCode, type ParsedOpenUrl, type ResolveLaunchPlanInput, type ResolvedArgv, type SessionMode, type SpawnFn, TerminalNotFoundError, buildFreshArgv, buildSessionArgv, buildTerminalInvocation, detectInstallKind, executeLaunchPlan, extractNpxHash, hasNudgedHash, isHandlerNudgeDisabled, maybeNudgeForNpxInstall, nudgeMessage, nudgeStampDir, nudgeStampPath, parseOpenUrl, pickAgent, recordNudge, resolveLaunchPlan, shouldNudgeForNpx };