@namzu/cli 29.0.0 → 29.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/CHANGELOG.md +146 -0
- package/README.md +20 -0
- package/dist/browser/commands.d.ts +29 -0
- package/dist/browser/commands.d.ts.map +1 -0
- package/dist/browser/commands.js +361 -0
- package/dist/browser/commands.js.map +1 -0
- package/dist/browser/control.d.ts +79 -0
- package/dist/browser/control.d.ts.map +1 -0
- package/dist/browser/control.js +140 -0
- package/dist/browser/control.js.map +1 -0
- package/dist/browser/describe.d.ts +12 -0
- package/dist/browser/describe.d.ts.map +1 -0
- package/dist/browser/describe.js +27 -0
- package/dist/browser/describe.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +29 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/acp.d.ts.map +1 -1
- package/dist/commands/acp.js +1 -0
- package/dist/commands/acp.js.map +1 -1
- package/dist/commands/browser.d.ts +7 -0
- package/dist/commands/browser.d.ts.map +1 -0
- package/dist/commands/browser.js +16 -0
- package/dist/commands/browser.js.map +1 -0
- package/dist/commands/drain.d.ts +2 -1
- package/dist/commands/drain.d.ts.map +1 -1
- package/dist/commands/drain.js +6 -3
- package/dist/commands/drain.js.map +1 -1
- package/dist/commands/exec-flags.d.ts +2 -1
- package/dist/commands/exec-flags.d.ts.map +1 -1
- package/dist/commands/exec-flags.js +6 -3
- package/dist/commands/exec-flags.js.map +1 -1
- package/dist/commands/exec-json.d.ts.map +1 -1
- package/dist/commands/exec-json.js +2 -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/host-queries.d.ts.map +1 -1
- package/dist/commands/host-queries.js +10 -3
- package/dist/commands/host-queries.js.map +1 -1
- package/dist/commands/schedule.d.ts +9 -0
- package/dist/commands/schedule.d.ts.map +1 -0
- package/dist/commands/schedule.js +126 -0
- package/dist/commands/schedule.js.map +1 -0
- package/dist/commands/serve.d.ts +3 -1
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +5 -3
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/skills.d.ts +10 -0
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/skills.js +23 -7
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/upgrade.d.ts +5 -0
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +11 -0
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/config/load.d.ts +39 -0
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +232 -1
- package/dist/config/load.js.map +1 -1
- package/dist/config/schema.d.ts +78 -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 +23 -0
- package/dist/config/user-config.d.ts.map +1 -0
- package/dist/config/user-config.js +48 -0
- package/dist/config/user-config.js.map +1 -0
- package/dist/context/capabilities.d.ts +1 -1
- package/dist/context/capabilities.d.ts.map +1 -1
- package/dist/context/capabilities.js +1 -0
- package/dist/context/capabilities.js.map +1 -1
- package/dist/doctor/checks/browser.d.ts +15 -0
- package/dist/doctor/checks/browser.d.ts.map +1 -0
- package/dist/doctor/checks/browser.js +63 -0
- package/dist/doctor/checks/browser.js.map +1 -0
- package/dist/doctor/checks/index.d.ts +4 -1
- package/dist/doctor/checks/index.d.ts.map +1 -1
- package/dist/doctor/checks/index.js +8 -1
- package/dist/doctor/checks/index.js.map +1 -1
- package/dist/doctor/checks/scheduler.d.ts +10 -0
- package/dist/doctor/checks/scheduler.d.ts.map +1 -0
- package/dist/doctor/checks/scheduler.js +74 -0
- package/dist/doctor/checks/scheduler.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/integrations/notifications/desktop/freedesktop.d.ts +10 -0
- package/dist/integrations/notifications/desktop/freedesktop.d.ts.map +1 -0
- package/dist/integrations/notifications/desktop/freedesktop.js +33 -0
- package/dist/integrations/notifications/desktop/freedesktop.js.map +1 -0
- package/dist/integrations/notifications/desktop/macos.d.ts +6 -0
- package/dist/integrations/notifications/desktop/macos.d.ts.map +1 -0
- package/dist/integrations/notifications/desktop/macos.js +17 -0
- package/dist/integrations/notifications/desktop/macos.js.map +1 -0
- package/dist/integrations/notifications/desktop/sanitize.d.ts +16 -0
- package/dist/integrations/notifications/desktop/sanitize.d.ts.map +1 -0
- package/dist/integrations/notifications/desktop/sanitize.js +49 -0
- package/dist/integrations/notifications/desktop/sanitize.js.map +1 -0
- package/dist/integrations/notifications/desktop/throttle.d.ts +10 -0
- package/dist/integrations/notifications/desktop/throttle.d.ts.map +1 -0
- package/dist/integrations/notifications/desktop/throttle.js +39 -0
- package/dist/integrations/notifications/desktop/throttle.js.map +1 -0
- package/dist/integrations/notifications/desktop/windows-toast.d.ts +23 -0
- package/dist/integrations/notifications/desktop/windows-toast.d.ts.map +1 -0
- package/dist/integrations/notifications/desktop/windows-toast.js +56 -0
- package/dist/integrations/notifications/desktop/windows-toast.js.map +1 -0
- package/dist/integrations/notifications/desktop.d.ts +82 -0
- package/dist/integrations/notifications/desktop.d.ts.map +1 -0
- package/dist/integrations/notifications/desktop.js +198 -0
- package/dist/integrations/notifications/desktop.js.map +1 -0
- package/dist/integrations/resident/session-step.d.ts.map +1 -1
- package/dist/integrations/resident/session-step.js +1 -0
- package/dist/integrations/resident/session-step.js.map +1 -1
- package/dist/integrations/subagents/runtime.d.ts +6 -0
- package/dist/integrations/subagents/runtime.d.ts.map +1 -1
- package/dist/integrations/subagents/runtime.js +14 -5
- package/dist/integrations/subagents/runtime.js.map +1 -1
- package/dist/permissions/browser-sites.d.ts +95 -0
- package/dist/permissions/browser-sites.d.ts.map +1 -0
- package/dist/permissions/browser-sites.js +270 -0
- package/dist/permissions/browser-sites.js.map +1 -0
- package/dist/permissions/checks.d.ts.map +1 -1
- package/dist/permissions/checks.js +7 -1
- package/dist/permissions/checks.js.map +1 -1
- package/dist/permissions/rules.d.ts.map +1 -1
- package/dist/permissions/rules.js +4 -8
- package/dist/permissions/rules.js.map +1 -1
- package/dist/schedule/build.d.ts +79 -0
- package/dist/schedule/build.d.ts.map +1 -0
- package/dist/schedule/build.js +246 -0
- package/dist/schedule/build.js.map +1 -0
- package/dist/schedule/changes.d.ts +22 -0
- package/dist/schedule/changes.d.ts.map +1 -0
- package/dist/schedule/changes.js +55 -0
- package/dist/schedule/changes.js.map +1 -0
- package/dist/schedule/commands/add.d.ts +24 -0
- package/dist/schedule/commands/add.d.ts.map +1 -0
- package/dist/schedule/commands/add.js +459 -0
- package/dist/schedule/commands/add.js.map +1 -0
- package/dist/schedule/commands/args.d.ts +22 -0
- package/dist/schedule/commands/args.d.ts.map +1 -0
- package/dist/schedule/commands/args.js +80 -0
- package/dist/schedule/commands/args.js.map +1 -0
- package/dist/schedule/commands/confirm-prompt.d.ts +6 -0
- package/dist/schedule/commands/confirm-prompt.d.ts.map +1 -0
- package/dist/schedule/commands/confirm-prompt.js +21 -0
- package/dist/schedule/commands/confirm-prompt.js.map +1 -0
- package/dist/schedule/commands/lifecycle.d.ts +39 -0
- package/dist/schedule/commands/lifecycle.d.ts.map +1 -0
- package/dist/schedule/commands/lifecycle.js +585 -0
- package/dist/schedule/commands/lifecycle.js.map +1 -0
- package/dist/schedule/commands/list.d.ts +33 -0
- package/dist/schedule/commands/list.d.ts.map +1 -0
- package/dist/schedule/commands/list.js +202 -0
- package/dist/schedule/commands/list.js.map +1 -0
- package/dist/schedule/commands/logs.d.ts +7 -0
- package/dist/schedule/commands/logs.d.ts.map +1 -0
- package/dist/schedule/commands/logs.js +106 -0
- package/dist/schedule/commands/logs.js.map +1 -0
- package/dist/schedule/commands/service.d.ts +16 -0
- package/dist/schedule/commands/service.d.ts.map +1 -0
- package/dist/schedule/commands/service.js +458 -0
- package/dist/schedule/commands/service.js.map +1 -0
- package/dist/schedule/daemon/daemon.d.ts +156 -0
- package/dist/schedule/daemon/daemon.d.ts.map +1 -0
- package/dist/schedule/daemon/daemon.js +1248 -0
- package/dist/schedule/daemon/daemon.js.map +1 -0
- package/dist/schedule/daemon/endpoint.d.ts +38 -0
- package/dist/schedule/daemon/endpoint.d.ts.map +1 -0
- package/dist/schedule/daemon/endpoint.js +158 -0
- package/dist/schedule/daemon/endpoint.js.map +1 -0
- package/dist/schedule/daemon/exit.d.ts +8 -0
- package/dist/schedule/daemon/exit.d.ts.map +1 -0
- package/dist/schedule/daemon/exit.js +8 -0
- package/dist/schedule/daemon/exit.js.map +1 -0
- package/dist/schedule/daemon/log.d.ts +12 -0
- package/dist/schedule/daemon/log.d.ts.map +1 -0
- package/dist/schedule/daemon/log.js +53 -0
- package/dist/schedule/daemon/log.js.map +1 -0
- package/dist/schedule/daemon/notify.d.ts +31 -0
- package/dist/schedule/daemon/notify.d.ts.map +1 -0
- package/dist/schedule/daemon/notify.js +89 -0
- package/dist/schedule/daemon/notify.js.map +1 -0
- package/dist/schedule/daemon/retention.d.ts +16 -0
- package/dist/schedule/daemon/retention.d.ts.map +1 -0
- package/dist/schedule/daemon/retention.js +46 -0
- package/dist/schedule/daemon/retention.js.map +1 -0
- package/dist/schedule/daemon/sessions.d.ts +23 -0
- package/dist/schedule/daemon/sessions.d.ts.map +1 -0
- package/dist/schedule/daemon/sessions.js +52 -0
- package/dist/schedule/daemon/sessions.js.map +1 -0
- package/dist/schedule/env.d.ts +28 -0
- package/dist/schedule/env.d.ts.map +1 -0
- package/dist/schedule/env.js +99 -0
- package/dist/schedule/env.js.map +1 -0
- package/dist/schedule/fire/browser-preflight.d.ts +41 -0
- package/dist/schedule/fire/browser-preflight.d.ts.map +1 -0
- package/dist/schedule/fire/browser-preflight.js +73 -0
- package/dist/schedule/fire/browser-preflight.js.map +1 -0
- package/dist/schedule/fire/fire.d.ts +78 -0
- package/dist/schedule/fire/fire.d.ts.map +1 -0
- package/dist/schedule/fire/fire.js +482 -0
- package/dist/schedule/fire/fire.js.map +1 -0
- package/dist/schedule/fire/result.d.ts +13 -0
- package/dist/schedule/fire/result.d.ts.map +1 -0
- package/dist/schedule/fire/result.js +18 -0
- package/dist/schedule/fire/result.js.map +1 -0
- package/dist/schedule/fire/unattended-note.d.ts +22 -0
- package/dist/schedule/fire/unattended-note.d.ts.map +1 -0
- package/dist/schedule/fire/unattended-note.js +46 -0
- package/dist/schedule/fire/unattended-note.js.map +1 -0
- package/dist/schedule/floor.d.ts +116 -0
- package/dist/schedule/floor.d.ts.map +1 -0
- package/dist/schedule/floor.js +1051 -0
- package/dist/schedule/floor.js.map +1 -0
- package/dist/schedule/folder.d.ts +34 -0
- package/dist/schedule/folder.d.ts.map +1 -0
- package/dist/schedule/folder.js +84 -0
- package/dist/schedule/folder.js.map +1 -0
- package/dist/schedule/paths.d.ts +49 -0
- package/dist/schedule/paths.d.ts.map +1 -0
- package/dist/schedule/paths.js +53 -0
- package/dist/schedule/paths.js.map +1 -0
- package/dist/schedule/policy.d.ts +141 -0
- package/dist/schedule/policy.d.ts.map +1 -0
- package/dist/schedule/policy.js +378 -0
- package/dist/schedule/policy.js.map +1 -0
- package/dist/schedule/resume-command.d.ts +36 -0
- package/dist/schedule/resume-command.d.ts.map +1 -0
- package/dist/schedule/resume-command.js +72 -0
- package/dist/schedule/resume-command.js.map +1 -0
- package/dist/schedule/service/detect.d.ts +22 -0
- package/dist/schedule/service/detect.d.ts.map +1 -0
- package/dist/schedule/service/detect.js +29 -0
- package/dist/schedule/service/detect.js.map +1 -0
- package/dist/schedule/service/index.d.ts +48 -0
- package/dist/schedule/service/index.d.ts.map +1 -0
- package/dist/schedule/service/index.js +352 -0
- package/dist/schedule/service/index.js.map +1 -0
- package/dist/schedule/service/launchd.d.ts +24 -0
- package/dist/schedule/service/launchd.d.ts.map +1 -0
- package/dist/schedule/service/launchd.js +84 -0
- package/dist/schedule/service/launchd.js.map +1 -0
- package/dist/schedule/service/manifest.d.ts +44 -0
- package/dist/schedule/service/manifest.d.ts.map +1 -0
- package/dist/schedule/service/manifest.js +16 -0
- package/dist/schedule/service/manifest.js.map +1 -0
- package/dist/schedule/service/names.d.ts +9 -0
- package/dist/schedule/service/names.d.ts.map +1 -0
- package/dist/schedule/service/names.js +22 -0
- package/dist/schedule/service/names.js.map +1 -0
- package/dist/schedule/service/quote.d.ts +24 -0
- package/dist/schedule/service/quote.d.ts.map +1 -0
- package/dist/schedule/service/quote.js +64 -0
- package/dist/schedule/service/quote.js.map +1 -0
- package/dist/schedule/service/runner.d.ts +17 -0
- package/dist/schedule/service/runner.d.ts.map +1 -0
- package/dist/schedule/service/runner.js +31 -0
- package/dist/schedule/service/runner.js.map +1 -0
- package/dist/schedule/service/systemd.d.ts +37 -0
- package/dist/schedule/service/systemd.d.ts.map +1 -0
- package/dist/schedule/service/systemd.js +96 -0
- package/dist/schedule/service/systemd.js.map +1 -0
- package/dist/schedule/service/windows-task.d.ts +51 -0
- package/dist/schedule/service/windows-task.d.ts.map +1 -0
- package/dist/schedule/service/windows-task.js +134 -0
- package/dist/schedule/service/windows-task.js.map +1 -0
- package/dist/schedule/service/wsl.d.ts +57 -0
- package/dist/schedule/service/wsl.d.ts.map +1 -0
- package/dist/schedule/service/wsl.js +111 -0
- package/dist/schedule/service/wsl.js.map +1 -0
- package/dist/schedule/store/atomic.d.ts +43 -0
- package/dist/schedule/store/atomic.d.ts.map +1 -0
- package/dist/schedule/store/atomic.js +135 -0
- package/dist/schedule/store/atomic.js.map +1 -0
- package/dist/schedule/store/claims.d.ts +26 -0
- package/dist/schedule/store/claims.d.ts.map +1 -0
- package/dist/schedule/store/claims.js +57 -0
- package/dist/schedule/store/claims.js.map +1 -0
- package/dist/schedule/store/digest.d.ts +18 -0
- package/dist/schedule/store/digest.d.ts.map +1 -0
- package/dist/schedule/store/digest.js +139 -0
- package/dist/schedule/store/digest.js.map +1 -0
- package/dist/schedule/store/history.d.ts +21 -0
- package/dist/schedule/store/history.d.ts.map +1 -0
- package/dist/schedule/store/history.js +114 -0
- package/dist/schedule/store/history.js.map +1 -0
- package/dist/schedule/store/jobs.d.ts +61 -0
- package/dist/schedule/store/jobs.d.ts.map +1 -0
- package/dist/schedule/store/jobs.js +210 -0
- package/dist/schedule/store/jobs.js.map +1 -0
- package/dist/schedule/store/state.d.ts +19 -0
- package/dist/schedule/store/state.d.ts.map +1 -0
- package/dist/schedule/store/state.js +38 -0
- package/dist/schedule/store/state.js.map +1 -0
- package/dist/schedule/types.d.ts +256 -0
- package/dist/schedule/types.d.ts.map +1 -0
- package/dist/schedule/types.js +9 -0
- package/dist/schedule/types.js.map +1 -0
- package/dist/skills/catalog.d.ts +96 -0
- package/dist/skills/catalog.d.ts.map +1 -0
- package/dist/skills/catalog.js +226 -0
- package/dist/skills/catalog.js.map +1 -0
- package/dist/skills/save.d.ts +148 -0
- package/dist/skills/save.d.ts.map +1 -0
- package/dist/skills/save.js +344 -0
- package/dist/skills/save.js.map +1 -0
- package/dist/skills/store.d.ts +103 -16
- package/dist/skills/store.d.ts.map +1 -1
- package/dist/skills/store.js +230 -29
- package/dist/skills/store.js.map +1 -1
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +591 -72
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/LiveActivity.d.ts +8 -1
- package/dist/tui/LiveActivity.d.ts.map +1 -1
- package/dist/tui/LiveActivity.js +20 -4
- package/dist/tui/LiveActivity.js.map +1 -1
- package/dist/tui/PermissionOverlay.d.ts +24 -4
- package/dist/tui/PermissionOverlay.d.ts.map +1 -1
- package/dist/tui/PermissionOverlay.js +113 -15
- package/dist/tui/PermissionOverlay.js.map +1 -1
- package/dist/tui/SaveSkillOverlay.d.ts +33 -0
- package/dist/tui/SaveSkillOverlay.d.ts.map +1 -0
- package/dist/tui/SaveSkillOverlay.js +118 -0
- package/dist/tui/SaveSkillOverlay.js.map +1 -0
- package/dist/tui/agent.d.ts +185 -5
- package/dist/tui/agent.d.ts.map +1 -1
- package/dist/tui/agent.js +325 -54
- package/dist/tui/agent.js.map +1 -1
- package/dist/tui/browser-notices.d.ts +33 -0
- package/dist/tui/browser-notices.d.ts.map +1 -0
- package/dist/tui/browser-notices.js +102 -0
- package/dist/tui/browser-notices.js.map +1 -0
- package/dist/tui/permission-review.d.ts.map +1 -1
- package/dist/tui/permission-review.js +53 -4
- package/dist/tui/permission-review.js.map +1 -1
- package/dist/tui/schedule/host-commands.d.ts +34 -0
- package/dist/tui/schedule/host-commands.d.ts.map +1 -0
- package/dist/tui/schedule/host-commands.js +309 -0
- package/dist/tui/schedule/host-commands.js.map +1 -0
- package/dist/tui/schedule/integration.d.ts +62 -0
- package/dist/tui/schedule/integration.d.ts.map +1 -0
- package/dist/tui/schedule/integration.js +145 -0
- package/dist/tui/schedule/integration.js.map +1 -0
- package/dist/tui/schedule/loop-host.d.ts +42 -0
- package/dist/tui/schedule/loop-host.d.ts.map +1 -0
- package/dist/tui/schedule/loop-host.js +153 -0
- package/dist/tui/schedule/loop-host.js.map +1 -0
- package/dist/tui/schedule/resume.d.ts +122 -0
- package/dist/tui/schedule/resume.d.ts.map +1 -0
- package/dist/tui/schedule/resume.js +324 -0
- package/dist/tui/schedule/resume.js.map +1 -0
- package/dist/tui/schedule/startup.d.ts +11 -0
- package/dist/tui/schedule/startup.d.ts.map +1 -0
- package/dist/tui/schedule/startup.js +121 -0
- package/dist/tui/schedule/startup.js.map +1 -0
- package/dist/tui/schedule/tool-host.d.ts +44 -0
- package/dist/tui/schedule/tool-host.d.ts.map +1 -0
- package/dist/tui/schedule/tool-host.js +294 -0
- package/dist/tui/schedule/tool-host.js.map +1 -0
- package/dist/tui/skills/learning.d.ts +74 -0
- package/dist/tui/skills/learning.d.ts.map +1 -0
- package/dist/tui/skills/learning.js +131 -0
- package/dist/tui/skills/learning.js.map +1 -0
- package/dist/tui/skills/suggest-setting.d.ts +22 -0
- package/dist/tui/skills/suggest-setting.d.ts.map +1 -0
- package/dist/tui/skills/suggest-setting.js +55 -0
- package/dist/tui/skills/suggest-setting.js.map +1 -0
- package/dist/tui/skills/suggestion-ledger.d.ts +35 -0
- package/dist/tui/skills/suggestion-ledger.d.ts.map +1 -0
- package/dist/tui/skills/suggestion-ledger.js +52 -0
- package/dist/tui/skills/suggestion-ledger.js.map +1 -0
- package/dist/tui/slashCommands.d.ts +20 -0
- package/dist/tui/slashCommands.d.ts.map +1 -1
- package/dist/tui/slashCommands.js +76 -2
- package/dist/tui/slashCommands.js.map +1 -1
- package/dist/tui/turn-interruption.d.ts +20 -1
- package/dist/tui/turn-interruption.d.ts.map +1 -1
- package/dist/tui/turn-interruption.js +43 -0
- package/dist/tui/turn-interruption.js.map +1 -1
- package/dist/tui/types.d.ts +9 -1
- package/dist/tui/types.d.ts.map +1 -1
- package/package.json +5 -3
- package/skills/README.md +15 -0
- package/skills/browser-automation/SKILL.md +84 -0
- package/skills/schedule-task/SKILL.md +140 -0
- package/skills/skill-creator/SKILL.md +101 -0
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `/schedule` and `/loop` in the TUI.
|
|
3
|
+
*
|
|
4
|
+
* `/schedule` lists the scheduled jobs with what needs you — a run waiting
|
|
5
|
+
* for approval, a job waiting for confirmation or on hold — and acts on them:
|
|
6
|
+
* confirm (the same preview `namzu schedule add` shows), pause, resume, run,
|
|
7
|
+
* remove, and add a job by hand. A run waiting for approval is answered with
|
|
8
|
+
* `/resume` of its conversation in its folder.
|
|
9
|
+
*/
|
|
10
|
+
import { resolve } from 'node:path';
|
|
11
|
+
import { describeSchedule, hostTimeZone } from '@namzu/sdk';
|
|
12
|
+
import { readPermissionLayers } from '../../config/load.js';
|
|
13
|
+
import { JobRequestError, buildJob, confirmJob, previewLines } from '../../schedule/build.js';
|
|
14
|
+
import { changesBlock, changesSinceConfirmed } from '../../schedule/changes.js';
|
|
15
|
+
import { callEndpoint, readEndpoint } from '../../schedule/daemon/endpoint.js';
|
|
16
|
+
import { schedulePaths } from '../../schedule/paths.js';
|
|
17
|
+
import { compileJobPolicy, isPresetName } from '../../schedule/policy.js';
|
|
18
|
+
import { parkedRunWords, resumeCommand } from '../../schedule/resume-command.js';
|
|
19
|
+
import { readManifest } from '../../schedule/service/manifest.js';
|
|
20
|
+
import { appendHistory, readHistory } from '../../schedule/store/history.js';
|
|
21
|
+
import { confirmationHolds, createJob, deleteJob, findJob, listJobs, updateJob, } from '../../schedule/store/jobs.js';
|
|
22
|
+
import { nextFireOf, readState } from '../../schedule/store/state.js';
|
|
23
|
+
import { describeLoops } from './loop-host.js';
|
|
24
|
+
const USAGE = [
|
|
25
|
+
'/schedule jobs, and what needs you',
|
|
26
|
+
'/schedule confirm <job> confirm a job created without a terminal, or held after an edit',
|
|
27
|
+
'/schedule pause|resume <job>',
|
|
28
|
+
'/schedule run <job> run it now through the scheduler',
|
|
29
|
+
'/schedule remove <job>',
|
|
30
|
+
'/schedule add <name> "<when>" <read-only|edit-in-folder> <prompt…>',
|
|
31
|
+
'A run waiting for approval: /resume its conversation (⏲ <job> · <time>) in its folder.',
|
|
32
|
+
].join('\n');
|
|
33
|
+
async function schedulerLine(home) {
|
|
34
|
+
const paths = schedulePaths(home);
|
|
35
|
+
const endpoint = readEndpoint(paths.endpoint);
|
|
36
|
+
if (endpoint && (await callEndpoint(endpoint, 'status', {}, 500)))
|
|
37
|
+
return 'Scheduler: running.';
|
|
38
|
+
let installed = false;
|
|
39
|
+
try {
|
|
40
|
+
installed = readManifest(paths) !== undefined;
|
|
41
|
+
}
|
|
42
|
+
catch { }
|
|
43
|
+
return installed
|
|
44
|
+
? 'Scheduler: installed but not answering — namzu schedule status.'
|
|
45
|
+
: 'Scheduler: not installed — namzu schedule install. Jobs do not run until it is.';
|
|
46
|
+
}
|
|
47
|
+
function when(iso, tz) {
|
|
48
|
+
if (!iso)
|
|
49
|
+
return '—';
|
|
50
|
+
return new Intl.DateTimeFormat('en-GB', {
|
|
51
|
+
dateStyle: 'medium',
|
|
52
|
+
timeStyle: 'short',
|
|
53
|
+
timeZone: tz,
|
|
54
|
+
}).format(new Date(iso));
|
|
55
|
+
}
|
|
56
|
+
export async function listScheduleJobs(ctx) {
|
|
57
|
+
const paths = schedulePaths(ctx.home);
|
|
58
|
+
const { jobs } = listJobs(paths);
|
|
59
|
+
const lines = [];
|
|
60
|
+
for (const job of jobs) {
|
|
61
|
+
const tz = job.schedule.kind === 'cron' ? job.schedule.tz : hostTimeZone();
|
|
62
|
+
const state = readState(paths, job.id);
|
|
63
|
+
const mark = state.activeRun?.status === 'awaiting-approval'
|
|
64
|
+
? state.activeRun.handoff
|
|
65
|
+
? ` ⚠ ${parkedRunWords(state.activeRun)}`
|
|
66
|
+
: ' ⚠ WAITING FOR YOUR APPROVAL'
|
|
67
|
+
: job.state === 'pending-confirmation'
|
|
68
|
+
? ' ⚠ needs confirmation'
|
|
69
|
+
: job.state === 'active' && !confirmationHolds(job)
|
|
70
|
+
? ' ⚠ changed outside namzu — on hold'
|
|
71
|
+
: state.activeRun?.status === 'running'
|
|
72
|
+
? ' ● running'
|
|
73
|
+
: '';
|
|
74
|
+
lines.push(`⏲ ${job.name} [${job.state}]${mark}\n ${describeSchedule(job.schedule, { tz })} · next ${when(nextFireOf(job, state), tz)}${state.lastRun ? ` · last ${state.lastRun.status} ${when(state.lastRun.endedAt, tz)}` : ''}\n ${job.folder.canonical}`);
|
|
75
|
+
if (state.activeRun?.status === 'awaiting-approval' && state.activeRun.sessionId) {
|
|
76
|
+
const command = resumeCommand(job, state.activeRun.sessionId);
|
|
77
|
+
const verb = state.activeRun.handoff ? 'when that is done, continue it' : 'answer it';
|
|
78
|
+
lines.push(job.folder.canonical === ctx.cwd
|
|
79
|
+
? ` ${verb}: /resume and pick "⏲ ${job.name}", or ${command}`
|
|
80
|
+
: ` ${verb}: ${command}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return [
|
|
84
|
+
jobs.length === 0
|
|
85
|
+
? 'No scheduled jobs. Ask for one ("run this every night at 3"), or /schedule add.'
|
|
86
|
+
: lines.join('\n'),
|
|
87
|
+
await schedulerLine(ctx.home),
|
|
88
|
+
].join('\n');
|
|
89
|
+
}
|
|
90
|
+
async function confirmInTui(ctx, job, verb) {
|
|
91
|
+
const paths = schedulePaths(ctx.home);
|
|
92
|
+
const policy = compileJobPolicy(job.permissions, {
|
|
93
|
+
layers: readPermissionLayers({ cwd: job.folder.canonical }),
|
|
94
|
+
namzuHome: paths.home,
|
|
95
|
+
folder: job.folder,
|
|
96
|
+
});
|
|
97
|
+
if (policy.diagnostics.length > 0) {
|
|
98
|
+
ctx.say(`The rules do not compile: ${policy.diagnostics.join('; ')}`);
|
|
99
|
+
return 'cancel';
|
|
100
|
+
}
|
|
101
|
+
ctx.say([
|
|
102
|
+
...previewLines(job, policy, new Date()),
|
|
103
|
+
...changesBlock(changesSinceConfirmed(readHistory(paths, job.id))),
|
|
104
|
+
'Prompt',
|
|
105
|
+
...job.prompt.split('\n').map((l) => ` │ ${l}`),
|
|
106
|
+
].join('\n'));
|
|
107
|
+
const answer = await ctx.ask({
|
|
108
|
+
questionId: `schedule-confirm:${job.id}`,
|
|
109
|
+
question: `${verb} the scheduled job "${job.name}"? (details above)`,
|
|
110
|
+
header: 'Scheduled job',
|
|
111
|
+
options: [
|
|
112
|
+
{ id: 'cancel', label: 'Cancel', description: 'Change nothing' },
|
|
113
|
+
{
|
|
114
|
+
id: 'create-paused',
|
|
115
|
+
label: `${verb} paused`,
|
|
116
|
+
description: 'It does not run until resumed',
|
|
117
|
+
},
|
|
118
|
+
{ id: 'create', label: verb, description: 'It runs on schedule with the permissions above' },
|
|
119
|
+
],
|
|
120
|
+
multiSelect: false,
|
|
121
|
+
allowFreeText: false,
|
|
122
|
+
});
|
|
123
|
+
if (answer.kind !== 'answer')
|
|
124
|
+
return 'cancel';
|
|
125
|
+
const id = answer.selectedOptionIds[0];
|
|
126
|
+
return id === 'create' || id === 'create-paused' ? id : 'cancel';
|
|
127
|
+
}
|
|
128
|
+
/** Split `add` arguments: name, a quoted when, a preset, and the prompt. */
|
|
129
|
+
export function parseAddArgs(args) {
|
|
130
|
+
const text = args.join(' ');
|
|
131
|
+
const match = /^(\S+)\s+"([^"]+)"\s+(\S+)\s+([\s\S]+)$/.exec(text.trim());
|
|
132
|
+
if (!match)
|
|
133
|
+
return undefined;
|
|
134
|
+
return {
|
|
135
|
+
name: match[1],
|
|
136
|
+
when: match[2],
|
|
137
|
+
preset: match[3],
|
|
138
|
+
prompt: match[4],
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
export async function runScheduleCommand(args, ctx) {
|
|
142
|
+
const paths = schedulePaths(ctx.home);
|
|
143
|
+
const [verb, ...rest] = args;
|
|
144
|
+
try {
|
|
145
|
+
switch (verb) {
|
|
146
|
+
case undefined:
|
|
147
|
+
case 'list':
|
|
148
|
+
ctx.say(await listScheduleJobs(ctx));
|
|
149
|
+
return;
|
|
150
|
+
case 'help':
|
|
151
|
+
ctx.say(USAGE);
|
|
152
|
+
return;
|
|
153
|
+
case 'confirm': {
|
|
154
|
+
const job = findJob(paths, rest[0] ?? '');
|
|
155
|
+
const answer = await confirmInTui(ctx, job, 'Confirm');
|
|
156
|
+
if (answer === 'cancel') {
|
|
157
|
+
ctx.say(`Not confirmed; ${job.name} stays ${job.state}.`);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
const now = new Date();
|
|
161
|
+
const next = updateJob(paths, job.id, job.revision, (j) => confirmJob(j, 'tui', now, { paused: answer === 'create-paused' }));
|
|
162
|
+
appendHistory(paths, job.id, {
|
|
163
|
+
v: 1,
|
|
164
|
+
kind: 'job',
|
|
165
|
+
at: now.toISOString(),
|
|
166
|
+
action: 'confirmed',
|
|
167
|
+
by: 'tui',
|
|
168
|
+
});
|
|
169
|
+
ctx.say(`Confirmed ${next.name} (${next.state}).`);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
case 'pause':
|
|
173
|
+
case 'resume': {
|
|
174
|
+
const job = findJob(paths, rest[0] ?? '');
|
|
175
|
+
if (verb === 'resume' && !confirmationHolds(job)) {
|
|
176
|
+
ctx.say(`${job.name} changed since it was confirmed: /schedule confirm ${job.name}`);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const now = new Date();
|
|
180
|
+
updateJob(paths, job.id, job.revision, (j) => verb === 'pause'
|
|
181
|
+
? { ...j, state: 'paused', pausedAt: now.toISOString(), pausedBy: 'operator' }
|
|
182
|
+
: { ...j, state: 'active', pausedAt: undefined, pausedBy: undefined });
|
|
183
|
+
appendHistory(paths, job.id, {
|
|
184
|
+
v: 1,
|
|
185
|
+
kind: 'job',
|
|
186
|
+
at: now.toISOString(),
|
|
187
|
+
action: verb === 'pause' ? 'paused' : 'resumed',
|
|
188
|
+
by: 'operator',
|
|
189
|
+
});
|
|
190
|
+
ctx.say(`${job.name} ${verb === 'pause' ? 'paused' : 'resumed'}.`);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
case 'run': {
|
|
194
|
+
const job = findJob(paths, rest[0] ?? '');
|
|
195
|
+
const endpoint = readEndpoint(paths.endpoint);
|
|
196
|
+
const answer = endpoint
|
|
197
|
+
? await callEndpoint(endpoint, 'run-now', { jobId: job.id })
|
|
198
|
+
: undefined;
|
|
199
|
+
ctx.say(answer
|
|
200
|
+
? answer.ok
|
|
201
|
+
? `${job.name} queued; /schedule shows it running.`
|
|
202
|
+
: String(answer.message ?? 'refused')
|
|
203
|
+
: `The scheduler is not running; run it here with: namzu schedule run-now ${job.name}`);
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
case 'remove': {
|
|
207
|
+
const job = findJob(paths, rest[0] ?? '');
|
|
208
|
+
const answer = await ctx.ask({
|
|
209
|
+
questionId: `schedule-remove:${job.id}`,
|
|
210
|
+
question: `Remove the scheduled job "${job.name}"? Its history is kept.`,
|
|
211
|
+
options: [
|
|
212
|
+
{ id: 'no', label: 'No' },
|
|
213
|
+
{ id: 'yes', label: 'Remove it' },
|
|
214
|
+
],
|
|
215
|
+
multiSelect: false,
|
|
216
|
+
allowFreeText: false,
|
|
217
|
+
});
|
|
218
|
+
if (answer.kind !== 'answer' || !answer.selectedOptionIds.includes('yes'))
|
|
219
|
+
return;
|
|
220
|
+
deleteJob(paths, job.id);
|
|
221
|
+
appendHistory(paths, job.id, {
|
|
222
|
+
v: 1,
|
|
223
|
+
kind: 'job',
|
|
224
|
+
at: new Date().toISOString(),
|
|
225
|
+
action: 'removed',
|
|
226
|
+
by: 'operator',
|
|
227
|
+
});
|
|
228
|
+
ctx.say(`Removed ${job.name}.`);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
case 'add': {
|
|
232
|
+
const parsed = parseAddArgs(rest);
|
|
233
|
+
if (!parsed || !isPresetName(parsed.preset)) {
|
|
234
|
+
ctx.say(`Usage: /schedule add <name> "<when>" <read-only|edit-in-folder> <prompt…>\nFor anything else: namzu schedule add --help`);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
if (!ctx.model) {
|
|
238
|
+
ctx.say('This session has no model yet; pick one first.');
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
const now = new Date();
|
|
242
|
+
const job = buildJob({
|
|
243
|
+
name: parsed.name,
|
|
244
|
+
prompt: parsed.prompt,
|
|
245
|
+
when: parsed.when,
|
|
246
|
+
folder: resolve(ctx.cwd),
|
|
247
|
+
permissions: { preset: parsed.preset },
|
|
248
|
+
model: `${ctx.model.provider}${ctx.model.model ? `/${ctx.model.model}` : ''}`,
|
|
249
|
+
createdBy: { surface: 'tui' },
|
|
250
|
+
}, { paths, config: ctx.config, now });
|
|
251
|
+
const answer = await confirmInTui(ctx, job, 'Create');
|
|
252
|
+
if (answer === 'cancel') {
|
|
253
|
+
ctx.say('Not created.');
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
const created = createJob(paths, confirmJob(job, 'tui', now, { paused: answer === 'create-paused' }));
|
|
257
|
+
appendHistory(paths, created.id, {
|
|
258
|
+
v: 1,
|
|
259
|
+
kind: 'job',
|
|
260
|
+
at: now.toISOString(),
|
|
261
|
+
action: 'created',
|
|
262
|
+
by: 'tui',
|
|
263
|
+
});
|
|
264
|
+
ctx.say(`Created ${created.name} (${created.state}).`);
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
default:
|
|
268
|
+
ctx.say(USAGE);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
ctx.say(error instanceof JobRequestError || error instanceof Error ? error.message : String(error));
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
export async function runLoopCommand(args, loops, say) {
|
|
276
|
+
const [first, ...rest] = args;
|
|
277
|
+
try {
|
|
278
|
+
if (!first || first === 'list') {
|
|
279
|
+
say(describeLoops(loops.list()));
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
if (first === 'stop') {
|
|
283
|
+
const id = rest[0];
|
|
284
|
+
if (!id) {
|
|
285
|
+
say('Usage: /loop stop <id>|all');
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
const stopped = await loops.delete(id);
|
|
289
|
+
say(stopped === 0
|
|
290
|
+
? `No loop has id ${id}.`
|
|
291
|
+
: `Stopped ${stopped} loop${stopped === 1 ? '' : 's'}.`);
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
// `/loop <interval> <prompt>`; a cron expression is five words.
|
|
295
|
+
const cron = args.length >= 6 && args.slice(0, 5).every((w) => /^[\d*/,\-a-z]+$/i.test(w));
|
|
296
|
+
const interval = cron ? args.slice(0, 5).join(' ') : first;
|
|
297
|
+
const prompt = (cron ? args.slice(5) : rest).join(' ').trim();
|
|
298
|
+
if (!prompt) {
|
|
299
|
+
say('Usage: /loop <interval> <prompt or /command> e.g. /loop 10m check the build');
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
const loop = await loops.create({ interval, prompt, createdBy: 'operator' });
|
|
303
|
+
say(`↻ Loop ${loop.id}: ${loop.schedule}, between turns, for 7 days. /loop stop ${loop.id} ends it.`);
|
|
304
|
+
}
|
|
305
|
+
catch (error) {
|
|
306
|
+
say(error instanceof Error ? error.message : String(error));
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=host-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-commands.js","sourceRoot":"","sources":["../../../src/tui/schedule/host-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Everything the TUI's App needs from the scheduler, behind one object so
|
|
3
|
+
* the App changes by a few lines: the `schedule` and `session_loop` tools for
|
|
4
|
+
* the session, `/schedule` and `/loop`, the loop timer, the startup line, and
|
|
5
|
+
* the answer path for a parked scheduled run.
|
|
6
|
+
*
|
|
7
|
+
* The App hands it getters rather than values, because what they read
|
|
8
|
+
* (the conversation on screen, the model, whether a turn is running) changes
|
|
9
|
+
* after this object is made.
|
|
10
|
+
*/
|
|
11
|
+
import { type ToolDefinition } from '@namzu/sdk';
|
|
12
|
+
import type { NamzuCliConfig } from '../../config/schema.js';
|
|
13
|
+
import type { PermissionMode } from '../../permissions/mode.js';
|
|
14
|
+
import type { QuestionFn, ScreenPermissionFn } from '../agent.js';
|
|
15
|
+
import { SessionLoopScheduler } from './loop-host.js';
|
|
16
|
+
import { type ResumeEnvironment, type ScheduledResume } from './resume.js';
|
|
17
|
+
export interface ScheduleIntegrationDeps {
|
|
18
|
+
/** `NAMZU_HOME` of the conversations on screen, once known. */
|
|
19
|
+
readonly home: () => string | undefined;
|
|
20
|
+
readonly cwd: () => string;
|
|
21
|
+
readonly extraRoots: () => readonly string[];
|
|
22
|
+
readonly config: () => Pick<NamzuCliConfig, 'limits'>;
|
|
23
|
+
readonly model: () => {
|
|
24
|
+
readonly provider: string;
|
|
25
|
+
readonly model?: string;
|
|
26
|
+
} | undefined;
|
|
27
|
+
readonly sessionId: () => string | undefined;
|
|
28
|
+
/** `<session-id>/loops.json` of the conversation on screen. */
|
|
29
|
+
readonly loopsFile: () => string | undefined;
|
|
30
|
+
readonly isIdle: () => boolean;
|
|
31
|
+
readonly say: (text: string) => void;
|
|
32
|
+
readonly ask: QuestionFn;
|
|
33
|
+
/** The permission screen; a scheduled turn's prompts are batch-only. */
|
|
34
|
+
readonly askPermission: ScreenPermissionFn;
|
|
35
|
+
/** Send a prompt as the next turn, as if typed. */
|
|
36
|
+
readonly submit: (text: string) => void;
|
|
37
|
+
}
|
|
38
|
+
export interface ScheduleIntegration {
|
|
39
|
+
readonly loops: SessionLoopScheduler;
|
|
40
|
+
/** The tools a person-attended session offers. */
|
|
41
|
+
tools(): ToolDefinition[];
|
|
42
|
+
/** `/schedule` and `/loop`; false for any other name. */
|
|
43
|
+
handleSlash(name: string, args: readonly string[]): boolean;
|
|
44
|
+
startupLine(): string | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* After a parked scheduled turn answered here has run: record the run's
|
|
47
|
+
* end in its job, as a scheduler would, so `schedule list` and `status`
|
|
48
|
+
* stop showing it waiting. A turn that parked again stays waiting.
|
|
49
|
+
*/
|
|
50
|
+
settleAnswered(): Promise<void>;
|
|
51
|
+
/** Whether the conversation on screen is a scheduled run parked on a decision or a handoff. */
|
|
52
|
+
isParked(): Promise<boolean>;
|
|
53
|
+
/**
|
|
54
|
+
* Ask about a parked scheduled batch, or whether to continue a run a tool
|
|
55
|
+
* paused for a person. Throws, saying which session would match, when
|
|
56
|
+
* `environment` is not how the job runs.
|
|
57
|
+
*/
|
|
58
|
+
prepareResume(operatorMode: PermissionMode, environment: ResumeEnvironment): Promise<ScheduledResume | undefined>;
|
|
59
|
+
dispose(): void;
|
|
60
|
+
}
|
|
61
|
+
export declare function createScheduleIntegration(deps: ScheduleIntegrationDeps): ScheduleIntegration;
|
|
62
|
+
//# sourceMappingURL=integration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../../../src/tui/schedule/integration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,KAAK,cAAc,EAA6C,MAAM,YAAY,CAAA;AAC3F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAK/D,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAEjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EACN,KAAK,iBAAiB,EACtB,KAAK,eAAe,EAGpB,MAAM,aAAa,CAAA;AAIpB,MAAM,WAAW,uBAAuB;IACvC,+DAA+D;IAC/D,QAAQ,CAAC,IAAI,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAA;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,SAAS,MAAM,EAAE,CAAA;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAA;IACrD,QAAQ,CAAC,KAAK,EAAE,MAAM;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAA;IACxF,QAAQ,CAAC,SAAS,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;IAC5C,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,OAAO,CAAA;IAC9B,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAA;IACxB,wEAAwE;IACxE,QAAQ,CAAC,aAAa,EAAE,kBAAkB,CAAA;IAC1C,mDAAmD;IACnD,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACvC;AAED,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAA;IACpC,kDAAkD;IAClD,KAAK,IAAI,cAAc,EAAE,CAAA;IACzB,yDAAyD;IACzD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAA;IAC3D,WAAW,IAAI,MAAM,GAAG,SAAS,CAAA;IACjC;;;;OAIG;IACH,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/B,+FAA+F;IAC/F,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IAC5B;;;;OAIG;IACH,aAAa,CACZ,YAAY,EAAE,cAAc,EAC5B,WAAW,EAAE,iBAAiB,GAC5B,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAAA;IACvC,OAAO,IAAI,IAAI,CAAA;CACf;AAID,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,uBAAuB,GAAG,mBAAmB,CAkH5F"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Everything the TUI's App needs from the scheduler, behind one object so
|
|
3
|
+
* the App changes by a few lines: the `schedule` and `session_loop` tools for
|
|
4
|
+
* the session, `/schedule` and `/loop`, the loop timer, the startup line, and
|
|
5
|
+
* the answer path for a parked scheduled run.
|
|
6
|
+
*
|
|
7
|
+
* The App hands it getters rather than values, because what they read
|
|
8
|
+
* (the conversation on screen, the model, whether a turn is running) changes
|
|
9
|
+
* after this object is made.
|
|
10
|
+
*/
|
|
11
|
+
import { buildScheduleTools, buildSessionLoopTools } from '@namzu/sdk';
|
|
12
|
+
import { settleAnsweredPark } from '../../schedule/commands/lifecycle.js';
|
|
13
|
+
import { schedulePaths } from '../../schedule/paths.js';
|
|
14
|
+
import { listJobs } from '../../schedule/store/jobs.js';
|
|
15
|
+
import { readState } from '../../schedule/store/state.js';
|
|
16
|
+
import { runLoopCommand, runScheduleCommand } from './host-commands.js';
|
|
17
|
+
import { SessionLoopScheduler } from './loop-host.js';
|
|
18
|
+
import { findScheduledPark, prepareScheduledResume, } from './resume.js';
|
|
19
|
+
import { scheduleStartupLine } from './startup.js';
|
|
20
|
+
import { createScheduleToolHost } from './tool-host.js';
|
|
21
|
+
const LOOP_TICK_MS = 15_000;
|
|
22
|
+
export function createScheduleIntegration(deps) {
|
|
23
|
+
const home = () => {
|
|
24
|
+
const value = deps.home();
|
|
25
|
+
if (!value)
|
|
26
|
+
throw new Error('Scheduled jobs are unavailable until this folder’s conversations are open.');
|
|
27
|
+
return value;
|
|
28
|
+
};
|
|
29
|
+
const loops = new SessionLoopScheduler({
|
|
30
|
+
file: deps.loopsFile,
|
|
31
|
+
isIdle: deps.isIdle,
|
|
32
|
+
fire: (loop) => {
|
|
33
|
+
deps.say(`↻ loop ${loop.id}${loop.createdBy === 'model' ? ' (created by the model)' : ''}`);
|
|
34
|
+
deps.submit(loop.prompt);
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
const timer = setInterval(() => {
|
|
38
|
+
try {
|
|
39
|
+
loops.tick();
|
|
40
|
+
}
|
|
41
|
+
catch { }
|
|
42
|
+
}, LOOP_TICK_MS);
|
|
43
|
+
timer.unref?.();
|
|
44
|
+
return {
|
|
45
|
+
loops,
|
|
46
|
+
tools: () => [
|
|
47
|
+
...buildScheduleTools(createScheduleToolHost({
|
|
48
|
+
home,
|
|
49
|
+
cwd: deps.cwd,
|
|
50
|
+
extraRoots: deps.extraRoots,
|
|
51
|
+
model: deps.model,
|
|
52
|
+
config: deps.config,
|
|
53
|
+
sessionId: deps.sessionId,
|
|
54
|
+
say: deps.say,
|
|
55
|
+
ask: deps.ask,
|
|
56
|
+
})),
|
|
57
|
+
...buildSessionLoopTools(loops),
|
|
58
|
+
],
|
|
59
|
+
handleSlash(name, args) {
|
|
60
|
+
if (name === 'loop') {
|
|
61
|
+
void runLoopCommand(args, loops, deps.say);
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
if (name !== 'schedule')
|
|
65
|
+
return false;
|
|
66
|
+
let ctxHome;
|
|
67
|
+
try {
|
|
68
|
+
ctxHome = home();
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
deps.say(error instanceof Error ? error.message : String(error));
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
const model = deps.model();
|
|
75
|
+
void runScheduleCommand(args, {
|
|
76
|
+
home: ctxHome,
|
|
77
|
+
cwd: deps.cwd(),
|
|
78
|
+
config: deps.config(),
|
|
79
|
+
...(model ? { model } : {}),
|
|
80
|
+
say: deps.say,
|
|
81
|
+
ask: deps.ask,
|
|
82
|
+
});
|
|
83
|
+
return true;
|
|
84
|
+
},
|
|
85
|
+
startupLine() {
|
|
86
|
+
const value = deps.home();
|
|
87
|
+
if (!value)
|
|
88
|
+
return undefined;
|
|
89
|
+
try {
|
|
90
|
+
return scheduleStartupLine(value, deps.cwd());
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
async settleAnswered() {
|
|
97
|
+
const value = deps.home();
|
|
98
|
+
const sessionId = deps.sessionId();
|
|
99
|
+
if (!value || !sessionId)
|
|
100
|
+
return;
|
|
101
|
+
const paths = schedulePaths(value);
|
|
102
|
+
try {
|
|
103
|
+
for (const job of listJobs(paths).jobs) {
|
|
104
|
+
const run = readState(paths, job.id).activeRun;
|
|
105
|
+
if (run?.status === 'awaiting-approval' && run.sessionId === sessionId)
|
|
106
|
+
await settleAnsweredPark(paths, job.id);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// A scheduler settles it on its next tick; the screen is not the place to fail.
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
async isParked() {
|
|
114
|
+
const value = deps.home();
|
|
115
|
+
const sessionId = deps.sessionId();
|
|
116
|
+
if (!value || !sessionId)
|
|
117
|
+
return false;
|
|
118
|
+
try {
|
|
119
|
+
return (await findScheduledPark(value, sessionId)) !== undefined;
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
async prepareResume(operatorMode, environment) {
|
|
126
|
+
const value = deps.home();
|
|
127
|
+
const sessionId = deps.sessionId();
|
|
128
|
+
if (!value || !sessionId)
|
|
129
|
+
return undefined;
|
|
130
|
+
return prepareScheduledResume({
|
|
131
|
+
home: value,
|
|
132
|
+
sessionId,
|
|
133
|
+
operatorMode,
|
|
134
|
+
environment,
|
|
135
|
+
ask: deps.askPermission,
|
|
136
|
+
choose: deps.ask,
|
|
137
|
+
say: deps.say,
|
|
138
|
+
});
|
|
139
|
+
},
|
|
140
|
+
dispose() {
|
|
141
|
+
clearInterval(timer);
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=integration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.js","sourceRoot":"","sources":["../../../src/tui/schedule/integration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `/loop` and the `session_loop` tool: a prompt the open session re-sends to
|
|
3
|
+
* itself on an interval.
|
|
4
|
+
*
|
|
5
|
+
* It fires only between turns. A loop that comes due while a turn runs fires
|
|
6
|
+
* once when the session is idle again — never once per missed interval: the
|
|
7
|
+
* session is the operator's, and a pile of queued prompts would take it over.
|
|
8
|
+
* At most 20 loops, at least a minute apart, each expiring seven days after it
|
|
9
|
+
* was made. They live in `<session-id>/loops.json` beside the session log and
|
|
10
|
+
* come back with `/resume` (expired ones do not). A loop the model made says
|
|
11
|
+
* so wherever it is shown.
|
|
12
|
+
*/
|
|
13
|
+
import { type ScheduleSpec, type SessionLoop, type SessionLoopHost } from '@namzu/sdk';
|
|
14
|
+
export declare const MAX_LOOPS = 20;
|
|
15
|
+
export declare const LOOP_LIFETIME_MS: number;
|
|
16
|
+
export interface LoopHostDeps {
|
|
17
|
+
/** `<session-id>/loops.json` of the conversation on screen, or undefined before there is one. */
|
|
18
|
+
readonly file: () => string | undefined;
|
|
19
|
+
/** No turn is running and nothing waits for an answer. */
|
|
20
|
+
readonly isIdle: () => boolean;
|
|
21
|
+
/** Send the loop's prompt as the next turn. */
|
|
22
|
+
readonly fire: (loop: SessionLoop) => void;
|
|
23
|
+
readonly now?: () => number;
|
|
24
|
+
}
|
|
25
|
+
/** `5m`, `every 1h`, or five-field cron, as a spec. */
|
|
26
|
+
export declare function loopSpec(interval: string, now: Date): ScheduleSpec;
|
|
27
|
+
export declare class SessionLoopScheduler implements SessionLoopHost {
|
|
28
|
+
#private;
|
|
29
|
+
constructor(deps: LoopHostDeps);
|
|
30
|
+
create(request: {
|
|
31
|
+
readonly interval: string;
|
|
32
|
+
readonly prompt: string;
|
|
33
|
+
readonly createdBy: 'model' | 'operator';
|
|
34
|
+
}): Promise<SessionLoop>;
|
|
35
|
+
list(): readonly SessionLoop[];
|
|
36
|
+
delete(id: string): Promise<number>;
|
|
37
|
+
/** Fire what is due, when idle. Called on a timer and when a turn ends. */
|
|
38
|
+
tick(): void;
|
|
39
|
+
}
|
|
40
|
+
/** One line per loop, for `/loop list`. */
|
|
41
|
+
export declare function describeLoops(loops: readonly SessionLoop[]): string;
|
|
42
|
+
//# sourceMappingURL=loop-host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-host.d.ts","sourceRoot":"","sources":["../../../src/tui/schedule/loop-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EACN,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,eAAe,EAKpB,MAAM,YAAY,CAAA;AAGnB,eAAO,MAAM,SAAS,KAAK,CAAA;AAC3B,eAAO,MAAM,gBAAgB,QAA0B,CAAA;AAavD,MAAM,WAAW,YAAY;IAC5B,iGAAiG;IACjG,QAAQ,CAAC,IAAI,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;IACvC,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,MAAM,OAAO,CAAA;IAC9B,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAA;IAC1C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAC3B;AAED,uDAAuD;AACvD,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,YAAY,CAKlE;AAED,qBAAa,oBAAqB,YAAW,eAAe;;gBAK/C,IAAI,EAAE,YAAY;IA8CxB,MAAM,CAAC,OAAO,EAAE;QACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;QACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;QACvB,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,UAAU,CAAA;KACxC,GAAG,OAAO,CAAC,WAAW,CAAC;IAsBxB,IAAI,IAAI,SAAS,WAAW,EAAE;IAKxB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQzC,2EAA2E;IAC3E,IAAI,IAAI,IAAI;CAkCZ;AAED,2CAA2C;AAC3C,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,CAQnE"}
|