@namzu/cli 30.0.0 → 33.0.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/CHANGELOG.md +261 -1
- package/dist/browser/commands.js +11 -7
- package/dist/browser/commands.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +26 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/acp.d.ts +20 -2
- package/dist/commands/acp.d.ts.map +1 -1
- package/dist/commands/acp.js +42 -5
- package/dist/commands/acp.js.map +1 -1
- package/dist/commands/archive.d.ts +4 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +62 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/drain.d.ts.map +1 -1
- package/dist/commands/drain.js +2 -1
- package/dist/commands/drain.js.map +1 -1
- package/dist/commands/exec-json.d.ts.map +1 -1
- package/dist/commands/exec-json.js +24 -1
- package/dist/commands/exec-json.js.map +1 -1
- package/dist/commands/exec.d.ts.map +1 -1
- package/dist/commands/exec.js +2 -1
- package/dist/commands/exec.js.map +1 -1
- package/dist/commands/login.d.ts +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +33 -11
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/mcp-oauth-login.d.ts +19 -0
- package/dist/commands/mcp-oauth-login.d.ts.map +1 -0
- package/dist/commands/mcp-oauth-login.js +213 -0
- package/dist/commands/mcp-oauth-login.js.map +1 -0
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +288 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/prior-messages.d.ts.map +1 -1
- package/dist/commands/prior-messages.js +42 -2
- package/dist/commands/prior-messages.js.map +1 -1
- package/dist/commands/schedule.d.ts.map +1 -1
- package/dist/commands/schedule.js +7 -5
- package/dist/commands/schedule.js.map +1 -1
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/skills.js +60 -5
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/types.d.ts +2 -0
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/worktree.d.ts +6 -0
- package/dist/commands/worktree.d.ts.map +1 -0
- package/dist/commands/worktree.js +85 -0
- package/dist/commands/worktree.js.map +1 -0
- package/dist/config/composer-triggers.d.ts +41 -0
- package/dist/config/composer-triggers.d.ts.map +1 -0
- package/dist/config/composer-triggers.js +80 -0
- package/dist/config/composer-triggers.js.map +1 -0
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +58 -0
- package/dist/config/load.js.map +1 -1
- package/dist/config/schema.d.ts +34 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/config/user-config.d.ts +2 -0
- package/dist/config/user-config.d.ts.map +1 -1
- package/dist/config/user-config.js +76 -6
- package/dist/config/user-config.js.map +1 -1
- package/dist/context/doctrine.d.ts +3 -3
- package/dist/context/doctrine.d.ts.map +1 -1
- package/dist/context/doctrine.js +3 -3
- package/dist/context/doctrine.js.map +1 -1
- package/dist/context/runtime-message.d.ts.map +1 -1
- package/dist/context/runtime-message.js +4 -0
- package/dist/context/runtime-message.js.map +1 -1
- package/dist/doctor/checks/credentials.d.ts.map +1 -1
- package/dist/doctor/checks/credentials.js +2 -0
- package/dist/doctor/checks/credentials.js.map +1 -1
- package/dist/integrations/mcp/oauth-store.d.ts +40 -0
- package/dist/integrations/mcp/oauth-store.d.ts.map +1 -0
- package/dist/integrations/mcp/oauth-store.js +549 -0
- package/dist/integrations/mcp/oauth-store.js.map +1 -0
- package/dist/integrations/mcp/servers.d.ts +72 -5
- package/dist/integrations/mcp/servers.d.ts.map +1 -1
- package/dist/integrations/mcp/servers.js +298 -24
- package/dist/integrations/mcp/servers.js.map +1 -1
- package/dist/integrations/mcp/user-config.d.ts +25 -0
- package/dist/integrations/mcp/user-config.d.ts.map +1 -0
- package/dist/integrations/mcp/user-config.js +92 -0
- package/dist/integrations/mcp/user-config.js.map +1 -0
- package/dist/integrations/plugins/runtime.d.ts +11 -9
- package/dist/integrations/plugins/runtime.d.ts.map +1 -1
- package/dist/integrations/plugins/runtime.js +17 -36
- package/dist/integrations/plugins/runtime.js.map +1 -1
- package/dist/integrations/providers/credential-store.d.ts +8 -0
- package/dist/integrations/providers/credential-store.d.ts.map +1 -1
- package/dist/integrations/providers/credential-store.js +111 -22
- package/dist/integrations/providers/credential-store.js.map +1 -1
- package/dist/integrations/providers/discover.d.ts +11 -5
- package/dist/integrations/providers/discover.d.ts.map +1 -1
- package/dist/integrations/providers/discover.js +26 -12
- 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/integrations/resident/session-step.d.ts.map +1 -1
- package/dist/integrations/resident/session-step.js +2 -1
- package/dist/integrations/resident/session-step.js.map +1 -1
- package/dist/integrations/sessions/store.d.ts +23 -5
- package/dist/integrations/sessions/store.d.ts.map +1 -1
- package/dist/integrations/sessions/store.js +184 -26
- package/dist/integrations/sessions/store.js.map +1 -1
- package/dist/integrations/subagents/NamzuCliAgent.d.ts +8 -0
- package/dist/integrations/subagents/NamzuCliAgent.d.ts.map +1 -0
- package/dist/integrations/subagents/NamzuCliAgent.js +9 -0
- package/dist/integrations/subagents/NamzuCliAgent.js.map +1 -0
- package/dist/integrations/subagents/runtime.d.ts +9 -6
- package/dist/integrations/subagents/runtime.d.ts.map +1 -1
- package/dist/integrations/subagents/runtime.js +108 -19
- package/dist/integrations/subagents/runtime.js.map +1 -1
- package/dist/integrations/subagents/worktree-driver.d.ts +17 -0
- package/dist/integrations/subagents/worktree-driver.d.ts.map +1 -0
- package/dist/integrations/subagents/worktree-driver.js +72 -0
- package/dist/integrations/subagents/worktree-driver.js.map +1 -0
- package/dist/integrations/web/search.d.ts.map +1 -1
- package/dist/integrations/web/search.js +8 -6
- package/dist/integrations/web/search.js.map +1 -1
- package/dist/integrations/worktrees/managed.d.ts +49 -0
- package/dist/integrations/worktrees/managed.d.ts.map +1 -0
- package/dist/integrations/worktrees/managed.js +231 -0
- package/dist/integrations/worktrees/managed.js.map +1 -0
- package/dist/permissions/rules.d.ts +5 -1
- package/dist/permissions/rules.d.ts.map +1 -1
- package/dist/permissions/rules.js +85 -3
- package/dist/permissions/rules.js.map +1 -1
- package/dist/schedule/build.d.ts +19 -2
- package/dist/schedule/build.d.ts.map +1 -1
- package/dist/schedule/build.js +119 -21
- package/dist/schedule/build.js.map +1 -1
- package/dist/schedule/changes.d.ts.map +1 -1
- package/dist/schedule/changes.js +13 -0
- package/dist/schedule/changes.js.map +1 -1
- package/dist/schedule/commands/add.d.ts +1 -1
- package/dist/schedule/commands/add.d.ts.map +1 -1
- package/dist/schedule/commands/add.js +186 -40
- package/dist/schedule/commands/add.js.map +1 -1
- package/dist/schedule/commands/list.d.ts +2 -0
- package/dist/schedule/commands/list.d.ts.map +1 -1
- package/dist/schedule/commands/list.js +64 -19
- package/dist/schedule/commands/list.js.map +1 -1
- package/dist/schedule/daemon/daemon.d.ts +1 -1
- package/dist/schedule/daemon/daemon.d.ts.map +1 -1
- package/dist/schedule/daemon/daemon.js +17 -5
- package/dist/schedule/daemon/daemon.js.map +1 -1
- package/dist/schedule/daemon/notify.d.ts +21 -1
- package/dist/schedule/daemon/notify.d.ts.map +1 -1
- package/dist/schedule/daemon/notify.js +43 -0
- package/dist/schedule/daemon/notify.js.map +1 -1
- package/dist/schedule/fire/fire.d.ts +1 -1
- package/dist/schedule/fire/fire.d.ts.map +1 -1
- package/dist/schedule/fire/fire.js +205 -14
- package/dist/schedule/fire/fire.js.map +1 -1
- package/dist/schedule/fire/result.d.ts +1 -1
- package/dist/schedule/fire/result.d.ts.map +1 -1
- package/dist/schedule/fire/result.js +2 -1
- package/dist/schedule/fire/result.js.map +1 -1
- package/dist/schedule/fire/run-script.d.ts +46 -0
- package/dist/schedule/fire/run-script.d.ts.map +1 -0
- package/dist/schedule/fire/run-script.js +81 -0
- package/dist/schedule/fire/run-script.js.map +1 -0
- package/dist/schedule/fire/unattended-note.d.ts +8 -0
- package/dist/schedule/fire/unattended-note.d.ts.map +1 -1
- package/dist/schedule/fire/unattended-note.js +5 -0
- package/dist/schedule/fire/unattended-note.js.map +1 -1
- package/dist/schedule/fire/wake-gate.d.ts +39 -0
- package/dist/schedule/fire/wake-gate.d.ts.map +1 -0
- package/dist/schedule/fire/wake-gate.js +90 -0
- package/dist/schedule/fire/wake-gate.js.map +1 -0
- package/dist/schedule/floor.d.ts +1 -1
- package/dist/schedule/floor.d.ts.map +1 -1
- package/dist/schedule/floor.js +288 -16
- package/dist/schedule/floor.js.map +1 -1
- package/dist/schedule/policy.d.ts +40 -0
- package/dist/schedule/policy.d.ts.map +1 -1
- package/dist/schedule/policy.js +36 -0
- package/dist/schedule/policy.js.map +1 -1
- package/dist/schedule/script-check.d.ts +53 -0
- package/dist/schedule/script-check.d.ts.map +1 -0
- package/dist/schedule/script-check.js +145 -0
- package/dist/schedule/script-check.js.map +1 -0
- package/dist/schedule/script-shell.d.ts +3 -0
- package/dist/schedule/script-shell.d.ts.map +1 -0
- package/dist/schedule/script-shell.js +5 -0
- package/dist/schedule/script-shell.js.map +1 -0
- package/dist/schedule/service/manifest.js +1 -1
- package/dist/schedule/service/manifest.js.map +1 -1
- package/dist/schedule/store/atomic.d.ts +5 -2
- package/dist/schedule/store/atomic.d.ts.map +1 -1
- package/dist/schedule/store/atomic.js +7 -4
- package/dist/schedule/store/atomic.js.map +1 -1
- package/dist/schedule/store/claims.js +1 -1
- package/dist/schedule/store/claims.js.map +1 -1
- package/dist/schedule/store/history.d.ts +1 -1
- package/dist/schedule/store/history.d.ts.map +1 -1
- package/dist/schedule/store/history.js +4 -1
- package/dist/schedule/store/history.js.map +1 -1
- package/dist/schedule/store/jobs.d.ts +19 -3
- package/dist/schedule/store/jobs.d.ts.map +1 -1
- package/dist/schedule/store/jobs.js +83 -16
- package/dist/schedule/store/jobs.js.map +1 -1
- package/dist/schedule/store/state.js +1 -1
- package/dist/schedule/store/state.js.map +1 -1
- package/dist/schedule/types.d.ts +71 -6
- package/dist/schedule/types.d.ts.map +1 -1
- package/dist/schedule/types.js +25 -1
- package/dist/schedule/types.js.map +1 -1
- package/dist/schedule/visible-source.d.ts +18 -0
- package/dist/schedule/visible-source.d.ts.map +1 -0
- package/dist/schedule/visible-source.js +59 -0
- package/dist/schedule/visible-source.js.map +1 -0
- package/dist/skills/audit.d.ts +31 -0
- package/dist/skills/audit.d.ts.map +1 -0
- package/dist/skills/audit.js +75 -0
- package/dist/skills/audit.js.map +1 -0
- package/dist/test-support/toolset.d.ts +23 -0
- package/dist/test-support/toolset.d.ts.map +1 -0
- package/dist/test-support/toolset.js +27 -0
- package/dist/test-support/toolset.js.map +1 -0
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +568 -106
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/ChoicePicker.d.ts +2 -0
- package/dist/tui/ChoicePicker.d.ts.map +1 -1
- package/dist/tui/ChoicePicker.js +10 -2
- package/dist/tui/ChoicePicker.js.map +1 -1
- package/dist/tui/Composer.d.ts +62 -3
- package/dist/tui/Composer.d.ts.map +1 -1
- package/dist/tui/Composer.js +162 -25
- package/dist/tui/Composer.js.map +1 -1
- package/dist/tui/ComposerFrame.d.ts +1 -1
- package/dist/tui/ComposerFrame.js +3 -3
- package/dist/tui/ComposerFrame.js.map +1 -1
- package/dist/tui/EffortSlider.d.ts +8 -9
- package/dist/tui/EffortSlider.d.ts.map +1 -1
- package/dist/tui/EffortSlider.js +15 -12
- package/dist/tui/EffortSlider.js.map +1 -1
- package/dist/tui/Picker.d.ts.map +1 -1
- package/dist/tui/Picker.js +18 -3
- package/dist/tui/Picker.js.map +1 -1
- package/dist/tui/ResumePicker.d.ts +2 -1
- package/dist/tui/ResumePicker.d.ts.map +1 -1
- package/dist/tui/ResumePicker.js +3 -3
- package/dist/tui/ResumePicker.js.map +1 -1
- package/dist/tui/StatusBar.d.ts +12 -12
- package/dist/tui/StatusBar.d.ts.map +1 -1
- package/dist/tui/StatusBar.js +15 -15
- package/dist/tui/StatusBar.js.map +1 -1
- package/dist/tui/agent.d.ts +46 -7
- package/dist/tui/agent.d.ts.map +1 -1
- package/dist/tui/agent.js +399 -182
- package/dist/tui/agent.js.map +1 -1
- package/dist/tui/browser-notices.d.ts.map +1 -1
- package/dist/tui/browser-notices.js +6 -1
- package/dist/tui/browser-notices.js.map +1 -1
- package/dist/tui/credential-entry.d.ts +4 -29
- package/dist/tui/credential-entry.d.ts.map +1 -1
- package/dist/tui/credential-entry.js +7 -29
- package/dist/tui/credential-entry.js.map +1 -1
- package/dist/tui/hypermode.d.ts +37 -0
- package/dist/tui/hypermode.d.ts.map +1 -0
- package/dist/tui/hypermode.js +58 -0
- package/dist/tui/hypermode.js.map +1 -0
- package/dist/tui/login-prompt.d.ts +3 -1
- package/dist/tui/login-prompt.d.ts.map +1 -1
- package/dist/tui/login-prompt.js +11 -0
- package/dist/tui/login-prompt.js.map +1 -1
- package/dist/tui/permission-review.d.ts +1 -1
- package/dist/tui/permission-review.js +1 -1
- package/dist/tui/provider-list.d.ts.map +1 -1
- package/dist/tui/provider-list.js +3 -1
- package/dist/tui/provider-list.js.map +1 -1
- package/dist/tui/schedule/host-commands.d.ts.map +1 -1
- package/dist/tui/schedule/host-commands.js +94 -33
- package/dist/tui/schedule/host-commands.js.map +1 -1
- package/dist/tui/schedule/integration.d.ts +6 -2
- package/dist/tui/schedule/integration.d.ts.map +1 -1
- package/dist/tui/schedule/integration.js +3 -1
- package/dist/tui/schedule/integration.js.map +1 -1
- package/dist/tui/schedule/resume.d.ts.map +1 -1
- package/dist/tui/schedule/resume.js +10 -1
- package/dist/tui/schedule/resume.js.map +1 -1
- package/dist/tui/schedule/tool-host.d.ts +4 -1
- package/dist/tui/schedule/tool-host.d.ts.map +1 -1
- package/dist/tui/schedule/tool-host.js +155 -40
- package/dist/tui/schedule/tool-host.js.map +1 -1
- package/dist/tui/slashCommands.d.ts +33 -6
- package/dist/tui/slashCommands.d.ts.map +1 -1
- package/dist/tui/slashCommands.js +96 -34
- package/dist/tui/slashCommands.js.map +1 -1
- package/dist/tui/theme.d.ts +10 -4
- package/dist/tui/theme.d.ts.map +1 -1
- package/dist/tui/theme.js +4 -3
- package/dist/tui/theme.js.map +1 -1
- package/dist/tui/triggers/analyze.d.ts +57 -0
- package/dist/tui/triggers/analyze.d.ts.map +1 -0
- package/dist/tui/triggers/analyze.js +221 -0
- package/dist/tui/triggers/analyze.js.map +1 -0
- package/dist/tui/triggers/context-text.d.ts +21 -0
- package/dist/tui/triggers/context-text.d.ts.map +1 -0
- package/dist/tui/triggers/context-text.js +44 -0
- package/dist/tui/triggers/context-text.js.map +1 -0
- package/dist/tui/triggers/copy.d.ts +38 -0
- package/dist/tui/triggers/copy.d.ts.map +1 -0
- package/dist/tui/triggers/copy.js +163 -0
- package/dist/tui/triggers/copy.js.map +1 -0
- package/dist/tui/triggers/detect.d.ts +83 -0
- package/dist/tui/triggers/detect.d.ts.map +1 -0
- package/dist/tui/triggers/detect.js +295 -0
- package/dist/tui/triggers/detect.js.map +1 -0
- package/dist/tui/triggers/fold.d.ts +34 -0
- package/dist/tui/triggers/fold.d.ts.map +1 -0
- package/dist/tui/triggers/fold.js +44 -0
- package/dist/tui/triggers/fold.js.map +1 -0
- package/dist/tui/triggers/pattern.d.ts +66 -0
- package/dist/tui/triggers/pattern.d.ts.map +1 -0
- package/dist/tui/triggers/pattern.js +243 -0
- package/dist/tui/triggers/pattern.js.map +1 -0
- package/dist/tui/triggers/provenance.d.ts +58 -0
- package/dist/tui/triggers/provenance.d.ts.map +1 -0
- package/dist/tui/triggers/provenance.js +98 -0
- package/dist/tui/triggers/provenance.js.map +1 -0
- package/dist/tui/triggers/registry.d.ts +113 -0
- package/dist/tui/triggers/registry.d.ts.map +1 -0
- package/dist/tui/triggers/registry.js +164 -0
- package/dist/tui/triggers/registry.js.map +1 -0
- package/dist/tui/triggers/setting.d.ts +18 -0
- package/dist/tui/triggers/setting.d.ts.map +1 -0
- package/dist/tui/triggers/setting.js +61 -0
- package/dist/tui/triggers/setting.js.map +1 -0
- package/dist/tui/triggers/verbs.d.ts +29 -0
- package/dist/tui/triggers/verbs.d.ts.map +1 -0
- package/dist/tui/triggers/verbs.js +140 -0
- package/dist/tui/triggers/verbs.js.map +1 -0
- package/dist/tui/turn-interruption.d.ts.map +1 -1
- package/dist/tui/turn-interruption.js +4 -0
- package/dist/tui/turn-interruption.js.map +1 -1
- package/dist/tui/types.d.ts +3 -1
- package/dist/tui/types.d.ts.map +1 -1
- package/package.json +13 -12
- package/skills/schedule-task/SKILL.md +115 -3
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineTool, mcpJsonSchemaToZod } from '@namzu/sdk';
|
|
1
|
+
import { defineTool, mcpJsonSchemaToZod, untrustedEnvelopeBody, } from '@namzu/sdk';
|
|
2
2
|
import { searchExa } from './exa-search.js';
|
|
3
3
|
/** Resolution is shared by tool mounting and the operator's status display. */
|
|
4
4
|
export function resolveWebSearch(config, nativeAvailable = false) {
|
|
@@ -49,13 +49,15 @@ export function createWebSearchTool() {
|
|
|
49
49
|
presentCall: (input) => ({ kind: 'generic', label: String(input.query) }),
|
|
50
50
|
presentResult: (_input, result) => {
|
|
51
51
|
const raw = String(result.output ?? result.error ?? '');
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
// The real envelope now binds its closing tag to a per-render nonce
|
|
53
|
+
// (`tools/untrusted-envelope.ts`), so this reads it back through the
|
|
54
|
+
// canonical reader instead of re-deriving the tag shape by hand — a
|
|
55
|
+
// hand-rolled literal prefix/suffix check drifts the moment the
|
|
56
|
+
// frame's own shape changes, which is exactly what happened here.
|
|
57
|
+
const body = untrustedEnvelopeBody(raw);
|
|
54
58
|
return {
|
|
55
59
|
kind: 'terminal',
|
|
56
|
-
output:
|
|
57
|
-
? raw.slice(boundary + 2, -'</namzu-untrusted>'.length).trim()
|
|
58
|
-
: raw,
|
|
60
|
+
output: body ?? raw,
|
|
59
61
|
};
|
|
60
62
|
},
|
|
61
63
|
async execute(input, context) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/integrations/web/search.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/integrations/web/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,UAAU,EACV,kBAAkB,EAClB,qBAAqB,GACrB,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,+EAA+E;AAC/E,MAAM,UAAU,gBAAgB,CAAC,MAAkB,EAAE,eAAe,GAAG,KAAK;IAC3E,MAAM,IAAI,GAAG,MAAM,EAAE,MAAM,IAAI,MAAM,CAAA;IACrC,MAAM,SAAS,GAAG,MAAM,EAAE,OAAO,IAAI,MAAM,CAAA;IAC3C,MAAM,OAAO,GACZ,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC7F,IAAI,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK;QACzC,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAA;IAC9F,OAAO,EAAE,IAAI,EAAE,OAAO,EAAW,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAkB,EAAE,eAAe,GAAG,KAAK;IACzE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;IACnE,OAAO,IAAI,KAAK,KAAK;QACpB,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAA;AAC/F,CAAC;AAED,MAAM,WAAW,GAAG;IACnB,IAAI,EAAE,QAAiB;IACvB,UAAU,EAAE;QACX,KAAK,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,IAAI;YACf,WAAW,EAAE,mBAAmB;SAChC;QACD,KAAK,EAAE;YACN,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,EAAE;YACX,WAAW,EAAE,6BAA6B;SAC1C;KACD;IACD,QAAQ,EAAE,CAAC,OAAO,CAAC;IACnB,oBAAoB,EAAE,KAAK;CAC3B,CAAA;AAED,iFAAiF;AACjF,MAAM,UAAU,mBAAmB;IAClC,OAAO,UAAU,CAAC;QACjB,IAAI,EAAE,YAAY;QAClB,WAAW,EACV,yQAAyQ;QAC1Q,WAAW,EAAE,kBAAkB,CAAC,WAAW,CAAC;QAC5C,QAAQ,EAAE,SAAS;QACnB,WAAW,EAAE,CAAC,gBAAgB,CAAC;QAC/B,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,KAAK;QAClB,eAAe,EAAE,IAAI;QACrB,SAAS,EAAE,MAAM;QACjB,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACzE,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;YACjC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;YACvD,oEAAoE;YACpE,qEAAqE;YACrE,oEAAoE;YACpE,gEAAgE;YAChE,kEAAkE;YAClE,MAAM,IAAI,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAA;YACvC,OAAO;gBACN,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,IAAI,IAAI,GAAG;aACnB,CAAA;QACF,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO;YAC3B,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;QACzE,CAAC;KACD,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/** CLI-owned, durable Git worktrees. The SDK driver enforces path and branch ownership. */
|
|
2
|
+
import { GitWorktreeDriver } from '@namzu/sdk';
|
|
3
|
+
export interface ManagedWorktree {
|
|
4
|
+
readonly label: string;
|
|
5
|
+
readonly path: string;
|
|
6
|
+
readonly branch: string;
|
|
7
|
+
readonly dirty: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface CreatedWorktree extends ManagedWorktree {
|
|
10
|
+
readonly sourceDirty: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface WorktreeFork extends CreatedWorktree {
|
|
13
|
+
readonly conversationId: string;
|
|
14
|
+
readonly title: string;
|
|
15
|
+
readonly copied: number;
|
|
16
|
+
}
|
|
17
|
+
export interface WorktreeResume {
|
|
18
|
+
readonly worktree: ManagedWorktree;
|
|
19
|
+
readonly conversationId?: string;
|
|
20
|
+
readonly title?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface ManagedWorktreesOptions {
|
|
23
|
+
/** Exact Namzu state root for an embedding or integration test. */
|
|
24
|
+
readonly stateRoot?: string;
|
|
25
|
+
}
|
|
26
|
+
/** A copyable command for the host shell; no path is interpreted by the agent. */
|
|
27
|
+
export declare function worktreeOpenHint(path: string, conversationId?: string): string;
|
|
28
|
+
/** Resolve the same main checkout from either it or one of its linked worktrees. */
|
|
29
|
+
export declare function openManagedWorktrees(cwd: string, options?: ManagedWorktreesOptions): Promise<ManagedWorktrees>;
|
|
30
|
+
export declare class ManagedWorktrees {
|
|
31
|
+
readonly repoRoot: string;
|
|
32
|
+
readonly sourceRoot: string;
|
|
33
|
+
readonly worktreesDir: string;
|
|
34
|
+
private readonly driver;
|
|
35
|
+
private readonly options;
|
|
36
|
+
constructor(repoRoot: string, sourceRoot: string, worktreesDir: string, driver: GitWorktreeDriver, options: ManagedWorktreesOptions);
|
|
37
|
+
private ref;
|
|
38
|
+
/** Registered Namzu-owned checkouts only; arbitrary folders are omitted. */
|
|
39
|
+
list(): Promise<ManagedWorktree[]>;
|
|
40
|
+
/** An exact label must still pass the SDK driver's ownership and Git registration checks. */
|
|
41
|
+
inspect(label: string): Promise<ManagedWorktree | null>;
|
|
42
|
+
/** Create at the selected checkout's committed HEAD, leaving its dirty files in place. */
|
|
43
|
+
create(label?: string): Promise<CreatedWorktree>;
|
|
44
|
+
/** Fork the source checkout's settled conversation into the new checkout's Project. */
|
|
45
|
+
fork(sourceConversationId: string, label?: string): Promise<WorktreeFork>;
|
|
46
|
+
/** Resolve an owned checkout and one of its own conversations for a fresh TUI launch. */
|
|
47
|
+
resume(label: string, conversationId?: string): Promise<WorktreeResume>;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=managed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managed.d.ts","sourceRoot":"","sources":["../../../src/integrations/worktrees/managed.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAQ3F,OAAO,EAAE,iBAAiB,EAAoC,MAAM,YAAY,CAAA;AAchF,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACvD,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAA;CAC7B;AAED,MAAM,WAAW,YAAa,SAAQ,eAAe;IACpD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAA;IAClC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,uBAAuB;IACvC,mEAAmE;IACnE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAS9E;AAeD,oFAAoF;AACpF,wBAAsB,oBAAoB,CACzC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,uBAA4B,GACnC,OAAO,CAAC,gBAAgB,CAAC,CAuC3B;AAED,qBAAa,gBAAgB;IAE3B,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAJf,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACZ,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,uBAAuB;IAGlD,OAAO,CAAC,GAAG;IAcX,4EAA4E;IACtE,IAAI,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAyBxC,6FAA6F;IACvF,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAa7D,0FAA0F;IACpF,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAuCtD,uFAAuF;IACjF,IAAI,CAAC,oBAAoB,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAmC/E,yFAAyF;IACnF,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;CAe7E"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/** CLI-owned, durable Git worktrees. The SDK driver enforces path and branch ownership. */
|
|
2
|
+
import { execFile } from 'node:child_process';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
|
+
import { lstat, mkdir, readdir, realpath, rmdir } from 'node:fs/promises';
|
|
5
|
+
import { join, resolve } from 'node:path';
|
|
6
|
+
import { promisify } from 'node:util';
|
|
7
|
+
import { GitWorktreeDriver, asSessionId, generateWorkspaceId } from '@namzu/sdk';
|
|
8
|
+
import { cliLogger } from '../../logging.js';
|
|
9
|
+
import { activeConversationTurn, closeSessions, forkConversationInto, listRecent, loadResumableConversation, openSessions, } from '../sessions/store.js';
|
|
10
|
+
const runFile = promisify(execFile);
|
|
11
|
+
/** A copyable command for the host shell; no path is interpreted by the agent. */
|
|
12
|
+
export function worktreeOpenHint(path, conversationId) {
|
|
13
|
+
const quoted = process.platform === 'win32'
|
|
14
|
+
? `'${path.replaceAll("'", "''")}'`
|
|
15
|
+
: `'${path.replaceAll("'", "'\\''")}'`;
|
|
16
|
+
const launch = `namzu${conversationId ? ` resume ${conversationId}` : ''}`;
|
|
17
|
+
return process.platform === 'win32'
|
|
18
|
+
? `Set-Location -LiteralPath ${quoted}; if ($?) { ${launch} }`
|
|
19
|
+
: `cd ${quoted} && ${launch}`;
|
|
20
|
+
}
|
|
21
|
+
/** Only one path component and one branch component; no Git or shell syntax. */
|
|
22
|
+
function checkedLabel(value) {
|
|
23
|
+
if (!/^[a-z0-9][a-z0-9-]{0,63}$/.test(value)) {
|
|
24
|
+
throw new Error('A worktree name must use 1–64 lowercase letters, digits or hyphens.');
|
|
25
|
+
}
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
async function git(cwd, ...args) {
|
|
29
|
+
const { stdout } = await runFile('git', ['-C', cwd, ...args]);
|
|
30
|
+
return stdout;
|
|
31
|
+
}
|
|
32
|
+
/** Resolve the same main checkout from either it or one of its linked worktrees. */
|
|
33
|
+
export async function openManagedWorktrees(cwd, options = {}) {
|
|
34
|
+
const directory = await realpath(resolve(cwd));
|
|
35
|
+
let sourceRoot;
|
|
36
|
+
let repoRoot;
|
|
37
|
+
try {
|
|
38
|
+
sourceRoot = await realpath((await git(directory, 'rev-parse', '--show-toplevel')).trim());
|
|
39
|
+
const listing = await git(directory, 'worktree', 'list', '--porcelain', '-z');
|
|
40
|
+
const first = listing.split('\0', 1)[0];
|
|
41
|
+
if (!first?.startsWith('worktree '))
|
|
42
|
+
throw new Error('Git did not report a main checkout.');
|
|
43
|
+
repoRoot = await realpath(first.slice('worktree '.length));
|
|
44
|
+
const sourceCommon = await realpath((await git(sourceRoot, 'rev-parse', '--path-format=absolute', '--git-common-dir')).trim());
|
|
45
|
+
const mainCommon = await realpath((await git(repoRoot, 'rev-parse', '--path-format=absolute', '--git-common-dir')).trim());
|
|
46
|
+
if (sourceCommon !== mainCommon)
|
|
47
|
+
throw new Error('The selected checkout belongs to another repository.');
|
|
48
|
+
}
|
|
49
|
+
catch (cause) {
|
|
50
|
+
throw new Error(`Cannot manage worktrees here: ${cause instanceof Error ? cause.message : String(cause)}`);
|
|
51
|
+
}
|
|
52
|
+
const sessions = await openSessions(repoRoot, options);
|
|
53
|
+
const worktreesDir = sessions.paths.worktrees();
|
|
54
|
+
closeSessions(sessions);
|
|
55
|
+
try {
|
|
56
|
+
const node = await lstat(worktreesDir);
|
|
57
|
+
if (!node.isDirectory())
|
|
58
|
+
throw new Error('The managed worktree path is not a directory.');
|
|
59
|
+
}
|
|
60
|
+
catch (cause) {
|
|
61
|
+
if (cause.code !== 'ENOENT')
|
|
62
|
+
throw cause;
|
|
63
|
+
}
|
|
64
|
+
return new ManagedWorktrees(repoRoot, sourceRoot, worktreesDir, new GitWorktreeDriver({ repoRoot, worktreesDir, logger: cliLogger() }), options);
|
|
65
|
+
}
|
|
66
|
+
export class ManagedWorktrees {
|
|
67
|
+
repoRoot;
|
|
68
|
+
sourceRoot;
|
|
69
|
+
worktreesDir;
|
|
70
|
+
driver;
|
|
71
|
+
options;
|
|
72
|
+
constructor(repoRoot, sourceRoot, worktreesDir, driver, options) {
|
|
73
|
+
this.repoRoot = repoRoot;
|
|
74
|
+
this.sourceRoot = sourceRoot;
|
|
75
|
+
this.worktreesDir = worktreesDir;
|
|
76
|
+
this.driver = driver;
|
|
77
|
+
this.options = options;
|
|
78
|
+
}
|
|
79
|
+
ref(label) {
|
|
80
|
+
const checked = checkedLabel(label);
|
|
81
|
+
return {
|
|
82
|
+
id: generateWorkspaceId(),
|
|
83
|
+
meta: {
|
|
84
|
+
backend: 'git-worktree',
|
|
85
|
+
repoRoot: this.repoRoot,
|
|
86
|
+
branch: `namzu/${checked}`,
|
|
87
|
+
worktreePath: join(this.worktreesDir, checked),
|
|
88
|
+
},
|
|
89
|
+
createdAt: new Date(),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/** Registered Namzu-owned checkouts only; arbitrary folders are omitted. */
|
|
93
|
+
async list() {
|
|
94
|
+
let entries;
|
|
95
|
+
try {
|
|
96
|
+
entries = await readdir(this.worktreesDir, {
|
|
97
|
+
withFileTypes: true,
|
|
98
|
+
encoding: 'utf8',
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
catch (cause) {
|
|
102
|
+
if (cause.code === 'ENOENT')
|
|
103
|
+
return [];
|
|
104
|
+
throw cause;
|
|
105
|
+
}
|
|
106
|
+
const found = [];
|
|
107
|
+
for (const entry of entries) {
|
|
108
|
+
if (!entry.isDirectory())
|
|
109
|
+
continue;
|
|
110
|
+
if (!/^[a-z0-9][a-z0-9-]{0,63}$/.test(entry.name))
|
|
111
|
+
continue;
|
|
112
|
+
try {
|
|
113
|
+
const worktree = await this.inspect(entry.name);
|
|
114
|
+
if (worktree)
|
|
115
|
+
found.push(worktree);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// A directory with tampered ownership is never offered as a target.
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return found.sort((a, b) => a.label.localeCompare(b.label));
|
|
122
|
+
}
|
|
123
|
+
/** An exact label must still pass the SDK driver's ownership and Git registration checks. */
|
|
124
|
+
async inspect(label) {
|
|
125
|
+
const ref = this.ref(label);
|
|
126
|
+
const inspection = await this.driver.inspect(ref);
|
|
127
|
+
return inspection.exists
|
|
128
|
+
? {
|
|
129
|
+
label,
|
|
130
|
+
path: ref.meta.worktreePath,
|
|
131
|
+
branch: ref.meta.branch,
|
|
132
|
+
dirty: inspection.isDirty,
|
|
133
|
+
}
|
|
134
|
+
: null;
|
|
135
|
+
}
|
|
136
|
+
/** Create at the selected checkout's committed HEAD, leaving its dirty files in place. */
|
|
137
|
+
async create(label) {
|
|
138
|
+
const name = checkedLabel(label ?? `work-${randomUUID().slice(0, 8)}`);
|
|
139
|
+
const sourceDirty = (await git(this.sourceRoot, 'status', '--porcelain')).trim().length > 0;
|
|
140
|
+
const head = (await git(this.sourceRoot, 'rev-parse', 'HEAD')).trim();
|
|
141
|
+
await mkdir(this.worktreesDir, { recursive: true, mode: 0o700 });
|
|
142
|
+
// The SDK driver correctly recovers a new checkout after a failing
|
|
143
|
+
// post-checkout hook, but the same evidence describes a pre-existing
|
|
144
|
+
// checkout after `git worktree add` refused a duplicate. Serialize CLI
|
|
145
|
+
// creators and reject that pre-existing case before asking the driver.
|
|
146
|
+
const lockPath = join(this.worktreesDir, `.${name}.creating`);
|
|
147
|
+
try {
|
|
148
|
+
await mkdir(lockPath);
|
|
149
|
+
}
|
|
150
|
+
catch (cause) {
|
|
151
|
+
if (cause.code === 'EEXIST') {
|
|
152
|
+
throw new Error(`Worktree ${name} is already being created. Try another name.`);
|
|
153
|
+
}
|
|
154
|
+
throw cause;
|
|
155
|
+
}
|
|
156
|
+
try {
|
|
157
|
+
if (await this.inspect(name))
|
|
158
|
+
throw new Error(`Worktree ${name} already exists.`);
|
|
159
|
+
const ref = await this.driver.create({ label: name, baseRef: head });
|
|
160
|
+
const inspection = await this.driver.inspect(ref);
|
|
161
|
+
if (!inspection.exists) {
|
|
162
|
+
throw new Error(`Git reported a worktree at ${ref.meta.worktreePath}, but it is not registered.`);
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
label: name,
|
|
166
|
+
path: ref.meta.worktreePath,
|
|
167
|
+
branch: ref.meta.branch,
|
|
168
|
+
dirty: inspection.isDirty,
|
|
169
|
+
sourceDirty,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
finally {
|
|
173
|
+
await rmdir(lockPath);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/** Fork the source checkout's settled conversation into the new checkout's Project. */
|
|
177
|
+
async fork(sourceConversationId, label) {
|
|
178
|
+
const source = await openSessions(this.sourceRoot, this.options);
|
|
179
|
+
try {
|
|
180
|
+
const sourceId = asSessionId(sourceConversationId);
|
|
181
|
+
const messages = await loadResumableConversation(source, sourceId);
|
|
182
|
+
if (messages.length === 0) {
|
|
183
|
+
throw new Error('There is nothing to fork yet — this conversation has no messages.');
|
|
184
|
+
}
|
|
185
|
+
if (await activeConversationTurn(source, sourceId)) {
|
|
186
|
+
throw new Error('Wait for the current turn to finish before forking to a worktree.');
|
|
187
|
+
}
|
|
188
|
+
const created = await this.create(label);
|
|
189
|
+
try {
|
|
190
|
+
const target = await openSessions(created.path, this.options);
|
|
191
|
+
try {
|
|
192
|
+
const forked = await forkConversationInto(source, target, sourceId);
|
|
193
|
+
return {
|
|
194
|
+
...created,
|
|
195
|
+
conversationId: forked.id,
|
|
196
|
+
title: forked.title,
|
|
197
|
+
copied: forked.copied,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
finally {
|
|
201
|
+
closeSessions(target);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
catch (cause) {
|
|
205
|
+
throw new Error(`Worktree ${created.path} was created, but its conversation copy failed: ${cause instanceof Error ? cause.message : String(cause)}. The worktree was kept for inspection.`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
finally {
|
|
209
|
+
closeSessions(source);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/** Resolve an owned checkout and one of its own conversations for a fresh TUI launch. */
|
|
213
|
+
async resume(label, conversationId) {
|
|
214
|
+
const worktree = await this.inspect(label);
|
|
215
|
+
if (!worktree)
|
|
216
|
+
throw new Error(`No managed worktree named ${label} is registered here.`);
|
|
217
|
+
const sessions = await openSessions(worktree.path, this.options);
|
|
218
|
+
try {
|
|
219
|
+
if (conversationId) {
|
|
220
|
+
await loadResumableConversation(sessions, conversationId);
|
|
221
|
+
return { worktree, conversationId };
|
|
222
|
+
}
|
|
223
|
+
const latest = (await listRecent(sessions, 1))[0];
|
|
224
|
+
return latest ? { worktree, conversationId: latest.id, title: latest.title } : { worktree };
|
|
225
|
+
}
|
|
226
|
+
finally {
|
|
227
|
+
closeSessions(sessions);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=managed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managed.js","sourceRoot":"","sources":["../../../src/integrations/worktrees/managed.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* The whole surface is pure: config in, rules out. The gate stays the only
|
|
11
11
|
* thing that decides anything, which is what keeps this testable without a turn.
|
|
12
12
|
*/
|
|
13
|
-
import { type AuthorizationRule } from '@namzu/sdk';
|
|
13
|
+
import { type AuthorizationRule, type Logger } from '@namzu/sdk';
|
|
14
14
|
import { type PermissionChecksConfig } from './checks.js';
|
|
15
15
|
/** What the operator wants to happen when a rule matches. */
|
|
16
16
|
export type PermissionEffect = 'allow' | 'ask' | 'deny';
|
|
@@ -25,6 +25,10 @@ export declare function isPermissionEffect(value: unknown): value is PermissionE
|
|
|
25
25
|
*/
|
|
26
26
|
export type ToolPermission = PermissionEffect | Readonly<Record<string, PermissionEffect>>;
|
|
27
27
|
export type PermissionsConfig = Readonly<Record<string, ToolPermission>>;
|
|
28
|
+
/** Exact tool rules written for the CLI's former MCP naming scheme. */
|
|
29
|
+
export declare function legacyMcpPermissionNames(config: PermissionsConfig | undefined): readonly string[];
|
|
30
|
+
/** Say the migration warning once per name and process, including resident steps. */
|
|
31
|
+
export declare function warnLegacyMcpPermissionNames(config: PermissionsConfig | undefined, log?: Pick<Logger, 'warn'>): void;
|
|
28
32
|
export interface CompileDiagnostic {
|
|
29
33
|
readonly tool: string;
|
|
30
34
|
readonly pattern?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/permissions/rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/permissions/rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAGN,KAAK,iBAAiB,EACtB,KAAK,MAAM,EAIX,MAAM,YAAY,CAAA;AAGnB,OAAO,EAAE,KAAK,sBAAsB,EAA0B,MAAM,aAAa,CAAA;AAEjF,6DAA6D;AAC7D,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAA;AAIvD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gBAAgB,CAE5E;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAA;AAE1F,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAA;AAExE,uEAAuE;AACvE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,iBAAiB,GAAG,SAAS,GAAG,SAAS,MAAM,EAAE,CAEjG;AAID,qFAAqF;AACrF,wBAAgB,4BAA4B,CAC3C,MAAM,EAAE,iBAAiB,GAAG,SAAS,EACrC,GAAG,GAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAe,GACrC,IAAI,CAWN;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,KAAK,EAAE,SAAS,iBAAiB,EAAE,CAAA;IAC5C;;;;;;;OAOG;IACH,QAAQ,CAAC,WAAW,EAAE,SAAS,iBAAiB,EAAE,CAAA;CAClD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAI7D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgEG;AACH,wBAAgB,iBAAiB,CAChC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,OAAO,GAAG,MAAe,GACjC,MAAM,CASR;AA+CD,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAKtE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAU1D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CACjC,MAAM,EAAE,iBAAiB,GAAG,SAAS,EACrC,MAAM,CAAC,EAAE,sBAAsB,GAC7B,mBAAmB,CAsJrB"}
|
|
@@ -10,12 +10,29 @@
|
|
|
10
10
|
* The whole surface is pure: config in, rules out. The gate stays the only
|
|
11
11
|
* thing that decides anything, which is what keeps this testable without a turn.
|
|
12
12
|
*/
|
|
13
|
-
import { builtinCommandArguments, permissionPatternToRegExpSource, } from '@namzu/sdk';
|
|
13
|
+
import { AuthorizationGate, NOOP_LOGGER, builtinCommandArguments, permissionPatternToRegExpSource, } from '@namzu/sdk';
|
|
14
|
+
import { cliLogger } from '../logging.js';
|
|
14
15
|
import { verifyPermissionChecks } from './checks.js';
|
|
15
16
|
const EFFECTS = new Set(['allow', 'ask', 'deny']);
|
|
16
17
|
export function isPermissionEffect(value) {
|
|
17
18
|
return typeof value === 'string' && EFFECTS.has(value);
|
|
18
19
|
}
|
|
20
|
+
/** Exact tool rules written for the CLI's former MCP naming scheme. */
|
|
21
|
+
export function legacyMcpPermissionNames(config) {
|
|
22
|
+
return Object.keys(config ?? {}).filter((name) => /^mcp_(?!_)[^_]+_.+/.test(name));
|
|
23
|
+
}
|
|
24
|
+
const warnedLegacyMcpNames = new Set();
|
|
25
|
+
/** Say the migration warning once per name and process, including resident steps. */
|
|
26
|
+
export function warnLegacyMcpPermissionNames(config, log = cliLogger()) {
|
|
27
|
+
for (const name of legacyMcpPermissionNames(config)) {
|
|
28
|
+
if (warnedLegacyMcpNames.has(name))
|
|
29
|
+
continue;
|
|
30
|
+
warnedLegacyMcpNames.add(name);
|
|
31
|
+
log.warn('Former MCP permission name does not match the current mcp__<server>__<tool> naming scheme', {
|
|
32
|
+
'namzu.permission.tool_name': name,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
19
36
|
/**
|
|
20
37
|
* Turn a glob-ish pattern into an anchored regex source.
|
|
21
38
|
*
|
|
@@ -187,6 +204,9 @@ export function bySpecificity(a, b) {
|
|
|
187
204
|
*/
|
|
188
205
|
export function compilePermissions(config, checks) {
|
|
189
206
|
const rules = [];
|
|
207
|
+
const sourceDenials = [];
|
|
208
|
+
const sourceReviews = [];
|
|
209
|
+
const sourceAllowances = [];
|
|
190
210
|
const diagnostics = [];
|
|
191
211
|
// Checks still run against an empty table. "This command is asked about"
|
|
192
212
|
// is a claim worth holding when there is no config at all, and returning
|
|
@@ -198,6 +218,39 @@ export function compilePermissions(config, checks) {
|
|
|
198
218
|
// compiler by changing itself.
|
|
199
219
|
const commandArguments = builtinCommandArguments();
|
|
200
220
|
for (const [tool, permission] of Object.entries(config)) {
|
|
221
|
+
if (tool === 'sources') {
|
|
222
|
+
if (typeof permission !== 'object' || permission === null || Array.isArray(permission)) {
|
|
223
|
+
diagnostics.push({ tool, message: 'expected a table of source id globs and effects' });
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
for (const source of Object.keys(permission).sort(bySpecificity)) {
|
|
227
|
+
const effect = permission[source];
|
|
228
|
+
if (!source) {
|
|
229
|
+
diagnostics.push({ tool, pattern: source, message: 'source id glob must not be empty' });
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
if (!isPermissionEffect(effect)) {
|
|
233
|
+
diagnostics.push({
|
|
234
|
+
tool,
|
|
235
|
+
pattern: source,
|
|
236
|
+
message: `expected "allow", "ask" or "deny"; got ${JSON.stringify(effect)}`,
|
|
237
|
+
});
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
const rule = {
|
|
241
|
+
type: 'by_source',
|
|
242
|
+
sources: [source],
|
|
243
|
+
decision: effect === 'ask' ? 'review' : effect,
|
|
244
|
+
};
|
|
245
|
+
if (effect === 'allow')
|
|
246
|
+
sourceAllowances.push(rule);
|
|
247
|
+
else if (effect === 'deny')
|
|
248
|
+
sourceDenials.push(rule);
|
|
249
|
+
else
|
|
250
|
+
sourceReviews.push(rule);
|
|
251
|
+
}
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
201
254
|
if (isPermissionEffect(permission)) {
|
|
202
255
|
if (permission === 'allow')
|
|
203
256
|
rules.push({ type: 'allow_by_name', toolNames: [tool] });
|
|
@@ -270,7 +323,36 @@ export function compilePermissions(config, checks) {
|
|
|
270
323
|
// After compiling, never during: a check is a claim about the FINISHED
|
|
271
324
|
// table, and evaluating one against a half-built rule list would answer
|
|
272
325
|
// with whatever order the config happened to be written in.
|
|
273
|
-
|
|
274
|
-
|
|
326
|
+
// A source question must not turn a tool-specific refusal into an approvable
|
|
327
|
+
// call. Check the tool table in its own specificity order before asking by
|
|
328
|
+
// source; only a tool-table denial is lifted ahead of source review. A
|
|
329
|
+
// specific tool allowance can still outrank a broader tool-table denial,
|
|
330
|
+
// but the source review will ask about that call as the operator requested.
|
|
331
|
+
const toolDenialBeforeSourceReview = [];
|
|
332
|
+
if (sourceReviews.length > 0 && rules.length > 0) {
|
|
333
|
+
const toolGate = new AuthorizationGate({
|
|
334
|
+
enabled: true,
|
|
335
|
+
rules: [...rules],
|
|
336
|
+
allowReadOnlyTools: false,
|
|
337
|
+
denyDangerousPatterns: false,
|
|
338
|
+
logDecisions: false,
|
|
339
|
+
}, NOOP_LOGGER);
|
|
340
|
+
const toolDecision = (call) => toolGate.evaluate(call);
|
|
341
|
+
toolDenialBeforeSourceReview.push({
|
|
342
|
+
type: 'predicate',
|
|
343
|
+
description: 'denied by a tool-specific permission rule',
|
|
344
|
+
decide: (call) => (toolDecision(call).decision === 'deny' ? 'deny' : null),
|
|
345
|
+
describe: (call) => toolDecision(call).reason,
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
const orderedRules = [
|
|
349
|
+
...sourceDenials,
|
|
350
|
+
...toolDenialBeforeSourceReview,
|
|
351
|
+
...sourceReviews,
|
|
352
|
+
...rules,
|
|
353
|
+
...sourceAllowances,
|
|
354
|
+
];
|
|
355
|
+
diagnostics.push(...verifyPermissionChecks(orderedRules, checks));
|
|
356
|
+
return { rules: orderedRules, diagnostics };
|
|
275
357
|
}
|
|
276
358
|
//# sourceMappingURL=rules.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/permissions/rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/permissions/rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACN,iBAAiB,EAIjB,WAAW,EACX,uBAAuB,EACvB,+BAA+B,GAC/B,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACzC,OAAO,EAA+B,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAKjF,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;AAEzD,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;AACvD,CAAC;AAcD,uEAAuE;AACvE,MAAM,UAAU,wBAAwB,CAAC,MAAqC;IAC7E,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;AACnF,CAAC;AAED,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAA;AAE9C,qFAAqF;AACrF,MAAM,UAAU,4BAA4B,CAC3C,MAAqC,EACrC,MAA4B,SAAS,EAAE;IAEvC,KAAK,MAAM,IAAI,IAAI,wBAAwB,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,IAAI,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAQ;QAC5C,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC9B,GAAG,CAAC,IAAI,CACP,2FAA2F,EAC3F;YACC,4BAA4B,EAAE,IAAI;SAClC,CACD,CAAA;IACF,CAAC;AACF,CAAC;AAqBD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACpD,yEAAyE;IACzE,+CAA+C;IAC/C,OAAO,+BAA+B,CAAC,OAAO,CAAC,CAAA;AAChD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgEG;AACH,MAAM,UAAU,iBAAiB,CAChC,IAAY,EACZ,OAAe,EACf,WAA6B,MAAM;IAEnC,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IACnC,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAC3D,wEAAwE;IACxE,yEAAyE;IACzE,wEAAwE;IACxE,qEAAqE;IACrE,MAAM,aAAa,GAAG,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,EAAE,CAAA;IAChF,OAAO,aAAa,CAAC,CAAC,CAAC,IAAI,QAAQ,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,QAAQ,MAAM,OAAO,KAAK,CAAA;AACxF,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAS,WAAW,CACnB,IAAY,EACZ,QAAgB,EAChB,OAAe,EACf,QAA0B;IAE1B,sEAAsE;IACtE,2EAA2E;IAC3E,2EAA2E;IAC3E,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;QACxC,OAAO,QAAQ,KAAK,OAAO;YAC1B,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE;YAC9C,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,CAAA;IAC/C,CAAC;IACD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAA;IAC/C,OAAO;QACN,IAAI,EAAE,kBAAkB;QACxB,SAAS,EAAE,CAAC,IAAI,CAAC;QACjB,QAAQ;QACR,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChE,QAAQ;KACR,CAAA;AACF,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IAClC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA;AACpD,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,OAAe;IAC5D,iEAAiE;IACjE,sDAAsD;IACtD,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAA;IACvD,OAAO,IAAI,MAAM,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;AAC3F,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAAC,CAAS,EAAE,CAAS;IACjD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,CAAC,CAAA;IACpC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,CAAC,CAAC,CAAA;IACrC,MAAM,OAAO,GAAG,CAAC,CAAS,EAAU,EAAE;QACrC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAC7B,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;IACrC,CAAC,CAAA;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IACpC,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAC3B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAClC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CACjC,MAAqC,EACrC,MAA+B;IAE/B,MAAM,KAAK,GAAwB,EAAE,CAAA;IACrC,MAAM,aAAa,GAAwB,EAAE,CAAA;IAC7C,MAAM,aAAa,GAAwB,EAAE,CAAA;IAC7C,MAAM,gBAAgB,GAAwB,EAAE,CAAA;IAChD,MAAM,WAAW,GAAwB,EAAE,CAAA;IAC3C,yEAAyE;IACzE,yEAAyE;IACzE,6DAA6D;IAC7D,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAA;IAEjF,2EAA2E;IAC3E,0EAA0E;IAC1E,+BAA+B;IAC/B,MAAM,gBAAgB,GAAG,uBAAuB,EAAE,CAAA;IAElD,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACzD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBACxF,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,iDAAiD,EAAE,CAAC,CAAA;gBACtF,SAAQ;YACT,CAAC;YACD,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;gBAClE,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;gBACjC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACb,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC,CAAA;oBACxF,SAAQ;gBACT,CAAC;gBACD,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;oBACjC,WAAW,CAAC,IAAI,CAAC;wBAChB,IAAI;wBACJ,OAAO,EAAE,MAAM;wBACf,OAAO,EAAE,0CAA0C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;qBAC3E,CAAC,CAAA;oBACF,SAAQ;gBACT,CAAC;gBACD,MAAM,IAAI,GAAsB;oBAC/B,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,CAAC,MAAM,CAAC;oBACjB,QAAQ,EAAE,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;iBAC9C,CAAA;gBACD,IAAI,MAAM,KAAK,OAAO;oBAAE,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;qBAC9C,IAAI,MAAM,KAAK,MAAM;oBAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;;oBAC/C,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC9B,CAAC;YACD,SAAQ;QACT,CAAC;QACD,IAAI,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;YACpC,IAAI,UAAU,KAAK,OAAO;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACpF,IAAI,UAAU,KAAK,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAClF,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;gBAC1B,KAAK,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG;oBAClC,MAAM,EAAE,MAAM;oBACd,QAAQ,EAAE,QAAQ;iBAClB,CAAC,CAAA;YACH,CAAC;YACD,SAAQ;QACT,CAAC;QACD,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YAC3D,WAAW,CAAC,IAAI,CAAC;gBAChB,IAAI;gBACJ,OAAO,EAAE,gEAAgE,OAAO,UAAU,EAAE;aAC5F,CAAC,CAAA;YACF,SAAQ;QACT,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YACnE,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YAClC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjC,WAAW,CAAC,IAAI,CAAC;oBAChB,IAAI;oBACJ,OAAO;oBACP,OAAO,EAAE,0CAA0C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;iBAC3E,CAAC,CAAA;gBACF,SAAQ;YACT,CAAC;YACD,IAAI,CAAC;gBACJ,IAAI,MAAM,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAA;YAC3C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,WAAW,CAAC,IAAI,CAAC;oBAChB,IAAI;oBACJ,OAAO;oBACP,OAAO,EAAE,0BAA0B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;iBACrF,CAAC,CAAA;gBACF,SAAQ;YACT,CAAC;YACD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBACtB,KAAK,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC;oBACzC,MAAM,EAAE,MAAM;oBACd,QAAQ,EAAE,QAAQ;iBAClB,CAAC,CAAA;gBACF,SAAQ;YACT,CAAC;YACD,mEAAmE;YACnE,8DAA8D;YAC9D,mEAAmE;YACnE,+DAA+D;YAC/D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAC3C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC5B,KAAK,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC;oBACjD,MAAM,EAAE,MAAM;oBACd,QAAQ,EAAE,MAAM;iBAChB,CAAC,CAAA;gBACF,SAAQ;YACT,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;QACzD,CAAC;IACF,CAAC;IACD,uEAAuE;IACvE,wEAAwE;IACxE,4DAA4D;IAC5D,6EAA6E;IAC7E,2EAA2E;IAC3E,uEAAuE;IACvE,yEAAyE;IACzE,4EAA4E;IAC5E,MAAM,4BAA4B,GAAwB,EAAE,CAAA;IAC5D,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CACrC;YACC,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC;YACjB,kBAAkB,EAAE,KAAK;YACzB,qBAAqB,EAAE,KAAK;YAC5B,YAAY,EAAE,KAAK;SACnB,EACD,WAAW,CACX,CAAA;QACD,MAAM,YAAY,GAAG,CAAC,IAAgC,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAClF,4BAA4B,CAAC,IAAI,CAAC;YACjC,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,2CAA2C;YACxD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YAC1E,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM;SAC7C,CAAC,CAAA;IACH,CAAC;IACD,MAAM,YAAY,GAAG;QACpB,GAAG,aAAa;QAChB,GAAG,4BAA4B;QAC/B,GAAG,aAAa;QAChB,GAAG,KAAK;QACR,GAAG,gBAAgB;KACnB,CAAA;IACD,WAAW,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAA;IACjE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,CAAA;AAC5C,CAAC"}
|
package/dist/schedule/build.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ import { type ScheduleSpec } from '@namzu/sdk';
|
|
|
20
20
|
import type { NamzuCliConfig } from '../config/schema.js';
|
|
21
21
|
import type { SchedulePaths } from './paths.js';
|
|
22
22
|
import { type CompiledJobPolicy, type PermissionInput } from './policy.js';
|
|
23
|
-
import type { ConfirmationSurface, ScheduleBudget, ScheduleJob } from './types.js';
|
|
23
|
+
import type { ConfirmationSurface, ScheduleBudget, ScheduleJob, ScheduleRunKind } from './types.js';
|
|
24
24
|
export declare const DEFAULT_TOKEN_BUDGET = 500000;
|
|
25
25
|
export declare const DEFAULT_TIMEOUT_MS: number;
|
|
26
26
|
export declare const DEFAULT_MAX_ITERATIONS = 50;
|
|
@@ -32,8 +32,13 @@ export declare const DEFAULT_WAIT_FOR_PROVIDER_MS: number;
|
|
|
32
32
|
export declare const DEFAULT_APPROVAL_TTL_MS: number;
|
|
33
33
|
export declare const DEFAULT_KEEP_SESSIONS = 20;
|
|
34
34
|
export declare const DEFAULT_PAUSE_AFTER_FAILURES = 5;
|
|
35
|
+
/** Separate from `budget.timeoutMs`, which governs the agent phase, not the script. */
|
|
36
|
+
export declare const DEFAULT_SCRIPT_TIMEOUT_MS: number;
|
|
37
|
+
/** Q4's number: a paragraph of "what changed", independent of the notification's own cap. */
|
|
38
|
+
export declare const DEFAULT_WAKE_GATE_CONTEXT_CHARS = 4000;
|
|
35
39
|
export interface JobRequest {
|
|
36
40
|
readonly name: string;
|
|
41
|
+
/** Unused (kept empty) for a pure `script` job; the agent's instruction otherwise. */
|
|
37
42
|
readonly prompt: string;
|
|
38
43
|
readonly when: string;
|
|
39
44
|
/** A spec already parsed (an edit that keeps its schedule); `when` is then ignored. */
|
|
@@ -52,12 +57,24 @@ export interface JobRequest {
|
|
|
52
57
|
readonly createdBy: ScheduleJob['createdBy'];
|
|
53
58
|
/** Only the CLI's `--allow-unattended-host` sets this. */
|
|
54
59
|
readonly allowUnattendedHost?: boolean;
|
|
60
|
+
/** Absent: `'agent'`, unchanged from before this field existed. */
|
|
61
|
+
readonly runKind?: ScheduleRunKind;
|
|
62
|
+
/** Required when `runKind` is `'script'` or `'script+agent'` (the wake-gate). */
|
|
63
|
+
readonly script?: {
|
|
64
|
+
readonly body: string;
|
|
65
|
+
readonly shell: 'bash' | 'sh';
|
|
66
|
+
readonly timeoutMs?: number;
|
|
67
|
+
};
|
|
68
|
+
/** `runKind: 'script+agent'` only. */
|
|
69
|
+
readonly wakeGate?: {
|
|
70
|
+
readonly maxContextChars?: number;
|
|
71
|
+
};
|
|
55
72
|
}
|
|
56
73
|
export declare class JobRequestError extends Error {
|
|
57
74
|
readonly name = "JobRequestError";
|
|
58
75
|
}
|
|
59
76
|
/** The model a job pins: `provider[/model]`, or the configured primary. */
|
|
60
|
-
export declare function resolveJobModel(spec: string | undefined, home?: string): ScheduleJob['model']
|
|
77
|
+
export declare function resolveJobModel(spec: string | undefined, home?: string): NonNullable<ScheduleJob['model']>;
|
|
61
78
|
export declare function buildJob(request: JobRequest, context: {
|
|
62
79
|
readonly paths: SchedulePaths;
|
|
63
80
|
readonly config: Pick<NamzuCliConfig, 'limits'>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/schedule/build.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAEN,KAAK,YAAY,
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/schedule/build.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAEN,KAAK,YAAY,EASjB,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAOzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EACN,KAAK,iBAAiB,EACtB,KAAK,eAAe,EAGpB,MAAM,aAAa,CAAA;AAIpB,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAGnG,eAAO,MAAM,oBAAoB,SAAU,CAAA;AAC3C,eAAO,MAAM,kBAAkB,QAAc,CAAA;AAC7C,eAAO,MAAM,sBAAsB,KAAK,CAAA;AACxC,oFAAoF;AACpF,eAAO,MAAM,cAAc,KAAK,CAAA;AAChC,8FAA8F;AAC9F,eAAO,MAAM,UAAU,QAAS,CAAA;AAChC,eAAO,MAAM,4BAA4B,QAAc,CAAA;AACvD,eAAO,MAAM,uBAAuB,QAAuB,CAAA;AAC3D,eAAO,MAAM,qBAAqB,KAAK,CAAA;AACvC,eAAO,MAAM,4BAA4B,IAAI,CAAA;AAC7C,uFAAuF;AACvF,eAAO,MAAM,yBAAyB,QAAa,CAAA;AACnD,6FAA6F;AAC7F,eAAO,MAAM,+BAA+B,OAAQ,CAAA;AAEpD,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,sFAAsF;IACtF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,uFAAuF;IACvF,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,CAAA;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAA;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IACzC,iFAAiF;IACjF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IACpC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,WAAW,CAAC,CAAA;IAC5C,0DAA0D;IAC1D,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAA;IACtC,mEAAmE;IACnE,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,CAAA;IAClC,iFAAiF;IACjF,QAAQ,CAAC,MAAM,CAAC,EAAE;QACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;QACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;QAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAC3B,CAAA;IACD,sCAAsC;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACzD;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACzC,SAAkB,IAAI,qBAAoB;CAC1C;AASD,2EAA2E;AAC3E,wBAAgB,eAAe,CAC9B,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,IAAI,CAAC,EAAE,MAAM,GACX,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAyBnC;AAED,wBAAgB,QAAQ,CACvB,OAAO,EAAE,UAAU,EACnB,OAAO,EAAE;IACR,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAA;IAC7B,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAA;IAC/C,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAA;IAClB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACxB,GACC,WAAW,CA0Lb;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACzB,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,mBAAmB,EAC5B,GAAG,EAAE,IAAI,EACT,OAAO,GAAE;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACzC,WAAW,CAmBb;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,GAAG,WAAW,CAoBjF;AAED,4FAA4F;AAC5F,wBAAgB,UAAU,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,IAAI,GAAG,MAAM,CAUhE;AASD,4GAA4G;AAC5G,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,iBAAiB,EAAE,GAAG,EAAE,IAAI,GAAG,MAAM,EAAE,CA+D7F"}
|