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
package/src/tool/lsp.ts
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import z from "zod"
|
|
2
|
+
import { Effect } from "effect"
|
|
3
|
+
import * as Tool from "./tool"
|
|
4
|
+
import path from "path"
|
|
5
|
+
import { LSP } from "../lsp"
|
|
6
|
+
import DESCRIPTION from "./lsp.txt"
|
|
7
|
+
import { Instance } from "../project/instance"
|
|
8
|
+
import { pathToFileURL } from "url"
|
|
9
|
+
import { assertExternalDirectoryEffect } from "./external-directory"
|
|
10
|
+
import { AppFileSystem } from "@tuling-ai/shared/filesystem"
|
|
11
|
+
|
|
12
|
+
const operations = [
|
|
13
|
+
"goToDefinition",
|
|
14
|
+
"findReferences",
|
|
15
|
+
"hover",
|
|
16
|
+
"documentSymbol",
|
|
17
|
+
"workspaceSymbol",
|
|
18
|
+
"goToImplementation",
|
|
19
|
+
"prepareCallHierarchy",
|
|
20
|
+
"incomingCalls",
|
|
21
|
+
"outgoingCalls",
|
|
22
|
+
] as const
|
|
23
|
+
|
|
24
|
+
export const LspTool = Tool.define(
|
|
25
|
+
"lsp",
|
|
26
|
+
Effect.gen(function* () {
|
|
27
|
+
const lsp = yield* LSP.Service
|
|
28
|
+
const fs = yield* AppFileSystem.Service
|
|
29
|
+
|
|
30
|
+
return {
|
|
31
|
+
description: DESCRIPTION,
|
|
32
|
+
parameters: z.object({
|
|
33
|
+
operation: z.enum(operations).describe("The LSP operation to perform"),
|
|
34
|
+
filePath: z.string().describe("The absolute or relative path to the file"),
|
|
35
|
+
line: z.number().int().min(1).describe("The line number (1-based, as shown in editors)"),
|
|
36
|
+
character: z.number().int().min(1).describe("The character offset (1-based, as shown in editors)"),
|
|
37
|
+
}),
|
|
38
|
+
execute: (
|
|
39
|
+
args: { operation: (typeof operations)[number]; filePath: string; line: number; character: number },
|
|
40
|
+
ctx: Tool.Context,
|
|
41
|
+
) =>
|
|
42
|
+
Effect.gen(function* () {
|
|
43
|
+
const file = path.isAbsolute(args.filePath) ? args.filePath : path.join(Instance.directory, args.filePath)
|
|
44
|
+
yield* assertExternalDirectoryEffect(ctx, file)
|
|
45
|
+
yield* ctx.ask({ permission: "lsp", patterns: ["*"], always: ["*"], metadata: {} })
|
|
46
|
+
|
|
47
|
+
const uri = pathToFileURL(file).href
|
|
48
|
+
const position = { file, line: args.line - 1, character: args.character - 1 }
|
|
49
|
+
const relPath = path.relative(Instance.worktree, file)
|
|
50
|
+
const title = `${args.operation} ${relPath}:${args.line}:${args.character}`
|
|
51
|
+
|
|
52
|
+
const exists = yield* fs.existsSafe(file)
|
|
53
|
+
if (!exists) throw new Error(`File not found: ${file}`)
|
|
54
|
+
|
|
55
|
+
const available = yield* lsp.hasClients(file)
|
|
56
|
+
if (!available) throw new Error("No LSP server available for this file type.")
|
|
57
|
+
|
|
58
|
+
yield* lsp.touchFile(file, true)
|
|
59
|
+
|
|
60
|
+
const result: unknown[] = yield* (() => {
|
|
61
|
+
switch (args.operation) {
|
|
62
|
+
case "goToDefinition":
|
|
63
|
+
return lsp.definition(position)
|
|
64
|
+
case "findReferences":
|
|
65
|
+
return lsp.references(position)
|
|
66
|
+
case "hover":
|
|
67
|
+
return lsp.hover(position)
|
|
68
|
+
case "documentSymbol":
|
|
69
|
+
return lsp.documentSymbol(uri)
|
|
70
|
+
case "workspaceSymbol":
|
|
71
|
+
return lsp.workspaceSymbol("")
|
|
72
|
+
case "goToImplementation":
|
|
73
|
+
return lsp.implementation(position)
|
|
74
|
+
case "prepareCallHierarchy":
|
|
75
|
+
return lsp.prepareCallHierarchy(position)
|
|
76
|
+
case "incomingCalls":
|
|
77
|
+
return lsp.incomingCalls(position)
|
|
78
|
+
case "outgoingCalls":
|
|
79
|
+
return lsp.outgoingCalls(position)
|
|
80
|
+
}
|
|
81
|
+
})()
|
|
82
|
+
|
|
83
|
+
return {
|
|
84
|
+
title,
|
|
85
|
+
metadata: { result },
|
|
86
|
+
output: result.length === 0 ? `No results found for ${args.operation}` : JSON.stringify(result, null, 2),
|
|
87
|
+
}
|
|
88
|
+
}),
|
|
89
|
+
}
|
|
90
|
+
}),
|
|
91
|
+
)
|
package/src/tool/lsp.txt
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
Interact with Language Server Protocol (LSP) servers to get code intelligence features.
|
|
2
|
+
|
|
3
|
+
Supported operations:
|
|
4
|
+
- goToDefinition: Find where a symbol is defined
|
|
5
|
+
- findReferences: Find all references to a symbol
|
|
6
|
+
- hover: Get hover information (documentation, type info) for a symbol
|
|
7
|
+
- documentSymbol: Get all symbols (functions, classes, variables) in a document
|
|
8
|
+
- workspaceSymbol: Search for symbols across the entire workspace
|
|
9
|
+
- goToImplementation: Find implementations of an interface or abstract method
|
|
10
|
+
- prepareCallHierarchy: Get call hierarchy item at a position (functions/methods)
|
|
11
|
+
- incomingCalls: Find all functions/methods that call the function at a position
|
|
12
|
+
- outgoingCalls: Find all functions/methods called by the function at a position
|
|
13
|
+
|
|
14
|
+
All operations require:
|
|
15
|
+
- filePath: The file to operate on
|
|
16
|
+
- line: The line number (1-based, as shown in editors)
|
|
17
|
+
- character: The character offset (1-based, as shown in editors)
|
|
18
|
+
|
|
19
|
+
Note: LSP servers must be configured for the file type. If no server is available, an error will be returned.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { Duration, Effect, Schema } from "effect"
|
|
2
|
+
import { HttpClient, HttpClientRequest } from "effect/unstable/http"
|
|
3
|
+
|
|
4
|
+
const URL = process.env.EXA_API_KEY
|
|
5
|
+
? `https://mcp.exa.ai/mcp?exaApiKey=${encodeURIComponent(process.env.EXA_API_KEY)}`
|
|
6
|
+
: "https://mcp.exa.ai/mcp"
|
|
7
|
+
|
|
8
|
+
const McpResult = Schema.Struct({
|
|
9
|
+
result: Schema.Struct({
|
|
10
|
+
content: Schema.Array(
|
|
11
|
+
Schema.Struct({
|
|
12
|
+
type: Schema.String,
|
|
13
|
+
text: Schema.String,
|
|
14
|
+
}),
|
|
15
|
+
),
|
|
16
|
+
}),
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
const decode = Schema.decodeUnknownEffect(Schema.fromJsonString(McpResult))
|
|
20
|
+
|
|
21
|
+
const parseSse = Effect.fn("McpExa.parseSse")(function* (body: string) {
|
|
22
|
+
for (const line of body.split("\n")) {
|
|
23
|
+
if (!line.startsWith("data: ")) continue
|
|
24
|
+
const data = yield* decode(line.substring(6))
|
|
25
|
+
if (data.result.content[0]?.text) return data.result.content[0].text
|
|
26
|
+
}
|
|
27
|
+
return undefined
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
export const SearchArgs = Schema.Struct({
|
|
31
|
+
query: Schema.String,
|
|
32
|
+
type: Schema.String,
|
|
33
|
+
numResults: Schema.Number,
|
|
34
|
+
livecrawl: Schema.String,
|
|
35
|
+
contextMaxCharacters: Schema.optional(Schema.Number),
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
export const CodeArgs = Schema.Struct({
|
|
39
|
+
query: Schema.String,
|
|
40
|
+
tokensNum: Schema.Number,
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
const McpRequest = <F extends Schema.Struct.Fields>(args: Schema.Struct<F>) =>
|
|
44
|
+
Schema.Struct({
|
|
45
|
+
jsonrpc: Schema.Literal("2.0"),
|
|
46
|
+
id: Schema.Literal(1),
|
|
47
|
+
method: Schema.Literal("tools/call"),
|
|
48
|
+
params: Schema.Struct({
|
|
49
|
+
name: Schema.String,
|
|
50
|
+
arguments: args,
|
|
51
|
+
}),
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
export const call = <F extends Schema.Struct.Fields>(
|
|
55
|
+
http: HttpClient.HttpClient,
|
|
56
|
+
tool: string,
|
|
57
|
+
args: Schema.Struct<F>,
|
|
58
|
+
value: Schema.Struct.Type<F>,
|
|
59
|
+
timeout: Duration.Input,
|
|
60
|
+
) =>
|
|
61
|
+
Effect.gen(function* () {
|
|
62
|
+
const request = yield* HttpClientRequest.post(URL).pipe(
|
|
63
|
+
HttpClientRequest.accept("application/json, text/event-stream"),
|
|
64
|
+
HttpClientRequest.schemaBodyJson(McpRequest(args))({
|
|
65
|
+
jsonrpc: "2.0" as const,
|
|
66
|
+
id: 1 as const,
|
|
67
|
+
method: "tools/call" as const,
|
|
68
|
+
params: { name: tool, arguments: value },
|
|
69
|
+
}),
|
|
70
|
+
)
|
|
71
|
+
const response = yield* HttpClient.filterStatusOk(http)
|
|
72
|
+
.execute(request)
|
|
73
|
+
.pipe(
|
|
74
|
+
Effect.timeoutOrElse({ duration: timeout, orElse: () => Effect.die(new Error(`${tool} request timed out`)) }),
|
|
75
|
+
)
|
|
76
|
+
const body = yield* response.text
|
|
77
|
+
return yield* parseSse(body)
|
|
78
|
+
})
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import * as path from "path"
|
|
2
|
+
import type { ProjectID } from "../project/schema"
|
|
3
|
+
import type { SessionID } from "../session/schema"
|
|
4
|
+
|
|
5
|
+
const VALID_SCOPES = ["global", "projects", "sessions"] as const
|
|
6
|
+
|
|
7
|
+
const TASK_ID_RE = /^T\d+(\.\d+)*$/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Returns true when the relative path under <root>/memory/ is one of the
|
|
11
|
+
* precise paths the checkpoint-writer subagent is permitted to write:
|
|
12
|
+
* projects/<pid>/memory.md (or memory-<topic>.md spillover)
|
|
13
|
+
* sessions/<sid>/checkpoint.md (or checkpoint-<topic>.md spillover)
|
|
14
|
+
* sessions/<sid>/notes.md
|
|
15
|
+
* sessions/<sid>/tasks/<task_id>/*.md
|
|
16
|
+
*
|
|
17
|
+
* Rejects anything else. Catches writer drift like
|
|
18
|
+
* `<pid>/pinned.md` (v4 name) at write time.
|
|
19
|
+
*/
|
|
20
|
+
function isCheckpointWriterAllowed(parts: string[]): boolean {
|
|
21
|
+
if (parts.length < 3) return false
|
|
22
|
+
|
|
23
|
+
if (parts[0] === "projects") {
|
|
24
|
+
if (parts.length !== 3) return false
|
|
25
|
+
const file = parts[2]
|
|
26
|
+
if (!file.endsWith(".md")) return false
|
|
27
|
+
const lower = file.toLowerCase()
|
|
28
|
+
return lower === "memory.md" || lower.startsWith("memory-")
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (parts[0] === "sessions") {
|
|
32
|
+
const rest = parts.slice(2)
|
|
33
|
+
if (rest.length === 1) {
|
|
34
|
+
const file = rest[0]
|
|
35
|
+
if (!file.endsWith(".md")) return false
|
|
36
|
+
return file === "checkpoint.md" || file === "notes.md" || file.startsWith("checkpoint-")
|
|
37
|
+
}
|
|
38
|
+
if (rest.length === 3 && rest[0] === "tasks") {
|
|
39
|
+
return TASK_ID_RE.test(rest[1]) && rest[2].endsWith(".md")
|
|
40
|
+
}
|
|
41
|
+
return false
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return false
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Format the multi-line "where to write memory" hint shown to main agent
|
|
49
|
+
* when it attempts a path with no scope dir or an invalid scope. Both throws
|
|
50
|
+
* use byte-identical bodies — the corrective action is the same.
|
|
51
|
+
*/
|
|
52
|
+
function formatMainAgentHelp(memoryFile: string, notesFile: string, target: string): string {
|
|
53
|
+
return (
|
|
54
|
+
`Memory writes go under <memoryRoot>/<scope>/<scope_id>/<key>.md (scope: global | projects | sessions). You attempted: ${target}.\n` +
|
|
55
|
+
`\n` +
|
|
56
|
+
`Canonical main-agent paths (copy verbatim):\n` +
|
|
57
|
+
` ${memoryFile}\n` +
|
|
58
|
+
` Edit ## Rules / ## Architecture decisions / ## Discovered durable knowledge.\n` +
|
|
59
|
+
` ${notesFile}\n` +
|
|
60
|
+
` Append \`## [turn N · ISO-Z]\` entries for free-form scratch.\n` +
|
|
61
|
+
`\n` +
|
|
62
|
+
`Other free-form <key>.md under a valid scope dir are also allowed.\n` +
|
|
63
|
+
`checkpoint.md, task progress, and memory-/checkpoint-<topic>.md spillovers are checkpoint-writer's domain.`
|
|
64
|
+
)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Returns true when the path is reserved-by-pattern for the checkpoint-writer
|
|
69
|
+
* subagent — main agent must not write it directly.
|
|
70
|
+
*
|
|
71
|
+
* In v5 only the writer-managed task directory remains reserved-by-pattern.
|
|
72
|
+
* Main agent CAN write <pid>/MEMORY.md and <sid>/checkpoint.md (system prompt
|
|
73
|
+
* teaches it the rules).
|
|
74
|
+
*/
|
|
75
|
+
function isReservedForCheckpointWriter(parts: string[]): boolean {
|
|
76
|
+
if (parts[0] !== "sessions" || parts.length < 4) return false
|
|
77
|
+
// Anything under <sid>/tasks/ is writer-managed (use task tool revise action).
|
|
78
|
+
if (parts[2] === "tasks") return true
|
|
79
|
+
return false
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Throws if the target write would violate memory-scope or reserved-path
|
|
84
|
+
* rules. Pure function — does not touch the filesystem.
|
|
85
|
+
*
|
|
86
|
+
* Two policies:
|
|
87
|
+
* - For checkpoint-writer subagent: must be in the precise allowlist above
|
|
88
|
+
* (<pid>/MEMORY.md, <sid>/checkpoint.md, <sid>/tasks/<id>/*.md, plus
|
|
89
|
+
* memory-/checkpoint- spillover variants).
|
|
90
|
+
* - For all other agents: cannot write <sid>/tasks/* — that's
|
|
91
|
+
* checkpoint-writer-only.
|
|
92
|
+
*
|
|
93
|
+
* Non-memory paths and free keys under valid scopes pass through unmodified.
|
|
94
|
+
*/
|
|
95
|
+
export function assertMemoryWriteAllowed(input: {
|
|
96
|
+
target: string
|
|
97
|
+
agentName: string
|
|
98
|
+
memoryRoot: string
|
|
99
|
+
projectID: ProjectID
|
|
100
|
+
sessionID: SessionID
|
|
101
|
+
taskId?: string
|
|
102
|
+
}): void {
|
|
103
|
+
const { target, agentName, memoryRoot, projectID, sessionID } = input
|
|
104
|
+
const memoryFile = path.join(memoryRoot, "projects", projectID, "MEMORY.md")
|
|
105
|
+
const notesFile = path.join(memoryRoot, "sessions", sessionID, "notes.md")
|
|
106
|
+
const checkpointFile = path.join(memoryRoot, "sessions", sessionID, "checkpoint.md")
|
|
107
|
+
const taskMemDir = path.join(memoryRoot, "sessions", sessionID, "tasks")
|
|
108
|
+
const normalizedRoot = memoryRoot.endsWith(path.sep) ? memoryRoot : memoryRoot + path.sep
|
|
109
|
+
if (!target.startsWith(normalizedRoot)) return
|
|
110
|
+
|
|
111
|
+
const rel = path.relative(memoryRoot, target)
|
|
112
|
+
const parts = rel.split(path.sep)
|
|
113
|
+
|
|
114
|
+
if (parts.length < 2) {
|
|
115
|
+
throw new Error(formatMainAgentHelp(memoryFile, notesFile, target))
|
|
116
|
+
}
|
|
117
|
+
const scope = parts[0]
|
|
118
|
+
if (!VALID_SCOPES.includes(scope as (typeof VALID_SCOPES)[number])) {
|
|
119
|
+
throw new Error(formatMainAgentHelp(memoryFile, notesFile, target))
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (agentName === "checkpoint-writer") {
|
|
123
|
+
if (!isCheckpointWriterAllowed(parts)) {
|
|
124
|
+
throw new Error(
|
|
125
|
+
`Path '${rel}' is not in the checkpoint-writer allowlist.\n` +
|
|
126
|
+
`Writer may only write to:\n` +
|
|
127
|
+
` ${memoryFile} — project memory (or memory-<topic>.md spillover)\n` +
|
|
128
|
+
` ${checkpointFile} — session checkpoint (or checkpoint-<topic>.md spillover)\n` +
|
|
129
|
+
` ${taskMemDir}/<task_id>/*.md — per-task narratives (any .md filename)\n` +
|
|
130
|
+
`You attempted: ${target}.`,
|
|
131
|
+
)
|
|
132
|
+
}
|
|
133
|
+
return
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (isReservedForCheckpointWriter(parts)) {
|
|
137
|
+
// Spec ② follow-up: subagent bound to a specific TID may write anywhere
|
|
138
|
+
// under ITS OWN tasks/<TID>/ subtree. Cross-task writes still rejected.
|
|
139
|
+
// parts shape under tasks: ["sessions", sid, "tasks", "<TID>", "<file>.md", ...]
|
|
140
|
+
// NOTE: `parts.length >= 5` is deliberately looser than the checkpoint-writer
|
|
141
|
+
// path (which requires exactly tasks/<TID>/<file>.md). A subagent may nest
|
|
142
|
+
// its own workspace (tasks/<TID>/sub/foo.md); the `parts[3] === input.taskId`
|
|
143
|
+
// guard still confines it to its own task, so the extra depth is safe.
|
|
144
|
+
if (
|
|
145
|
+
input.taskId &&
|
|
146
|
+
parts[2] === "tasks" &&
|
|
147
|
+
parts[3] === input.taskId &&
|
|
148
|
+
parts.length >= 5 &&
|
|
149
|
+
parts[parts.length - 1].endsWith(".md")
|
|
150
|
+
) {
|
|
151
|
+
return
|
|
152
|
+
}
|
|
153
|
+
throw new Error(
|
|
154
|
+
`Path '${rel}' is reserved for the checkpoint-writer subagent.\n` +
|
|
155
|
+
`Main agent writes to:\n` +
|
|
156
|
+
` ${memoryFile}\n` +
|
|
157
|
+
` ${notesFile}\n` +
|
|
158
|
+
`Subagent bound to task <TID> may write to tasks/<TID>/*.md (pass task_id when spawning).\n` +
|
|
159
|
+
`You attempted: ${target}.`,
|
|
160
|
+
)
|
|
161
|
+
}
|
|
162
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import z from "zod"
|
|
3
|
+
import { Memory } from "@/memory"
|
|
4
|
+
import DESCRIPTION from "./memory.txt"
|
|
5
|
+
import * as Tool from "./tool"
|
|
6
|
+
|
|
7
|
+
const parameters = z.object({
|
|
8
|
+
operation: z.enum(["search"]).default("search").describe("Memory operation to perform"),
|
|
9
|
+
query: z.string().describe("Search query (BM25 over markdown bodies)"),
|
|
10
|
+
scope: z.enum(["global", "projects", "sessions", "cc"]).optional().describe("Filter by memory scope"),
|
|
11
|
+
scope_id: z
|
|
12
|
+
.string()
|
|
13
|
+
.optional()
|
|
14
|
+
.describe("Filter by scope id (e.g., session id, task id, project id hash)"),
|
|
15
|
+
type: z
|
|
16
|
+
.string()
|
|
17
|
+
.optional()
|
|
18
|
+
.describe("Filter by memory type (pinned, snapshot, learning, progress, free, ...)"),
|
|
19
|
+
limit: z.number().optional().describe("Max results (default 10)"),
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
export const MemoryTool = Tool.define(
|
|
23
|
+
"memory",
|
|
24
|
+
Effect.gen(function* () {
|
|
25
|
+
const memory = yield* Memory.Service
|
|
26
|
+
return {
|
|
27
|
+
description: DESCRIPTION,
|
|
28
|
+
parameters,
|
|
29
|
+
execute: (args: z.infer<typeof parameters>) =>
|
|
30
|
+
Effect.gen(function* () {
|
|
31
|
+
const results = yield* memory.search({
|
|
32
|
+
query: args.query,
|
|
33
|
+
scope: args.scope,
|
|
34
|
+
scope_id: args.scope_id,
|
|
35
|
+
type: args.type,
|
|
36
|
+
limit: args.limit,
|
|
37
|
+
})
|
|
38
|
+
if (results.length === 0) {
|
|
39
|
+
return {
|
|
40
|
+
title: `Memory search: 0 results`,
|
|
41
|
+
output: [
|
|
42
|
+
`No matches for "${args.query}".`,
|
|
43
|
+
``,
|
|
44
|
+
`0 results does NOT mean it was never recorded. Escalate before giving up:`,
|
|
45
|
+
`1. Retry with FEWER / more distinctive terms — queries are OR-joined and`,
|
|
46
|
+
` ranked, so 1-2 rare words (an exact ID, function name, flag) beat a long`,
|
|
47
|
+
` descriptive phrase. Drop generic words ("config", "params", "database").`,
|
|
48
|
+
`2. For a LITERAL string the tokenizer splits (URLs like postgres://…, ports`,
|
|
49
|
+
` like 5433, paths) — Grep the memory dir directly; FTS can't see it.`,
|
|
50
|
+
`3. For VERBATIM recall of something a summary may have glossed over (exact`,
|
|
51
|
+
` command, the user's precise wording) — use the history tool (raw`,
|
|
52
|
+
` conversation), which keeps original messages.`,
|
|
53
|
+
`Widen scope progressively: session → project → global → history.`,
|
|
54
|
+
].join("\n"),
|
|
55
|
+
metadata: { count: 0 },
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const lines = [
|
|
59
|
+
`Found ${results.length} match${results.length === 1 ? "" : "es"} (BM25-ranked, best first).`,
|
|
60
|
+
`A hit here is authoritative — use it even if a parallel/sibling query returned nothing.`,
|
|
61
|
+
`If you need the FULL body (snippets are truncated), Read the path.`,
|
|
62
|
+
`If you need an EXACT literal (a connection string, port, token, full command line, path) and the snippet/body only paraphrases or partially shows it, the curated memory may have dropped the precise form — query the history tool for the original message, which holds it verbatim.`,
|
|
63
|
+
``,
|
|
64
|
+
]
|
|
65
|
+
for (const r of results) {
|
|
66
|
+
lines.push(`### ${r.path}`)
|
|
67
|
+
lines.push(
|
|
68
|
+
`Scope: ${r.scope}${r.scope_id ? `/${r.scope_id}` : ""}, Type: ${r.type}, Score: ${r.score.toFixed(3)}`,
|
|
69
|
+
)
|
|
70
|
+
lines.push(r.snippet)
|
|
71
|
+
lines.push("")
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
title: `Memory search: ${results.length} result${results.length === 1 ? "" : "s"}`,
|
|
75
|
+
output: lines.join("\n"),
|
|
76
|
+
metadata: { count: results.length },
|
|
77
|
+
}
|
|
78
|
+
}),
|
|
79
|
+
}
|
|
80
|
+
}),
|
|
81
|
+
)
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
Search session/project/global memory using BM25 over markdown
|
|
2
|
+
bodies. Use this to recall content the agent or writer subagent
|
|
3
|
+
persisted previously: project memory, session checkpoints, task
|
|
4
|
+
narratives (under sessions/<sid>/tasks/), project notes, global
|
|
5
|
+
preferences.
|
|
6
|
+
|
|
7
|
+
Memory layout: <data>/memory/<scope>/<scope_id>/<key>.md
|
|
8
|
+
Scopes: global | projects | sessions | cc (opt-in, see below)
|
|
9
|
+
|
|
10
|
+
QUERY GUIDELINES:
|
|
11
|
+
- Queries are OR'd and BM25-ranked: a document matches if it contains
|
|
12
|
+
ANY query word, ordered by relevance (how many / how rare the matched
|
|
13
|
+
words are). Low-relevance common-word-only matches are dropped by a
|
|
14
|
+
score floor.
|
|
15
|
+
- Prefer 1–3 distinctive terms (function name, task ID, exact phrase
|
|
16
|
+
from a directive, a rare word from the snippet you want). Long lists
|
|
17
|
+
of generic words ("config params database connection") just add noise
|
|
18
|
+
and bury the real hit — pick the rarest, most specific word.
|
|
19
|
+
- "T5.3 closure" works. So does "permission deadlock". Avoid padding
|
|
20
|
+
with generic descriptors.
|
|
21
|
+
- Punctuation (`.`, `-`, `/`, `:`) is stripped during tokenization.
|
|
22
|
+
Both query and indexed body see only alphanumeric runs, so `T5.3`
|
|
23
|
+
matches `T5.3`, `T5_3`, or `T5 3`. A literal like `postgres://host:5433`
|
|
24
|
+
is indexed as tokens `postgres`, `host`, `5433` — search one of those,
|
|
25
|
+
not the full URL.
|
|
26
|
+
|
|
27
|
+
A HIT IS AUTHORITATIVE. If search returns a result, trust it — even
|
|
28
|
+
when a different/sibling query you ran returned nothing. Do not conclude
|
|
29
|
+
"I never recorded this" because one phrasing missed.
|
|
30
|
+
|
|
31
|
+
PARTIAL HIT, EXACT LITERAL NEEDED. A hit may give the gist but have
|
|
32
|
+
dropped the precise form of a connection string, port, token, full
|
|
33
|
+
command line, or path (curation paraphrases). If you need the literal
|
|
34
|
+
byte-for-byte and the result only approximates it, query the history
|
|
35
|
+
tool — the original message holds it verbatim. Don't reconstruct or
|
|
36
|
+
guess the exact value from a paraphrase.
|
|
37
|
+
|
|
38
|
+
WHEN SEARCH RETURNS 0 (escalate, do not give up):
|
|
39
|
+
1. Retry with fewer / rarer terms (see guidelines above).
|
|
40
|
+
2. For a literal string the tokenizer splits (URL, port, path) — Grep
|
|
41
|
+
the memory dir directly; FTS can't match the punctuation form.
|
|
42
|
+
3. For verbatim recall a summary may have glossed over — use the
|
|
43
|
+
history tool (raw conversation messages).
|
|
44
|
+
Widen scope progressively: session → project → global → history.
|
|
45
|
+
|
|
46
|
+
Actions:
|
|
47
|
+
- search: OR-joined BM25 query, optional scope/scope_id/type filters
|
|
48
|
+
|
|
49
|
+
After search returns paths, use Read on the most relevant ones to
|
|
50
|
+
load full content (snippets are truncated). Use Glob on
|
|
51
|
+
`<data>/memory/**/*.md` to inspect the tree if you need to find files
|
|
52
|
+
by name pattern instead of body.
|
|
53
|
+
|
|
54
|
+
CC SCOPE:
|
|
55
|
+
When memory.cc_index is enabled in config, Claude Code memory at
|
|
56
|
+
~/.claude/projects/<slug>/memory/*.md is also indexed under
|
|
57
|
+
scope="cc". scope_id is the CC project slug (a path-derived identifier
|
|
58
|
+
like "-home-user-projects-app"). Frontmatter metadata.type
|
|
59
|
+
(feedback / project / reference / user) populates the type column,
|
|
60
|
+
so e.g. type="feedback" filters CC feedback memories. CC memory is
|
|
61
|
+
read-only from this tool.
|
|
62
|
+
|
|
63
|
+
Privacy note: CC's `type: user` and `type: feedback` categories may
|
|
64
|
+
hold personal context (the user's role, preferences, prior guidance)
|
|
65
|
+
that CC originally wrote for its own future sessions. With cc_index on,
|
|
66
|
+
they become recallable from any tulingcode agent — including subagents
|
|
67
|
+
that may be exposed to prompt-injected content. If that's not desired,
|
|
68
|
+
keep cc_index disabled or filter `type` at search time to exclude
|
|
69
|
+
the more sensitive categories.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import z from "zod"
|
|
2
|
+
import { Effect } from "effect"
|
|
3
|
+
import * as Tool from "./tool"
|
|
4
|
+
import { EditTool } from "./edit"
|
|
5
|
+
import DESCRIPTION from "./multiedit.txt"
|
|
6
|
+
import path from "path"
|
|
7
|
+
import { Instance } from "../project/instance"
|
|
8
|
+
|
|
9
|
+
export const MultiEditTool = Tool.define(
|
|
10
|
+
"multiedit",
|
|
11
|
+
Effect.gen(function* () {
|
|
12
|
+
const editInfo = yield* EditTool
|
|
13
|
+
const edit = yield* editInfo.init()
|
|
14
|
+
|
|
15
|
+
return {
|
|
16
|
+
description: DESCRIPTION,
|
|
17
|
+
parameters: z.object({
|
|
18
|
+
filePath: z.string().describe("The absolute path to the file to modify"),
|
|
19
|
+
edits: z
|
|
20
|
+
.array(
|
|
21
|
+
z.object({
|
|
22
|
+
filePath: z.string().describe("The absolute path to the file to modify"),
|
|
23
|
+
oldString: z.string().describe("The text to replace"),
|
|
24
|
+
newString: z.string().describe("The text to replace it with (must be different from oldString)"),
|
|
25
|
+
replaceAll: z.boolean().optional().describe("Replace all occurrences of oldString (default false)"),
|
|
26
|
+
}),
|
|
27
|
+
)
|
|
28
|
+
.describe("Array of edit operations to perform sequentially on the file"),
|
|
29
|
+
}),
|
|
30
|
+
execute: (
|
|
31
|
+
params: {
|
|
32
|
+
filePath: string
|
|
33
|
+
edits: Array<{ filePath: string; oldString: string; newString: string; replaceAll?: boolean }>
|
|
34
|
+
},
|
|
35
|
+
ctx: Tool.Context,
|
|
36
|
+
) =>
|
|
37
|
+
Effect.gen(function* () {
|
|
38
|
+
const results = []
|
|
39
|
+
for (const [, entry] of params.edits.entries()) {
|
|
40
|
+
const result = yield* edit.execute(
|
|
41
|
+
{
|
|
42
|
+
filePath: params.filePath,
|
|
43
|
+
oldString: entry.oldString,
|
|
44
|
+
newString: entry.newString,
|
|
45
|
+
replaceAll: entry.replaceAll,
|
|
46
|
+
},
|
|
47
|
+
ctx,
|
|
48
|
+
)
|
|
49
|
+
results.push(result)
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
title: path.relative(Instance.worktree, params.filePath),
|
|
53
|
+
metadata: {
|
|
54
|
+
results: results.map((r) => r.metadata),
|
|
55
|
+
},
|
|
56
|
+
output: results.at(-1)!.output,
|
|
57
|
+
}
|
|
58
|
+
}),
|
|
59
|
+
}
|
|
60
|
+
}),
|
|
61
|
+
)
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
This is a tool for making multiple edits to a single file in one operation. It is built on top of the Edit tool and allows you to perform multiple find-and-replace operations efficiently. Prefer this tool over the Edit tool when you need to make multiple edits to the same file.
|
|
2
|
+
|
|
3
|
+
Before using this tool:
|
|
4
|
+
|
|
5
|
+
1. Use the Read tool to understand the file's contents and context
|
|
6
|
+
2. Verify the directory path is correct
|
|
7
|
+
|
|
8
|
+
To make multiple file edits, provide the following:
|
|
9
|
+
1. file_path: The absolute path to the file to modify (must be absolute, not relative)
|
|
10
|
+
2. edits: An array of edit operations to perform, where each edit contains:
|
|
11
|
+
- oldString: The text to replace (must match the file contents exactly, including all whitespace and indentation)
|
|
12
|
+
- newString: The edited text to replace the oldString
|
|
13
|
+
- replaceAll: Replace all occurrences of oldString. This parameter is optional and defaults to false.
|
|
14
|
+
|
|
15
|
+
IMPORTANT:
|
|
16
|
+
- All edits are applied in sequence, in the order they are provided
|
|
17
|
+
- Each edit operates on the result of the previous edit
|
|
18
|
+
- All edits must be valid for the operation to succeed - if any edit fails, none will be applied
|
|
19
|
+
- This tool is ideal when you need to make several changes to different parts of the same file
|
|
20
|
+
|
|
21
|
+
CRITICAL REQUIREMENTS:
|
|
22
|
+
1. All edits follow the same requirements as the single Edit tool
|
|
23
|
+
2. The edits are atomic - either all succeed or none are applied
|
|
24
|
+
3. Plan your edits carefully to avoid conflicts between sequential operations
|
|
25
|
+
|
|
26
|
+
WARNING:
|
|
27
|
+
- The tool will fail if edits.oldString doesn't match the file contents exactly (including whitespace)
|
|
28
|
+
- The tool will fail if edits.oldString and edits.newString are the same
|
|
29
|
+
- Since edits are applied in sequence, ensure that earlier edits don't affect the text that later edits are trying to find
|
|
30
|
+
|
|
31
|
+
When making edits:
|
|
32
|
+
- Ensure all edits result in idiomatic, correct code
|
|
33
|
+
- Do not leave the code in a broken state
|
|
34
|
+
- Always use absolute file paths (starting with /)
|
|
35
|
+
- Only use emojis if the user explicitly requests it. Avoid adding emojis to files unless asked.
|
|
36
|
+
- Use replaceAll for replacing and renaming strings across the file. This parameter is useful if you want to rename a variable for instance.
|
|
37
|
+
|
|
38
|
+
If you want to create a new file, use:
|
|
39
|
+
- A new file path, including dir name if needed
|
|
40
|
+
- First edit: empty oldString and the new file's contents as newString
|
|
41
|
+
- Subsequent edits: normal edit operations on the created content
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
Use this tool to suggest switching to plan agent when the user's request would benefit from planning before implementation.
|
|
2
|
+
|
|
3
|
+
If they explicitly mention wanting to create a plan ALWAYS call this tool first.
|
|
4
|
+
|
|
5
|
+
This tool will ask the user if they want to switch to plan agent.
|
|
6
|
+
|
|
7
|
+
Call this tool when:
|
|
8
|
+
- The user's request is complex and would benefit from planning first
|
|
9
|
+
- You want to research and design before making changes
|
|
10
|
+
- The task involves multiple files or significant architectural decisions
|
|
11
|
+
|
|
12
|
+
Do NOT call this tool:
|
|
13
|
+
- For simple, straightforward tasks
|
|
14
|
+
- When the user explicitly wants immediate implementation
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Use this tool when you have completed the planning phase and are ready to exit plan agent.
|
|
2
|
+
|
|
3
|
+
This tool will ask the user if they want to switch to build agent to start implementing the plan.
|
|
4
|
+
|
|
5
|
+
Call this tool:
|
|
6
|
+
- After you have written a complete plan to the plan file
|
|
7
|
+
- After you have clarified any questions with the user
|
|
8
|
+
- When you are confident the plan is ready for implementation
|
|
9
|
+
|
|
10
|
+
Do NOT call this tool:
|
|
11
|
+
- Before you have created or finalized the plan
|
|
12
|
+
- If you still have unanswered questions about the implementation
|
|
13
|
+
- If the user has indicated they want to continue planning
|