tulingcode 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +134 -0
- package/Dockerfile +18 -0
- package/README.md +15 -0
- package/bin/tuling +179 -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/package.json +196 -0
- package/parsers-config.ts +290 -0
- package/script/build.ts +267 -0
- package/script/check-migrations.ts +16 -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 +60 -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 +1783 -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 +741 -0
- package/src/actor/turn.ts +49 -0
- package/src/actor/waiter.ts +166 -0
- package/src/agent/agent.ts +554 -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 +705 -0
- package/src/cli/cmd/run-completion.ts +77 -0
- package/src/cli/cmd/run.ts +694 -0
- package/src/cli/cmd/serve.ts +21 -0
- package/src/cli/cmd/session.ts +181 -0
- package/src/cli/cmd/stats.ts +413 -0
- package/src/cli/cmd/tui/app.tsx +1130 -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 +83 -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-command.tsx +208 -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 +224 -0
- package/src/cli/cmd/tui/component/dialog-model.tsx +253 -0
- package/src/cli/cmd/tui/component/dialog-provider.tsx +490 -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-variant.tsx +39 -0
- package/src/cli/cmd/tui/component/dialog-workflows.tsx +62 -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.tsx +684 -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 +1812 -0
- package/src/cli/cmd/tui/component/prompt/part.ts +16 -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/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 +76 -0
- package/src/cli/cmd/tui/context/language.tsx +91 -0
- package/src/cli/cmd/tui/context/local.tsx +455 -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 +61 -0
- package/src/cli/cmd/tui/context/sdk.tsx +150 -0
- package/src/cli/cmd/tui/context/sync.tsx +828 -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/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/tulingcode.json +245 -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 +1298 -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 +193 -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 +397 -0
- package/src/cli/cmd/tui/i18n/es.ts +433 -0
- package/src/cli/cmd/tui/i18n/fr.ts +440 -0
- package/src/cli/cmd/tui/i18n/ja.ts +392 -0
- package/src/cli/cmd/tui/i18n/locales.ts +82 -0
- package/src/cli/cmd/tui/i18n/ru.ts +452 -0
- package/src/cli/cmd/tui/i18n/zh.ts +390 -0
- package/src/cli/cmd/tui/i18n/zht.ts +360 -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 +1030 -0
- package/src/cli/cmd/tui/plugin/slots.tsx +60 -0
- package/src/cli/cmd/tui/routes/home.tsx +165 -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 +2532 -0
- package/src/cli/cmd/tui/routes/session/permission.tsx +691 -0
- package/src/cli/cmd/tui/routes/session/question.tsx +488 -0
- package/src/cli/cmd/tui/routes/session/sidebar.tsx +97 -0
- package/src/cli/cmd/tui/routes/session/subagent-footer.tsx +142 -0
- package/src/cli/cmd/tui/thread.ts +246 -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 +452 -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 +378 -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 +35 -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/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 +41 -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 +360 -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 +81 -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 +53 -0
- package/src/cli/network.ts +62 -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/config.ts +1024 -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 +16 -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 +164 -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 +260 -0
- package/src/installation/index.ts +351 -0
- package/src/installation/version.ts +8 -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 +944 -0
- package/src/mcp/oauth-callback.ts +232 -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 +379 -0
- package/src/permission/schema.ts +17 -0
- package/src/plugin/checkpoint-splitover.ts +60 -0
- package/src/plugin/cloud-ai.ts +329 -0
- package/src/plugin/cloudflare.ts +76 -0
- package/src/plugin/codex.ts +607 -0
- package/src/plugin/github-copilot/copilot.ts +368 -0
- package/src/plugin/github-copilot/models.ts +153 -0
- package/src/plugin/index.ts +493 -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-free.ts +153 -0
- package/src/plugin/mimo.ts +124 -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 +190 -0
- package/src/project/project-id.ts +48 -0
- package/src/project/project.sql.ts +16 -0
- package/src/project/project.ts +501 -0
- package/src/project/schema.ts +15 -0
- package/src/project/vcs.ts +227 -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 +1782 -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 +1322 -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/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 +92 -0
- package/src/server/projectors.ts +28 -0
- package/src/server/proxy.ts +171 -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 +287 -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 +88 -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 +136 -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 +35 -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 +247 -0
- package/src/server/routes/instance/question.ts +162 -0
- package/src/server/routes/instance/session.ts +1296 -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 +72 -0
- package/src/server/routes/ui.ts +55 -0
- package/src/server/server.ts +136 -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 +1478 -0
- package/src/session/classify.ts +92 -0
- package/src/session/claude-import.sql.ts +13 -0
- package/src/session/claude-import.ts +379 -0
- package/src/session/compaction.ts +543 -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 +735 -0
- package/src/session/max-mode.ts +397 -0
- package/src/session/message-v2.ts +1136 -0
- package/src/session/message.ts +191 -0
- package/src/session/overflow.ts +53 -0
- package/src/session/prefix-capture-ref.ts +48 -0
- package/src/session/processor.ts +962 -0
- package/src/session/projectors.ts +137 -0
- package/src/session/prompt/anthropic.txt +154 -0
- package/src/session/prompt/beast.txt +155 -0
- package/src/session/prompt/build-switch.txt +5 -0
- package/src/session/prompt/codex.txt +79 -0
- package/src/session/prompt/compose.txt +115 -0
- package/src/session/prompt/copilot-gpt-5.txt +143 -0
- package/src/session/prompt/default.txt +151 -0
- package/src/session/prompt/gemini.txt +155 -0
- package/src/session/prompt/gpt.txt +107 -0
- package/src/session/prompt/kimi.txt +95 -0
- package/src/session/prompt/max-steps.txt +16 -0
- package/src/session/prompt/trinity.txt +97 -0
- package/src/session/prompt.ts +3355 -0
- package/src/session/prune.ts +481 -0
- package/src/session/retry.ts +166 -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 +86 -0
- package/src/session/todo.ts +77 -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 +110 -0
- package/src/skill/compose/.bundle/ask/SKILL.md +58 -0
- package/src/skill/compose/.bundle/brainstorm/SKILL.md +220 -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 +287 -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 +115 -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 +169 -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 +656 -0
- package/src/skill/compose/.bundle/new-skill/anthropic-best-practices.md +1150 -0
- package/src/skill/compose/.bundle/new-skill/examples/CLAUDE_MD_TESTING.md +189 -0
- package/src/skill/compose/.bundle/new-skill/graphviz-conventions.dot +172 -0
- package/src/skill/compose/.bundle/new-skill/persuasion-principles.md +187 -0
- package/src/skill/compose/.bundle/new-skill/render-graphs.js +168 -0
- package/src/skill/compose/.bundle/new-skill/testing-skills-with-subagents.md +384 -0
- package/src/skill/compose/.bundle/parallel/SKILL.md +182 -0
- package/src/skill/compose/.bundle/plan/SKILL.md +161 -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 +171 -0
- package/src/skill/compose/.bundle/subagent/SKILL.md +344 -0
- package/src/skill/compose/.bundle/subagent/code-quality-reviewer-prompt.md +24 -0
- package/src/skill/compose/.bundle/subagent/implementer-prompt.md +126 -0
- package/src/skill/compose/.bundle/subagent/spec-reviewer-prompt.md +112 -0
- package/src/skill/compose/.bundle/tdd/SKILL.md +372 -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 +311 -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/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 +387 -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 +803 -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 +696 -0
- package/src/tool/bash.txt +123 -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 +685 -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 +61 -0
- package/src/tool/multiedit.txt +41 -0
- package/src/tool/plan-enter.txt +14 -0
- package/src/tool/plan-exit.txt +13 -0
- package/src/tool/plan.ts +90 -0
- package/src/tool/question.ts +67 -0
- package/src/tool/question.txt +10 -0
- package/src/tool/read.ts +327 -0
- package/src/tool/read.txt +14 -0
- package/src/tool/registry.ts +413 -0
- package/src/tool/schema.ts +17 -0
- package/src/tool/session-cwd.ts +35 -0
- package/src/tool/shell-tokenize.ts +346 -0
- package/src/tool/shell-wrap.ts +190 -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 +153 -0
- package/src/tool/truncate.ts +201 -0
- package/src/tool/truncation-dir.ts +4 -0
- package/src/tool/webfetch.ts +199 -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 +164 -0
- package/src/tool/workflow.txt +25 -0
- package/src/tool/write.ts +88 -0
- package/src/tool/write.txt +9 -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/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 +12 -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 +197 -0
- package/src/util/media.ts +26 -0
- package/src/util/mimo-process.ts +24 -0
- package/src/util/network.ts +9 -0
- package/src/util/process.ts +174 -0
- package/src/util/queue.ts +32 -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/timeout.ts +14 -0
- package/src/util/token.ts +5 -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/deep-research.js +391 -0
- package/src/workflow/builtin.ts +54 -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 +1234 -0
- package/src/workflow/sandbox.ts +280 -0
- package/src/workflow/workflow.sql.ts +31 -0
- package/src/workflow/workspace.ts +69 -0
- package/src/worktree/index.ts +614 -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 +1072 -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 +874 -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/prompt-part.test.ts +47 -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 +121 -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 +269 -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 +956 -0
- package/test/file/path-traversal.test.ts +204 -0
- package/test/file/ripgrep.test.ts +214 -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 +190 -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 +149 -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 +226 -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/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 +824 -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 +51 -0
- package/test/permission/next.test.ts +1080 -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 +257 -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 +150 -0
- package/test/project/project-id.test.ts +64 -0
- package/test/project/project.test.ts +481 -0
- package/test/project/vcs.test.ts +286 -0
- package/test/project/worktree-remove.test.ts +126 -0
- package/test/project/worktree.test.ts +214 -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 +2648 -0
- package/test/provider/transform.test.ts +3379 -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 +122 -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-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 +279 -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 +508 -0
- package/test/session/checkpoint-context.test.ts +141 -0
- package/test/session/checkpoint-drain.test.ts +188 -0
- package/test/session/checkpoint-extract-titles.test.ts +58 -0
- package/test/session/checkpoint-fork-mode.test.ts +576 -0
- package/test/session/checkpoint-main-slice.test.ts +259 -0
- package/test/session/checkpoint-paths.test.ts +78 -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 +143 -0
- package/test/session/checkpoint-rebuild-v3.test.ts +248 -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 +335 -0
- package/test/session/compaction-agent-scope.test.ts +164 -0
- package/test/session/context-inheritance.test.ts +46 -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 +387 -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 +121 -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 +1272 -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 +229 -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 +1574 -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 +703 -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/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/share/share-next.test.ts +332 -0
- package/test/shell/shell.test.ts +73 -0
- package/test/skill/compose-review.test.ts +141 -0
- package/test/skill/discovery.test.ts +116 -0
- package/test/skill/skill.test.ts +465 -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 +152 -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 +206 -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 +250 -0
- package/test/tool/actor.test.ts +748 -0
- package/test/tool/apply_patch.test.ts +626 -0
- package/test/tool/bash.test.ts +1195 -0
- package/test/tool/describe-workflow.test.ts +12 -0
- package/test/tool/edit.test.ts +691 -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/registry-invocation-style.test.ts +121 -0
- package/test/tool/registry.test.ts +164 -0
- package/test/tool/shell-tokenize.test.ts +273 -0
- package/test/tool/shell-wrap-missing-script.test.ts +128 -0
- package/test/tool/shell-wrap.test.ts +257 -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/truncation.test.ts +253 -0
- package/test/tool/webfetch.test.ts +103 -0
- package/test/tool/whitelist.test.ts +373 -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/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 +44 -0
- package/test/util/module.test.ts +59 -0
- package/test/util/process.test.ts +128 -0
- package/test/util/timeout.test.ts +21 -0
- package/test/util/which.test.ts +100 -0
- package/test/util/wildcard.test.ts +90 -0
- package/test/workflow/builtin.test.ts +22 -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 +1078 -0
- package/test/workflow/sandbox.test.ts +259 -0
- package/test/workflow/tool.test.ts +473 -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,79 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test"
|
|
2
|
+
import path from "path"
|
|
3
|
+
import fs from "fs/promises"
|
|
4
|
+
import { Effect } from "effect"
|
|
5
|
+
import { tmpdir } from "../fixture/fixture"
|
|
6
|
+
import { Instance } from "../../src/project/instance"
|
|
7
|
+
import { ProviderAuth } from "../../src/provider"
|
|
8
|
+
import { ProviderID } from "../../src/provider/schema"
|
|
9
|
+
|
|
10
|
+
describe("plugin.auth-override", () => {
|
|
11
|
+
test("user plugin overrides built-in github-copilot auth", async () => {
|
|
12
|
+
await using tmp = await tmpdir({
|
|
13
|
+
init: async (dir) => {
|
|
14
|
+
const pluginDir = path.join(dir, ".tulingcode", "plugin")
|
|
15
|
+
await fs.mkdir(pluginDir, { recursive: true })
|
|
16
|
+
|
|
17
|
+
await Bun.write(
|
|
18
|
+
path.join(pluginDir, "custom-copilot-auth.ts"),
|
|
19
|
+
[
|
|
20
|
+
"export default {",
|
|
21
|
+
' id: "demo.custom-copilot-auth",',
|
|
22
|
+
" server: async () => ({",
|
|
23
|
+
" auth: {",
|
|
24
|
+
' provider: "github-copilot",',
|
|
25
|
+
" methods: [",
|
|
26
|
+
' { type: "api", label: "Test Override Auth" },',
|
|
27
|
+
" ],",
|
|
28
|
+
" loader: async () => ({ access: 'test-token' }),",
|
|
29
|
+
" },",
|
|
30
|
+
" }),",
|
|
31
|
+
"}",
|
|
32
|
+
"",
|
|
33
|
+
].join("\n"),
|
|
34
|
+
)
|
|
35
|
+
},
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
await using plain = await tmpdir()
|
|
39
|
+
|
|
40
|
+
const methods = await Instance.provide({
|
|
41
|
+
directory: tmp.path,
|
|
42
|
+
fn: async () => {
|
|
43
|
+
return Effect.runPromise(
|
|
44
|
+
ProviderAuth.Service.use((svc) => svc.methods()).pipe(Effect.provide(ProviderAuth.defaultLayer)),
|
|
45
|
+
)
|
|
46
|
+
},
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
const plainMethods = await Instance.provide({
|
|
50
|
+
directory: plain.path,
|
|
51
|
+
fn: async () => {
|
|
52
|
+
return Effect.runPromise(
|
|
53
|
+
ProviderAuth.Service.use((svc) => svc.methods()).pipe(Effect.provide(ProviderAuth.defaultLayer)),
|
|
54
|
+
)
|
|
55
|
+
},
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
const copilot = methods[ProviderID.make("github-copilot")]
|
|
59
|
+
expect(copilot).toBeDefined()
|
|
60
|
+
expect(copilot.length).toBe(1)
|
|
61
|
+
expect(copilot[0].label).toBe("Test Override Auth")
|
|
62
|
+
expect(plainMethods[ProviderID.make("github-copilot")][0].label).not.toBe("Test Override Auth")
|
|
63
|
+
}, 30000) // Increased timeout for plugin installation
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
const file = path.join(import.meta.dir, "../../src/plugin/index.ts")
|
|
67
|
+
|
|
68
|
+
describe("plugin.config-hook-error-isolation", () => {
|
|
69
|
+
test("config hooks are individually error-isolated in the layer factory", async () => {
|
|
70
|
+
const src = await Bun.file(file).text()
|
|
71
|
+
|
|
72
|
+
// Each hook's config call is wrapped in Effect.tryPromise with error logging + Effect.ignore
|
|
73
|
+
expect(src).toContain("plugin config hook failed")
|
|
74
|
+
|
|
75
|
+
const pattern =
|
|
76
|
+
/for\s*\(const hook of hooks\)\s*\{[\s\S]*?Effect\.tryPromise[\s\S]*?\.config\?\.\([\s\S]*?plugin config hook failed[\s\S]*?Effect\.ignore/
|
|
77
|
+
expect(pattern.test(src)).toBe(true)
|
|
78
|
+
})
|
|
79
|
+
})
|
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
import { afterEach, describe, expect, test } from "bun:test"
|
|
2
|
+
import * as fs from "fs/promises"
|
|
3
|
+
import * as path from "path"
|
|
4
|
+
import type { ActorMatcher, ActorPreStopInput, ActorStopOutput, PluginInput } from "@tuling-ai/plugin"
|
|
5
|
+
import { CheckpointSplitoverPlugin } from "../../src/plugin/checkpoint-splitover"
|
|
6
|
+
import { matchesActor } from "../../src/plugin/matcher"
|
|
7
|
+
import * as CheckpointContext from "../../src/session/checkpoint-context"
|
|
8
|
+
import { checkpointPath, memoryPath, metaDir } from "../../src/session/checkpoint-paths"
|
|
9
|
+
import type { SessionID } from "../../src/session/schema"
|
|
10
|
+
import type { ProjectID } from "../../src/project/schema"
|
|
11
|
+
|
|
12
|
+
afterEach(() => {
|
|
13
|
+
CheckpointContext._reset()
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
function tmpSessionID(): SessionID {
|
|
17
|
+
return ("s_" + Math.random().toString(36).slice(2, 10)) as SessionID
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function tmpProjectID(): ProjectID {
|
|
21
|
+
return ("proj_test_" + Math.random().toString(36).slice(2, 10)) as ProjectID
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function fakeInput(projectID: ProjectID): PluginInput {
|
|
25
|
+
return {
|
|
26
|
+
client: {},
|
|
27
|
+
project: { id: projectID },
|
|
28
|
+
directory: "",
|
|
29
|
+
worktree: "",
|
|
30
|
+
experimental_workspace: { register() {} },
|
|
31
|
+
serverUrl: new URL("http://localhost:4096"),
|
|
32
|
+
$: undefined,
|
|
33
|
+
} as unknown as PluginInput
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function fakeStopInput(sessionID: SessionID): ActorPreStopInput {
|
|
37
|
+
return {
|
|
38
|
+
sessionID,
|
|
39
|
+
actorID: "act_test",
|
|
40
|
+
agentType: "checkpoint-writer",
|
|
41
|
+
mode: "subagent",
|
|
42
|
+
lifecycle: "ephemeral",
|
|
43
|
+
task: "checkpoint",
|
|
44
|
+
iteration: 0,
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async function setupSession(sessionID: SessionID, projectID: ProjectID): Promise<void> {
|
|
49
|
+
await fs.mkdir(metaDir(sessionID), { recursive: true })
|
|
50
|
+
await fs.mkdir(path.dirname(memoryPath(projectID)), { recursive: true })
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const CLEAN_CHECKPOINT = `Topic: clean test checkpoint
|
|
54
|
+
|
|
55
|
+
### Execution context
|
|
56
|
+
(none)
|
|
57
|
+
|
|
58
|
+
### Live resources
|
|
59
|
+
(none)
|
|
60
|
+
|
|
61
|
+
### Session metadata
|
|
62
|
+
(none)
|
|
63
|
+
|
|
64
|
+
### Discovered
|
|
65
|
+
(none)
|
|
66
|
+
|
|
67
|
+
### Dead ends
|
|
68
|
+
(none)
|
|
69
|
+
`
|
|
70
|
+
|
|
71
|
+
const CLEAN_MEMORY = `## Rules
|
|
72
|
+
short rule
|
|
73
|
+
`
|
|
74
|
+
|
|
75
|
+
describe("CheckpointSplitoverPlugin", () => {
|
|
76
|
+
test("clean checkpoint -> no reentry", async () => {
|
|
77
|
+
const sessionID = tmpSessionID()
|
|
78
|
+
const projectID = tmpProjectID()
|
|
79
|
+
await setupSession(sessionID, projectID)
|
|
80
|
+
await fs.writeFile(checkpointPath(sessionID), CLEAN_CHECKPOINT)
|
|
81
|
+
await fs.writeFile(memoryPath(projectID), CLEAN_MEMORY)
|
|
82
|
+
|
|
83
|
+
const hooks = await CheckpointSplitoverPlugin(fakeInput(projectID))
|
|
84
|
+
const reg = hooks["actor.preStop"]
|
|
85
|
+
if (!reg || typeof reg === "function") throw new Error("expected registration object with matcher+run")
|
|
86
|
+
|
|
87
|
+
const output: ActorStopOutput = {}
|
|
88
|
+
await reg.run(fakeStopInput(sessionID), output)
|
|
89
|
+
|
|
90
|
+
expect(output.continue).toBeUndefined()
|
|
91
|
+
expect(output.reason).toBeUndefined()
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
test("extract-required → buildExtractionReflection in reason", async () => {
|
|
95
|
+
const sessionID = tmpSessionID()
|
|
96
|
+
const projectID = tmpProjectID()
|
|
97
|
+
await setupSession(sessionID, projectID)
|
|
98
|
+
// §1 Active intent budget is 500 tokens (~2000 chars). Blow past it.
|
|
99
|
+
const oversized = "## §1 Active intent\n" + "x ".repeat(3000) + "\n"
|
|
100
|
+
await fs.writeFile(checkpointPath(sessionID), oversized)
|
|
101
|
+
await fs.writeFile(memoryPath(projectID), "## Rules\nok\n")
|
|
102
|
+
|
|
103
|
+
const hooks = await CheckpointSplitoverPlugin(fakeInput(projectID))
|
|
104
|
+
const reg = hooks["actor.preStop"]
|
|
105
|
+
if (!reg || typeof reg === "function") throw new Error("expected registration object")
|
|
106
|
+
|
|
107
|
+
const output: ActorStopOutput = {}
|
|
108
|
+
await reg.run(fakeStopInput(sessionID), output)
|
|
109
|
+
|
|
110
|
+
expect(output.continue).toBe(true)
|
|
111
|
+
expect(output.reason).toBeDefined()
|
|
112
|
+
expect(output.reason!).toContain("EXTRACTION REQUIRED")
|
|
113
|
+
expect(output.reason!).toContain("spillover")
|
|
114
|
+
})
|
|
115
|
+
|
|
116
|
+
test("regular error → buildReflectionMessage in reason", async () => {
|
|
117
|
+
const sessionID = tmpSessionID()
|
|
118
|
+
const projectID = tmpProjectID()
|
|
119
|
+
await setupSession(sessionID, projectID)
|
|
120
|
+
// checkpoint-validator emits severity:"error" with rule "topic-missing" when
|
|
121
|
+
// the file is empty (checkpoint-retry.ts line 62-68). Create empty checkpoint.md.
|
|
122
|
+
await fs.writeFile(checkpointPath(sessionID), "")
|
|
123
|
+
await fs.writeFile(memoryPath(projectID), "## Rules\nshort\n")
|
|
124
|
+
|
|
125
|
+
const hooks = await CheckpointSplitoverPlugin(fakeInput(projectID))
|
|
126
|
+
const reg = hooks["actor.preStop"]
|
|
127
|
+
if (!reg || typeof reg === "function") throw new Error("expected registration object")
|
|
128
|
+
|
|
129
|
+
const output: ActorStopOutput = {}
|
|
130
|
+
await reg.run(fakeStopInput(sessionID), output)
|
|
131
|
+
|
|
132
|
+
expect(output.continue).toBe(true)
|
|
133
|
+
expect(output.reason).toBeDefined()
|
|
134
|
+
expect(output.reason!).toContain("<system-reminder>")
|
|
135
|
+
expect(output.reason!).toContain("CHECKPOINT_PATH = ")
|
|
136
|
+
expect(output.reason!).toContain("MEMORY_PATH = ")
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
test("extract-required wins over error", async () => {
|
|
140
|
+
const sessionID = tmpSessionID()
|
|
141
|
+
const projectID = tmpProjectID()
|
|
142
|
+
await setupSession(sessionID, projectID)
|
|
143
|
+
// §1 Active intent over budget AND checkpoint.md content present but
|
|
144
|
+
// memory.md missing topics (would cause separate error). The hook should
|
|
145
|
+
// pick the extract-required branch because that wins priority.
|
|
146
|
+
const oversized = "## §1 Active intent\n" + "x ".repeat(3000) + "\n"
|
|
147
|
+
await fs.writeFile(checkpointPath(sessionID), oversized)
|
|
148
|
+
await fs.writeFile(memoryPath(projectID), "") // empty memory file
|
|
149
|
+
|
|
150
|
+
const hooks = await CheckpointSplitoverPlugin(fakeInput(projectID))
|
|
151
|
+
const reg = hooks["actor.preStop"]
|
|
152
|
+
if (!reg || typeof reg === "function") throw new Error("expected registration object")
|
|
153
|
+
|
|
154
|
+
const output: ActorStopOutput = {}
|
|
155
|
+
await reg.run(fakeStopInput(sessionID), output)
|
|
156
|
+
|
|
157
|
+
expect(output.continue).toBe(true)
|
|
158
|
+
expect(output.reason!).toContain("EXTRACTION REQUIRED")
|
|
159
|
+
expect(output.reason!).not.toContain("<system-reminder>")
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
test("hook never throws on pathological session IDs", async () => {
|
|
163
|
+
// Different inputs route through different paths (graceful empty → error
|
|
164
|
+
// branch, or genuine throw → catch). The universal invariant is: no
|
|
165
|
+
// exception escapes the hook.
|
|
166
|
+
const hooks = await CheckpointSplitoverPlugin(fakeInput(tmpProjectID()))
|
|
167
|
+
const reg = hooks["actor.preStop"]
|
|
168
|
+
if (!reg || typeof reg === "function") throw new Error("expected registration object")
|
|
169
|
+
|
|
170
|
+
const cases: SessionID[] = [
|
|
171
|
+
("") as SessionID,
|
|
172
|
+
("s_/../../etc/passwd") as SessionID,
|
|
173
|
+
("s_nonexistent_session") as SessionID,
|
|
174
|
+
]
|
|
175
|
+
for (const sid of cases) {
|
|
176
|
+
const output: ActorStopOutput = {}
|
|
177
|
+
await expect(reg.run(fakeStopInput(sid), output)).resolves.toBeUndefined()
|
|
178
|
+
}
|
|
179
|
+
})
|
|
180
|
+
|
|
181
|
+
test("synchronous validator throw → caught by plugin (output untouched, no exception)", async () => {
|
|
182
|
+
// NUL byte in session ID forces Bun.file() to throw synchronously inside
|
|
183
|
+
// runValidatorsForCkpt — escaping the validator's own .catch(() => "")
|
|
184
|
+
// handler. The plugin's outer try/catch must catch it.
|
|
185
|
+
//
|
|
186
|
+
// Load-bearing assertions:
|
|
187
|
+
// - resolves.toBeUndefined: catch path swallowed the exception.
|
|
188
|
+
// - output.continue undefined: distinguishes "catch fired" from
|
|
189
|
+
// "validator returned gracefully with topic-missing error" (which
|
|
190
|
+
// would set continue=true).
|
|
191
|
+
const hooks = await CheckpointSplitoverPlugin(fakeInput(tmpProjectID()))
|
|
192
|
+
const reg = hooks["actor.preStop"]
|
|
193
|
+
if (!reg || typeof reg === "function") throw new Error("expected registration object")
|
|
194
|
+
|
|
195
|
+
const output: ActorStopOutput = {}
|
|
196
|
+
await expect(reg.run(fakeStopInput(("s_\x00bad") as SessionID), output)).resolves.toBeUndefined()
|
|
197
|
+
expect(output.continue).toBeUndefined()
|
|
198
|
+
expect(output.reason).toBeUndefined()
|
|
199
|
+
})
|
|
200
|
+
|
|
201
|
+
test("warn-only → no reentry", async () => {
|
|
202
|
+
const sessionID = tmpSessionID()
|
|
203
|
+
const projectID = tmpProjectID()
|
|
204
|
+
await setupSession(sessionID, projectID)
|
|
205
|
+
// validateSnapshot and validateLearning both emit severity:"warn" rule
|
|
206
|
+
// "topic-too-long" when the Topic: line exceeds TOPIC_MAX_CHARS (80). Use
|
|
207
|
+
// the clean v5 checkpoint skeleton but stretch the topic over 80 chars.
|
|
208
|
+
// All required sub-sections are present in order with (none) placeholders,
|
|
209
|
+
// so no error/extract-required violations fire. Result: 2 warn violations
|
|
210
|
+
// (one per validator) → plugin must leave output untouched regardless.
|
|
211
|
+
const longTopic = "a".repeat(120) // > 80 char limit
|
|
212
|
+
const warnOnlyCheckpoint =
|
|
213
|
+
`Topic: ${longTopic}\n` +
|
|
214
|
+
`\n` +
|
|
215
|
+
`### Execution context\n(none)\n\n` +
|
|
216
|
+
`### Live resources\n(none)\n\n` +
|
|
217
|
+
`### Session metadata\n(none)\n\n` +
|
|
218
|
+
`### Discovered\n(none)\n\n` +
|
|
219
|
+
`### Dead ends\n(none)\n`
|
|
220
|
+
await fs.writeFile(checkpointPath(sessionID), warnOnlyCheckpoint)
|
|
221
|
+
await fs.writeFile(memoryPath(projectID), "## Rules\nshort\n")
|
|
222
|
+
|
|
223
|
+
const hooks = await CheckpointSplitoverPlugin(fakeInput(projectID))
|
|
224
|
+
const reg = hooks["actor.preStop"]
|
|
225
|
+
if (!reg || typeof reg === "function") throw new Error("expected registration object")
|
|
226
|
+
|
|
227
|
+
const output: ActorStopOutput = {}
|
|
228
|
+
await reg.run(fakeStopInput(sessionID), output)
|
|
229
|
+
|
|
230
|
+
// The fixture produces warn-level violations only (topic-too-long).
|
|
231
|
+
// Plugin output must stay untouched regardless of warn count.
|
|
232
|
+
expect(output.continue).toBeUndefined()
|
|
233
|
+
expect(output.reason).toBeUndefined()
|
|
234
|
+
})
|
|
235
|
+
|
|
236
|
+
test("matcher includes checkpoint-writer and excludes other agents", async () => {
|
|
237
|
+
const hooks = await CheckpointSplitoverPlugin(fakeInput(tmpProjectID()))
|
|
238
|
+
const reg = hooks["actor.preStop"]
|
|
239
|
+
if (!reg || typeof reg === "function") throw new Error("expected registration object")
|
|
240
|
+
const matcher: ActorMatcher | undefined = reg.matcher
|
|
241
|
+
|
|
242
|
+
expect(matchesActor(matcher, { mode: "subagent", agentType: "checkpoint-writer" })).toBe(true)
|
|
243
|
+
|
|
244
|
+
// Any agentType not in the include list is rejected — independent of BUILT_IN_AGENTS membership.
|
|
245
|
+
expect(matchesActor(matcher, { mode: "subagent", agentType: "general" })).toBe(false)
|
|
246
|
+
expect(matchesActor(matcher, { mode: "subagent", agentType: "build" })).toBe(false)
|
|
247
|
+
expect(matchesActor(matcher, { mode: "subagent", agentType: "summary" })).toBe(false)
|
|
248
|
+
|
|
249
|
+
// Non-built-in custom agents also excluded (include is strict)
|
|
250
|
+
expect(matchesActor(matcher, { mode: "subagent", agentType: "custom" })).toBe(false)
|
|
251
|
+
})
|
|
252
|
+
|
|
253
|
+
test("CheckpointContext entry with priorTitles → validateLearning catches duplicate-title", async () => {
|
|
254
|
+
const sessionID = tmpSessionID()
|
|
255
|
+
const projectID = tmpProjectID()
|
|
256
|
+
const actorID = "act_dup"
|
|
257
|
+
await setupSession(sessionID, projectID)
|
|
258
|
+
// Pre-populate CheckpointContext so the splitover hook sees a non-empty
|
|
259
|
+
// priorTitles when it runs validateLearning.
|
|
260
|
+
CheckpointContext.set(sessionID, actorID, {
|
|
261
|
+
priorTitles: new Set(["Reuse Bun.file() not fs.readFile"]),
|
|
262
|
+
expectedRevisions: [],
|
|
263
|
+
})
|
|
264
|
+
// Writer's new checkpoint duplicates the prior title in Discovered section.
|
|
265
|
+
// Fixture matches validator's `valid` shape (Topic → Discovered → Dead ends)
|
|
266
|
+
// because extractDiscoveredEntries' regex anchors at start-of-body and
|
|
267
|
+
// doesn't accept intervening snapshot sections. Missing snapshot sections
|
|
268
|
+
// will also emit subsection-missing errors that ride alongside the
|
|
269
|
+
// duplicate-title error into the same `<system-reminder>` envelope — fine
|
|
270
|
+
// for what this test exercises (the priorTitles wire-through).
|
|
271
|
+
const dupCheckpoint = `Topic: writer-output
|
|
272
|
+
|
|
273
|
+
### Discovered
|
|
274
|
+
- Reuse Bun.file() not fs.readFile
|
|
275
|
+
Why: faster
|
|
276
|
+
How to apply: replace fs.readFile sites
|
|
277
|
+
|
|
278
|
+
### Dead ends
|
|
279
|
+
(none)
|
|
280
|
+
`
|
|
281
|
+
await fs.writeFile(checkpointPath(sessionID), dupCheckpoint)
|
|
282
|
+
await fs.writeFile(memoryPath(projectID), "## Rules\nx\n")
|
|
283
|
+
|
|
284
|
+
const hooks = await CheckpointSplitoverPlugin(fakeInput(projectID))
|
|
285
|
+
const reg = hooks["actor.preStop"]
|
|
286
|
+
if (!reg || typeof reg === "function") throw new Error("expected registration object")
|
|
287
|
+
|
|
288
|
+
const output: ActorStopOutput = {}
|
|
289
|
+
const input: ActorPreStopInput = { ...fakeStopInput(sessionID), actorID }
|
|
290
|
+
await reg.run(input, output)
|
|
291
|
+
|
|
292
|
+
expect(output.continue).toBe(true)
|
|
293
|
+
// The duplicate-title violation goes through the error branch
|
|
294
|
+
// (validateLearning emits severity:"error" rule "discovered-duplicate-title"),
|
|
295
|
+
// so the reason starts with the system-reminder envelope and includes the
|
|
296
|
+
// violation detail (which embeds the duplicated title verbatim).
|
|
297
|
+
expect(output.reason).toContain("<system-reminder>")
|
|
298
|
+
expect(output.reason).toContain("duplicates a prior checkpoint")
|
|
299
|
+
expect(output.reason).toContain("Reuse Bun.file() not fs.readFile")
|
|
300
|
+
})
|
|
301
|
+
|
|
302
|
+
test("no CheckpointContext entry: fallback to empty (D₁ behaviour)", async () => {
|
|
303
|
+
const sessionID = tmpSessionID()
|
|
304
|
+
const projectID = tmpProjectID()
|
|
305
|
+
await setupSession(sessionID, projectID)
|
|
306
|
+
// No CheckpointContext.set call — entry is missing.
|
|
307
|
+
// Write a clean checkpoint so without priorTitles, no validateLearning
|
|
308
|
+
// violation can fire. Plugin should fall back to EMPTY_CTX and produce
|
|
309
|
+
// no reentry signal.
|
|
310
|
+
await fs.writeFile(checkpointPath(sessionID), CLEAN_CHECKPOINT)
|
|
311
|
+
await fs.writeFile(memoryPath(projectID), CLEAN_MEMORY)
|
|
312
|
+
|
|
313
|
+
const hooks = await CheckpointSplitoverPlugin(fakeInput(projectID))
|
|
314
|
+
const reg = hooks["actor.preStop"]
|
|
315
|
+
if (!reg || typeof reg === "function") throw new Error("expected registration object")
|
|
316
|
+
|
|
317
|
+
const output: ActorStopOutput = {}
|
|
318
|
+
await reg.run(fakeStopInput(sessionID), output)
|
|
319
|
+
|
|
320
|
+
expect(output.continue).toBeUndefined()
|
|
321
|
+
expect(output.reason).toBeUndefined()
|
|
322
|
+
})
|
|
323
|
+
|
|
324
|
+
// -------------------------------------------------------------------------
|
|
325
|
+
// Regression: child-session writer (Axis A) must read PARENT's checkpoint.md
|
|
326
|
+
// -------------------------------------------------------------------------
|
|
327
|
+
// Post-Axis-A, the writer runs under a fresh child session: input.sessionID
|
|
328
|
+
// is the child's id, but the writer composes checkpoint.md / memory.md at
|
|
329
|
+
// paths derived from the PARENT's session id. Without a parentSessionID
|
|
330
|
+
// fallback, the splitover plugin reads checkpointPath(child) → file missing
|
|
331
|
+
// → false `topic-missing` error → wrong-path retry loop. Ditto for
|
|
332
|
+
// CheckpointContext lookup (set by parent, looked up by child = miss).
|
|
333
|
+
//
|
|
334
|
+
// Fix: the plugin reads `(parentSessionID ?? sessionID)` so:
|
|
335
|
+
// • checkpoint-writer (parent ≠ child) reads from parent's path.
|
|
336
|
+
// • dream/distill (parent === child === sessionID) keep working via the
|
|
337
|
+
// fallback.
|
|
338
|
+
describe("parentSessionID fallback (child-session writer)", () => {
|
|
339
|
+
test("clean parent's checkpoint + child's input.sessionID → no violation", async () => {
|
|
340
|
+
const parentID = tmpSessionID()
|
|
341
|
+
const childID = tmpSessionID()
|
|
342
|
+
const projectID = tmpProjectID()
|
|
343
|
+
// Provision PARENT's metaDir + write a clean checkpoint there.
|
|
344
|
+
// CHILD's metaDir is intentionally NOT created — proves the plugin
|
|
345
|
+
// does not consult the child's path.
|
|
346
|
+
await setupSession(parentID, projectID)
|
|
347
|
+
await fs.writeFile(checkpointPath(parentID), CLEAN_CHECKPOINT)
|
|
348
|
+
await fs.writeFile(memoryPath(projectID), CLEAN_MEMORY)
|
|
349
|
+
|
|
350
|
+
const hooks = await CheckpointSplitoverPlugin(fakeInput(projectID))
|
|
351
|
+
const reg = hooks["actor.preStop"]
|
|
352
|
+
if (!reg || typeof reg === "function") throw new Error("expected registration object")
|
|
353
|
+
|
|
354
|
+
// Simulate the post-Axis-A spawn shape: sessionID=child, parentSessionID=parent.
|
|
355
|
+
const input: ActorPreStopInput = { ...fakeStopInput(childID), parentSessionID: parentID }
|
|
356
|
+
const output: ActorStopOutput = {}
|
|
357
|
+
await reg.run(input, output)
|
|
358
|
+
|
|
359
|
+
// No violation → output untouched. Without the fallback the plugin would
|
|
360
|
+
// read checkpointPath(child) → missing → set continue=true with a
|
|
361
|
+
// topic-missing error, failing this assertion.
|
|
362
|
+
expect(output.continue).toBeUndefined()
|
|
363
|
+
expect(output.reason).toBeUndefined()
|
|
364
|
+
})
|
|
365
|
+
|
|
366
|
+
test("CheckpointContext is also keyed on parent: child-only lookup misses", async () => {
|
|
367
|
+
const parentID = tmpSessionID()
|
|
368
|
+
const childID = tmpSessionID()
|
|
369
|
+
const projectID = tmpProjectID()
|
|
370
|
+
const actorID = "act_dup_child"
|
|
371
|
+
await setupSession(parentID, projectID)
|
|
372
|
+
// Producer (tryStartCheckpointWriter) seeds CheckpointContext keyed on
|
|
373
|
+
// the PARENT session. The plugin must look up by parent too — otherwise
|
|
374
|
+
// priorTitles is always empty and validateLearning never catches dupes.
|
|
375
|
+
CheckpointContext.set(parentID, actorID, {
|
|
376
|
+
priorTitles: new Set(["Reuse Bun.file() not fs.readFile"]),
|
|
377
|
+
expectedRevisions: [],
|
|
378
|
+
})
|
|
379
|
+
// Writer's new checkpoint duplicates the prior title in Discovered.
|
|
380
|
+
const dupCheckpoint = `Topic: writer-output
|
|
381
|
+
|
|
382
|
+
### Discovered
|
|
383
|
+
- Reuse Bun.file() not fs.readFile
|
|
384
|
+
Why: faster
|
|
385
|
+
How to apply: replace fs.readFile sites
|
|
386
|
+
|
|
387
|
+
### Dead ends
|
|
388
|
+
(none)
|
|
389
|
+
`
|
|
390
|
+
await fs.writeFile(checkpointPath(parentID), dupCheckpoint)
|
|
391
|
+
await fs.writeFile(memoryPath(projectID), CLEAN_MEMORY)
|
|
392
|
+
|
|
393
|
+
const hooks = await CheckpointSplitoverPlugin(fakeInput(projectID))
|
|
394
|
+
const reg = hooks["actor.preStop"]
|
|
395
|
+
if (!reg || typeof reg === "function") throw new Error("expected registration object")
|
|
396
|
+
|
|
397
|
+
const input: ActorPreStopInput = {
|
|
398
|
+
...fakeStopInput(childID),
|
|
399
|
+
actorID,
|
|
400
|
+
parentSessionID: parentID,
|
|
401
|
+
}
|
|
402
|
+
const output: ActorStopOutput = {}
|
|
403
|
+
await reg.run(input, output)
|
|
404
|
+
|
|
405
|
+
// Duplicate-title violation must fire — proves both file path AND
|
|
406
|
+
// CheckpointContext use the parent's session.
|
|
407
|
+
expect(output.continue).toBe(true)
|
|
408
|
+
expect(output.reason).toContain("duplicates a prior checkpoint")
|
|
409
|
+
expect(output.reason).toContain("Reuse Bun.file() not fs.readFile")
|
|
410
|
+
})
|
|
411
|
+
|
|
412
|
+
test("dream/distill shape (no parentSessionID) still works via fallback", async () => {
|
|
413
|
+
// For agents that don't get the child-session redirect, parent === child
|
|
414
|
+
// and parentSessionID is undefined. The `?? sessionID` fallback must
|
|
415
|
+
// preserve current behavior.
|
|
416
|
+
const sessionID = tmpSessionID()
|
|
417
|
+
const projectID = tmpProjectID()
|
|
418
|
+
await setupSession(sessionID, projectID)
|
|
419
|
+
await fs.writeFile(checkpointPath(sessionID), CLEAN_CHECKPOINT)
|
|
420
|
+
await fs.writeFile(memoryPath(projectID), CLEAN_MEMORY)
|
|
421
|
+
|
|
422
|
+
const hooks = await CheckpointSplitoverPlugin(fakeInput(projectID))
|
|
423
|
+
const reg = hooks["actor.preStop"]
|
|
424
|
+
if (!reg || typeof reg === "function") throw new Error("expected registration object")
|
|
425
|
+
|
|
426
|
+
// No parentSessionID set — same shape as today's dream/distill.
|
|
427
|
+
const output: ActorStopOutput = {}
|
|
428
|
+
await reg.run(fakeStopInput(sessionID), output)
|
|
429
|
+
|
|
430
|
+
expect(output.continue).toBeUndefined()
|
|
431
|
+
expect(output.reason).toBeUndefined()
|
|
432
|
+
})
|
|
433
|
+
})
|
|
434
|
+
})
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { expect, test } from "bun:test"
|
|
2
|
+
import { CloudflareAIGatewayAuthPlugin } from "@/plugin/cloudflare"
|
|
3
|
+
|
|
4
|
+
const pluginInput = {
|
|
5
|
+
client: {} as never,
|
|
6
|
+
project: {} as never,
|
|
7
|
+
directory: "",
|
|
8
|
+
worktree: "",
|
|
9
|
+
experimental_workspace: {
|
|
10
|
+
register() {},
|
|
11
|
+
},
|
|
12
|
+
serverUrl: new URL("https://example.com"),
|
|
13
|
+
$: {} as never,
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function makeHookInput(overrides: { providerID?: string; apiId?: string; reasoning?: boolean }) {
|
|
17
|
+
return {
|
|
18
|
+
sessionID: "s",
|
|
19
|
+
agent: "a",
|
|
20
|
+
provider: {} as never,
|
|
21
|
+
message: {} as never,
|
|
22
|
+
model: {
|
|
23
|
+
providerID: overrides.providerID ?? "cloudflare-ai-gateway",
|
|
24
|
+
api: { id: overrides.apiId ?? "openai/gpt-5.2-codex", url: "", npm: "ai-gateway-provider" },
|
|
25
|
+
capabilities: {
|
|
26
|
+
reasoning: overrides.reasoning ?? true,
|
|
27
|
+
temperature: false,
|
|
28
|
+
attachment: true,
|
|
29
|
+
toolcall: true,
|
|
30
|
+
input: { text: true, audio: false, image: false, video: false, pdf: false },
|
|
31
|
+
output: { text: true, audio: false, image: false, video: false, pdf: false },
|
|
32
|
+
interleaved: false,
|
|
33
|
+
},
|
|
34
|
+
} as never,
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function makeHookOutput() {
|
|
39
|
+
return { temperature: 0, topP: 1, topK: 0, maxOutputTokens: 32_000 as number | undefined, options: {} }
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
test("omits maxOutputTokens for openai reasoning models on cloudflare-ai-gateway", async () => {
|
|
43
|
+
const hooks = await CloudflareAIGatewayAuthPlugin(pluginInput)
|
|
44
|
+
const out = makeHookOutput()
|
|
45
|
+
await hooks["chat.params"]!(makeHookInput({ apiId: "openai/gpt-5.2-codex", reasoning: true }), out)
|
|
46
|
+
expect(out.maxOutputTokens).toBeUndefined()
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
test("keeps maxOutputTokens for openai non-reasoning models", async () => {
|
|
50
|
+
const hooks = await CloudflareAIGatewayAuthPlugin(pluginInput)
|
|
51
|
+
const out = makeHookOutput()
|
|
52
|
+
await hooks["chat.params"]!(makeHookInput({ apiId: "openai/gpt-4-turbo", reasoning: false }), out)
|
|
53
|
+
expect(out.maxOutputTokens).toBe(32_000)
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
test("keeps maxOutputTokens for non-openai reasoning models on cloudflare-ai-gateway", async () => {
|
|
57
|
+
const hooks = await CloudflareAIGatewayAuthPlugin(pluginInput)
|
|
58
|
+
const out = makeHookOutput()
|
|
59
|
+
await hooks["chat.params"]!(makeHookInput({ apiId: "anthropic/claude-sonnet-4-5", reasoning: true }), out)
|
|
60
|
+
expect(out.maxOutputTokens).toBe(32_000)
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
test("ignores non-cloudflare-ai-gateway providers", async () => {
|
|
64
|
+
const hooks = await CloudflareAIGatewayAuthPlugin(pluginInput)
|
|
65
|
+
const out = makeHookOutput()
|
|
66
|
+
await hooks["chat.params"]!(makeHookInput({ providerID: "openai", apiId: "gpt-5.2-codex", reasoning: true }), out)
|
|
67
|
+
expect(out.maxOutputTokens).toBe(32_000)
|
|
68
|
+
})
|