@opendash-ai/cli 0.1.0-beta.1
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/Dockerfile +18 -0
- package/README.md +15 -0
- package/analysis.py +171 -0
- package/bin/opendash +180 -0
- package/bunfig.toml +7 -0
- package/drizzle.config.ts +10 -0
- package/git +0 -0
- package/migration/20260127222353_familiar_lady_ursula/migration.sql +90 -0
- package/migration/20260127222353_familiar_lady_ursula/snapshot.json +796 -0
- package/migration/20260211171708_add_project_commands/migration.sql +1 -0
- package/migration/20260211171708_add_project_commands/snapshot.json +806 -0
- package/migration/20260213144116_wakeful_the_professor/migration.sql +11 -0
- package/migration/20260213144116_wakeful_the_professor/snapshot.json +897 -0
- package/migration/20260225215848_workspace/migration.sql +7 -0
- package/migration/20260225215848_workspace/snapshot.json +959 -0
- package/migration/20260227213759_add_session_workspace_id/migration.sql +2 -0
- package/migration/20260227213759_add_session_workspace_id/snapshot.json +983 -0
- package/migration/20260228203230_blue_harpoon/migration.sql +17 -0
- package/migration/20260228203230_blue_harpoon/snapshot.json +1102 -0
- package/migration/20260303231226_add_workspace_fields/migration.sql +5 -0
- package/migration/20260303231226_add_workspace_fields/snapshot.json +1013 -0
- package/migration/20260309230000_move_org_to_state/migration.sql +3 -0
- package/migration/20260309230000_move_org_to_state/snapshot.json +1156 -0
- package/migration/20260312043431_session_message_cursor/migration.sql +4 -0
- package/migration/20260312043431_session_message_cursor/snapshot.json +1168 -0
- package/migration/20260323234822_events/migration.sql +13 -0
- package/migration/20260323234822_events/snapshot.json +1271 -0
- package/migration/20260410174513_workspace-name/migration.sql +16 -0
- package/migration/20260410174513_workspace-name/snapshot.json +1271 -0
- package/migration/20260413175956_chief_energizer/migration.sql +13 -0
- package/migration/20260413175956_chief_energizer/snapshot.json +1399 -0
- package/migration/20260422160000_context_inheritance/migration.sql +3 -0
- package/migration/20260422170000_task_registry/migration.sql +18 -0
- package/migration/20260423145421_remove_session_entry/migration.sql +4 -0
- package/migration/20260515000000_actor_rename/migration.sql +7 -0
- package/migration/20260515010000_memory_fts/migration.sql +33 -0
- package/migration/20260515020000_user_task/migration.sql +29 -0
- package/migration/20260519000000_last_checkpoint_message_id/migration.sql +1 -0
- package/migration/20260521000000_message_agent_id/migration.sql +2 -0
- package/migration/20260521000100_actor_registry_v6/migration.sql +25 -0
- package/migration/20260521010000_memory_fts_v6/migration.sql +33 -0
- package/migration/20260521020000_memory_fts_triggers/migration.sql +17 -0
- package/migration/20260526000000_agent_id_main/migration.sql +14 -0
- package/migration/20260527000000_actor_lifecycle/migration.sql +8 -0
- package/migration/20260527000100_inbox/migration.sql +12 -0
- package/migration/20260529000000_task_todo_redesign/migration.sql +16 -0
- package/migration/20260603000000_task_in_progress_owner/migration.sql +1 -0
- package/migration/20260603000000_workflow_run/migration.sql +17 -0
- package/migration/20260604000000_workflow_script_sha/migration.sql +1 -0
- package/migration/20260608000000_claude_import/migration.sql +7 -0
- package/migration/20260608010000_claude_import_message_ids/migration.sql +1 -0
- package/migration/20260609000000_history_fts/migration.sql +29 -0
- package/migration/20260609230000_workflow_agent_timeout/migration.sql +1 -0
- package/migration/20260612000000_external_import/migration.sql +16 -0
- package/package.json +218 -0
- package/parsers-config.ts +290 -0
- package/script/build.ts +337 -0
- package/script/build_noinstall.ts +337 -0
- package/script/check-migrations.ts +16 -0
- package/script/dev.ts +38 -0
- package/script/fds-upload.ts +170 -0
- package/script/fix-node-pty.ts +28 -0
- package/script/generate.ts +23 -0
- package/script/postinstall.mjs +102 -0
- package/script/publish.ts +75 -0
- package/script/run-workspace-server +106 -0
- package/script/schema.ts +63 -0
- package/script/time.ts +6 -0
- package/script/trace-imports.ts +153 -0
- package/script/upgrade-opentui.ts +64 -0
- package/src/account/account.sql.ts +39 -0
- package/src/account/account.ts +456 -0
- package/src/account/repo.ts +166 -0
- package/src/account/schema.ts +99 -0
- package/src/account/url.ts +8 -0
- package/src/acp/README.md +174 -0
- package/src/acp/agent.ts +1787 -0
- package/src/acp/session.ts +116 -0
- package/src/acp/types.ts +24 -0
- package/src/actor/actor.sql.ts +38 -0
- package/src/actor/events.ts +67 -0
- package/src/actor/index.ts +2 -0
- package/src/actor/registry.ts +412 -0
- package/src/actor/return-header.ts +24 -0
- package/src/actor/schema.ts +47 -0
- package/src/actor/spawn-ref.ts +16 -0
- package/src/actor/spawn.ts +756 -0
- package/src/actor/turn.ts +49 -0
- package/src/actor/waiter.ts +166 -0
- package/src/agent/agent.ts +574 -0
- package/src/agent/config.ts +5 -0
- package/src/agent/generate.txt +75 -0
- package/src/agent/prompt/checkpoint-writer.txt +167 -0
- package/src/agent/prompt/compaction.txt +9 -0
- package/src/agent/prompt/distill.txt +199 -0
- package/src/agent/prompt/dream.txt +155 -0
- package/src/agent/prompt/explore.txt +18 -0
- package/src/agent/prompt/summary.txt +11 -0
- package/src/agent/prompt/title.txt +44 -0
- package/src/audio.d.ts +9 -0
- package/src/auth/index.ts +97 -0
- package/src/bus/bus-event.ts +33 -0
- package/src/bus/global.ts +12 -0
- package/src/bus/index.ts +193 -0
- package/src/cli/bootstrap.ts +33 -0
- package/src/cli/cmd/account.ts +258 -0
- package/src/cli/cmd/acp.ts +70 -0
- package/src/cli/cmd/agent.ts +248 -0
- package/src/cli/cmd/cmd.ts +7 -0
- package/src/cli/cmd/db.ts +120 -0
- package/src/cli/cmd/debug/agent.ts +192 -0
- package/src/cli/cmd/debug/config.ts +17 -0
- package/src/cli/cmd/debug/file.ts +100 -0
- package/src/cli/cmd/debug/index.ts +48 -0
- package/src/cli/cmd/debug/lsp.ts +61 -0
- package/src/cli/cmd/debug/ripgrep.ts +105 -0
- package/src/cli/cmd/debug/scrap.ts +16 -0
- package/src/cli/cmd/debug/skill.ts +23 -0
- package/src/cli/cmd/debug/snapshot.ts +53 -0
- package/src/cli/cmd/export.ts +306 -0
- package/src/cli/cmd/generate.ts +50 -0
- package/src/cli/cmd/github.ts +1647 -0
- package/src/cli/cmd/import.ts +208 -0
- package/src/cli/cmd/mcp.ts +812 -0
- package/src/cli/cmd/models.ts +88 -0
- package/src/cli/cmd/plug.ts +233 -0
- package/src/cli/cmd/pr.ts +138 -0
- package/src/cli/cmd/providers.ts +713 -0
- package/src/cli/cmd/run-completion.ts +77 -0
- package/src/cli/cmd/run.ts +694 -0
- package/src/cli/cmd/serve.ts +30 -0
- package/src/cli/cmd/session.ts +181 -0
- package/src/cli/cmd/stats.ts +413 -0
- package/src/cli/cmd/tui/app.tsx +1140 -0
- package/src/cli/cmd/tui/asset/TEN_VAD_LICENSE +12 -0
- package/src/cli/cmd/tui/asset/charge.wav +0 -0
- package/src/cli/cmd/tui/asset/pulse-a.wav +0 -0
- package/src/cli/cmd/tui/asset/pulse-b.wav +0 -0
- package/src/cli/cmd/tui/asset/pulse-c.wav +0 -0
- package/src/cli/cmd/tui/asset/ten_vad.wasm +0 -0
- package/src/cli/cmd/tui/asset/ten_vad_loader.js +30 -0
- package/src/cli/cmd/tui/attach.ts +84 -0
- package/src/cli/cmd/tui/component/background-image.tsx +150 -0
- package/src/cli/cmd/tui/component/bg-pulse.tsx +130 -0
- package/src/cli/cmd/tui/component/border.tsx +21 -0
- package/src/cli/cmd/tui/component/dialog-agent.tsx +31 -0
- package/src/cli/cmd/tui/component/dialog-agreement.tsx +111 -0
- package/src/cli/cmd/tui/component/dialog-command.tsx +219 -0
- package/src/cli/cmd/tui/component/dialog-console-org.tsx +103 -0
- package/src/cli/cmd/tui/component/dialog-go-upsell.tsx +157 -0
- package/src/cli/cmd/tui/component/dialog-image-list.tsx +111 -0
- package/src/cli/cmd/tui/component/dialog-logo-design.tsx +37 -0
- package/src/cli/cmd/tui/component/dialog-mcp.tsx +86 -0
- package/src/cli/cmd/tui/component/dialog-mimo-login.tsx +165 -0
- package/src/cli/cmd/tui/component/dialog-model.tsx +335 -0
- package/src/cli/cmd/tui/component/dialog-provider.tsx +449 -0
- package/src/cli/cmd/tui/component/dialog-session-delete-failed.tsx +101 -0
- package/src/cli/cmd/tui/component/dialog-session-list.tsx +269 -0
- package/src/cli/cmd/tui/component/dialog-session-rename.tsx +31 -0
- package/src/cli/cmd/tui/component/dialog-skill.tsx +42 -0
- package/src/cli/cmd/tui/component/dialog-stash.tsx +87 -0
- package/src/cli/cmd/tui/component/dialog-status.tsx +170 -0
- package/src/cli/cmd/tui/component/dialog-tag.tsx +44 -0
- package/src/cli/cmd/tui/component/dialog-theme-list.tsx +50 -0
- package/src/cli/cmd/tui/component/dialog-token-plan.tsx +77 -0
- package/src/cli/cmd/tui/component/dialog-variant.tsx +39 -0
- package/src/cli/cmd/tui/component/dialog-workflows.tsx +51 -0
- package/src/cli/cmd/tui/component/dialog-workspace-create.tsx +289 -0
- package/src/cli/cmd/tui/component/dialog-workspace-unavailable.tsx +81 -0
- package/src/cli/cmd/tui/component/dialog-worktree.tsx +90 -0
- package/src/cli/cmd/tui/component/error-component.tsx +92 -0
- package/src/cli/cmd/tui/component/logo.tsx +961 -0
- package/src/cli/cmd/tui/component/plugin-route-missing.tsx +14 -0
- package/src/cli/cmd/tui/component/prompt/autocomplete-detect.ts +34 -0
- package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +668 -0
- package/src/cli/cmd/tui/component/prompt/cwd.ts +0 -0
- package/src/cli/cmd/tui/component/prompt/frecency.tsx +90 -0
- package/src/cli/cmd/tui/component/prompt/history.tsx +108 -0
- package/src/cli/cmd/tui/component/prompt/index.tsx +1917 -0
- package/src/cli/cmd/tui/component/prompt/offset.ts +45 -0
- package/src/cli/cmd/tui/component/prompt/part.ts +36 -0
- package/src/cli/cmd/tui/component/prompt/shimmer.ts +62 -0
- package/src/cli/cmd/tui/component/prompt/stash.tsx +101 -0
- package/src/cli/cmd/tui/component/spinner.tsx +24 -0
- package/src/cli/cmd/tui/component/starry-background.tsx +305 -0
- package/src/cli/cmd/tui/component/startup-loading.tsx +67 -0
- package/src/cli/cmd/tui/component/task-item.tsx +63 -0
- package/src/cli/cmd/tui/component/textarea-keybindings.ts +73 -0
- package/src/cli/cmd/tui/component/todo-item.tsx +32 -0
- package/src/cli/cmd/tui/component/workflow-tree.tsx +177 -0
- package/src/cli/cmd/tui/config/cwd.ts +5 -0
- package/src/cli/cmd/tui/config/tui-migrate.ts +151 -0
- package/src/cli/cmd/tui/config/tui-schema.ts +38 -0
- package/src/cli/cmd/tui/config/tui.ts +219 -0
- package/src/cli/cmd/tui/context/args.tsx +16 -0
- package/src/cli/cmd/tui/context/directory.ts +15 -0
- package/src/cli/cmd/tui/context/event.ts +45 -0
- package/src/cli/cmd/tui/context/exit.tsx +65 -0
- package/src/cli/cmd/tui/context/helper.tsx +25 -0
- package/src/cli/cmd/tui/context/keybind.tsx +105 -0
- package/src/cli/cmd/tui/context/kv.tsx +86 -0
- package/src/cli/cmd/tui/context/language.tsx +91 -0
- package/src/cli/cmd/tui/context/local.tsx +469 -0
- package/src/cli/cmd/tui/context/plugin-keybinds.ts +41 -0
- package/src/cli/cmd/tui/context/project.tsx +109 -0
- package/src/cli/cmd/tui/context/prompt.tsx +18 -0
- package/src/cli/cmd/tui/context/route.tsx +68 -0
- package/src/cli/cmd/tui/context/sdk.tsx +150 -0
- package/src/cli/cmd/tui/context/sync.tsx +884 -0
- package/src/cli/cmd/tui/context/theme/aura.json +69 -0
- package/src/cli/cmd/tui/context/theme/ayu.json +80 -0
- package/src/cli/cmd/tui/context/theme/carbonfox.json +248 -0
- package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +230 -0
- package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +230 -0
- package/src/cli/cmd/tui/context/theme/catppuccin.json +112 -0
- package/src/cli/cmd/tui/context/theme/cobalt2.json +225 -0
- package/src/cli/cmd/tui/context/theme/cursor.json +249 -0
- package/src/cli/cmd/tui/context/theme/dracula.json +219 -0
- package/src/cli/cmd/tui/context/theme/everforest.json +241 -0
- package/src/cli/cmd/tui/context/theme/flexoki.json +237 -0
- package/src/cli/cmd/tui/context/theme/github.json +233 -0
- package/src/cli/cmd/tui/context/theme/gruvbox.json +242 -0
- package/src/cli/cmd/tui/context/theme/kanagawa.json +77 -0
- package/src/cli/cmd/tui/context/theme/lucent-orng.json +234 -0
- package/src/cli/cmd/tui/context/theme/material.json +235 -0
- package/src/cli/cmd/tui/context/theme/matrix.json +77 -0
- package/src/cli/cmd/tui/context/theme/mercury.json +252 -0
- package/src/cli/cmd/tui/context/theme/monokai.json +221 -0
- package/src/cli/cmd/tui/context/theme/nightowl.json +221 -0
- package/src/cli/cmd/tui/context/theme/nord.json +223 -0
- package/src/cli/cmd/tui/context/theme/one-dark.json +84 -0
- package/src/cli/cmd/tui/context/theme/opendash.json +243 -0
- package/src/cli/cmd/tui/context/theme/orng.json +249 -0
- package/src/cli/cmd/tui/context/theme/osaka-jade.json +93 -0
- package/src/cli/cmd/tui/context/theme/palenight.json +222 -0
- package/src/cli/cmd/tui/context/theme/rosepine.json +234 -0
- package/src/cli/cmd/tui/context/theme/solarized.json +223 -0
- package/src/cli/cmd/tui/context/theme/synthwave84.json +226 -0
- package/src/cli/cmd/tui/context/theme/tokyonight.json +243 -0
- package/src/cli/cmd/tui/context/theme/vercel.json +245 -0
- package/src/cli/cmd/tui/context/theme/vesper.json +218 -0
- package/src/cli/cmd/tui/context/theme/zenburn.json +223 -0
- package/src/cli/cmd/tui/context/theme.tsx +1299 -0
- package/src/cli/cmd/tui/context/thinking.ts +48 -0
- package/src/cli/cmd/tui/context/tui-config.tsx +9 -0
- package/src/cli/cmd/tui/event.ts +56 -0
- package/src/cli/cmd/tui/feature-plugins/home/footer.tsx +93 -0
- package/src/cli/cmd/tui/feature-plugins/home/tips-view.tsx +194 -0
- package/src/cli/cmd/tui/feature-plugins/home/tips.tsx +54 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/context.tsx +114 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/cwd.tsx +45 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/files.tsx +62 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/footer.tsx +93 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/goal.tsx +84 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/instructions.tsx +54 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/lsp.tsx +66 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/mcp.tsx +98 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/task.tsx +95 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/todo.tsx +51 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/tps.ts +31 -0
- package/src/cli/cmd/tui/feature-plugins/system/plugins.tsx +274 -0
- package/src/cli/cmd/tui/i18n/en.ts +470 -0
- package/src/cli/cmd/tui/i18n/es.ts +508 -0
- package/src/cli/cmd/tui/i18n/fr.ts +515 -0
- package/src/cli/cmd/tui/i18n/ja.ts +463 -0
- package/src/cli/cmd/tui/i18n/locales.ts +82 -0
- package/src/cli/cmd/tui/i18n/ru.ts +527 -0
- package/src/cli/cmd/tui/i18n/slash-command.ts +11 -0
- package/src/cli/cmd/tui/i18n/zh.ts +459 -0
- package/src/cli/cmd/tui/i18n/zht.ts +430 -0
- package/src/cli/cmd/tui/layer.ts +6 -0
- package/src/cli/cmd/tui/plugin/api.tsx +402 -0
- package/src/cli/cmd/tui/plugin/index.ts +3 -0
- package/src/cli/cmd/tui/plugin/internal.ts +35 -0
- package/src/cli/cmd/tui/plugin/runtime.ts +1057 -0
- package/src/cli/cmd/tui/plugin/slots.tsx +60 -0
- package/src/cli/cmd/tui/routes/home.tsx +172 -0
- package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +76 -0
- package/src/cli/cmd/tui/routes/session/dialog-message.tsx +116 -0
- package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +47 -0
- package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +47 -0
- package/src/cli/cmd/tui/routes/session/footer.tsx +91 -0
- package/src/cli/cmd/tui/routes/session/index.tsx +3087 -0
- package/src/cli/cmd/tui/routes/session/permission.tsx +697 -0
- package/src/cli/cmd/tui/routes/session/question.tsx +488 -0
- package/src/cli/cmd/tui/routes/session/sidebar.tsx +109 -0
- package/src/cli/cmd/tui/routes/session/subagent-footer.tsx +143 -0
- package/src/cli/cmd/tui/thread.ts +323 -0
- package/src/cli/cmd/tui/ui/dialog-alert.tsx +61 -0
- package/src/cli/cmd/tui/ui/dialog-confirm.tsx +95 -0
- package/src/cli/cmd/tui/ui/dialog-export-options.tsx +223 -0
- package/src/cli/cmd/tui/ui/dialog-help.tsx +42 -0
- package/src/cli/cmd/tui/ui/dialog-prompt.tsx +123 -0
- package/src/cli/cmd/tui/ui/dialog-select.tsx +467 -0
- package/src/cli/cmd/tui/ui/dialog.tsx +207 -0
- package/src/cli/cmd/tui/ui/link.tsx +28 -0
- package/src/cli/cmd/tui/ui/spinner.ts +386 -0
- package/src/cli/cmd/tui/ui/toast.tsx +102 -0
- package/src/cli/cmd/tui/util/clipboard.ts +203 -0
- package/src/cli/cmd/tui/util/editor.ts +36 -0
- package/src/cli/cmd/tui/util/image-protocol.ts +35 -0
- package/src/cli/cmd/tui/util/index.ts +6 -0
- package/src/cli/cmd/tui/util/model.ts +23 -0
- package/src/cli/cmd/tui/util/pinyin.ts +20 -0
- package/src/cli/cmd/tui/util/provider-origin.ts +7 -0
- package/src/cli/cmd/tui/util/revert-diff.ts +18 -0
- package/src/cli/cmd/tui/util/scroll.ts +23 -0
- package/src/cli/cmd/tui/util/selection.ts +23 -0
- package/src/cli/cmd/tui/util/signal.ts +71 -0
- package/src/cli/cmd/tui/util/sound.ts +154 -0
- package/src/cli/cmd/tui/util/system-locale.ts +209 -0
- package/src/cli/cmd/tui/util/terminal.ts +110 -0
- package/src/cli/cmd/tui/util/transcript.ts +112 -0
- package/src/cli/cmd/tui/util/vad.ts +229 -0
- package/src/cli/cmd/tui/util/voice.ts +595 -0
- package/src/cli/cmd/tui/win32.ts +130 -0
- package/src/cli/cmd/tui/worker.ts +104 -0
- package/src/cli/cmd/uninstall.ts +351 -0
- package/src/cli/cmd/upgrade.ts +79 -0
- package/src/cli/cmd/web.ts +96 -0
- package/src/cli/effect/prompt.ts +25 -0
- package/src/cli/error.ts +82 -0
- package/src/cli/heap.ts +59 -0
- package/src/cli/i18n.ts +15 -0
- package/src/cli/logo.ts +52 -0
- package/src/cli/network.ts +68 -0
- package/src/cli/ui.ts +133 -0
- package/src/cli/upgrade.ts +41 -0
- package/src/command/index.ts +276 -0
- package/src/command/template/initialize.txt +66 -0
- package/src/command/template/review.txt +101 -0
- package/src/config/agent.ts +197 -0
- package/src/config/command.ts +69 -0
- package/src/config/compose.ts +26 -0
- package/src/config/config.ts +1052 -0
- package/src/config/console-state.ts +16 -0
- package/src/config/entry-name.ts +16 -0
- package/src/config/error.ts +21 -0
- package/src/config/formatter.ts +17 -0
- package/src/config/history.ts +21 -0
- package/src/config/index.ts +17 -0
- package/src/config/keybinds.ts +127 -0
- package/src/config/layout.ts +10 -0
- package/src/config/lsp.ts +45 -0
- package/src/config/managed.ts +70 -0
- package/src/config/markdown.ts +97 -0
- package/src/config/mcp.ts +172 -0
- package/src/config/model-id.ts +14 -0
- package/src/config/parse.ts +44 -0
- package/src/config/paths.ts +73 -0
- package/src/config/permission.ts +76 -0
- package/src/config/plugin.ts +88 -0
- package/src/config/provider.ts +118 -0
- package/src/config/server.ts +20 -0
- package/src/config/skills.ts +16 -0
- package/src/config/variable.ts +90 -0
- package/src/control-plane/adaptors/index.ts +52 -0
- package/src/control-plane/adaptors/worktree.ts +47 -0
- package/src/control-plane/dev/debug-workspace-plugin.ts +73 -0
- package/src/control-plane/schema.ts +19 -0
- package/src/control-plane/sse.ts +66 -0
- package/src/control-plane/types.ts +34 -0
- package/src/control-plane/util.ts +37 -0
- package/src/control-plane/workspace-context.ts +26 -0
- package/src/control-plane/workspace.sql.ts +17 -0
- package/src/control-plane/workspace.ts +615 -0
- package/src/effect/app-runtime.ts +146 -0
- package/src/effect/bootstrap-runtime.ts +33 -0
- package/src/effect/bridge.ts +48 -0
- package/src/effect/cross-spawn-spawner.ts +514 -0
- package/src/effect/index.ts +5 -0
- package/src/effect/instance-ref.ts +11 -0
- package/src/effect/instance-registry.ts +12 -0
- package/src/effect/instance-state.ts +81 -0
- package/src/effect/logger.ts +73 -0
- package/src/effect/memo-map.ts +3 -0
- package/src/effect/observability.ts +107 -0
- package/src/effect/run-service.ts +52 -0
- package/src/effect/runner.ts +210 -0
- package/src/effect/runtime.ts +19 -0
- package/src/env/index.ts +37 -0
- package/src/file/ignore.ts +81 -0
- package/src/file/index.ts +664 -0
- package/src/file/protected.ts +59 -0
- package/src/file/ripgrep.ts +485 -0
- package/src/file/watcher.ts +163 -0
- package/src/flag/flag.ts +212 -0
- package/src/format/formatter.ts +403 -0
- package/src/format/index.ts +203 -0
- package/src/git/index.ts +260 -0
- package/src/global/index.ts +54 -0
- package/src/history/backfill.ts +162 -0
- package/src/history/extract.ts +67 -0
- package/src/history/fts-query.ts +15 -0
- package/src/history/fts.sql.ts +20 -0
- package/src/history/index.ts +10 -0
- package/src/history/resolve.ts +65 -0
- package/src/history/service.ts +258 -0
- package/src/history/writer.ts +112 -0
- package/src/id/id.ts +87 -0
- package/src/ide/index.ts +73 -0
- package/src/inbox/inbox-ref.ts +38 -0
- package/src/inbox/inbox.sql.ts +26 -0
- package/src/inbox/inbox.ts +223 -0
- package/src/inbox/index.ts +3 -0
- package/src/inbox/render.ts +40 -0
- package/src/index.ts +261 -0
- package/src/installation/index.ts +362 -0
- package/src/installation/version.ts +32 -0
- package/src/intelligence/AUDIT.md +292 -0
- package/src/intelligence/ENTERPRISE-CAPABILITIES.md +317 -0
- package/src/intelligence/ENTERPRISE-REVIEW.md +284 -0
- package/src/intelligence/IMPLEMENTATION.md +214 -0
- package/src/intelligence/PHASE1.md +178 -0
- package/src/intelligence/PHASE2.5.md +162 -0
- package/src/intelligence/PHASE2.md +150 -0
- package/src/intelligence/PHASE3-REFINED.md +257 -0
- package/src/intelligence/PHASE3.md +188 -0
- package/src/intelligence/README.md +260 -0
- package/src/intelligence/analytics/SKILL.md +369 -0
- package/src/intelligence/analytics/adapters/index.ts +77 -0
- package/src/intelligence/analytics/benchmarks/observable-runner.ts +575 -0
- package/src/intelligence/analytics/benchmarks/runner.ts +758 -0
- package/src/intelligence/analytics/engine/index.ts +152 -0
- package/src/intelligence/analytics/hook.ts +154 -0
- package/src/intelligence/analytics/index.ts +194 -0
- package/src/intelligence/analytics/loader/index.ts +502 -0
- package/src/intelligence/analytics/memory/index.ts +455 -0
- package/src/intelligence/analytics/orchestrator/index.ts +329 -0
- package/src/intelligence/analytics/planner/index.ts +188 -0
- package/src/intelligence/analytics/prompt/index.ts +449 -0
- package/src/intelligence/analytics/reasoning/enterprise-capabilities.ts +534 -0
- package/src/intelligence/analytics/reasoning/enterprise-prompt.ts +321 -0
- package/src/intelligence/analytics/reasoning/index.ts +267 -0
- package/src/intelligence/analytics/reasoning/test.ts +166 -0
- package/src/intelligence/analytics/reasoning/visible-reasoning.ts +609 -0
- package/src/intelligence/analytics/registry/index.ts +176 -0
- package/src/intelligence/analytics/router/index.ts +352 -0
- package/src/intelligence/analytics/test.ts +127 -0
- package/src/intelligence/analytics/workflow/index.ts +375 -0
- package/src/intelligence/index.ts +50 -0
- package/src/lsp/client.ts +249 -0
- package/src/lsp/diagnostic.ts +29 -0
- package/src/lsp/index.ts +3 -0
- package/src/lsp/language.ts +120 -0
- package/src/lsp/launch.ts +21 -0
- package/src/lsp/lsp.ts +519 -0
- package/src/lsp/server.ts +1956 -0
- package/src/mcp/auth.ts +144 -0
- package/src/mcp/index.ts +939 -0
- package/src/mcp/oauth-callback.ts +236 -0
- package/src/mcp/oauth-provider.ts +214 -0
- package/src/memory/fts-query.ts +37 -0
- package/src/memory/fts.sql.ts +19 -0
- package/src/memory/index.ts +1 -0
- package/src/memory/paths.ts +116 -0
- package/src/memory/reconcile.ts +144 -0
- package/src/memory/service.ts +144 -0
- package/src/metrics/client.ts +40 -0
- package/src/metrics/event.ts +43 -0
- package/src/metrics/index.ts +5 -0
- package/src/metrics/installation.ts +18 -0
- package/src/metrics/subscriber.ts +58 -0
- package/src/metrics/util.ts +9 -0
- package/src/node.ts +6 -0
- package/src/npm/config.ts +0 -0
- package/src/npm/index.ts +293 -0
- package/src/npmcli-config.d.ts +43 -0
- package/src/patch/index.ts +680 -0
- package/src/permission/arity.ts +163 -0
- package/src/permission/evaluate.ts +15 -0
- package/src/permission/index.ts +382 -0
- package/src/permission/schema.ts +17 -0
- package/src/plugin/checkpoint-splitover.ts +60 -0
- package/src/plugin/cloudflare.ts +76 -0
- package/src/plugin/codex.ts +611 -0
- package/src/plugin/github-copilot/copilot.ts +368 -0
- package/src/plugin/github-copilot/models.ts +153 -0
- package/src/plugin/index.ts +637 -0
- package/src/plugin/install.ts +439 -0
- package/src/plugin/loader.ts +216 -0
- package/src/plugin/matcher.ts +33 -0
- package/src/plugin/meta.ts +188 -0
- package/src/plugin/mimo.ts +296 -0
- package/src/plugin/shared.ts +323 -0
- package/src/plugin/subagent-progress-checker.ts +147 -0
- package/src/project/bootstrap.ts +59 -0
- package/src/project/index.ts +2 -0
- package/src/project/instance.ts +215 -0
- package/src/project/project-id.ts +48 -0
- package/src/project/project.sql.ts +16 -0
- package/src/project/project.ts +522 -0
- package/src/project/schema.ts +15 -0
- package/src/project/vcs.ts +227 -0
- package/src/project/workspace-trust.ts +67 -0
- package/src/provider/auth.ts +234 -0
- package/src/provider/error.ts +216 -0
- package/src/provider/index.ts +5 -0
- package/src/provider/models.ts +180 -0
- package/src/provider/provider.ts +1788 -0
- package/src/provider/schema.ts +36 -0
- package/src/provider/sdk/copilot/README.md +5 -0
- package/src/provider/sdk/copilot/chat/convert-to-openai-compatible-chat-messages.ts +170 -0
- package/src/provider/sdk/copilot/chat/get-response-metadata.ts +15 -0
- package/src/provider/sdk/copilot/chat/map-openai-compatible-finish-reason.ts +19 -0
- package/src/provider/sdk/copilot/chat/openai-compatible-api-types.ts +64 -0
- package/src/provider/sdk/copilot/chat/openai-compatible-chat-language-model.ts +815 -0
- package/src/provider/sdk/copilot/chat/openai-compatible-chat-options.ts +28 -0
- package/src/provider/sdk/copilot/chat/openai-compatible-metadata-extractor.ts +44 -0
- package/src/provider/sdk/copilot/chat/openai-compatible-prepare-tools.ts +83 -0
- package/src/provider/sdk/copilot/copilot-provider.ts +100 -0
- package/src/provider/sdk/copilot/index.ts +2 -0
- package/src/provider/sdk/copilot/openai-compatible-error.ts +27 -0
- package/src/provider/sdk/copilot/responses/convert-to-openai-responses-input.ts +335 -0
- package/src/provider/sdk/copilot/responses/map-openai-responses-finish-reason.ts +22 -0
- package/src/provider/sdk/copilot/responses/openai-config.ts +18 -0
- package/src/provider/sdk/copilot/responses/openai-error.ts +22 -0
- package/src/provider/sdk/copilot/responses/openai-responses-api-types.ts +214 -0
- package/src/provider/sdk/copilot/responses/openai-responses-language-model.ts +1770 -0
- package/src/provider/sdk/copilot/responses/openai-responses-prepare-tools.ts +173 -0
- package/src/provider/sdk/copilot/responses/openai-responses-settings.ts +1 -0
- package/src/provider/sdk/copilot/responses/tool/code-interpreter.ts +87 -0
- package/src/provider/sdk/copilot/responses/tool/file-search.ts +127 -0
- package/src/provider/sdk/copilot/responses/tool/image-generation.ts +114 -0
- package/src/provider/sdk/copilot/responses/tool/local-shell.ts +64 -0
- package/src/provider/sdk/copilot/responses/tool/web-search-preview.ts +103 -0
- package/src/provider/sdk/copilot/responses/tool/web-search.ts +102 -0
- package/src/provider/transform.ts +1376 -0
- package/src/pty/index.ts +364 -0
- package/src/pty/pty.bun.ts +26 -0
- package/src/pty/pty.node.ts +27 -0
- package/src/pty/pty.ts +25 -0
- package/src/pty/schema.ts +17 -0
- package/src/question/index.ts +252 -0
- package/src/question/schema.ts +17 -0
- package/src/server/adapter.bun.ts +40 -0
- package/src/server/adapter.node.ts +66 -0
- package/src/server/adapter.ts +21 -0
- package/src/server/auth.ts +16 -0
- package/src/server/error.ts +53 -0
- package/src/server/event.ts +7 -0
- package/src/server/fence.ts +81 -0
- package/src/server/mdns.ts +60 -0
- package/src/server/middleware.ts +94 -0
- package/src/server/projectors.ts +28 -0
- package/src/server/proxy.ts +171 -0
- package/src/server/pty-ticket.ts +42 -0
- package/src/server/rate-limit.ts +38 -0
- package/src/server/routes/control/index.ts +160 -0
- package/src/server/routes/control/workspace.ts +203 -0
- package/src/server/routes/global.ts +367 -0
- package/src/server/routes/instance/bash-interactive.ts +82 -0
- package/src/server/routes/instance/config.ts +89 -0
- package/src/server/routes/instance/event.ts +108 -0
- package/src/server/routes/instance/experimental.ts +408 -0
- package/src/server/routes/instance/file.ts +190 -0
- package/src/server/routes/instance/httpapi/config.ts +51 -0
- package/src/server/routes/instance/httpapi/permission.ts +72 -0
- package/src/server/routes/instance/httpapi/project.ts +62 -0
- package/src/server/routes/instance/httpapi/provider.ts +142 -0
- package/src/server/routes/instance/httpapi/question.ts +121 -0
- package/src/server/routes/instance/httpapi/server.ts +153 -0
- package/src/server/routes/instance/index.ts +301 -0
- package/src/server/routes/instance/mcp.ts +260 -0
- package/src/server/routes/instance/middleware.ts +44 -0
- package/src/server/routes/instance/permission.ts +73 -0
- package/src/server/routes/instance/project.ts +122 -0
- package/src/server/routes/instance/provider.ts +158 -0
- package/src/server/routes/instance/pty.ts +302 -0
- package/src/server/routes/instance/question.ts +162 -0
- package/src/server/routes/instance/session.ts +1328 -0
- package/src/server/routes/instance/sync.ts +143 -0
- package/src/server/routes/instance/trace.ts +59 -0
- package/src/server/routes/instance/tui.ts +384 -0
- package/src/server/routes/instance/workflows.ts +142 -0
- package/src/server/routes/ui.ts +37 -0
- package/src/server/server.ts +146 -0
- package/src/server/workspace.ts +122 -0
- package/src/session/auto-dream.ts +123 -0
- package/src/session/boundary.ts +77 -0
- package/src/session/budgeted-read.ts +118 -0
- package/src/session/checkpoint-align.ts +29 -0
- package/src/session/checkpoint-context.ts +36 -0
- package/src/session/checkpoint-paths.ts +86 -0
- package/src/session/checkpoint-progress-reconcile.ts +111 -0
- package/src/session/checkpoint-retry.ts +192 -0
- package/src/session/checkpoint-templates.ts +114 -0
- package/src/session/checkpoint-validator.ts +259 -0
- package/src/session/checkpoint.ts +1560 -0
- package/src/session/classify.ts +117 -0
- package/src/session/claude-import.ts +381 -0
- package/src/session/codex-import.ts +416 -0
- package/src/session/compaction.ts +545 -0
- package/src/session/external-import.sql.ts +18 -0
- package/src/session/external-import.ts +136 -0
- package/src/session/goal.ts +232 -0
- package/src/session/index.ts +1 -0
- package/src/session/instruction.ts +276 -0
- package/src/session/last-message-info.ts +32 -0
- package/src/session/llm-request-prefix.ts +82 -0
- package/src/session/llm.ts +734 -0
- package/src/session/max-mode.ts +410 -0
- package/src/session/message-v2.ts +1138 -0
- package/src/session/message.ts +191 -0
- package/src/session/opendash-import.ts +281 -0
- package/src/session/overflow.ts +53 -0
- package/src/session/prefix-capture-ref.ts +48 -0
- package/src/session/processor.ts +983 -0
- package/src/session/projectors.ts +137 -0
- package/src/session/prompt/anthropic.txt +177 -0
- package/src/session/prompt/beast.txt +186 -0
- package/src/session/prompt/build-switch.txt +5 -0
- package/src/session/prompt/codex.txt +108 -0
- package/src/session/prompt/compose.txt +119 -0
- package/src/session/prompt/copilot-gpt-5.txt +173 -0
- package/src/session/prompt/deepseek.txt +156 -0
- package/src/session/prompt/default.old.txt +151 -0
- package/src/session/prompt/default.txt +209 -0
- package/src/session/prompt/gemini.txt +186 -0
- package/src/session/prompt/glm.txt +73 -0
- package/src/session/prompt/gpt.txt +134 -0
- package/src/session/prompt/kimi.txt +117 -0
- package/src/session/prompt/max-steps.txt +16 -0
- package/src/session/prompt/minimax.txt +165 -0
- package/src/session/prompt/text-loop-recovery.ts +40 -0
- package/src/session/prompt/text-ngram-detection.ts +116 -0
- package/src/session/prompt/trinity.txt +128 -0
- package/src/session/prompt.ts +3878 -0
- package/src/session/prune.ts +481 -0
- package/src/session/retry.ts +178 -0
- package/src/session/revert.ts +161 -0
- package/src/session/run-state.ts +135 -0
- package/src/session/schema.ts +36 -0
- package/src/session/session.sql.ts +110 -0
- package/src/session/session.ts +908 -0
- package/src/session/status.ts +89 -0
- package/src/session/summary.ts +163 -0
- package/src/session/system.ts +97 -0
- package/src/session/todo.ts +77 -0
- package/src/session/trajectory.ts +98 -0
- package/src/share/index.ts +2 -0
- package/src/share/session.ts +57 -0
- package/src/share/share-next.ts +381 -0
- package/src/share/share.sql.ts +13 -0
- package/src/shell/shell.ts +124 -0
- package/src/skill/builtin/.bundle/self-extend/SKILL.md +131 -0
- package/src/skill/builtin/.bundle/self-extend/reference/hook-api.md +242 -0
- package/src/skill/builtin/.bundle/self-extend/reference/skill-api.md +114 -0
- package/src/skill/builtin/.bundle/self-extend/reference/tool-api.md +115 -0
- package/src/skill/builtin/.bundle/self-extend/reference/tui-api.md +258 -0
- package/src/skill/builtin/bundle.macro.ts +30 -0
- package/src/skill/builtin/extract.ts +41 -0
- package/src/skill/compose/.bundle/ask/SKILL.md +58 -0
- package/src/skill/compose/.bundle/brainstorm/SKILL.md +200 -0
- package/src/skill/compose/.bundle/brainstorm/scripts/frame-template.html +214 -0
- package/src/skill/compose/.bundle/brainstorm/scripts/helper.js +88 -0
- package/src/skill/compose/.bundle/brainstorm/scripts/server.cjs +354 -0
- package/src/skill/compose/.bundle/brainstorm/scripts/start-server.sh +148 -0
- package/src/skill/compose/.bundle/brainstorm/scripts/stop-server.sh +56 -0
- package/src/skill/compose/.bundle/brainstorm/spec-document-reviewer-prompt.md +50 -0
- package/src/skill/compose/.bundle/brainstorm/visual-companion.md +258 -0
- package/src/skill/compose/.bundle/debug/CREATION-LOG.md +119 -0
- package/src/skill/compose/.bundle/debug/SKILL.md +297 -0
- package/src/skill/compose/.bundle/debug/condition-based-waiting-example.ts +158 -0
- package/src/skill/compose/.bundle/debug/condition-based-waiting.md +106 -0
- package/src/skill/compose/.bundle/debug/defense-in-depth.md +122 -0
- package/src/skill/compose/.bundle/debug/find-polluter.sh +63 -0
- package/src/skill/compose/.bundle/debug/root-cause-tracing.md +144 -0
- package/src/skill/compose/.bundle/debug/test-academic.md +14 -0
- package/src/skill/compose/.bundle/debug/test-pressure-1.md +58 -0
- package/src/skill/compose/.bundle/debug/test-pressure-2.md +68 -0
- package/src/skill/compose/.bundle/debug/test-pressure-3.md +69 -0
- package/src/skill/compose/.bundle/execute/SKILL.md +71 -0
- package/src/skill/compose/.bundle/feedback/SKILL.md +214 -0
- package/src/skill/compose/.bundle/merge/SKILL.md +252 -0
- package/src/skill/compose/.bundle/new-skill/SKILL.md +211 -0
- package/src/skill/compose/.bundle/parallel/SKILL.md +168 -0
- package/src/skill/compose/.bundle/plan/SKILL.md +183 -0
- package/src/skill/compose/.bundle/plan/plan-document-reviewer-prompt.md +50 -0
- package/src/skill/compose/.bundle/report/SKILL.md +180 -0
- package/src/skill/compose/.bundle/review/SKILL.md +104 -0
- package/src/skill/compose/.bundle/review/code-reviewer.md +178 -0
- package/src/skill/compose/.bundle/subagent/SKILL.md +325 -0
- package/src/skill/compose/.bundle/subagent/code-quality-reviewer-prompt.md +26 -0
- package/src/skill/compose/.bundle/subagent/implementer-prompt.md +128 -0
- package/src/skill/compose/.bundle/subagent/spec-reviewer-prompt.md +118 -0
- package/src/skill/compose/.bundle/tdd/SKILL.md +360 -0
- package/src/skill/compose/.bundle/tdd/testing-anti-patterns.md +299 -0
- package/src/skill/compose/.bundle/verify/SKILL.md +140 -0
- package/src/skill/compose/.bundle/worktree/SKILL.md +234 -0
- package/src/skill/compose/LICENSE-karpathy +28 -0
- package/src/skill/compose/LICENSE-superpowers +26 -0
- package/src/skill/compose/bundle.macro.ts +30 -0
- package/src/skill/compose/extract.ts +85 -0
- package/src/skill/discovery.ts +116 -0
- package/src/skill/index.ts +328 -0
- package/src/snapshot/index.ts +777 -0
- package/src/sql.d.ts +4 -0
- package/src/storage/db.bun.ts +8 -0
- package/src/storage/db.node.ts +8 -0
- package/src/storage/db.ts +172 -0
- package/src/storage/index.ts +26 -0
- package/src/storage/json-migration.ts +426 -0
- package/src/storage/read-sqlite.bun.ts +11 -0
- package/src/storage/read-sqlite.node.ts +13 -0
- package/src/storage/read-sqlite.ts +10 -0
- package/src/storage/schema.sql.ts +10 -0
- package/src/storage/schema.ts +7 -0
- package/src/storage/storage.ts +331 -0
- package/src/sync/README.md +179 -0
- package/src/sync/event.sql.ts +16 -0
- package/src/sync/index.ts +278 -0
- package/src/sync/schema.ts +14 -0
- package/src/task/events.ts +28 -0
- package/src/task/gate-state.ts +54 -0
- package/src/task/gate.ts +116 -0
- package/src/task/index.ts +1 -0
- package/src/task/registry.ts +394 -0
- package/src/task/schema.ts +43 -0
- package/src/task/task.sql.ts +50 -0
- package/src/team/events.ts +22 -0
- package/src/team/index.ts +113 -0
- package/src/team/schema.ts +31 -0
- package/src/temporary.ts +33 -0
- package/src/tool/actor.shell.txt +72 -0
- package/src/tool/actor.ts +804 -0
- package/src/tool/actor.txt +103 -0
- package/src/tool/apply_patch.ts +308 -0
- package/src/tool/apply_patch.txt +33 -0
- package/src/tool/bash-interactive.ts +183 -0
- package/src/tool/bash.ts +722 -0
- package/src/tool/bash.txt +123 -0
- package/src/tool/bash_token_efficient_pipeline.ts +189 -0
- package/src/tool/change-directory.ts +91 -0
- package/src/tool/codesearch.ts +63 -0
- package/src/tool/codesearch.txt +12 -0
- package/src/tool/edit.ts +752 -0
- package/src/tool/edit.txt +10 -0
- package/src/tool/external-directory.ts +132 -0
- package/src/tool/glob.ts +100 -0
- package/src/tool/glob.txt +6 -0
- package/src/tool/grep.ts +145 -0
- package/src/tool/grep.txt +8 -0
- package/src/tool/history.ts +146 -0
- package/src/tool/history.txt +17 -0
- package/src/tool/index.ts +4 -0
- package/src/tool/invalid.ts +20 -0
- package/src/tool/invocation-style.ts +17 -0
- package/src/tool/lsp.ts +91 -0
- package/src/tool/lsp.txt +19 -0
- package/src/tool/mcp-exa.ts +78 -0
- package/src/tool/memory-path-guard.ts +162 -0
- package/src/tool/memory.ts +81 -0
- package/src/tool/memory.txt +69 -0
- package/src/tool/multiedit.ts +54 -0
- package/src/tool/multiedit.txt +41 -0
- package/src/tool/notebook-edit.ts +225 -0
- package/src/tool/notebook-edit.txt +10 -0
- package/src/tool/plan-enter.txt +16 -0
- package/src/tool/plan-exit.txt +14 -0
- package/src/tool/plan.ts +179 -0
- package/src/tool/question.ts +67 -0
- package/src/tool/question.txt +10 -0
- package/src/tool/read-state.ts +44 -0
- package/src/tool/read.ts +327 -0
- package/src/tool/read.txt +14 -0
- package/src/tool/recoverable.ts +35 -0
- package/src/tool/registry.ts +429 -0
- package/src/tool/schema.ts +17 -0
- package/src/tool/session-cwd.ts +35 -0
- package/src/tool/shell-tokenize.ts +374 -0
- package/src/tool/shell-wrap.ts +235 -0
- package/src/tool/skill.ts +76 -0
- package/src/tool/skill.txt +5 -0
- package/src/tool/task.shell.txt +57 -0
- package/src/tool/task.ts +456 -0
- package/src/tool/task.txt +56 -0
- package/src/tool/tool.ts +166 -0
- package/src/tool/truncate.ts +201 -0
- package/src/tool/truncation-dir.ts +4 -0
- package/src/tool/webfetch.ts +208 -0
- package/src/tool/webfetch.txt +13 -0
- package/src/tool/websearch/index.ts +104 -0
- package/src/tool/websearch/mimo.ts +118 -0
- package/src/tool/websearch/websearch.txt +14 -0
- package/src/tool/workflow.ts +357 -0
- package/src/tool/workflow.txt +25 -0
- package/src/tool/write.ts +88 -0
- package/src/tool/write.txt +10 -0
- package/src/util/abort.ts +35 -0
- package/src/util/archive.ts +15 -0
- package/src/util/color.ts +17 -0
- package/src/util/data-url.ts +9 -0
- package/src/util/defer.ts +10 -0
- package/src/util/effect-http-client.ts +11 -0
- package/src/util/effect-zod.ts +367 -0
- package/src/util/env-info.ts +62 -0
- package/src/util/error.ts +78 -0
- package/src/util/filesystem.ts +243 -0
- package/src/util/fn.ts +21 -0
- package/src/util/format.ts +20 -0
- package/src/util/iife.ts +3 -0
- package/src/util/index.ts +14 -0
- package/src/util/keybind.ts +101 -0
- package/src/util/lazy.ts +18 -0
- package/src/util/local-context.ts +23 -0
- package/src/util/locale.ts +79 -0
- package/src/util/lock.ts +96 -0
- package/src/util/log.ts +234 -0
- package/src/util/media.ts +26 -0
- package/src/util/network.ts +9 -0
- package/src/util/opendash-process.ts +24 -0
- package/src/util/process.ts +174 -0
- package/src/util/provider-priority.ts +48 -0
- package/src/util/queue.ts +60 -0
- package/src/util/record.ts +3 -0
- package/src/util/rpc.ts +64 -0
- package/src/util/schema.ts +53 -0
- package/src/util/scrap.ts +10 -0
- package/src/util/signal.ts +12 -0
- package/src/util/ssrf.ts +116 -0
- package/src/util/timeout.ts +14 -0
- package/src/util/token.ts +5 -0
- package/src/util/tool-compat.ts +144 -0
- package/src/util/update-schema.ts +13 -0
- package/src/util/which.ts +14 -0
- package/src/util/wildcard.ts +57 -0
- package/src/workflow/builtin/compose.js +749 -0
- package/src/workflow/builtin/deep-research.js +398 -0
- package/src/workflow/builtin.ts +59 -0
- package/src/workflow/events.ts +72 -0
- package/src/workflow/meta.ts +335 -0
- package/src/workflow/persistence.ts +312 -0
- package/src/workflow/resolve.ts +45 -0
- package/src/workflow/runtime-ref.ts +18 -0
- package/src/workflow/runtime.ts +1447 -0
- package/src/workflow/sandbox.ts +286 -0
- package/src/workflow/workflow.sql.ts +31 -0
- package/src/workflow/workspace.ts +69 -0
- package/src/worktree/index.ts +629 -0
- package/sst-env.d.ts +10 -0
- package/test/AGENTS.md +133 -0
- package/test/account/repo.test.ts +352 -0
- package/test/account/service.test.ts +456 -0
- package/test/acp/agent-interface.test.ts +51 -0
- package/test/acp/event-subscription.test.ts +725 -0
- package/test/actor/cancel-cascade.test.ts +432 -0
- package/test/actor/no-completion-listener.test.ts +41 -0
- package/test/actor/poststop-progress-write-permission.repro.test.ts +414 -0
- package/test/actor/registry-render.test.ts +113 -0
- package/test/actor/registry-status.test.ts +111 -0
- package/test/actor/registry.test.ts +619 -0
- package/test/actor/return-header.test.ts +40 -0
- package/test/actor/spawn-lifecycle.test.ts +346 -0
- package/test/actor/spawn-no-deadlock.test.ts +340 -0
- package/test/actor/spawn-notification.test.ts +393 -0
- package/test/actor/spawn-task-autostart.test.ts +530 -0
- package/test/actor/spawn.test.ts +1106 -0
- package/test/actor/status-event-payload.test.ts +132 -0
- package/test/actor/terminology.test.ts +39 -0
- package/test/actor/turn.test.ts +125 -0
- package/test/actor/waiter.test.ts +246 -0
- package/test/agent/agent.test.ts +935 -0
- package/test/agent/allowlist.test.ts +45 -0
- package/test/auth/auth.test.ts +86 -0
- package/test/bus/bus-effect.test.ts +162 -0
- package/test/bus/bus-integration.test.ts +87 -0
- package/test/bus/bus.test.ts +219 -0
- package/test/cli/account.test.ts +26 -0
- package/test/cli/cmd/tui/autocomplete-detect.test.ts +55 -0
- package/test/cli/cmd/tui/extmark-cjk.test.ts +96 -0
- package/test/cli/cmd/tui/offset.test.ts +101 -0
- package/test/cli/cmd/tui/prompt-part.test.ts +97 -0
- package/test/cli/error.test.ts +18 -0
- package/test/cli/github-action.test.ts +198 -0
- package/test/cli/github-remote.test.ts +80 -0
- package/test/cli/import.test.ts +54 -0
- package/test/cli/plugin-auth-picker.test.ts +120 -0
- package/test/cli/run-completion.test.ts +131 -0
- package/test/cli/tui/keybind-plugin.test.ts +90 -0
- package/test/cli/tui/plugin-add.test.ts +111 -0
- package/test/cli/tui/plugin-install.test.ts +87 -0
- package/test/cli/tui/plugin-lifecycle.test.ts +224 -0
- package/test/cli/tui/plugin-loader-entrypoint.test.ts +484 -0
- package/test/cli/tui/plugin-loader-pure.test.ts +71 -0
- package/test/cli/tui/plugin-loader.test.ts +816 -0
- package/test/cli/tui/plugin-toggle.test.ts +157 -0
- package/test/cli/tui/revert-diff.test.ts +35 -0
- package/test/cli/tui/route-agent-id.test.ts +26 -0
- package/test/cli/tui/sidebar-tps.test.ts +63 -0
- package/test/cli/tui/slot-replace.test.tsx +47 -0
- package/test/cli/tui/sync-bucket.test.ts +29 -0
- package/test/cli/tui/theme-store.test.ts +51 -0
- package/test/cli/tui/thread.test.ts +125 -0
- package/test/cli/tui/transcript.test.ts +426 -0
- package/test/cli/tui/use-event.test.tsx +175 -0
- package/test/cli/tui/voice.test.ts +443 -0
- package/test/command/deep-research-command.test.ts +16 -0
- package/test/config/agent-color.test.ts +77 -0
- package/test/config/checkpoint-fork.test.ts +21 -0
- package/test/config/config.test.ts +2577 -0
- package/test/config/fixtures/empty-frontmatter.md +4 -0
- package/test/config/fixtures/frontmatter.md +28 -0
- package/test/config/fixtures/markdown-header.md +11 -0
- package/test/config/fixtures/no-frontmatter.md +1 -0
- package/test/config/fixtures/weird-model-id.md +13 -0
- package/test/config/lsp.test.ts +87 -0
- package/test/config/markdown.test.ts +228 -0
- package/test/config/plugin.test.ts +0 -0
- package/test/config/tui.test.ts +627 -0
- package/test/control-plane/adaptors.test.ts +71 -0
- package/test/control-plane/sse.test.ts +56 -0
- package/test/effect/app-runtime-logger.test.ts +92 -0
- package/test/effect/cross-spawn-spawner.test.ts +411 -0
- package/test/effect/instance-state.test.ts +482 -0
- package/test/effect/observability.test.ts +46 -0
- package/test/effect/run-service.test.ts +46 -0
- package/test/effect/runner-warn-log.test.ts +111 -0
- package/test/effect/runner.test.ts +494 -0
- package/test/fake/provider.ts +90 -0
- package/test/file/fsmonitor.test.ts +68 -0
- package/test/file/ignore.test.ts +10 -0
- package/test/file/index.test.ts +963 -0
- package/test/file/path-traversal.test.ts +243 -0
- package/test/file/ripgrep.test.ts +218 -0
- package/test/file/watcher.test.ts +249 -0
- package/test/filesystem/filesystem.test.ts +319 -0
- package/test/fixture/db.ts +11 -0
- package/test/fixture/fixture.test.ts +58 -0
- package/test/fixture/fixture.ts +223 -0
- package/test/fixture/flock-worker.ts +72 -0
- package/test/fixture/lsp/fake-lsp-server.js +75 -0
- package/test/fixture/plug-worker.ts +93 -0
- package/test/fixture/plugin-meta-worker.ts +19 -0
- package/test/fixture/skills/agents-sdk/SKILL.md +152 -0
- package/test/fixture/skills/agents-sdk/references/callable.md +92 -0
- package/test/fixture/skills/cloudflare/SKILL.md +211 -0
- package/test/fixture/skills/index.json +6 -0
- package/test/fixture/tui-plugin.ts +328 -0
- package/test/fixture/tui-runtime.ts +31 -0
- package/test/format/format.test.ts +244 -0
- package/test/git/git.test.ts +128 -0
- package/test/global/fixture/global-paths-worker.ts +17 -0
- package/test/global/mimocode-home.test.ts +143 -0
- package/test/history/backfill.test.ts +160 -0
- package/test/history/extract.test.ts +106 -0
- package/test/history/fts-query.test.ts +30 -0
- package/test/history/resolve.test.ts +130 -0
- package/test/history/service.test.ts +210 -0
- package/test/history/writer.test.ts +163 -0
- package/test/ide/ide.test.ts +82 -0
- package/test/inbox/drain-in-loop.test.ts +230 -0
- package/test/inbox/fork-agent-compat.test.ts +387 -0
- package/test/inbox/gc-on-init.test.ts +167 -0
- package/test/inbox/send-no-block.test.ts +120 -0
- package/test/inbox/sender-cancel-independence.test.ts +160 -0
- package/test/inbox/wake-matrix.test.ts +141 -0
- package/test/installation/installation.test.ts +255 -0
- package/test/keybind.test.ts +421 -0
- package/test/lib/effect.ts +53 -0
- package/test/lib/filesystem.ts +10 -0
- package/test/lib/llm-server.ts +770 -0
- package/test/lib/mock-llm.ts +159 -0
- package/test/lib/scripted-llm-server.ts +245 -0
- package/test/lsp/client.test.ts +98 -0
- package/test/lsp/index.test.ts +109 -0
- package/test/lsp/launch.test.ts +22 -0
- package/test/lsp/lifecycle.test.ts +184 -0
- package/test/mcp/headers.test.ts +178 -0
- package/test/mcp/lifecycle.test.ts +786 -0
- package/test/mcp/oauth-auto-connect.test.ts +281 -0
- package/test/mcp/oauth-browser.test.ts +268 -0
- package/test/mcp/oauth-callback.test.ts +34 -0
- package/test/memory/abort-leak-webfetch.ts +49 -0
- package/test/memory/abort-leak.test.ts +127 -0
- package/test/memory/cc-frontmatter.test.ts +85 -0
- package/test/memory/cc-paths.test.ts +60 -0
- package/test/memory/cc-reconcile.test.ts +239 -0
- package/test/memory/cc-search.test.ts +151 -0
- package/test/memory/fts-query.test.ts +48 -0
- package/test/memory/fts-rowid-stability.test.ts +271 -0
- package/test/memory/paths.test.ts +210 -0
- package/test/memory/reconcile.test.ts +115 -0
- package/test/memory/service.test.ts +169 -0
- package/test/npm.test.ts +18 -0
- package/test/patch/patch.test.ts +348 -0
- package/test/permission/abort.test.ts +116 -0
- package/test/permission/arity.test.ts +33 -0
- package/test/permission/disabled.test.ts +68 -0
- package/test/permission/next.test.ts +1116 -0
- package/test/permission/non-interactive.test.ts +55 -0
- package/test/permission-task.test.ts +326 -0
- package/test/plugin/actor-hooks.test.ts +1471 -0
- package/test/plugin/auth-override.test.ts +79 -0
- package/test/plugin/checkpoint-splitover.test.ts +434 -0
- package/test/plugin/cloudflare.test.ts +68 -0
- package/test/plugin/codex.test.ts +123 -0
- package/test/plugin/github-copilot-models.test.ts +163 -0
- package/test/plugin/install-concurrency.test.ts +140 -0
- package/test/plugin/install.test.ts +570 -0
- package/test/plugin/loader-shared.test.ts +1169 -0
- package/test/plugin/matcher.test.ts +97 -0
- package/test/plugin/meta.test.ts +137 -0
- package/test/plugin/mimo.test.ts +259 -0
- package/test/plugin/session-loop-hooks.test.ts +159 -0
- package/test/plugin/shared.test.ts +88 -0
- package/test/plugin/subagent-progress-checker.test.ts +227 -0
- package/test/plugin/trigger.test.ts +116 -0
- package/test/plugin/workspace-adaptor.test.ts +109 -0
- package/test/preload.ts +102 -0
- package/test/project/migrate-global.test.ts +152 -0
- package/test/project/project-id.test.ts +64 -0
- package/test/project/project.test.ts +504 -0
- package/test/project/vcs.test.ts +286 -0
- package/test/project/worktree-remove.test.ts +126 -0
- package/test/project/worktree.test.ts +222 -0
- package/test/provider/amazon-bedrock.test.ts +462 -0
- package/test/provider/copilot/convert-to-copilot-messages.test.ts +523 -0
- package/test/provider/copilot/copilot-chat-model.test.ts +592 -0
- package/test/provider/error.test.ts +160 -0
- package/test/provider/gitlab-duo.test.ts +413 -0
- package/test/provider/model-groups.test.ts +389 -0
- package/test/provider/provider-chunk-timeout.test.ts +23 -0
- package/test/provider/provider.test.ts +2610 -0
- package/test/provider/transform.test.ts +3523 -0
- package/test/pty/pty-output-isolation.test.ts +146 -0
- package/test/pty/pty-session.test.ts +102 -0
- package/test/pty/pty-shell.test.ts +69 -0
- package/test/question/question.test.ts +464 -0
- package/test/server/global-session-list.test.ts +105 -0
- package/test/server/project-init-git.test.ts +137 -0
- package/test/server/rate-limit.test.ts +66 -0
- package/test/server/session-actions.test.ts +49 -0
- package/test/server/session-list.test.ts +110 -0
- package/test/server/session-messages.test.ts +220 -0
- package/test/server/session-prompt-busy.test.ts +146 -0
- package/test/server/session-prompt-heartbeat.test.ts +131 -0
- package/test/server/session-select.test.ts +100 -0
- package/test/server/session-task-route.test.ts +165 -0
- package/test/server/summarize-route-main-slice.test.ts +99 -0
- package/test/server/trace-attributes.test.ts +76 -0
- package/test/server/workflows-route.test.ts +363 -0
- package/test/session/bootstrap-skip-system.test.ts +121 -0
- package/test/session/boundary.test.ts +33 -0
- package/test/session/budgeted-read.test.ts +74 -0
- package/test/session/checkpoint-align.test.ts +58 -0
- package/test/session/checkpoint-boundary.test.ts +186 -0
- package/test/session/checkpoint-child-session.test.ts +509 -0
- package/test/session/checkpoint-context.test.ts +141 -0
- package/test/session/checkpoint-drain.test.ts +189 -0
- package/test/session/checkpoint-extract-titles.test.ts +58 -0
- package/test/session/checkpoint-fork-mode.test.ts +577 -0
- package/test/session/checkpoint-main-slice.test.ts +261 -0
- package/test/session/checkpoint-paths.test.ts +87 -0
- package/test/session/checkpoint-permission.test.ts +136 -0
- package/test/session/checkpoint-progress-reconcile.test.ts +219 -0
- package/test/session/checkpoint-rebuild-unify.test.ts +158 -0
- package/test/session/checkpoint-rebuild-v3.test.ts +259 -0
- package/test/session/checkpoint-render-verify.test.ts +512 -0
- package/test/session/checkpoint-retry.test.ts +150 -0
- package/test/session/checkpoint-splitover-integration.test.ts +533 -0
- package/test/session/checkpoint-templates.test.ts +51 -0
- package/test/session/checkpoint-thresholds.test.ts +120 -0
- package/test/session/checkpoint-validator.test.ts +189 -0
- package/test/session/classify-integration.test.ts +476 -0
- package/test/session/classify.test.ts +390 -0
- package/test/session/codex-import.test.ts +331 -0
- package/test/session/compaction-agent-scope.test.ts +209 -0
- package/test/session/context-inheritance.test.ts +46 -0
- package/test/session/external-import.test.ts +17 -0
- package/test/session/fork-prefix-invariant.test.ts +116 -0
- package/test/session/goal.test.ts +106 -0
- package/test/session/instruction.test.ts +388 -0
- package/test/session/invalid-output-continuation.test.ts +150 -0
- package/test/session/last-message-info.test.ts +47 -0
- package/test/session/length-tool-safety.test.ts +125 -0
- package/test/session/llm-request-prefix.test.ts +197 -0
- package/test/session/llm-retry.test.ts +59 -0
- package/test/session/llm-system-prompt.test.ts +479 -0
- package/test/session/llm.test.ts +1268 -0
- package/test/session/main-lifecycle.test.ts +51 -0
- package/test/session/main-runloop-history-invariant.test.ts +182 -0
- package/test/session/max-mode-econnreset.test.ts +232 -0
- package/test/session/max-mode.test.ts +54 -0
- package/test/session/message-v2-filter.test.ts +197 -0
- package/test/session/message-v2.test.ts +1119 -0
- package/test/session/messages-default-main.test.ts +105 -0
- package/test/session/messages-pagination.test.ts +888 -0
- package/test/session/overflow.test.ts +576 -0
- package/test/session/processor-effect.test.ts +853 -0
- package/test/session/prompt-effect.test.ts +1534 -0
- package/test/session/prompt-rebuild-loop.test.ts +108 -0
- package/test/session/prompt-rebuild-reset.test.ts +67 -0
- package/test/session/prompt-sweep.test.ts +145 -0
- package/test/session/prompt-task-gate.test.ts +127 -0
- package/test/session/prompt.test.ts +827 -0
- package/test/session/prune-main-slice.test.ts +272 -0
- package/test/session/prune-skip-system.test.ts +346 -0
- package/test/session/prune.test.ts +419 -0
- package/test/session/rebuild-microcompact.test.ts +318 -0
- package/test/session/recall-reminder.test.ts +37 -0
- package/test/session/recent-user-msg.test.ts +219 -0
- package/test/session/retry.test.ts +410 -0
- package/test/session/revert-compact.test.ts +639 -0
- package/test/session/run-state-tuple-key.test.ts +152 -0
- package/test/session/session-create-registers-main.test.ts +70 -0
- package/test/session/session.test.ts +181 -0
- package/test/session/snapshot-tool-race.test.ts +301 -0
- package/test/session/structured-output-integration.test.ts +264 -0
- package/test/session/structured-output-retry.test.ts +127 -0
- package/test/session/structured-output.test.ts +397 -0
- package/test/session/summary-main-slice.test.ts +170 -0
- package/test/session/system.test.ts +72 -0
- package/test/session/text-loop-detection.test.ts +185 -0
- package/test/session/text-loop-integration.test.ts +448 -0
- package/test/session/text-ngram-detection.test.ts +169 -0
- package/test/session/trajectory.test.ts +236 -0
- package/test/share/share-next.test.ts +332 -0
- package/test/shell/shell.test.ts +73 -0
- package/test/skill/compose-review.test.ts +174 -0
- package/test/skill/discovery.test.ts +116 -0
- package/test/skill/skill.test.ts +466 -0
- package/test/snapshot/snapshot.test.ts +1531 -0
- package/test/storage/db.test.ts +16 -0
- package/test/storage/json-migration.test.ts +831 -0
- package/test/storage/storage.test.ts +293 -0
- package/test/sync/index.test.ts +237 -0
- package/test/task/gate-state.test.ts +66 -0
- package/test/task/gate.test.ts +167 -0
- package/test/task/registry.test.ts +171 -0
- package/test/task/state-machine.test.ts +292 -0
- package/test/team/migrate-to-inbox.test.ts +124 -0
- package/test/team/team.test.ts +75 -0
- package/test/tool/__snapshots__/tool.test.ts.snap +9 -0
- package/test/tool/actor-cancel.test.ts +211 -0
- package/test/tool/actor-recover.test.ts +50 -0
- package/test/tool/actor-send.test.ts +200 -0
- package/test/tool/actor-status.test.ts +296 -0
- package/test/tool/actor-wait.test.ts +193 -0
- package/test/tool/actor.shell.test.ts +266 -0
- package/test/tool/actor.test.ts +753 -0
- package/test/tool/apply_patch.test.ts +626 -0
- package/test/tool/bash.test.ts +1232 -0
- package/test/tool/bash_token_efficient_pipeline.test.ts +329 -0
- package/test/tool/describe-workflow.test.ts +12 -0
- package/test/tool/edit.test.ts +730 -0
- package/test/tool/external-directory.test.ts +207 -0
- package/test/tool/fixtures/large-image.png +0 -0
- package/test/tool/fixtures/models-api.json +65179 -0
- package/test/tool/glob.test.ts +81 -0
- package/test/tool/grep.test.ts +114 -0
- package/test/tool/history.test.ts +144 -0
- package/test/tool/invocation-style.test.ts +30 -0
- package/test/tool/memory-edit-ask-skip.test.ts +62 -0
- package/test/tool/memory-path-guard.test.ts +594 -0
- package/test/tool/memory.test.ts +71 -0
- package/test/tool/question.test.ts +167 -0
- package/test/tool/read.test.ts +483 -0
- package/test/tool/recoverable.test.ts +36 -0
- package/test/tool/registry-invocation-style.test.ts +121 -0
- package/test/tool/registry.test.ts +164 -0
- package/test/tool/shell-tokenize.test.ts +309 -0
- package/test/tool/shell-wrap-missing-script.test.ts +128 -0
- package/test/tool/shell-wrap.test.ts +345 -0
- package/test/tool/skill.test.ts +99 -0
- package/test/tool/task-recover.test.ts +36 -0
- package/test/tool/task.shell.test.ts +234 -0
- package/test/tool/task.test.ts +296 -0
- package/test/tool/tool-def-shell-shape.test.ts +23 -0
- package/test/tool/tool-define.test.ts +59 -0
- package/test/tool/tool-validation-error.test.ts +25 -0
- package/test/tool/truncation.test.ts +253 -0
- package/test/tool/webfetch.test.ts +103 -0
- package/test/tool/whitelist.test.ts +377 -0
- package/test/tool/write.test.ts +244 -0
- package/test/util/data-url.test.ts +14 -0
- package/test/util/effect-zod.test.ts +869 -0
- package/test/util/env-info.test.ts +26 -0
- package/test/util/error.test.ts +38 -0
- package/test/util/filesystem.test.ts +656 -0
- package/test/util/format.test.ts +59 -0
- package/test/util/glob.test.ts +164 -0
- package/test/util/iife.test.ts +36 -0
- package/test/util/lazy.test.ts +50 -0
- package/test/util/lock.test.ts +72 -0
- package/test/util/log.test.ts +69 -0
- package/test/util/module.test.ts +59 -0
- package/test/util/process.test.ts +128 -0
- package/test/util/queue.test.ts +64 -0
- package/test/util/ssrf.test.ts +115 -0
- package/test/util/timeout.test.ts +21 -0
- package/test/util/tool-compat.test.ts +189 -0
- package/test/util/which.test.ts +100 -0
- package/test/util/wildcard.test.ts +90 -0
- package/test/workflow/builtin.test.ts +36 -0
- package/test/workflow/compose.test.ts +668 -0
- package/test/workflow/deep-research-cluster.test.ts +47 -0
- package/test/workflow/lib.ts +243 -0
- package/test/workflow/meta.test.ts +142 -0
- package/test/workflow/model-routing.test.ts +68 -0
- package/test/workflow/persistence.test.ts +229 -0
- package/test/workflow/resolve.test.ts +37 -0
- package/test/workflow/runtime-nested.test.ts +419 -0
- package/test/workflow/runtime-worktree.test.ts +261 -0
- package/test/workflow/runtime.test.ts +1142 -0
- package/test/workflow/sandbox.test.ts +259 -0
- package/test/workflow/tool.test.ts +487 -0
- package/test/workflow/verify-wow.test.ts +144 -0
- package/test/workflow/workspace.test.ts +88 -0
- package/test/workspace/workspace-restore.test.ts +281 -0
- package/test/worktree/index.test.ts +30 -0
- package/tsconfig.json +24 -0
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
import { afterEach, describe, expect, test } from "bun:test"
|
|
2
|
+
import { Effect, Exit, Cause } from "effect"
|
|
3
|
+
import { Log } from "../../src/util"
|
|
4
|
+
import { Instance } from "../../src/project/instance"
|
|
5
|
+
import { Server } from "../../src/server/server"
|
|
6
|
+
import { Session } from "../../src/session"
|
|
7
|
+
import { WorkflowPersistence } from "../../src/workflow/persistence"
|
|
8
|
+
import { WorkflowRuntime } from "../../src/workflow/runtime"
|
|
9
|
+
import { workflowRef } from "../../src/workflow/runtime-ref"
|
|
10
|
+
import { provideTmpdirServer, tmpdir } from "../fixture/fixture"
|
|
11
|
+
import { testEffect } from "../lib/effect"
|
|
12
|
+
import { makeLayer, ref, providerCfg } from "../workflow/lib"
|
|
13
|
+
|
|
14
|
+
void Log.init({ print: false })
|
|
15
|
+
|
|
16
|
+
afterEach(async () => {
|
|
17
|
+
workflowRef.current = undefined
|
|
18
|
+
await Instance.disposeAll()
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
describe("workflows routes", () => {
|
|
22
|
+
test("GET /workflows returns [] when the workflow runtime is not running", async () => {
|
|
23
|
+
await using tmp = await tmpdir({ git: true })
|
|
24
|
+
await Instance.provide({
|
|
25
|
+
directory: tmp.path,
|
|
26
|
+
fn: async () => {
|
|
27
|
+
// #given the workflow runtime layer is not running (late-bound ref unset)
|
|
28
|
+
workflowRef.current = undefined
|
|
29
|
+
|
|
30
|
+
// #when — a valid session-shaped sessionID (now REQUIRED) is supplied
|
|
31
|
+
const app = Server.Default().app
|
|
32
|
+
const response = await app.request("/workflows?sessionID=ses_16ec185f2ffexEGkbWeMqWSucv", { method: "GET" })
|
|
33
|
+
|
|
34
|
+
// #then — runtime absent short-circuits to [] (the session passes validation)
|
|
35
|
+
expect(response.status).toBe(200)
|
|
36
|
+
expect(await response.json()).toEqual([])
|
|
37
|
+
},
|
|
38
|
+
})
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
test("POST /workflows/:runID/resume returns { resumed: false } when the runtime is not running", async () => {
|
|
42
|
+
await using tmp = await tmpdir({ git: true })
|
|
43
|
+
await Instance.provide({
|
|
44
|
+
directory: tmp.path,
|
|
45
|
+
fn: async () => {
|
|
46
|
+
// #given the workflow runtime layer is not running
|
|
47
|
+
workflowRef.current = undefined
|
|
48
|
+
|
|
49
|
+
// #when — a real minted-shape runID (wf_ + 26 base62) with no persisted run
|
|
50
|
+
const app = Server.Default().app
|
|
51
|
+
const response = await app.request("/workflows/wf_16ec185f2ffexEGkbWeMqWSucv/resume", { method: "POST" })
|
|
52
|
+
|
|
53
|
+
// #then
|
|
54
|
+
expect(response.status).toBe(200)
|
|
55
|
+
expect(await response.json()).toEqual({ runID: "wf_16ec185f2ffexEGkbWeMqWSucv", resumed: false })
|
|
56
|
+
},
|
|
57
|
+
})
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
// ── P0 (MR104 #3): path traversal via unvalidated runID ──────────────────
|
|
61
|
+
// resume(runID) → readScript(runID) → scriptPath = join(scriptDir, runID + ".js").
|
|
62
|
+
// A traversal runID escapes scriptDir, so the route MUST reject any runID that
|
|
63
|
+
// is not exactly `wf_` + base62. The proof is that the request is REFUSED at the
|
|
64
|
+
// route's param validator (400) — it never reaches the runtime/launch, so no file
|
|
65
|
+
// outside scriptDir is ever opened.
|
|
66
|
+
for (const evil of [
|
|
67
|
+
"../../../etc/passwd",
|
|
68
|
+
"../../foo",
|
|
69
|
+
"/etc/passwd",
|
|
70
|
+
"wf_../../../etc/passwd", // defeats a prefix-only (startsWith "wf") check
|
|
71
|
+
"wf_..", // bare dot-dot after a legit prefix
|
|
72
|
+
]) {
|
|
73
|
+
test(`POST /workflows/:runID/resume REJECTS traversal runID ${JSON.stringify(evil)}`, async () => {
|
|
74
|
+
await using tmp = await tmpdir({ git: true })
|
|
75
|
+
await Instance.provide({
|
|
76
|
+
directory: tmp.path,
|
|
77
|
+
fn: async () => {
|
|
78
|
+
// #given the runtime is absent — so if validation let this through it would
|
|
79
|
+
// hit the early `{ resumed: false }`; the only way to a 400 is param rejection.
|
|
80
|
+
workflowRef.current = undefined
|
|
81
|
+
|
|
82
|
+
// #when
|
|
83
|
+
const app = Server.Default().app
|
|
84
|
+
const response = await app.request(`/workflows/${encodeURIComponent(evil)}/resume`, { method: "POST" })
|
|
85
|
+
|
|
86
|
+
// #then — rejected by the param validator before any path.join / file read.
|
|
87
|
+
expect(response.status).toBe(400)
|
|
88
|
+
},
|
|
89
|
+
})
|
|
90
|
+
})
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// ── Regression: read routes must accept a NESTED child runID ──────────────
|
|
94
|
+
// A top-level run is `wf_` + 26 base62; a nested workflow() child is `wf_` + 64
|
|
95
|
+
// hex (sha256). The transcript/structure routes previously validated only the
|
|
96
|
+
// 26-char form, so every nested-workflow detail page got a 400 and rendered blank.
|
|
97
|
+
// The routes short-circuit to empty when the runtime is absent, so a 200 here
|
|
98
|
+
// proves the param validator ACCEPTED the 64-hex id (a regression would 400).
|
|
99
|
+
const childRunID = "wf_" + "a".repeat(64)
|
|
100
|
+
for (const path of [`/workflows/${childRunID}/transcript`, `/workflows/${childRunID}/structure`]) {
|
|
101
|
+
test(`GET ${path} accepts a 64-hex child runID (200, not 400)`, async () => {
|
|
102
|
+
await using tmp = await tmpdir({ git: true })
|
|
103
|
+
await Instance.provide({
|
|
104
|
+
directory: tmp.path,
|
|
105
|
+
fn: async () => {
|
|
106
|
+
workflowRef.current = undefined
|
|
107
|
+
const response = await Server.Default().app.request(path, { method: "GET" })
|
|
108
|
+
expect(response.status).toBe(200)
|
|
109
|
+
},
|
|
110
|
+
})
|
|
111
|
+
})
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
for (const path of ["/workflows/wf_..%2F..%2Fetc/transcript", "/workflows/not-a-run/structure"]) {
|
|
115
|
+
test(`GET ${path} still REJECTS a malformed runID (400)`, async () => {
|
|
116
|
+
await using tmp = await tmpdir({ git: true })
|
|
117
|
+
await Instance.provide({
|
|
118
|
+
directory: tmp.path,
|
|
119
|
+
fn: async () => {
|
|
120
|
+
workflowRef.current = undefined
|
|
121
|
+
const response = await Server.Default().app.request(path, { method: "GET" })
|
|
122
|
+
expect(response.status).toBe(400)
|
|
123
|
+
},
|
|
124
|
+
})
|
|
125
|
+
})
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// ── P0 (MR104 #3): GET /workflows must NOT leak all-session runs ──────────
|
|
129
|
+
test("GET /workflows with NO sessionID returns 400 (does not list all runs)", async () => {
|
|
130
|
+
await using tmp = await tmpdir({ git: true })
|
|
131
|
+
await Instance.provide({
|
|
132
|
+
directory: tmp.path,
|
|
133
|
+
fn: async () => {
|
|
134
|
+
// #given a live-enough runtime is irrelevant: the missing required query param
|
|
135
|
+
// is rejected at the validator. (Keep it unset so a regression that drops the
|
|
136
|
+
// requirement would surface as a 200 [] rather than passing by accident.)
|
|
137
|
+
workflowRef.current = undefined
|
|
138
|
+
|
|
139
|
+
// #when — omit sessionID entirely
|
|
140
|
+
const app = Server.Default().app
|
|
141
|
+
const response = await app.request("/workflows", { method: "GET" })
|
|
142
|
+
|
|
143
|
+
// #then — rejected, NOT a 200 with the unfiltered all-runs branch.
|
|
144
|
+
expect(response.status).toBe(400)
|
|
145
|
+
},
|
|
146
|
+
})
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
test("GET /workflows with a non-session-shaped sessionID returns 400", async () => {
|
|
150
|
+
await using tmp = await tmpdir({ git: true })
|
|
151
|
+
await Instance.provide({
|
|
152
|
+
directory: tmp.path,
|
|
153
|
+
fn: async () => {
|
|
154
|
+
workflowRef.current = undefined
|
|
155
|
+
const app = Server.Default().app
|
|
156
|
+
const response = await app.request("/workflows?sessionID=not-a-session", { method: "GET" })
|
|
157
|
+
expect(response.status).toBe(400)
|
|
158
|
+
},
|
|
159
|
+
})
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
// ── P0 (MR104 #3): defense-in-depth at the persistence layer ──────────────
|
|
163
|
+
// readScript / journal IO are reachable from the tool + TUI, not only the HTTP
|
|
164
|
+
// route, so the persistence path functions must themselves refuse a traversal
|
|
165
|
+
// runID. A direct readScript("../../../etc/passwd") must FAIL (the guard throws,
|
|
166
|
+
// surfacing as an Effect defect) rather than open a file outside scriptDir.
|
|
167
|
+
test("WorkflowPersistence.readScript fails safely on a traversal runID (no out-of-dir read)", async () => {
|
|
168
|
+
await using tmp = await tmpdir({ git: true })
|
|
169
|
+
await Instance.provide({
|
|
170
|
+
directory: tmp.path,
|
|
171
|
+
fn: async () => {
|
|
172
|
+
const exit = await Effect.runPromiseExit(WorkflowPersistence.readScript("../../../etc/passwd"))
|
|
173
|
+
// #then — the GUARD must reject it. Asserting only Exit.isFailure would
|
|
174
|
+
// also pass against unguarded code (ENOENT on `…/etc/passwd.js`), so assert
|
|
175
|
+
// the failure carries the guard's message — this fails closed if safeRunID
|
|
176
|
+
// is ever removed.
|
|
177
|
+
expect(Exit.isFailure(exit)).toBe(true)
|
|
178
|
+
if (Exit.isFailure(exit)) {
|
|
179
|
+
expect(Cause.pretty(exit.cause)).toContain("invalid workflow runID")
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
})
|
|
183
|
+
})
|
|
184
|
+
|
|
185
|
+
test("WorkflowPersistence.readScript still reads a legit wf_ runID", async () => {
|
|
186
|
+
await using tmp = await tmpdir({ git: true })
|
|
187
|
+
await Instance.provide({
|
|
188
|
+
directory: tmp.path,
|
|
189
|
+
fn: async () => {
|
|
190
|
+
// #given a normally-minted runID with a persisted script
|
|
191
|
+
const runID = "wf_16ec185f2ffexEGkbWeMqWSucv"
|
|
192
|
+
await Effect.runPromise(WorkflowPersistence.writeScript(runID, "export const meta = {}\n"))
|
|
193
|
+
// #then — the guard does NOT break the legit path
|
|
194
|
+
const body = await Effect.runPromise(WorkflowPersistence.readScript(runID))
|
|
195
|
+
expect(body).toContain("export const meta")
|
|
196
|
+
},
|
|
197
|
+
})
|
|
198
|
+
})
|
|
199
|
+
})
|
|
200
|
+
|
|
201
|
+
// The LIVE path the TUI /workflows dialog consumes: the route returns REAL run
|
|
202
|
+
// data (not the degenerate []). These run under the workflow test layer
|
|
203
|
+
// (makeLayer) so WorkflowRuntime.layer is live and populates the module-global
|
|
204
|
+
// `workflowRef` that the route reads through. Crucially the data path is the
|
|
205
|
+
// process-global `:memory:` DB (test/preload sets OPENDASH_DB=:memory:, and the
|
|
206
|
+
// storage Client is a per-process singleton): the run writes its WorkflowRunTable
|
|
207
|
+
// row there, and the route's handler — run via AppRuntime, NOT this layer — reads
|
|
208
|
+
// the SAME DB. So `Server.Default().app.request("/workflows")` genuinely
|
|
209
|
+
// exercises the HTTP route end-to-end against a real run. The
|
|
210
|
+
// `x-opendash-directory` header makes InstanceMiddleware re-enter the SAME cached
|
|
211
|
+
// tmpdir Instance the run used (one entry per directory in Instance's cache), so
|
|
212
|
+
// resume's re-launch spawns in the run's own session context. We filter list by
|
|
213
|
+
// sessionID to stay robust against any residue in the shared in-memory DB.
|
|
214
|
+
const it = testEffect(makeLayer())
|
|
215
|
+
|
|
216
|
+
// Test ORDER is deliberate: the sandbox-free resume test runs FIRST and the
|
|
217
|
+
// agent-spawning list test runs LAST. An agent() run forks a quickjs sandbox
|
|
218
|
+
// (evalScript) whose teardown is CPU-sensitive — under load the 1ms pump interval
|
|
219
|
+
// can starve, leaving the forked fiber uninterruptible at scope close (the
|
|
220
|
+
// pre-existing quickjs-under-Bun condition; see runtime.test.ts). Keeping the only
|
|
221
|
+
// sandbox-bearing test last means its residue has no following evalScript test to
|
|
222
|
+
// destabilize. Verified 0 flakes across 16 process runs UNDER heavy CPU contention
|
|
223
|
+
// in this order; the reverse order flakes ~30%+.
|
|
224
|
+
//
|
|
225
|
+
// NOTE on resume coverage: we assert the resume route over a LIVE runtime returns
|
|
226
|
+
// the real { resumed: false } for an unknown run — this proves the route reaches
|
|
227
|
+
// the live `runtime.resume()` (distinct from the degenerate case above, where the
|
|
228
|
+
// runtime is absent and the route short-circuits before calling resume). We do NOT
|
|
229
|
+
// add an HTTP test for the positive { resumed: true } re-launch: a successful
|
|
230
|
+
// resume forks a fresh evalScript whose teardown deadlocks under CI CPU load
|
|
231
|
+
// regardless of how it is driven (HTTP or the service directly) — a runtime/sandbox
|
|
232
|
+
// limitation we cannot fix from a test. The re-launch semantics (resumed: true,
|
|
233
|
+
// cached replay, zero-spawn resume) are covered in the warmed-up
|
|
234
|
+
// test/workflow/runtime.test.ts suite.
|
|
235
|
+
describe("workflows routes — live runtime", () => {
|
|
236
|
+
it.live("POST /workflows/:runID/resume reaches the LIVE runtime (resumed: false for an unknown run)", () =>
|
|
237
|
+
provideTmpdirServer(
|
|
238
|
+
Effect.fnUntraced(function* ({ dir }) {
|
|
239
|
+
// #given the workflow runtime IS live (the layer set the late-bound ref) —
|
|
240
|
+
// this is what distinguishes this from the degenerate test above, where the
|
|
241
|
+
// ref is undefined and the route returns early without calling resume().
|
|
242
|
+
expect(workflowRef.current).toBeDefined()
|
|
243
|
+
|
|
244
|
+
// #when — POST resume over the REAL route for a runID with no persisted run.
|
|
245
|
+
// Use a valid minted-shape runID (wf_ + 26 base62) so it passes the param
|
|
246
|
+
// validator and genuinely reaches the live runtime.resume(), which loads no
|
|
247
|
+
// row and returns { resumed: false }. (async wrapper normalizes Hono's
|
|
248
|
+
// `Promise<Response> | Response` overload for Effect.promise.)
|
|
249
|
+
const response = yield* Effect.promise(async () =>
|
|
250
|
+
Server.Default().app.request(`/workflows/wf_00000000000000000000000000/resume`, {
|
|
251
|
+
method: "POST",
|
|
252
|
+
headers: { "x-opendash-directory": dir },
|
|
253
|
+
}),
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
// #then — the live runtime's real verdict flows back through the HTTP route.
|
|
257
|
+
expect(response.status).toBe(200)
|
|
258
|
+
expect(yield* Effect.promise(() => response.json())).toEqual({
|
|
259
|
+
runID: "wf_00000000000000000000000000",
|
|
260
|
+
resumed: false,
|
|
261
|
+
})
|
|
262
|
+
}),
|
|
263
|
+
{ git: true, config: providerCfg },
|
|
264
|
+
),
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
it.live("GET /workflows returns a live run with real status + counters", () =>
|
|
268
|
+
provideTmpdirServer(
|
|
269
|
+
Effect.fnUntraced(function* ({ dir, llm }) {
|
|
270
|
+
const runtime = yield* WorkflowRuntime.Service
|
|
271
|
+
const session = yield* Session.Service
|
|
272
|
+
const parent = yield* session.create({
|
|
273
|
+
title: "wf route live",
|
|
274
|
+
permission: [{ permission: "*", pattern: "*", action: "allow" }],
|
|
275
|
+
})
|
|
276
|
+
yield* llm.text("done") // one reply for the single agent() spawn
|
|
277
|
+
const script = [`export const meta = { name: "t", description: "d" }`, `return await agent("x")`].join("\n")
|
|
278
|
+
const { runID } = yield* runtime.start({ script, sessionID: parent.id, parentActorID: "main", model: ref })
|
|
279
|
+
const outcome = yield* runtime.wait({ runID, timeoutMs: 8000 })
|
|
280
|
+
expect(outcome.status).toBe("completed")
|
|
281
|
+
|
|
282
|
+
// #when — drive the REAL HTTP route the TUI list reads. The directory header
|
|
283
|
+
// makes InstanceMiddleware re-enter the same cached tmpdir Instance the run
|
|
284
|
+
// used; sessionID scopes to this run. app.request's Hono overload is
|
|
285
|
+
// `Promise<Response> | Response`, so the async wrapper normalizes it to a
|
|
286
|
+
// Promise for Effect.promise.
|
|
287
|
+
const response = yield* Effect.promise(async () =>
|
|
288
|
+
Server.Default().app.request(`/workflows?sessionID=${parent.id}`, {
|
|
289
|
+
method: "GET",
|
|
290
|
+
headers: { "x-opendash-directory": dir },
|
|
291
|
+
}),
|
|
292
|
+
)
|
|
293
|
+
expect(response.status).toBe(200)
|
|
294
|
+
const rows = (yield* Effect.promise(() => response.json())) as Array<{
|
|
295
|
+
runID: string
|
|
296
|
+
status: string
|
|
297
|
+
succeeded: number
|
|
298
|
+
}>
|
|
299
|
+
|
|
300
|
+
// #then — the live run is visible over HTTP with its real fields: this is
|
|
301
|
+
// the exact data path the TUI /workflows list reads (counter from a real spawn).
|
|
302
|
+
const row = rows.find((r) => r.runID === runID)
|
|
303
|
+
expect(row).toBeDefined()
|
|
304
|
+
expect(row!.status).toBe("completed")
|
|
305
|
+
expect(row!.succeeded).toBeGreaterThanOrEqual(1)
|
|
306
|
+
}),
|
|
307
|
+
{ git: true, config: providerCfg },
|
|
308
|
+
),
|
|
309
|
+
// Headroom over the default 5s: this exercises a full Instance bootstrap +
|
|
310
|
+
// a real runtime run + an HTTP round-trip, and runs alongside the heavy
|
|
311
|
+
// live workflow/server suites where CI load can push past 5s.
|
|
312
|
+
15000,
|
|
313
|
+
)
|
|
314
|
+
|
|
315
|
+
it.live("GET /workflows/:runID/transcript and /structure return the run's full data", () =>
|
|
316
|
+
provideTmpdirServer(
|
|
317
|
+
Effect.fnUntraced(function* ({ dir, llm }) {
|
|
318
|
+
const runtime = yield* WorkflowRuntime.Service
|
|
319
|
+
const session = yield* Session.Service
|
|
320
|
+
const parent = yield* session.create({
|
|
321
|
+
title: "wf route detail",
|
|
322
|
+
permission: [{ permission: "*", pattern: "*", action: "allow" }],
|
|
323
|
+
})
|
|
324
|
+
yield* llm.text("done")
|
|
325
|
+
const script = [
|
|
326
|
+
`export const meta = { name: "t", description: "d" }`,
|
|
327
|
+
`phase("Plan")`,
|
|
328
|
+
`return await agent("x")`,
|
|
329
|
+
].join("\n")
|
|
330
|
+
const { runID } = yield* runtime.start({ script, sessionID: parent.id, parentActorID: "main", model: ref })
|
|
331
|
+
const outcome = yield* runtime.wait({ runID, timeoutMs: 8000 })
|
|
332
|
+
expect(outcome.status).toBe("completed")
|
|
333
|
+
|
|
334
|
+
const tRes = yield* Effect.promise(async () =>
|
|
335
|
+
Server.Default().app.request(`/workflows/${runID}/transcript`, {
|
|
336
|
+
method: "GET",
|
|
337
|
+
headers: { "x-opendash-directory": dir },
|
|
338
|
+
}),
|
|
339
|
+
)
|
|
340
|
+
expect(tRes.status).toBe(200)
|
|
341
|
+
const tBody = (yield* Effect.promise(() => tRes.json())) as {
|
|
342
|
+
runID: string
|
|
343
|
+
transcript: { kind: string; text: string }[]
|
|
344
|
+
}
|
|
345
|
+
expect(tBody.runID).toBe(runID)
|
|
346
|
+
expect(tBody.transcript.some((e) => e.kind === "phase")).toBe(true)
|
|
347
|
+
|
|
348
|
+
const sRes = yield* Effect.promise(async () =>
|
|
349
|
+
Server.Default().app.request(`/workflows/${runID}/structure`, {
|
|
350
|
+
method: "GET",
|
|
351
|
+
headers: { "x-opendash-directory": dir },
|
|
352
|
+
}),
|
|
353
|
+
)
|
|
354
|
+
expect(sRes.status).toBe(200)
|
|
355
|
+
const sBody = (yield* Effect.promise(() => sRes.json())) as { runID: string; nodes: { type: string }[] }
|
|
356
|
+
expect(sBody.runID).toBe(runID)
|
|
357
|
+
expect(sBody.nodes.some((n) => n.type === "agent")).toBe(true)
|
|
358
|
+
}),
|
|
359
|
+
{ git: true, config: providerCfg },
|
|
360
|
+
),
|
|
361
|
+
15000,
|
|
362
|
+
)
|
|
363
|
+
})
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test"
|
|
2
|
+
import { Effect, Layer } from "effect"
|
|
3
|
+
import * as fs from "fs/promises"
|
|
4
|
+
import { Bus } from "../../src/bus"
|
|
5
|
+
import { Config } from "../../src/config"
|
|
6
|
+
import { Memory } from "../../src/memory"
|
|
7
|
+
import { ActorRegistry } from "../../src/actor/registry"
|
|
8
|
+
import { Actor } from "../../src/actor/spawn"
|
|
9
|
+
import { TaskRegistry } from "../../src/task/registry"
|
|
10
|
+
import { SessionCheckpoint } from "../../src/session/checkpoint"
|
|
11
|
+
import { Log } from "../../src/util"
|
|
12
|
+
import { provideTmpdirInstance } from "../fixture/fixture"
|
|
13
|
+
import { Session as SessionNs } from "../../src/session"
|
|
14
|
+
import { MessageID, PartID } from "../../src/session/schema"
|
|
15
|
+
import { ProviderID, ModelID } from "../../src/provider/schema"
|
|
16
|
+
import { checkpointPath } from "../../src/session/checkpoint-paths"
|
|
17
|
+
import * as CrossSpawnSpawner from "../../src/effect/cross-spawn-spawner"
|
|
18
|
+
|
|
19
|
+
void Log.init({ print: false })
|
|
20
|
+
|
|
21
|
+
const ref = {
|
|
22
|
+
providerID: ProviderID.make("test"),
|
|
23
|
+
modelID: ModelID.make("test-model"),
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const stubActorRegistry = Layer.succeed(
|
|
27
|
+
ActorRegistry.Service,
|
|
28
|
+
ActorRegistry.Service.of({
|
|
29
|
+
register: () => Effect.die("not used"),
|
|
30
|
+
updateStatus: () => Effect.void,
|
|
31
|
+
updateTurn: () => Effect.void,
|
|
32
|
+
get: () => Effect.succeed(undefined),
|
|
33
|
+
listBySession: () => Effect.succeed([]),
|
|
34
|
+
listActive: () => Effect.succeed([]),
|
|
35
|
+
listByParent: () => Effect.succeed([]),
|
|
36
|
+
renderForAgent: () => Effect.succeed(""),
|
|
37
|
+
agentTypeFor: () => Effect.succeed("main"),
|
|
38
|
+
// Force the guard inside tryStartCheckpointWriter to fire by always reporting true.
|
|
39
|
+
isSystemSpawned: () => Effect.succeed(true),
|
|
40
|
+
allocateActorID: () => Effect.die("not used"),
|
|
41
|
+
}),
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
// The system-spawn guard short-circuits before Actor.spawn is reached, so this
|
|
45
|
+
// stub never gets called — but we still need to satisfy the SessionCheckpoint
|
|
46
|
+
// layer's Actor.Service requirement at construction time.
|
|
47
|
+
const stubActor = Layer.succeed(
|
|
48
|
+
Actor.Service,
|
|
49
|
+
Actor.Service.of({
|
|
50
|
+
spawn: () => Effect.die("Actor.spawn unexpectedly called in system-spawn skip path"),
|
|
51
|
+
cancel: () => Effect.die("Actor.cancel unexpectedly called in system-spawn skip path"),
|
|
52
|
+
getForkContext: () => Effect.succeed(undefined),
|
|
53
|
+
}),
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
const deps = Layer.mergeAll(
|
|
57
|
+
Bus.layer,
|
|
58
|
+
Config.defaultLayer,
|
|
59
|
+
Memory.defaultLayer,
|
|
60
|
+
TaskRegistry.defaultLayer,
|
|
61
|
+
stubActorRegistry,
|
|
62
|
+
stubActor,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
const env = Layer.mergeAll(
|
|
66
|
+
SessionNs.defaultLayer,
|
|
67
|
+
CrossSpawnSpawner.defaultLayer,
|
|
68
|
+
SessionCheckpoint.layer.pipe(Layer.provide(SessionNs.defaultLayer), Layer.provideMerge(deps)),
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
describe("SessionCheckpoint.tryStartCheckpointWriter — system-spawn skip", () => {
|
|
72
|
+
test("returns 'skipped' and does NOT bootstrap checkpoint.md when isSystemSpawned=true", async () => {
|
|
73
|
+
await Effect.runPromise(
|
|
74
|
+
provideTmpdirInstance(() =>
|
|
75
|
+
Effect.gen(function* () {
|
|
76
|
+
const svc = yield* SessionCheckpoint.Service
|
|
77
|
+
const ssn = yield* SessionNs.Service
|
|
78
|
+
const info = yield* ssn.create({})
|
|
79
|
+
|
|
80
|
+
// Seed enough state that the empty-message guard would not fire — so
|
|
81
|
+
// we know it's the system-spawn guard short-circuiting the bootstrap.
|
|
82
|
+
const user = yield* ssn.updateMessage({
|
|
83
|
+
id: MessageID.ascending(),
|
|
84
|
+
role: "user",
|
|
85
|
+
sessionID: info.id,
|
|
86
|
+
agent: "build",
|
|
87
|
+
model: ref,
|
|
88
|
+
time: { created: Date.now() },
|
|
89
|
+
})
|
|
90
|
+
yield* ssn.updatePart({
|
|
91
|
+
id: PartID.ascending(),
|
|
92
|
+
messageID: user.id,
|
|
93
|
+
sessionID: info.id,
|
|
94
|
+
type: "text",
|
|
95
|
+
text: "seed",
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
const outcome = yield* svc.tryStartCheckpointWriter({
|
|
99
|
+
sessionID: info.id,
|
|
100
|
+
model: { providerID: "test", modelID: "test-model" },
|
|
101
|
+
promptOps: {} as any,
|
|
102
|
+
})
|
|
103
|
+
expect(outcome).toBe("skipped")
|
|
104
|
+
|
|
105
|
+
// Bootstrap helpers (ensureCheckpointTemplate / ensureMemoryTemplate)
|
|
106
|
+
// run AFTER the system-spawn guard. With the guard active, no
|
|
107
|
+
// checkpoint.md should appear on disk.
|
|
108
|
+
const cpPath = checkpointPath(info.id)
|
|
109
|
+
const exists = yield* Effect.promise(() =>
|
|
110
|
+
fs.stat(cpPath).then(() => true).catch(() => false),
|
|
111
|
+
)
|
|
112
|
+
expect(exists).toBe(false)
|
|
113
|
+
|
|
114
|
+
// Sanity: the writer table should not have been updated either.
|
|
115
|
+
const running = yield* svc.isWriterRunning(info.id)
|
|
116
|
+
expect(running).toBe(false)
|
|
117
|
+
}),
|
|
118
|
+
).pipe(Effect.scoped, Effect.provide(env)),
|
|
119
|
+
)
|
|
120
|
+
})
|
|
121
|
+
})
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test"
|
|
2
|
+
import { adjustBoundaryForApiInvariants } from "../../src/session/boundary"
|
|
3
|
+
|
|
4
|
+
type Msg = { role: "user" | "assistant" | "tool"; content: any[]; id?: string }
|
|
5
|
+
|
|
6
|
+
describe("adjustBoundaryForApiInvariants", () => {
|
|
7
|
+
test("walks back to include tool_use when tool_result is in tail", () => {
|
|
8
|
+
const msgs: Msg[] = [
|
|
9
|
+
{ role: "user", content: [{ type: "text", text: "hello" }] },
|
|
10
|
+
{ role: "assistant", content: [{ type: "tool_use", id: "X", name: "read" }] },
|
|
11
|
+
{ role: "tool", content: [{ type: "tool_result", tool_use_id: "X", text: "result" }] },
|
|
12
|
+
{ role: "assistant", content: [{ type: "text", text: "done" }] },
|
|
13
|
+
]
|
|
14
|
+
// Candidate boundary at idx=2 (tail starts with tool_result)
|
|
15
|
+
// Should walk back to idx=1 (include the tool_use)
|
|
16
|
+
expect(adjustBoundaryForApiInvariants(msgs, 2)).toBe(1)
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
test("returns boundary unchanged when no orphans", () => {
|
|
20
|
+
const msgs: Msg[] = [
|
|
21
|
+
{ role: "user", content: [{ type: "text", text: "hi" }] },
|
|
22
|
+
{ role: "assistant", content: [{ type: "text", text: "hi back" }] },
|
|
23
|
+
{ role: "user", content: [{ type: "text", text: "more" }] },
|
|
24
|
+
]
|
|
25
|
+
expect(adjustBoundaryForApiInvariants(msgs, 2)).toBe(2)
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
test("returns boundary unchanged when 0 or full length", () => {
|
|
29
|
+
const msgs: Msg[] = [{ role: "user", content: [] }]
|
|
30
|
+
expect(adjustBoundaryForApiInvariants(msgs, 0)).toBe(0)
|
|
31
|
+
expect(adjustBoundaryForApiInvariants(msgs, 1)).toBe(1)
|
|
32
|
+
})
|
|
33
|
+
})
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { describe, test, expect } from "bun:test"
|
|
2
|
+
import { readBudgeted, readBudgetedSectionAware } from "../../src/session/budgeted-read"
|
|
3
|
+
import * as fs from "fs/promises"
|
|
4
|
+
import * as path from "path"
|
|
5
|
+
import * as os from "os"
|
|
6
|
+
|
|
7
|
+
describe("readBudgeted", () => {
|
|
8
|
+
const tmpDir = os.tmpdir()
|
|
9
|
+
|
|
10
|
+
test("returns full content when under budget", async () => {
|
|
11
|
+
const file = path.join(tmpDir, "budgeted-test-small.md")
|
|
12
|
+
await fs.writeFile(file, "short content")
|
|
13
|
+
const result = await readBudgeted(file, 1000)
|
|
14
|
+
expect(result?.truncated).toBe(false)
|
|
15
|
+
expect(result?.text).toBe("short content")
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
test("truncates with Read hint when over budget", async () => {
|
|
19
|
+
const file = path.join(tmpDir, "budgeted-test-large.md")
|
|
20
|
+
await fs.writeFile(file, "word ".repeat(5000)) // ~5000 tokens
|
|
21
|
+
const result = await readBudgeted(file, 100)
|
|
22
|
+
expect(result?.truncated).toBe(true)
|
|
23
|
+
expect(result?.text).toContain("Truncated at ~100 tokens")
|
|
24
|
+
expect(result?.text).toContain("Read(")
|
|
25
|
+
expect(result?.text).toContain("offset=")
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
test("returns undefined for missing file", async () => {
|
|
29
|
+
const result = await readBudgeted("/tmp/nonexistent-xyz.md", 1000)
|
|
30
|
+
expect(result).toBeUndefined()
|
|
31
|
+
})
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
describe("readBudgetedSectionAware", () => {
|
|
35
|
+
const tmpDir = os.tmpdir()
|
|
36
|
+
|
|
37
|
+
test("preserves all section headers when content truncated", async () => {
|
|
38
|
+
const file = path.join(tmpDir, "section-aware.md")
|
|
39
|
+
const content = `# Title
|
|
40
|
+
## §1 Active intent
|
|
41
|
+
_instruction_
|
|
42
|
+
|
|
43
|
+
${"x ".repeat(2000)}
|
|
44
|
+
|
|
45
|
+
## §2 Next action
|
|
46
|
+
_instruction_
|
|
47
|
+
|
|
48
|
+
short
|
|
49
|
+
`
|
|
50
|
+
await fs.writeFile(file, content)
|
|
51
|
+
const result = await readBudgetedSectionAware(file, 100)
|
|
52
|
+
expect(result?.text).toContain("## §1 Active intent")
|
|
53
|
+
expect(result?.text).toContain("## §2 Next action")
|
|
54
|
+
expect(result?.text).toContain("_instruction_")
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
test("preserves spillover index lines (- See ...md) even when truncated", async () => {
|
|
58
|
+
const file = path.join(tmpDir, "spill-aware.md")
|
|
59
|
+
const content = `# Title
|
|
60
|
+
## §7 Discovered knowledge
|
|
61
|
+
_instruction_
|
|
62
|
+
|
|
63
|
+
${"y ".repeat(3000)}
|
|
64
|
+
- See checkpoint-lexer.md (15 items) — Position type, Token shape
|
|
65
|
+
|
|
66
|
+
## §9 Live resources
|
|
67
|
+
_instruction_
|
|
68
|
+
short
|
|
69
|
+
`
|
|
70
|
+
await fs.writeFile(file, content)
|
|
71
|
+
const result = await readBudgetedSectionAware(file, 100)
|
|
72
|
+
expect(result?.text).toContain("- See checkpoint-lexer.md")
|
|
73
|
+
})
|
|
74
|
+
})
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test"
|
|
2
|
+
import { alignToNonToolResultUser } from "../../src/session/checkpoint-align"
|
|
3
|
+
|
|
4
|
+
// Minimal shape: alignToNonToolResultUser only needs `info.role` and
|
|
5
|
+
// `parts[].type`. Use literal objects rather than full MessageV2.WithParts
|
|
6
|
+
// — the helper should be schema-light.
|
|
7
|
+
type Msg = {
|
|
8
|
+
info: { role: "user" | "assistant"; id: string }
|
|
9
|
+
parts: Array<{ type: string }>
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const u = (id: string, partTypes: string[] = ["text"]): Msg => ({
|
|
13
|
+
info: { role: "user", id },
|
|
14
|
+
parts: partTypes.map((t) => ({ type: t })),
|
|
15
|
+
})
|
|
16
|
+
const a = (id: string, partTypes: string[] = ["text"]): Msg => ({
|
|
17
|
+
info: { role: "assistant", id },
|
|
18
|
+
parts: partTypes.map((t) => ({ type: t })),
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
describe("alignToNonToolResultUser", () => {
|
|
22
|
+
test("returns the input idx when it already points at a non-tool-result-only user", () => {
|
|
23
|
+
const msgs = [u("u1", ["text"]), a("a1"), u("u2", ["text"])]
|
|
24
|
+
expect(alignToNonToolResultUser(msgs, 2)).toBe(2)
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
test("walks back past assistant tool_use to the previous user", () => {
|
|
28
|
+
const msgs = [u("u1"), a("a1", ["tool_use"]), u("u2", ["tool_result"]), a("a2", ["text"])]
|
|
29
|
+
// idx=2 (u2 with tool_result-only parts) must back up to idx=0 (u1 plain text)
|
|
30
|
+
expect(alignToNonToolResultUser(msgs, 2)).toBe(0)
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
test("treats user message with mixed parts (tool_result + text) as valid", () => {
|
|
34
|
+
const msgs = [u("u1"), a("a1", ["tool_use"]), u("u2", ["tool_result", "text"])]
|
|
35
|
+
expect(alignToNonToolResultUser(msgs, 2)).toBe(2)
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
test("returns 0 when no qualifying message exists in [0, idx]", () => {
|
|
39
|
+
// Degenerate: only tool-result-only users + assistants
|
|
40
|
+
const msgs = [u("u1", ["tool_result"]), a("a1", ["tool_use"]), u("u2", ["tool_result"])]
|
|
41
|
+
expect(alignToNonToolResultUser(msgs, 2)).toBe(0)
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
test("returns idx itself when idx is past the end (empty delta intent)", () => {
|
|
45
|
+
const msgs = [u("u1"), a("a1")]
|
|
46
|
+
expect(alignToNonToolResultUser(msgs, 2)).toBe(2)
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
test("idx 0 with valid first message returns 0", () => {
|
|
50
|
+
const msgs = [u("u1")]
|
|
51
|
+
expect(alignToNonToolResultUser(msgs, 0)).toBe(0)
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
test("treats user with empty parts as valid (cannot be orphan tool_result)", () => {
|
|
55
|
+
const msgs: Msg[] = [u("u1", ["tool_result"]), a("a1", ["tool_use"]), { info: { role: "user", id: "u2" }, parts: [] }]
|
|
56
|
+
expect(alignToNonToolResultUser(msgs, 2)).toBe(2)
|
|
57
|
+
})
|
|
58
|
+
})
|