@jingyi0605/codingns 0.3.6 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/bin/codingns.mjs +913 -1
- package/dist/public/assets/AdaptiveButlerPage-B153lk5H.css +1 -0
- package/dist/public/assets/AdaptiveButlerPage-R-XZw7pd.js +3 -0
- package/dist/public/assets/App-DUAg5urj.css +1 -0
- package/dist/public/assets/App-DkvE5EyM.js +30 -0
- package/dist/public/assets/BootstrapPage-Vu5oEJ8z.js +1 -0
- package/dist/public/assets/ConversationPage-Cjpg6g0J.js +2 -0
- package/dist/public/assets/DesktopDetachPreviewPage-BgeEqbc5.js +1 -0
- package/dist/public/assets/DesktopWindowPage-1WelvxdH.js +2 -0
- package/dist/public/assets/FileContextPanel-D_ghXJuW.js +1 -0
- package/dist/public/assets/GitSidebar-D9f9Jxwr.js +6 -0
- package/dist/public/assets/MobileCreateSessionSheet-DLq5qPkx.js +1 -0
- package/dist/public/assets/MobileSheet-DLg-gX1t.js +1 -0
- package/dist/public/assets/MobileTopHeaderFrame-DArgZI7L.js +1 -0
- package/dist/public/assets/MobileWorkspaceSwitcherHeader-0ywJKfBQ.js +1 -0
- package/dist/public/assets/ServerSettingsModal-izoYMx9U.js +1 -0
- package/dist/public/assets/SessionIndexPage-C5aG8FIv.js +1 -0
- package/dist/public/assets/SettingsPage-HJIC-P-4.js +1 -0
- package/dist/public/assets/TerminalManagerPanel-DpyUTo9k.js +1 -0
- package/dist/public/assets/{TerminalPage-D00S4KM6.js → TerminalPage-CtKXIU0h.js} +19 -19
- package/dist/public/assets/TerminalRuntimeFallbackModal-CRhOQOsT.js +1 -0
- package/dist/public/assets/ToolFilesPage-DcYPsS-e.js +1 -0
- package/dist/public/assets/ToolGitPage-CsPl89ty.js +1 -0
- package/dist/public/assets/ToolProcessesPage-D0dvR8xK.js +1 -0
- package/dist/public/assets/ToolsHomePage-4fP-KRiv.js +1 -0
- package/dist/public/assets/WorkbenchLandingPage-kvlfyxRo.js +1 -0
- package/dist/public/assets/WorkbenchLayout-ByFw4eeu.js +3 -0
- package/dist/public/assets/WorkbenchModal-Ctob14VR.js +1 -0
- package/dist/public/assets/WorkbenchShellRoute-BUITtdAg.css +1 -0
- package/dist/public/assets/WorkbenchShellRoute-Kw7JEZI3.js +1 -0
- package/dist/public/assets/WorkspaceDebugDetailPage-Com5kEXJ.js +1 -0
- package/dist/public/assets/WorkspaceDetailPage-D0Lrx4Uz.js +1 -0
- package/dist/public/assets/WorkspaceHomePage-wR8d3aP9.js +1 -0
- package/dist/public/assets/butler-records-events-DgWCG364.js +1 -0
- package/dist/public/assets/default-session-permission-mode-CcGwR4Kk.js +1 -0
- package/dist/public/assets/event-DvH9tcej.js +1 -0
- package/dist/public/assets/file-tree-icon-UFVoVzhM.js +31 -0
- package/dist/public/assets/index-Byp9hJ0c.js +42 -0
- package/dist/public/assets/index-_52jxu4a.css +1 -0
- package/dist/public/assets/preferences-service-KIYeE2gk.js +1 -0
- package/dist/public/assets/session-runtime-machine-0KNSSPp5.js +17 -0
- package/dist/public/assets/styles-BWPBZvze.css +1 -0
- package/dist/public/assets/styles-CSUx5LGe.js +1 -0
- package/dist/public/assets/terminal-runtime-meta-AWXJpN4r.js +1 -0
- package/dist/public/assets/useRegisteredDebugTemplates-DBDRdptr.js +1 -0
- package/dist/public/assets/window-BWqRixxq.js +1 -0
- package/dist/public/index.html +2 -2
- package/dist/server/middlewares/auth-guard.d.ts +4 -0
- package/dist/server/middlewares/auth-guard.js +42 -4
- package/dist/server/middlewares/auth-guard.js.map +1 -1
- package/dist/server/modules/assistant-capability/assistant-capability-controller.d.ts +234 -0
- package/dist/server/modules/assistant-capability/assistant-capability-controller.js +365 -0
- package/dist/server/modules/assistant-capability/assistant-capability-controller.js.map +1 -1
- package/dist/server/modules/assistant-capability/assistant-capability-service.d.ts +262 -2
- package/dist/server/modules/assistant-capability/assistant-capability-service.js +737 -3
- package/dist/server/modules/assistant-capability/assistant-capability-service.js.map +1 -1
- package/dist/server/modules/auth/auth-controller.d.ts +11 -1
- package/dist/server/modules/auth/auth-controller.js +61 -2
- package/dist/server/modules/auth/auth-controller.js.map +1 -1
- package/dist/server/modules/auth/auth-device-display-name.d.ts +10 -0
- package/dist/server/modules/auth/auth-device-display-name.js +190 -0
- package/dist/server/modules/auth/auth-device-display-name.js.map +1 -0
- package/dist/server/modules/auth/auth-service.d.ts +80 -5
- package/dist/server/modules/auth/auth-service.js +333 -23
- package/dist/server/modules/auth/auth-service.js.map +1 -1
- package/dist/server/modules/butler/assistant-automation-service.d.ts +112 -0
- package/dist/server/modules/butler/assistant-automation-service.js +832 -0
- package/dist/server/modules/butler/assistant-automation-service.js.map +1 -0
- package/dist/server/modules/butler/assistant-automation-trigger.d.ts +94 -0
- package/dist/server/modules/butler/assistant-automation-trigger.js +400 -0
- package/dist/server/modules/butler/assistant-automation-trigger.js.map +1 -0
- package/dist/server/modules/butler/assistant-sandbox-cleanup-scheduler.d.ts +32 -0
- package/dist/server/modules/butler/assistant-sandbox-cleanup-scheduler.js +93 -0
- package/dist/server/modules/butler/assistant-sandbox-cleanup-scheduler.js.map +1 -0
- package/dist/server/modules/butler/assistant-sandbox-service.d.ts +69 -0
- package/dist/server/modules/butler/assistant-sandbox-service.js +399 -0
- package/dist/server/modules/butler/assistant-sandbox-service.js.map +1 -0
- package/dist/server/modules/butler/butler-action-context-service.d.ts +4 -1
- package/dist/server/modules/butler/butler-action-context-service.js +8 -2
- package/dist/server/modules/butler/butler-action-context-service.js.map +1 -1
- package/dist/server/modules/butler/butler-auth-service.js +7 -2
- package/dist/server/modules/butler/butler-auth-service.js.map +1 -1
- package/dist/server/modules/butler/butler-control-session-service.d.ts +11 -1
- package/dist/server/modules/butler/butler-control-session-service.js +173 -40
- package/dist/server/modules/butler/butler-control-session-service.js.map +1 -1
- package/dist/server/modules/butler/butler-control-timer-scheduler.d.ts +32 -0
- package/dist/server/modules/butler/butler-control-timer-scheduler.js +93 -0
- package/dist/server/modules/butler/butler-control-timer-scheduler.js.map +1 -0
- package/dist/server/modules/butler/butler-control-timer-service.d.ts +42 -0
- package/dist/server/modules/butler/butler-control-timer-service.js +132 -0
- package/dist/server/modules/butler/butler-control-timer-service.js.map +1 -0
- package/dist/server/modules/butler/butler-controller.d.ts +42 -2
- package/dist/server/modules/butler/butler-controller.js +79 -12
- package/dist/server/modules/butler/butler-controller.js.map +1 -1
- package/dist/server/modules/butler/butler-follow-up-evaluation-instruction-adapter.d.ts +2 -1
- package/dist/server/modules/butler/butler-follow-up-evaluation-instruction-adapter.js +27 -25
- package/dist/server/modules/butler/butler-follow-up-evaluation-instruction-adapter.js.map +1 -1
- package/dist/server/modules/butler/butler-follow-up-service.d.ts +41 -5
- package/dist/server/modules/butler/butler-follow-up-service.js +568 -371
- package/dist/server/modules/butler/butler-follow-up-service.js.map +1 -1
- package/dist/server/modules/butler/butler-inbox-analysis-service.d.ts +4 -1
- package/dist/server/modules/butler/butler-inbox-analysis-service.js +18 -4
- package/dist/server/modules/butler/butler-inbox-analysis-service.js.map +1 -1
- package/dist/server/modules/butler/butler-inbox-service.js +1 -0
- package/dist/server/modules/butler/butler-inbox-service.js.map +1 -1
- package/dist/server/modules/butler/butler-profile-service.js +2 -5
- package/dist/server/modules/butler/butler-profile-service.js.map +1 -1
- package/dist/server/modules/butler/butler-project-service.d.ts +3 -1
- package/dist/server/modules/butler/butler-project-service.js +7 -1
- package/dist/server/modules/butler/butler-project-service.js.map +1 -1
- package/dist/server/modules/butler/butler-session-service.d.ts +5 -1
- package/dist/server/modules/butler/butler-session-service.js +26 -1
- package/dist/server/modules/butler/butler-session-service.js.map +1 -1
- package/dist/server/modules/butler/butler-session-summary-service.js +2 -1
- package/dist/server/modules/butler/butler-session-summary-service.js.map +1 -1
- package/dist/server/modules/butler/butler-workspace-context.d.ts +4 -1
- package/dist/server/modules/butler/butler-workspace-context.js +204 -58
- package/dist/server/modules/butler/butler-workspace-context.js.map +1 -1
- package/dist/server/modules/butler/patrol-execution-service.js +2 -1
- package/dist/server/modules/butler/patrol-execution-service.js.map +1 -1
- package/dist/server/modules/butler/provider-adapter-registry.d.ts +3 -0
- package/dist/server/modules/butler/provider-adapter-registry.js +18 -1
- package/dist/server/modules/butler/provider-adapter-registry.js.map +1 -1
- package/dist/server/modules/butler/verification-run-service.d.ts +9 -2
- package/dist/server/modules/butler/verification-run-service.js +188 -34
- package/dist/server/modules/butler/verification-run-service.js.map +1 -1
- package/dist/server/modules/debug-target/debug-target-controller.js +1 -1
- package/dist/server/modules/debug-target/debug-target-controller.js.map +1 -1
- package/dist/server/modules/debug-target/debug-target-service.d.ts +7 -2
- package/dist/server/modules/debug-target/debug-target-service.js +563 -100
- package/dist/server/modules/debug-target/debug-target-service.js.map +1 -1
- package/dist/server/modules/git/git-command-helper-client.d.ts +1 -0
- package/dist/server/modules/git/git-command-helper-client.js +19 -26
- package/dist/server/modules/git/git-command-helper-client.js.map +1 -1
- package/dist/server/modules/git/git-command-runner.js +19 -1
- package/dist/server/modules/git/git-command-runner.js.map +1 -1
- package/dist/server/modules/preferences/profile-service.d.ts +3 -1
- package/dist/server/modules/preferences/profile-service.js +74 -3
- package/dist/server/modules/preferences/profile-service.js.map +1 -1
- package/dist/server/modules/provider/provider-controller.d.ts +1 -1
- package/dist/server/modules/provider/provider-controller.js.map +1 -1
- package/dist/server/modules/provider/provider-discovery-helper-client.d.ts +5 -3
- package/dist/server/modules/provider/provider-discovery-helper-client.js +129 -43
- package/dist/server/modules/provider/provider-discovery-helper-client.js.map +1 -1
- package/dist/server/modules/provider/provider-discovery-helper-process.js +44 -0
- package/dist/server/modules/provider/provider-discovery-helper-process.js.map +1 -1
- package/dist/server/modules/provider/provider-discovery-runtime.js +83 -3
- package/dist/server/modules/provider/provider-discovery-runtime.js.map +1 -1
- package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-identity-service.d.ts +10 -0
- package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-identity-service.js +48 -0
- package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-identity-service.js.map +1 -0
- package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-packets.d.ts +48 -0
- package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-packets.js +11 -0
- package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-packets.js.map +1 -0
- package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-protocol.d.ts +74 -0
- package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-protocol.js +302 -0
- package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-protocol.js.map +1 -0
- package/dist/server/modules/relay-tunnel/relay-tunnel-controller.d.ts +33 -0
- package/dist/server/modules/relay-tunnel/relay-tunnel-controller.js +57 -0
- package/dist/server/modules/relay-tunnel/relay-tunnel-controller.js.map +1 -0
- package/dist/server/modules/relay-tunnel/relay-tunnel-edge-proof.d.ts +9 -0
- package/dist/server/modules/relay-tunnel/relay-tunnel-edge-proof.js +25 -0
- package/dist/server/modules/relay-tunnel/relay-tunnel-edge-proof.js.map +1 -0
- package/dist/server/modules/relay-tunnel/relay-tunnel-gateway-service.d.ts +18 -0
- package/dist/server/modules/relay-tunnel/relay-tunnel-gateway-service.js +230 -0
- package/dist/server/modules/relay-tunnel/relay-tunnel-gateway-service.js.map +1 -0
- package/dist/server/modules/relay-tunnel/relay-tunnel-runtime-adapter.d.ts +41 -0
- package/dist/server/modules/relay-tunnel/relay-tunnel-runtime-adapter.js +443 -0
- package/dist/server/modules/relay-tunnel/relay-tunnel-runtime-adapter.js.map +1 -0
- package/dist/server/modules/relay-tunnel/relay-tunnel-service.d.ts +111 -0
- package/dist/server/modules/relay-tunnel/relay-tunnel-service.js +771 -0
- package/dist/server/modules/relay-tunnel/relay-tunnel-service.js.map +1 -0
- package/dist/server/modules/sessions/claude-runtime-helper-client.js +23 -1
- package/dist/server/modules/sessions/claude-runtime-helper-client.js.map +1 -1
- package/dist/server/modules/sessions/codex-app-server-helper-client.d.ts +2 -1
- package/dist/server/modules/sessions/codex-app-server-helper-client.js +78 -0
- package/dist/server/modules/sessions/codex-app-server-helper-client.js.map +1 -1
- package/dist/server/modules/sessions/codex-app-server-helper-process.js +84 -2
- package/dist/server/modules/sessions/codex-app-server-helper-process.js.map +1 -1
- package/dist/server/modules/sessions/provider-session-delete-cli.d.ts +15 -0
- package/dist/server/modules/sessions/provider-session-delete-cli.js +148 -0
- package/dist/server/modules/sessions/provider-session-delete-cli.js.map +1 -0
- package/dist/server/modules/sessions/session-controller.d.ts +4 -1
- package/dist/server/modules/sessions/session-controller.js +4 -0
- package/dist/server/modules/sessions/session-controller.js.map +1 -1
- package/dist/server/modules/sessions/session-history-service.d.ts +24 -1
- package/dist/server/modules/sessions/session-history-service.js +401 -42
- package/dist/server/modules/sessions/session-history-service.js.map +1 -1
- package/dist/server/modules/sessions/session-live-runtime-router-service.d.ts +25 -0
- package/dist/server/modules/sessions/session-live-runtime-router-service.js +42 -0
- package/dist/server/modules/sessions/session-live-runtime-router-service.js.map +1 -0
- package/dist/server/modules/sessions/session-live-runtime-service.d.ts +6 -0
- package/dist/server/modules/sessions/session-live-runtime-service.js +130 -28
- package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
- package/dist/server/modules/sessions/session-message-attachment-service.d.ts +1 -0
- package/dist/server/modules/sessions/session-message-attachment-service.js +22 -0
- package/dist/server/modules/sessions/session-message-attachment-service.js.map +1 -1
- package/dist/server/modules/sessions/session-message-origin-utils.d.ts +12 -0
- package/dist/server/modules/sessions/session-message-origin-utils.js +45 -0
- package/dist/server/modules/sessions/session-message-origin-utils.js.map +1 -0
- package/dist/server/modules/sessions/session-permission-request-service.d.ts +1 -0
- package/dist/server/modules/sessions/session-permission-request-service.js +367 -5
- package/dist/server/modules/sessions/session-permission-request-service.js.map +1 -1
- package/dist/server/modules/sessions/session-provider-error-mapper.js +32 -0
- package/dist/server/modules/sessions/session-provider-error-mapper.js.map +1 -1
- package/dist/server/modules/sessions/session-provider-usage-guard-service.d.ts +37 -0
- package/dist/server/modules/sessions/session-provider-usage-guard-service.js +179 -0
- package/dist/server/modules/sessions/session-provider-usage-guard-service.js.map +1 -0
- package/dist/server/modules/sessions/session-provider-usage-limit.d.ts +17 -0
- package/dist/server/modules/sessions/session-provider-usage-limit.js +465 -0
- package/dist/server/modules/sessions/session-provider-usage-limit.js.map +1 -0
- package/dist/server/modules/skills/assistant-runtime-skill-catalog.d.ts +8 -0
- package/dist/server/modules/skills/assistant-runtime-skill-catalog.js +26 -0
- package/dist/server/modules/skills/assistant-runtime-skill-catalog.js.map +1 -0
- package/dist/server/modules/skills/assistant-runtime-skill-cleanup.d.ts +9 -0
- package/dist/server/modules/skills/assistant-runtime-skill-cleanup.js +55 -0
- package/dist/server/modules/skills/assistant-runtime-skill-cleanup.js.map +1 -0
- package/dist/server/modules/skills/builtin-skill-service.js +1 -6
- package/dist/server/modules/skills/builtin-skill-service.js.map +1 -1
- package/dist/server/modules/skills/builtin-skills/codingns-assistant/SKILL.md +19 -12
- package/dist/server/modules/skills/builtin-skills/codingns-assistant/references/cli-workflow.md +9 -3
- package/dist/server/modules/skills/skill-controller.d.ts +2 -2
- package/dist/server/modules/skills/skill-controller.js +9 -1
- package/dist/server/modules/skills/skill-controller.js.map +1 -1
- package/dist/server/modules/skills/skill-manager-service.d.ts +26 -1
- package/dist/server/modules/skills/skill-manager-service.js +346 -90
- package/dist/server/modules/skills/skill-manager-service.js.map +1 -1
- package/dist/server/modules/skills/skill-name-policy.d.ts +2 -0
- package/dist/server/modules/skills/skill-name-policy.js +10 -0
- package/dist/server/modules/skills/skill-name-policy.js.map +1 -0
- package/dist/server/modules/tailscale/tailscale-service.d.ts +2 -0
- package/dist/server/modules/tailscale/tailscale-service.js +21 -8
- package/dist/server/modules/tailscale/tailscale-service.js.map +1 -1
- package/dist/server/modules/tasks/task-helper-client.d.ts +5 -2
- package/dist/server/modules/tasks/task-helper-client.js +118 -38
- package/dist/server/modules/tasks/task-helper-client.js.map +1 -1
- package/dist/server/modules/tasks/task-helper-process.js +94 -3
- package/dist/server/modules/tasks/task-helper-process.js.map +1 -1
- package/dist/server/modules/tasks/task-types.d.ts +6 -0
- package/dist/server/modules/tasks/task-types.js +7 -1
- package/dist/server/modules/tasks/task-types.js.map +1 -1
- package/dist/server/modules/terminal/command-template-service.d.ts +9 -0
- package/dist/server/modules/terminal/command-template-service.js +87 -5
- package/dist/server/modules/terminal/command-template-service.js.map +1 -1
- package/dist/server/modules/terminal/template-reverse-proxy-service.js +71 -3
- package/dist/server/modules/terminal/template-reverse-proxy-service.js.map +1 -1
- package/dist/server/modules/terminal/terminal-controller.d.ts +3 -0
- package/dist/server/modules/terminal/terminal-controller.js +41 -0
- package/dist/server/modules/terminal/terminal-controller.js.map +1 -1
- package/dist/server/modules/workbench/workbench-service.d.ts +3 -0
- package/dist/server/modules/workbench/workbench-service.js +4 -3
- package/dist/server/modules/workbench/workbench-service.js.map +1 -1
- package/dist/server/modules/workbench/workspace-file-watcher.d.ts +14 -6
- package/dist/server/modules/workbench/workspace-file-watcher.js +267 -57
- package/dist/server/modules/workbench/workspace-file-watcher.js.map +1 -1
- package/dist/server/modules/workbench/workspace-panel-snapshot-service.d.ts +2 -0
- package/dist/server/modules/workbench/workspace-panel-snapshot-service.js +32 -3
- package/dist/server/modules/workbench/workspace-panel-snapshot-service.js.map +1 -1
- package/dist/server/modules/worktree/worktree-manager.d.ts +9 -1
- package/dist/server/modules/worktree/worktree-manager.js +9 -1
- package/dist/server/modules/worktree/worktree-manager.js.map +1 -1
- package/dist/server/routes/assistant.js +49 -0
- package/dist/server/routes/assistant.js.map +1 -1
- package/dist/server/routes/auth.js +4 -0
- package/dist/server/routes/auth.js.map +1 -1
- package/dist/server/routes/butler.js +5 -0
- package/dist/server/routes/butler.js.map +1 -1
- package/dist/server/routes/sessions.js +1 -0
- package/dist/server/routes/sessions.js.map +1 -1
- package/dist/server/routes/system.d.ts +2 -1
- package/dist/server/routes/system.js +13 -1
- package/dist/server/routes/system.js.map +1 -1
- package/dist/server/server/create-server.d.ts +18 -0
- package/dist/server/server/create-server.js +113 -20
- package/dist/server/server/create-server.js.map +1 -1
- package/dist/server/shared/utils/tokens.d.ts +3 -1
- package/dist/server/shared/utils/tokens.js +9 -2
- package/dist/server/shared/utils/tokens.js.map +1 -1
- package/dist/server/storage/repositories/assistant-automation-run-repository.d.ts +12 -0
- package/dist/server/storage/repositories/assistant-automation-run-repository.js +139 -0
- package/dist/server/storage/repositories/assistant-automation-run-repository.js.map +1 -0
- package/dist/server/storage/repositories/assistant-automation-task-repository.d.ts +17 -0
- package/dist/server/storage/repositories/assistant-automation-task-repository.js +179 -0
- package/dist/server/storage/repositories/assistant-automation-task-repository.js.map +1 -0
- package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.d.ts +18 -0
- package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.js +191 -0
- package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.js.map +1 -0
- package/dist/server/storage/repositories/auth-device-repository.d.ts +22 -0
- package/dist/server/storage/repositories/auth-device-repository.js +97 -0
- package/dist/server/storage/repositories/auth-device-repository.js.map +1 -0
- package/dist/server/storage/repositories/auth-device-session-repository.d.ts +17 -0
- package/dist/server/storage/repositories/auth-device-session-repository.js +82 -0
- package/dist/server/storage/repositories/auth-device-session-repository.js.map +1 -0
- package/dist/server/storage/repositories/auth-login-event-repository.d.ts +9 -0
- package/dist/server/storage/repositories/auth-login-event-repository.js +53 -0
- package/dist/server/storage/repositories/auth-login-event-repository.js.map +1 -0
- package/dist/server/storage/repositories/auth-token-repository.d.ts +4 -0
- package/dist/server/storage/repositories/auth-token-repository.js +58 -5
- package/dist/server/storage/repositories/auth-token-repository.js.map +1 -1
- package/dist/server/storage/repositories/butler-control-session-repository.js +27 -3
- package/dist/server/storage/repositories/butler-control-session-repository.js.map +1 -1
- package/dist/server/storage/repositories/butler-control-timer-repository.d.ts +15 -0
- package/dist/server/storage/repositories/butler-control-timer-repository.js +157 -0
- package/dist/server/storage/repositories/butler-control-timer-repository.js.map +1 -0
- package/dist/server/storage/repositories/butler-follow-up-task-repository.js +21 -3
- package/dist/server/storage/repositories/butler-follow-up-task-repository.js.map +1 -1
- package/dist/server/storage/repositories/instance-relay-tunnel-identity-repository.d.ts +8 -0
- package/dist/server/storage/repositories/instance-relay-tunnel-identity-repository.js +52 -0
- package/dist/server/storage/repositories/instance-relay-tunnel-identity-repository.js.map +1 -0
- package/dist/server/storage/repositories/instance-relay-tunnel-repository.d.ts +10 -0
- package/dist/server/storage/repositories/instance-relay-tunnel-repository.js +153 -0
- package/dist/server/storage/repositories/instance-relay-tunnel-repository.js.map +1 -0
- package/dist/server/storage/repositories/instance-tailscale-repository.js +6 -3
- package/dist/server/storage/repositories/instance-tailscale-repository.js.map +1 -1
- package/dist/server/storage/repositories/managed-skill-repository.d.ts +2 -1
- package/dist/server/storage/repositories/managed-skill-repository.js +14 -4
- package/dist/server/storage/repositories/managed-skill-repository.js.map +1 -1
- package/dist/server/storage/repositories/session-message-attachment-repository.d.ts +2 -0
- package/dist/server/storage/repositories/session-message-attachment-repository.js +24 -0
- package/dist/server/storage/repositories/session-message-attachment-repository.js.map +1 -1
- package/dist/server/storage/repositories/user-preference-profile-repository.js +6 -3
- package/dist/server/storage/repositories/user-preference-profile-repository.js.map +1 -1
- package/dist/server/storage/sqlite/client.js +534 -2
- package/dist/server/storage/sqlite/client.js.map +1 -1
- package/dist/server/storage/sqlite/schema.sql +228 -4
- package/dist/server/types/domain.d.ts +170 -2
- package/dist/server/ws/workbench-ws-hub.d.ts +14 -8
- package/dist/server/ws/workbench-ws-hub.js +369 -209
- package/dist/server/ws/workbench-ws-hub.js.map +1 -1
- package/dist/server/ws/ws-auth-guard.js +1 -4
- package/dist/server/ws/ws-auth-guard.js.map +1 -1
- package/dist/server/ws/ws-server.d.ts +1 -1
- package/dist/server/ws/ws-server.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/codex-resume-history.d.ts +1 -0
- package/node_modules/@codingns/session-sync-core/dist/codex-resume-history.js +80 -0
- package/node_modules/@codingns/session-sync-core/dist/codex-resume-history.js.map +1 -0
- package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.d.ts +5 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js +122 -4
- package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/codex.d.ts +17 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +437 -51
- package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/gemini.d.ts +7 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js +240 -27
- package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/kimi.d.ts +5 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/kimi.js +108 -2
- package/node_modules/@codingns/session-sync-core/dist/providers/kimi.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/opencode.d.ts +3 -0
- package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js +101 -8
- package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/utils.d.ts +1 -0
- package/node_modules/@codingns/session-sync-core/dist/providers/utils.js +4 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/utils.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js +44 -0
- package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.d.ts +5 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +153 -60
- package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/types.d.ts +1 -0
- package/node_modules/@codingns/session-sync-core/dist/services.d.ts +1 -0
- package/node_modules/@codingns/session-sync-core/dist/services.js +24 -8
- package/node_modules/@codingns/session-sync-core/dist/services.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/types.d.ts +6 -0
- package/package.json +1 -1
- package/scripts/postinstall.mjs +0 -33
- package/dist/public/assets/index-BlOinYqR.js +0 -122
- package/dist/public/assets/index-Dg_7g6lA.css +0 -1
|
@@ -8,7 +8,10 @@ export function createDatabaseClient(databasePath) {
|
|
|
8
8
|
const db = new Database(databasePath);
|
|
9
9
|
const schemaPath = new URL("./schema.sql", import.meta.url);
|
|
10
10
|
const schema = fs.readFileSync(schemaPath, "utf8");
|
|
11
|
+
ensurePreSchemaCompatibility(db);
|
|
11
12
|
db.exec(schema);
|
|
13
|
+
ensureAuthTokenDeviceColumns(db);
|
|
14
|
+
ensureAuthDeviceSchema(db);
|
|
12
15
|
ensureAuthLoginAttemptSchema(db);
|
|
13
16
|
ensureWorkspaceRemovalColumn(db);
|
|
14
17
|
ensureWorkspaceSortOrderColumn(db);
|
|
@@ -32,20 +35,117 @@ export function createDatabaseClient(databasePath) {
|
|
|
32
35
|
ensurePortLeaseSchema(db);
|
|
33
36
|
ensureRuntimeBindingSchema(db);
|
|
34
37
|
ensureAiFallbackEditSchema(db);
|
|
38
|
+
ensureInstanceTailscaleConfigSchema(db);
|
|
35
39
|
ensureInstanceTailscaleStatusSchema(db);
|
|
40
|
+
ensureInstanceRelayTunnelConfigSchema(db);
|
|
36
41
|
ensureTerminalCommandTemplateDebugSchema(db);
|
|
37
42
|
ensureTerminalInstanceDebugSchema(db);
|
|
38
43
|
ensureUserPreferenceProfileSchema(db);
|
|
39
44
|
ensureButlerProfileSchema(db);
|
|
40
45
|
ensureButlerControlSessionSchema(db);
|
|
46
|
+
ensureButlerControlTimerSchema(db);
|
|
47
|
+
ensureAssistantAutomationSchema(db);
|
|
48
|
+
ensureAssistantSandboxSchema(db);
|
|
41
49
|
ensureButlerInboxSchema(db);
|
|
42
50
|
ensureButlerFollowUpTaskSchema(db);
|
|
51
|
+
ensureVerificationRunSchema(db);
|
|
43
52
|
ensureButlerSessionSummarySchema(db);
|
|
44
53
|
return {
|
|
45
54
|
db,
|
|
46
55
|
close: () => db.close()
|
|
47
56
|
};
|
|
48
57
|
}
|
|
58
|
+
function ensurePreSchemaCompatibility(db) {
|
|
59
|
+
// 旧库还没有这些列时,schema.sql 里的索引会先炸掉,所以必须先补齐。
|
|
60
|
+
ensureAuthTokenDeviceColumns(db);
|
|
61
|
+
ensureManagedSkillScopeSchema(db);
|
|
62
|
+
}
|
|
63
|
+
function ensureAuthTokenDeviceColumns(db) {
|
|
64
|
+
if (!tableExists(db, "auth_tokens")) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const columns = db
|
|
68
|
+
.prepare("PRAGMA table_info(auth_tokens)")
|
|
69
|
+
.all();
|
|
70
|
+
const columnNames = new Set(columns.map((column) => column.name));
|
|
71
|
+
if (!columnNames.has("device_session_id")) {
|
|
72
|
+
db.exec("ALTER TABLE auth_tokens ADD COLUMN device_session_id TEXT");
|
|
73
|
+
}
|
|
74
|
+
if (!columnNames.has("caller_kind")) {
|
|
75
|
+
db.exec("ALTER TABLE auth_tokens ADD COLUMN caller_kind TEXT CHECK (caller_kind IN ('interactive_user', 'assistant_runtime'))");
|
|
76
|
+
}
|
|
77
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_auth_tokens_device_session_id ON auth_tokens(device_session_id)");
|
|
78
|
+
}
|
|
79
|
+
function tableExists(db, tableName) {
|
|
80
|
+
const row = db
|
|
81
|
+
.prepare(`SELECT name
|
|
82
|
+
FROM sqlite_master
|
|
83
|
+
WHERE type = 'table' AND name = ?`)
|
|
84
|
+
.get(tableName);
|
|
85
|
+
return row?.name === tableName;
|
|
86
|
+
}
|
|
87
|
+
function ensureAuthDeviceSchema(db) {
|
|
88
|
+
db.exec(`
|
|
89
|
+
CREATE TABLE IF NOT EXISTS auth_devices (
|
|
90
|
+
id TEXT PRIMARY KEY,
|
|
91
|
+
user_id TEXT NOT NULL,
|
|
92
|
+
client_type TEXT NOT NULL CHECK (client_type IN ('desktop', 'web', 'ios', 'android', 'unknown')),
|
|
93
|
+
client_instance_id TEXT,
|
|
94
|
+
display_name TEXT,
|
|
95
|
+
user_agent TEXT,
|
|
96
|
+
is_primary INTEGER NOT NULL DEFAULT 0 CHECK (is_primary IN (0, 1)),
|
|
97
|
+
last_source_address TEXT,
|
|
98
|
+
last_seen_at TEXT NOT NULL,
|
|
99
|
+
primary_set_at TEXT,
|
|
100
|
+
created_at TEXT NOT NULL,
|
|
101
|
+
updated_at TEXT NOT NULL,
|
|
102
|
+
FOREIGN KEY (user_id) REFERENCES auth_users(id)
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
CREATE INDEX IF NOT EXISTS idx_auth_devices_user_id
|
|
106
|
+
ON auth_devices(user_id, updated_at DESC);
|
|
107
|
+
CREATE INDEX IF NOT EXISTS idx_auth_devices_client_lookup
|
|
108
|
+
ON auth_devices(user_id, client_type, client_instance_id);
|
|
109
|
+
|
|
110
|
+
CREATE TABLE IF NOT EXISTS auth_device_sessions (
|
|
111
|
+
id TEXT PRIMARY KEY,
|
|
112
|
+
user_id TEXT NOT NULL,
|
|
113
|
+
device_id TEXT,
|
|
114
|
+
access_token_id TEXT,
|
|
115
|
+
refresh_token_id TEXT,
|
|
116
|
+
revoked_at TEXT,
|
|
117
|
+
created_at TEXT NOT NULL,
|
|
118
|
+
updated_at TEXT NOT NULL,
|
|
119
|
+
FOREIGN KEY (user_id) REFERENCES auth_users(id),
|
|
120
|
+
FOREIGN KEY (device_id) REFERENCES auth_devices(id)
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
CREATE INDEX IF NOT EXISTS idx_auth_device_sessions_user_id
|
|
124
|
+
ON auth_device_sessions(user_id, updated_at DESC);
|
|
125
|
+
CREATE INDEX IF NOT EXISTS idx_auth_device_sessions_device_id
|
|
126
|
+
ON auth_device_sessions(device_id, updated_at DESC);
|
|
127
|
+
|
|
128
|
+
CREATE TABLE IF NOT EXISTS auth_login_events (
|
|
129
|
+
id TEXT PRIMARY KEY,
|
|
130
|
+
user_id TEXT NOT NULL,
|
|
131
|
+
device_id TEXT,
|
|
132
|
+
client_type TEXT NOT NULL CHECK (client_type IN ('desktop', 'web', 'ios', 'android', 'unknown')),
|
|
133
|
+
source_address TEXT,
|
|
134
|
+
occurred_at TEXT NOT NULL,
|
|
135
|
+
FOREIGN KEY (user_id) REFERENCES auth_users(id),
|
|
136
|
+
FOREIGN KEY (device_id) REFERENCES auth_devices(id)
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
CREATE INDEX IF NOT EXISTS idx_auth_login_events_user_id
|
|
140
|
+
ON auth_login_events(user_id, occurred_at DESC);
|
|
141
|
+
`);
|
|
142
|
+
const authDeviceColumns = db
|
|
143
|
+
.prepare("PRAGMA table_info(auth_devices)")
|
|
144
|
+
.all();
|
|
145
|
+
if (!authDeviceColumns.some((column) => column.name === "user_agent")) {
|
|
146
|
+
db.exec("ALTER TABLE auth_devices ADD COLUMN user_agent TEXT");
|
|
147
|
+
}
|
|
148
|
+
}
|
|
49
149
|
function ensureAuthLoginAttemptSchema(db) {
|
|
50
150
|
const columns = db
|
|
51
151
|
.prepare("PRAGMA table_info(auth_login_attempts)")
|
|
@@ -197,10 +297,99 @@ function ensureUserPreferenceProfileSchema(db) {
|
|
|
197
297
|
const columns = db
|
|
198
298
|
.prepare("PRAGMA table_info(user_preference_profiles)")
|
|
199
299
|
.all();
|
|
200
|
-
if (columns.length === 0
|
|
300
|
+
if (columns.length === 0) {
|
|
201
301
|
return;
|
|
202
302
|
}
|
|
203
|
-
|
|
303
|
+
const columnNames = new Set(columns.map((column) => column.name));
|
|
304
|
+
if (!columnNames.has("auto_theme")) {
|
|
305
|
+
db.exec("ALTER TABLE user_preference_profiles ADD COLUMN auto_theme INTEGER NOT NULL DEFAULT 0 CHECK (auto_theme IN (0, 1))");
|
|
306
|
+
}
|
|
307
|
+
if (!columnNames.has("debug_port_pools_json")) {
|
|
308
|
+
db.exec(`ALTER TABLE user_preference_profiles
|
|
309
|
+
ADD COLUMN debug_port_pools_json TEXT NOT NULL DEFAULT '{"start":43000,"end":47999}'`);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
function ensureManagedSkillScopeSchema(db) {
|
|
313
|
+
if (!tableExists(db, "managed_skills")) {
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
const columns = db
|
|
317
|
+
.prepare("PRAGMA table_info(managed_skills)")
|
|
318
|
+
.all();
|
|
319
|
+
const columnNames = new Set(columns.map((column) => column.name));
|
|
320
|
+
const tableSqlRow = db
|
|
321
|
+
.prepare(`SELECT sql
|
|
322
|
+
FROM sqlite_master
|
|
323
|
+
WHERE type = 'table'
|
|
324
|
+
AND name = 'managed_skills'`)
|
|
325
|
+
.get();
|
|
326
|
+
const tableSql = tableSqlRow?.sql ?? "";
|
|
327
|
+
const needsRebuild = !columnNames.has("scope")
|
|
328
|
+
|| tableSql.includes("directory_name TEXT NOT NULL UNIQUE")
|
|
329
|
+
|| !tableSql.includes("UNIQUE(scope, directory_name)");
|
|
330
|
+
if (!needsRebuild) {
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
db.exec("DROP INDEX IF EXISTS idx_managed_skills_state");
|
|
334
|
+
db.exec("PRAGMA foreign_keys = OFF");
|
|
335
|
+
try {
|
|
336
|
+
db.exec("BEGIN");
|
|
337
|
+
db.exec(`
|
|
338
|
+
CREATE TABLE managed_skills__next (
|
|
339
|
+
id TEXT PRIMARY KEY,
|
|
340
|
+
name TEXT NOT NULL,
|
|
341
|
+
scope TEXT NOT NULL CHECK (scope IN ('workspace', 'assistant')),
|
|
342
|
+
directory_name TEXT NOT NULL,
|
|
343
|
+
source_type TEXT NOT NULL CHECK (source_type IN ('builtin', 'local-import', 'managed-copy')),
|
|
344
|
+
source_path TEXT,
|
|
345
|
+
content_hash TEXT NOT NULL,
|
|
346
|
+
managed_state TEXT NOT NULL CHECK (managed_state IN ('active', 'conflicted', 'missing')),
|
|
347
|
+
created_at TEXT NOT NULL,
|
|
348
|
+
updated_at TEXT NOT NULL,
|
|
349
|
+
UNIQUE(scope, directory_name)
|
|
350
|
+
);
|
|
351
|
+
`);
|
|
352
|
+
db.exec(`
|
|
353
|
+
INSERT INTO managed_skills__next (
|
|
354
|
+
id,
|
|
355
|
+
name,
|
|
356
|
+
scope,
|
|
357
|
+
directory_name,
|
|
358
|
+
source_type,
|
|
359
|
+
source_path,
|
|
360
|
+
content_hash,
|
|
361
|
+
managed_state,
|
|
362
|
+
created_at,
|
|
363
|
+
updated_at
|
|
364
|
+
)
|
|
365
|
+
SELECT
|
|
366
|
+
id,
|
|
367
|
+
name,
|
|
368
|
+
'workspace',
|
|
369
|
+
directory_name,
|
|
370
|
+
source_type,
|
|
371
|
+
source_path,
|
|
372
|
+
content_hash,
|
|
373
|
+
managed_state,
|
|
374
|
+
created_at,
|
|
375
|
+
updated_at
|
|
376
|
+
FROM managed_skills;
|
|
377
|
+
`);
|
|
378
|
+
db.exec("DROP TABLE managed_skills");
|
|
379
|
+
db.exec("ALTER TABLE managed_skills__next RENAME TO managed_skills");
|
|
380
|
+
db.exec("COMMIT");
|
|
381
|
+
}
|
|
382
|
+
catch (error) {
|
|
383
|
+
db.exec("ROLLBACK");
|
|
384
|
+
throw error;
|
|
385
|
+
}
|
|
386
|
+
finally {
|
|
387
|
+
db.exec("PRAGMA foreign_keys = ON");
|
|
388
|
+
}
|
|
389
|
+
db.exec(`
|
|
390
|
+
CREATE INDEX IF NOT EXISTS idx_managed_skills_state
|
|
391
|
+
ON managed_skills(scope, managed_state, updated_at DESC);
|
|
392
|
+
`);
|
|
204
393
|
}
|
|
205
394
|
function ensureButlerControlSessionSchema(db) {
|
|
206
395
|
const columns = db
|
|
@@ -219,6 +408,306 @@ function ensureButlerControlSessionSchema(db) {
|
|
|
219
408
|
if (!columnNames.has("source_item_id")) {
|
|
220
409
|
db.exec("ALTER TABLE butler_control_sessions ADD COLUMN source_item_id TEXT");
|
|
221
410
|
}
|
|
411
|
+
if (!columnNames.has("model")) {
|
|
412
|
+
db.exec("ALTER TABLE butler_control_sessions ADD COLUMN model TEXT");
|
|
413
|
+
}
|
|
414
|
+
if (!columnNames.has("reasoning_level")) {
|
|
415
|
+
db.exec("ALTER TABLE butler_control_sessions ADD COLUMN reasoning_level TEXT");
|
|
416
|
+
}
|
|
417
|
+
if (!columnNames.has("permission_mode")) {
|
|
418
|
+
db.exec("ALTER TABLE butler_control_sessions ADD COLUMN permission_mode TEXT");
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
function ensureButlerControlTimerSchema(db) {
|
|
422
|
+
const columns = db
|
|
423
|
+
.prepare("PRAGMA table_info(butler_control_timers)")
|
|
424
|
+
.all();
|
|
425
|
+
if (columns.length > 0) {
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
db.exec(`
|
|
429
|
+
CREATE TABLE IF NOT EXISTS butler_control_timers (
|
|
430
|
+
id TEXT PRIMARY KEY,
|
|
431
|
+
control_session_id TEXT NOT NULL,
|
|
432
|
+
session_id TEXT NOT NULL,
|
|
433
|
+
user_id TEXT NOT NULL,
|
|
434
|
+
project_id TEXT,
|
|
435
|
+
target_session_id TEXT,
|
|
436
|
+
title TEXT,
|
|
437
|
+
content TEXT NOT NULL,
|
|
438
|
+
due_at TEXT NOT NULL,
|
|
439
|
+
status TEXT NOT NULL CHECK (status IN ('active', 'completed', 'cancelled', 'failed')),
|
|
440
|
+
triggered_at TEXT,
|
|
441
|
+
last_error TEXT,
|
|
442
|
+
created_at TEXT NOT NULL,
|
|
443
|
+
updated_at TEXT NOT NULL,
|
|
444
|
+
cancelled_at TEXT,
|
|
445
|
+
FOREIGN KEY (control_session_id) REFERENCES butler_control_sessions(id) ON DELETE CASCADE,
|
|
446
|
+
FOREIGN KEY (session_id) REFERENCES session_bindings(session_id) ON DELETE CASCADE,
|
|
447
|
+
FOREIGN KEY (user_id) REFERENCES auth_users(id) ON DELETE CASCADE
|
|
448
|
+
);
|
|
449
|
+
|
|
450
|
+
CREATE INDEX IF NOT EXISTS idx_butler_control_timers_status_due_at
|
|
451
|
+
ON butler_control_timers(status, due_at ASC, updated_at ASC);
|
|
452
|
+
CREATE INDEX IF NOT EXISTS idx_butler_control_timers_session
|
|
453
|
+
ON butler_control_timers(control_session_id, status, updated_at DESC);
|
|
454
|
+
`);
|
|
455
|
+
}
|
|
456
|
+
function ensureAssistantAutomationSchema(db) {
|
|
457
|
+
const taskColumns = db
|
|
458
|
+
.prepare("PRAGMA table_info(assistant_automation_tasks)")
|
|
459
|
+
.all();
|
|
460
|
+
const runColumns = db
|
|
461
|
+
.prepare("PRAGMA table_info(assistant_automation_runs)")
|
|
462
|
+
.all();
|
|
463
|
+
if (taskColumns.length > 0 && runColumns.length > 0) {
|
|
464
|
+
return;
|
|
465
|
+
}
|
|
466
|
+
db.exec(`
|
|
467
|
+
CREATE TABLE IF NOT EXISTS assistant_automation_tasks (
|
|
468
|
+
id TEXT PRIMARY KEY,
|
|
469
|
+
user_id TEXT NOT NULL,
|
|
470
|
+
control_session_id TEXT NOT NULL,
|
|
471
|
+
project_id TEXT,
|
|
472
|
+
title TEXT,
|
|
473
|
+
trigger_type TEXT NOT NULL CHECK (trigger_type IN ('once', 'interval', 'cron', 'condition')),
|
|
474
|
+
trigger_config_json TEXT NOT NULL,
|
|
475
|
+
action_type TEXT NOT NULL CHECK (action_type IN ('send_control_message')),
|
|
476
|
+
action_config_json TEXT NOT NULL,
|
|
477
|
+
status TEXT NOT NULL CHECK (status IN ('active', 'paused', 'completed', 'cancelled', 'failed')),
|
|
478
|
+
next_run_at TEXT,
|
|
479
|
+
last_run_at TEXT,
|
|
480
|
+
last_run_summary TEXT,
|
|
481
|
+
last_error TEXT,
|
|
482
|
+
created_at TEXT NOT NULL,
|
|
483
|
+
updated_at TEXT NOT NULL,
|
|
484
|
+
cancelled_at TEXT,
|
|
485
|
+
FOREIGN KEY (control_session_id) REFERENCES butler_control_sessions(id) ON DELETE CASCADE,
|
|
486
|
+
FOREIGN KEY (user_id) REFERENCES auth_users(id) ON DELETE CASCADE
|
|
487
|
+
);
|
|
488
|
+
|
|
489
|
+
CREATE INDEX IF NOT EXISTS idx_assistant_automation_tasks_status_next_run_at
|
|
490
|
+
ON assistant_automation_tasks(status, next_run_at ASC, updated_at ASC);
|
|
491
|
+
CREATE INDEX IF NOT EXISTS idx_assistant_automation_tasks_session
|
|
492
|
+
ON assistant_automation_tasks(control_session_id, status, updated_at DESC);
|
|
493
|
+
|
|
494
|
+
CREATE TABLE IF NOT EXISTS assistant_automation_runs (
|
|
495
|
+
id TEXT PRIMARY KEY,
|
|
496
|
+
automation_id TEXT NOT NULL,
|
|
497
|
+
run_seq INTEGER NOT NULL,
|
|
498
|
+
trigger_type TEXT NOT NULL CHECK (trigger_type IN ('once', 'interval', 'cron', 'condition')),
|
|
499
|
+
trigger_snapshot_json TEXT NOT NULL,
|
|
500
|
+
action_type TEXT NOT NULL CHECK (action_type IN ('send_control_message')),
|
|
501
|
+
action_snapshot_json TEXT NOT NULL,
|
|
502
|
+
status TEXT NOT NULL CHECK (status IN ('queued', 'running', 'succeeded', 'failed', 'cancelled', 'skipped')),
|
|
503
|
+
summary TEXT,
|
|
504
|
+
error TEXT,
|
|
505
|
+
scheduled_at TEXT NOT NULL,
|
|
506
|
+
started_at TEXT,
|
|
507
|
+
finished_at TEXT,
|
|
508
|
+
created_at TEXT NOT NULL,
|
|
509
|
+
FOREIGN KEY (automation_id) REFERENCES assistant_automation_tasks(id) ON DELETE CASCADE
|
|
510
|
+
);
|
|
511
|
+
|
|
512
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_assistant_automation_runs_seq
|
|
513
|
+
ON assistant_automation_runs(automation_id, run_seq);
|
|
514
|
+
CREATE INDEX IF NOT EXISTS idx_assistant_automation_runs_created_at
|
|
515
|
+
ON assistant_automation_runs(automation_id, created_at DESC);
|
|
516
|
+
`);
|
|
517
|
+
}
|
|
518
|
+
function ensureAssistantSandboxSchema(db) {
|
|
519
|
+
const columns = db
|
|
520
|
+
.prepare("PRAGMA table_info(assistant_sandboxes)")
|
|
521
|
+
.all();
|
|
522
|
+
if (columns.length > 0) {
|
|
523
|
+
const columnNames = new Set(columns.map((column) => column.name));
|
|
524
|
+
const tableSql = db
|
|
525
|
+
.prepare("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'assistant_sandboxes'")
|
|
526
|
+
.get()?.sql ?? "";
|
|
527
|
+
const needsStatusConstraintRebuild = !tableSql.includes("'orphaned'");
|
|
528
|
+
if (needsStatusConstraintRebuild) {
|
|
529
|
+
const hasControlSessionId = columnNames.has("control_session_id");
|
|
530
|
+
const rebuild = db.transaction(() => {
|
|
531
|
+
db.exec("ALTER TABLE assistant_sandboxes RENAME TO assistant_sandboxes_legacy");
|
|
532
|
+
db.exec(`
|
|
533
|
+
CREATE TABLE assistant_sandboxes (
|
|
534
|
+
id TEXT PRIMARY KEY,
|
|
535
|
+
user_id TEXT NOT NULL,
|
|
536
|
+
workspace_id TEXT NOT NULL UNIQUE,
|
|
537
|
+
control_session_id TEXT,
|
|
538
|
+
title TEXT NOT NULL,
|
|
539
|
+
description TEXT,
|
|
540
|
+
source_kind TEXT NOT NULL CHECK (source_kind IN ('blank', 'clone')),
|
|
541
|
+
source_ref TEXT,
|
|
542
|
+
visibility TEXT NOT NULL CHECK (visibility IN ('assistant_only', 'pinned')),
|
|
543
|
+
status TEXT NOT NULL CHECK (status IN ('active', 'archived', 'expired', 'orphaned', 'deleted')),
|
|
544
|
+
purpose TEXT,
|
|
545
|
+
expires_at TEXT,
|
|
546
|
+
promoted_at TEXT,
|
|
547
|
+
created_at TEXT NOT NULL,
|
|
548
|
+
updated_at TEXT NOT NULL,
|
|
549
|
+
FOREIGN KEY (user_id) REFERENCES auth_users(id) ON DELETE CASCADE,
|
|
550
|
+
FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE,
|
|
551
|
+
FOREIGN KEY (control_session_id) REFERENCES butler_control_sessions(id) ON DELETE SET NULL
|
|
552
|
+
);
|
|
553
|
+
`);
|
|
554
|
+
db.exec(`
|
|
555
|
+
INSERT INTO assistant_sandboxes (
|
|
556
|
+
id,
|
|
557
|
+
user_id,
|
|
558
|
+
workspace_id,
|
|
559
|
+
control_session_id,
|
|
560
|
+
title,
|
|
561
|
+
description,
|
|
562
|
+
source_kind,
|
|
563
|
+
source_ref,
|
|
564
|
+
visibility,
|
|
565
|
+
status,
|
|
566
|
+
purpose,
|
|
567
|
+
expires_at,
|
|
568
|
+
promoted_at,
|
|
569
|
+
created_at,
|
|
570
|
+
updated_at
|
|
571
|
+
)
|
|
572
|
+
SELECT
|
|
573
|
+
id,
|
|
574
|
+
user_id,
|
|
575
|
+
workspace_id,
|
|
576
|
+
${hasControlSessionId ? "control_session_id" : "NULL"},
|
|
577
|
+
title,
|
|
578
|
+
description,
|
|
579
|
+
source_kind,
|
|
580
|
+
source_ref,
|
|
581
|
+
visibility,
|
|
582
|
+
status,
|
|
583
|
+
purpose,
|
|
584
|
+
expires_at,
|
|
585
|
+
promoted_at,
|
|
586
|
+
created_at,
|
|
587
|
+
updated_at
|
|
588
|
+
FROM assistant_sandboxes_legacy;
|
|
589
|
+
`);
|
|
590
|
+
db.exec("DROP TABLE assistant_sandboxes_legacy");
|
|
591
|
+
});
|
|
592
|
+
rebuild();
|
|
593
|
+
}
|
|
594
|
+
else if (!columnNames.has("control_session_id")) {
|
|
595
|
+
db.exec("ALTER TABLE assistant_sandboxes ADD COLUMN control_session_id TEXT");
|
|
596
|
+
}
|
|
597
|
+
db.exec(`
|
|
598
|
+
CREATE INDEX IF NOT EXISTS idx_assistant_sandboxes_user_status
|
|
599
|
+
ON assistant_sandboxes(user_id, status, updated_at DESC);
|
|
600
|
+
CREATE INDEX IF NOT EXISTS idx_assistant_sandboxes_workspace
|
|
601
|
+
ON assistant_sandboxes(workspace_id, status, updated_at DESC);
|
|
602
|
+
CREATE INDEX IF NOT EXISTS idx_assistant_sandboxes_control_session
|
|
603
|
+
ON assistant_sandboxes(control_session_id, status, updated_at DESC);
|
|
604
|
+
`);
|
|
605
|
+
return;
|
|
606
|
+
}
|
|
607
|
+
db.exec(`
|
|
608
|
+
CREATE TABLE IF NOT EXISTS assistant_sandboxes (
|
|
609
|
+
id TEXT PRIMARY KEY,
|
|
610
|
+
user_id TEXT NOT NULL,
|
|
611
|
+
workspace_id TEXT NOT NULL UNIQUE,
|
|
612
|
+
control_session_id TEXT,
|
|
613
|
+
title TEXT NOT NULL,
|
|
614
|
+
description TEXT,
|
|
615
|
+
source_kind TEXT NOT NULL CHECK (source_kind IN ('blank', 'clone')),
|
|
616
|
+
source_ref TEXT,
|
|
617
|
+
visibility TEXT NOT NULL CHECK (visibility IN ('assistant_only', 'pinned')),
|
|
618
|
+
status TEXT NOT NULL CHECK (status IN ('active', 'archived', 'expired', 'orphaned', 'deleted')),
|
|
619
|
+
purpose TEXT,
|
|
620
|
+
expires_at TEXT,
|
|
621
|
+
promoted_at TEXT,
|
|
622
|
+
created_at TEXT NOT NULL,
|
|
623
|
+
updated_at TEXT NOT NULL,
|
|
624
|
+
FOREIGN KEY (user_id) REFERENCES auth_users(id) ON DELETE CASCADE,
|
|
625
|
+
FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE,
|
|
626
|
+
FOREIGN KEY (control_session_id) REFERENCES butler_control_sessions(id) ON DELETE SET NULL
|
|
627
|
+
);
|
|
628
|
+
|
|
629
|
+
CREATE INDEX IF NOT EXISTS idx_assistant_sandboxes_user_status
|
|
630
|
+
ON assistant_sandboxes(user_id, status, updated_at DESC);
|
|
631
|
+
CREATE INDEX IF NOT EXISTS idx_assistant_sandboxes_workspace
|
|
632
|
+
ON assistant_sandboxes(workspace_id, status, updated_at DESC);
|
|
633
|
+
CREATE INDEX IF NOT EXISTS idx_assistant_sandboxes_control_session
|
|
634
|
+
ON assistant_sandboxes(control_session_id, status, updated_at DESC);
|
|
635
|
+
`);
|
|
636
|
+
}
|
|
637
|
+
function ensureVerificationRunSchema(db) {
|
|
638
|
+
const verificationRunSql = readTableSql(db, "verification_runs");
|
|
639
|
+
if (!verificationRunSql.includes("status IN ('queued', 'running', 'passed', 'failed', 'skipped')")) {
|
|
640
|
+
return;
|
|
641
|
+
}
|
|
642
|
+
db.exec(`
|
|
643
|
+
PRAGMA foreign_keys = OFF;
|
|
644
|
+
|
|
645
|
+
CREATE TABLE verification_runs_next (
|
|
646
|
+
id TEXT PRIMARY KEY,
|
|
647
|
+
project_id TEXT NOT NULL,
|
|
648
|
+
butler_session_id TEXT,
|
|
649
|
+
source_patrol_run_id TEXT,
|
|
650
|
+
verification_type TEXT NOT NULL CHECK (
|
|
651
|
+
verification_type IN ('test', 'health', 'browser', 'visual', 'metric')
|
|
652
|
+
),
|
|
653
|
+
status TEXT NOT NULL CHECK (
|
|
654
|
+
status IN ('queued', 'running', 'passed', 'failed', 'skipped', 'cancelled')
|
|
655
|
+
),
|
|
656
|
+
target_ref TEXT,
|
|
657
|
+
spec_json TEXT NOT NULL,
|
|
658
|
+
artifact_refs_json TEXT NOT NULL,
|
|
659
|
+
result_json TEXT NOT NULL,
|
|
660
|
+
summary TEXT,
|
|
661
|
+
started_at TEXT,
|
|
662
|
+
finished_at TEXT,
|
|
663
|
+
created_at TEXT NOT NULL,
|
|
664
|
+
FOREIGN KEY (project_id) REFERENCES butler_projects(id) ON DELETE CASCADE,
|
|
665
|
+
FOREIGN KEY (butler_session_id) REFERENCES butler_sessions(id)
|
|
666
|
+
);
|
|
667
|
+
|
|
668
|
+
INSERT INTO verification_runs_next (
|
|
669
|
+
id,
|
|
670
|
+
project_id,
|
|
671
|
+
butler_session_id,
|
|
672
|
+
source_patrol_run_id,
|
|
673
|
+
verification_type,
|
|
674
|
+
status,
|
|
675
|
+
target_ref,
|
|
676
|
+
spec_json,
|
|
677
|
+
artifact_refs_json,
|
|
678
|
+
result_json,
|
|
679
|
+
summary,
|
|
680
|
+
started_at,
|
|
681
|
+
finished_at,
|
|
682
|
+
created_at
|
|
683
|
+
)
|
|
684
|
+
SELECT
|
|
685
|
+
id,
|
|
686
|
+
project_id,
|
|
687
|
+
butler_session_id,
|
|
688
|
+
source_patrol_run_id,
|
|
689
|
+
verification_type,
|
|
690
|
+
status,
|
|
691
|
+
target_ref,
|
|
692
|
+
spec_json,
|
|
693
|
+
artifact_refs_json,
|
|
694
|
+
result_json,
|
|
695
|
+
summary,
|
|
696
|
+
started_at,
|
|
697
|
+
finished_at,
|
|
698
|
+
created_at
|
|
699
|
+
FROM verification_runs;
|
|
700
|
+
|
|
701
|
+
DROP TABLE verification_runs;
|
|
702
|
+
ALTER TABLE verification_runs_next RENAME TO verification_runs;
|
|
703
|
+
|
|
704
|
+
CREATE INDEX IF NOT EXISTS idx_verification_runs_project_created_at
|
|
705
|
+
ON verification_runs(project_id, created_at DESC);
|
|
706
|
+
CREATE INDEX IF NOT EXISTS idx_verification_runs_project_status
|
|
707
|
+
ON verification_runs(project_id, status, created_at DESC);
|
|
708
|
+
|
|
709
|
+
PRAGMA foreign_keys = ON;
|
|
710
|
+
`);
|
|
222
711
|
}
|
|
223
712
|
function ensureButlerInboxSchema(db) {
|
|
224
713
|
const columns = db
|
|
@@ -246,6 +735,15 @@ function ensureButlerFollowUpTaskSchema(db) {
|
|
|
246
735
|
if (!columnNames.has("rounds_json")) {
|
|
247
736
|
db.exec("ALTER TABLE butler_follow_up_tasks ADD COLUMN rounds_json TEXT NOT NULL DEFAULT '[]'");
|
|
248
737
|
}
|
|
738
|
+
if (!columnNames.has("provider_id")) {
|
|
739
|
+
db.exec("ALTER TABLE butler_follow_up_tasks ADD COLUMN provider_id TEXT NOT NULL DEFAULT 'codex'");
|
|
740
|
+
}
|
|
741
|
+
if (!columnNames.has("assistant_butler_session_id")) {
|
|
742
|
+
db.exec("ALTER TABLE butler_follow_up_tasks ADD COLUMN assistant_butler_session_id TEXT NOT NULL DEFAULT ''");
|
|
743
|
+
}
|
|
744
|
+
if (!columnNames.has("assistant_session_id")) {
|
|
745
|
+
db.exec("ALTER TABLE butler_follow_up_tasks ADD COLUMN assistant_session_id TEXT NOT NULL DEFAULT ''");
|
|
746
|
+
}
|
|
249
747
|
}
|
|
250
748
|
function ensureButlerSessionSummarySchema(db) {
|
|
251
749
|
const columns = db
|
|
@@ -265,6 +763,40 @@ function ensureInstanceTailscaleStatusSchema(db) {
|
|
|
265
763
|
}
|
|
266
764
|
db.exec("ALTER TABLE instance_tailscale_status ADD COLUMN account_name TEXT");
|
|
267
765
|
}
|
|
766
|
+
function ensureInstanceTailscaleConfigSchema(db) {
|
|
767
|
+
const columns = db
|
|
768
|
+
.prepare("PRAGMA table_info(instance_tailscale_config)")
|
|
769
|
+
.all();
|
|
770
|
+
if (columns.length === 0 || columns.some((column) => column.name === "activated")) {
|
|
771
|
+
return;
|
|
772
|
+
}
|
|
773
|
+
db.exec("ALTER TABLE instance_tailscale_config ADD COLUMN activated INTEGER NOT NULL DEFAULT 0 CHECK (activated IN (0, 1))");
|
|
774
|
+
db.exec("UPDATE instance_tailscale_config SET activated = enabled");
|
|
775
|
+
}
|
|
776
|
+
function ensureInstanceRelayTunnelConfigSchema(db) {
|
|
777
|
+
const columns = db
|
|
778
|
+
.prepare("PRAGMA table_info(instance_relay_tunnel_config)")
|
|
779
|
+
.all();
|
|
780
|
+
if (columns.length === 0) {
|
|
781
|
+
return;
|
|
782
|
+
}
|
|
783
|
+
if (!columns.some((column) => column.name === "activated")) {
|
|
784
|
+
db.exec("ALTER TABLE instance_relay_tunnel_config ADD COLUMN activated INTEGER NOT NULL DEFAULT 0 CHECK (activated IN (0, 1))");
|
|
785
|
+
db.exec("UPDATE instance_relay_tunnel_config SET activated = enabled");
|
|
786
|
+
}
|
|
787
|
+
if (!columns.some((column) => column.name === "control_access_token_ciphertext")) {
|
|
788
|
+
db.exec("ALTER TABLE instance_relay_tunnel_config ADD COLUMN control_access_token_ciphertext TEXT");
|
|
789
|
+
}
|
|
790
|
+
if (!columns.some((column) => column.name === "control_account_email")) {
|
|
791
|
+
db.exec("ALTER TABLE instance_relay_tunnel_config ADD COLUMN control_account_email TEXT");
|
|
792
|
+
}
|
|
793
|
+
if (!columns.some((column) => column.name === "control_session_expires_at")) {
|
|
794
|
+
db.exec("ALTER TABLE instance_relay_tunnel_config ADD COLUMN control_session_expires_at TEXT");
|
|
795
|
+
}
|
|
796
|
+
if (!columns.some((column) => column.name === "local_target_source")) {
|
|
797
|
+
db.exec("ALTER TABLE instance_relay_tunnel_config ADD COLUMN local_target_source TEXT NOT NULL DEFAULT 'default' CHECK (local_target_source IN ('default', 'custom'))");
|
|
798
|
+
}
|
|
799
|
+
}
|
|
268
800
|
function ensureSessionProviderSchema(db) {
|
|
269
801
|
const bindingSql = readTableSql(db, "session_bindings");
|
|
270
802
|
const indexSql = readTableSql(db, "session_indices");
|