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,367 @@
|
|
|
1
|
+
import { Effect, Option, Schema, SchemaAST } from "effect"
|
|
2
|
+
import z from "zod"
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Annotation key for providing a hand-crafted Zod schema that the walker
|
|
6
|
+
* should use instead of re-deriving from the AST. Attach it via
|
|
7
|
+
* `Schema.String.annotate({ [ZodOverride]: z.string().startsWith("per") })`.
|
|
8
|
+
*/
|
|
9
|
+
export const ZodOverride: unique symbol = Symbol.for("effect-zod/override")
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Annotation key for a pre-parse transform that runs on the raw input before
|
|
13
|
+
* the derived Zod schema validates it. The walker emits
|
|
14
|
+
* `z.preprocess(fn, inner)` when this annotation is present.
|
|
15
|
+
*
|
|
16
|
+
* Models zod's `z.preprocess(fn, schema)` pattern — useful when the schema
|
|
17
|
+
* needs to inspect the user's raw input (e.g. to capture insertion order)
|
|
18
|
+
* before `Schema.Struct` canonicalises the object.
|
|
19
|
+
*
|
|
20
|
+
* TODO: This exists to paper over a missing Effect Schema feature. The
|
|
21
|
+
* parser canonicalises open struct output (known fields first in
|
|
22
|
+
* declaration order, then catchall fields) before any user-defined
|
|
23
|
+
* transform sees the value, and there is no pre-parse hook — so the
|
|
24
|
+
* user's original property insertion order is gone by the time
|
|
25
|
+
* `Schema.decodeTo` or `middlewareDecoding` runs.
|
|
26
|
+
*
|
|
27
|
+
* That canonicalisation is a reasonable default, but `config/permission.ts`
|
|
28
|
+
* encodes rule precedence in the user's JSON key order (`evaluate.ts`
|
|
29
|
+
* uses `findLast`, so later entries win), which the canonicalisation
|
|
30
|
+
* silently destroys.
|
|
31
|
+
*
|
|
32
|
+
* The cleanest upstream fix would be either:
|
|
33
|
+
*
|
|
34
|
+
* 1. A `preserveInputOrder` option on `Schema.Struct` /
|
|
35
|
+
* `Schema.StructWithRest` that keeps the input's insertion order in
|
|
36
|
+
* the parsed object (opt-in; canonical order stays default).
|
|
37
|
+
* 2. A generic pre-parse hook (`Schema.preprocess(schema, fn)` or a
|
|
38
|
+
* transformation whose decode receives the raw `unknown`).
|
|
39
|
+
*
|
|
40
|
+
* Either of those would let us delete `ZodPreprocess` and the
|
|
41
|
+
* `__originalKeys` hack. Alternatively, the permission model could move
|
|
42
|
+
* to specificity-based precedence (exact keys beat wildcards) or an
|
|
43
|
+
* explicit ordered array of rules, which removes the ordering
|
|
44
|
+
* dependency at the data-model level.
|
|
45
|
+
*/
|
|
46
|
+
export const ZodPreprocess: unique symbol = Symbol.for("effect-zod/preprocess")
|
|
47
|
+
|
|
48
|
+
// AST nodes are immutable and frequently shared across schemas (e.g. a single
|
|
49
|
+
// Schema.Class embedded in multiple parents). Memoizing by node identity
|
|
50
|
+
// avoids rebuilding equivalent Zod subtrees and keeps derived children stable
|
|
51
|
+
// by reference across callers.
|
|
52
|
+
const walkCache = new WeakMap<SchemaAST.AST, z.ZodTypeAny>()
|
|
53
|
+
|
|
54
|
+
// Shared empty ParseOptions for the rare callers that need one — avoids
|
|
55
|
+
// allocating a fresh object per parse inside refinements and transforms.
|
|
56
|
+
const EMPTY_PARSE_OPTIONS = {} as SchemaAST.ParseOptions
|
|
57
|
+
|
|
58
|
+
export function zod<S extends Schema.Top>(schema: S): z.ZodType<Schema.Schema.Type<S>> {
|
|
59
|
+
return walk(schema.ast) as z.ZodType<Schema.Schema.Type<S>>
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function walk(ast: SchemaAST.AST): z.ZodTypeAny {
|
|
63
|
+
const cached = walkCache.get(ast)
|
|
64
|
+
if (cached) return cached
|
|
65
|
+
const result = walkUncached(ast)
|
|
66
|
+
walkCache.set(ast, result)
|
|
67
|
+
return result
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function walkUncached(ast: SchemaAST.AST): z.ZodTypeAny {
|
|
71
|
+
const override = (ast.annotations as any)?.[ZodOverride] as z.ZodTypeAny | undefined
|
|
72
|
+
if (override) return override
|
|
73
|
+
|
|
74
|
+
// Schema.Class wraps its fields in a Declaration AST plus an encoding that
|
|
75
|
+
// constructs the class instance. For the Zod derivation we want the plain
|
|
76
|
+
// field shape (the decoded/consumer view), not the class instance — so
|
|
77
|
+
// Declarations fall through to body(), not encoded(). User-level
|
|
78
|
+
// Schema.decodeTo / Schema.transform attach encoding to non-Declaration
|
|
79
|
+
// nodes, where we do apply the transform.
|
|
80
|
+
//
|
|
81
|
+
// Schema.withDecodingDefault also attaches encoding, but we want `.default(v)`
|
|
82
|
+
// on the inner Zod rather than a transform wrapper — so optional ASTs whose
|
|
83
|
+
// encoding resolves a default from Option.none() route through body()/opt().
|
|
84
|
+
const hasEncoding = ast.encoding?.length && ast._tag !== "Declaration"
|
|
85
|
+
const hasTransform = hasEncoding && !(SchemaAST.isOptional(ast) && extractDefault(ast) !== undefined)
|
|
86
|
+
const base = hasTransform ? encoded(ast) : body(ast)
|
|
87
|
+
const checked = ast.checks?.length ? applyChecks(base, ast.checks, ast) : base
|
|
88
|
+
const preprocess = (ast.annotations as { [ZodPreprocess]?: (val: unknown) => unknown } | undefined)?.[ZodPreprocess]
|
|
89
|
+
const out = preprocess ? z.preprocess(preprocess, checked) : checked
|
|
90
|
+
const desc = SchemaAST.resolveDescription(ast)
|
|
91
|
+
const ref = SchemaAST.resolveIdentifier(ast)
|
|
92
|
+
const described = desc ? out.describe(desc) : out
|
|
93
|
+
return ref ? described.meta({ ref }) : described
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Walk the encoded side and apply each link's decode to produce the decoded
|
|
97
|
+
// shape. A node `Target` produced by `from.decodeTo(Target)` carries
|
|
98
|
+
// `Target.encoding = [Link(from, transformation)]`. Chained decodeTo calls
|
|
99
|
+
// nest the encoding via `Link.to` so walking it recursively threads all
|
|
100
|
+
// prior transforms — typical encoding.length is 1.
|
|
101
|
+
function encoded(ast: SchemaAST.AST): z.ZodTypeAny {
|
|
102
|
+
const encoding = ast.encoding!
|
|
103
|
+
return encoding.reduce<z.ZodTypeAny>(
|
|
104
|
+
(acc, link) => acc.transform((v) => decode(link.transformation, v)),
|
|
105
|
+
walk(encoding[0].to),
|
|
106
|
+
)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Transformations built via pure `SchemaGetter.transform(fn)` (the common
|
|
110
|
+
// decodeTo case) resolve synchronously, so running with no services is safe.
|
|
111
|
+
// Effectful / middleware-based transforms will surface as Effect defects.
|
|
112
|
+
function decode(transformation: SchemaAST.Link["transformation"], value: unknown): unknown {
|
|
113
|
+
const exit = Effect.runSyncExit(
|
|
114
|
+
(transformation.decode as any).run(Option.some(value), EMPTY_PARSE_OPTIONS) as Effect.Effect<
|
|
115
|
+
Option.Option<unknown>
|
|
116
|
+
>,
|
|
117
|
+
)
|
|
118
|
+
if (exit._tag === "Failure") throw new Error(`effect-zod: transform failed: ${String(exit.cause)}`)
|
|
119
|
+
return Option.getOrElse(exit.value, () => value)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Flatten FilterGroups and any nested variants into a linear list of Filters.
|
|
123
|
+
// Well-known filters (Schema.isInt, isGreaterThan, isPattern, …) are
|
|
124
|
+
// translated into native Zod methods so their JSON Schema output includes
|
|
125
|
+
// the corresponding constraint (type: integer, exclusiveMinimum, pattern, …).
|
|
126
|
+
// Anything else falls back to a single .superRefine layer — runtime-only,
|
|
127
|
+
// emits no JSON Schema constraint.
|
|
128
|
+
function applyChecks(out: z.ZodTypeAny, checks: SchemaAST.Checks, ast: SchemaAST.AST): z.ZodTypeAny {
|
|
129
|
+
const filters: SchemaAST.Filter<unknown>[] = []
|
|
130
|
+
const collect = (c: SchemaAST.Check<unknown>) => {
|
|
131
|
+
if (c._tag === "FilterGroup") c.checks.forEach(collect)
|
|
132
|
+
else filters.push(c)
|
|
133
|
+
}
|
|
134
|
+
checks.forEach(collect)
|
|
135
|
+
|
|
136
|
+
const unhandled: SchemaAST.Filter<unknown>[] = []
|
|
137
|
+
const translated = filters.reduce<z.ZodTypeAny>((acc, filter) => {
|
|
138
|
+
const next = translateFilter(acc, filter)
|
|
139
|
+
if (next) return next
|
|
140
|
+
unhandled.push(filter)
|
|
141
|
+
return acc
|
|
142
|
+
}, out)
|
|
143
|
+
|
|
144
|
+
if (unhandled.length === 0) return translated
|
|
145
|
+
|
|
146
|
+
return translated.superRefine((value, ctx) => {
|
|
147
|
+
for (const filter of unhandled) {
|
|
148
|
+
const issue = filter.run(value, ast, EMPTY_PARSE_OPTIONS)
|
|
149
|
+
if (!issue) continue
|
|
150
|
+
const message = issueMessage(issue) ?? (filter.annotations as any)?.message ?? "Validation failed"
|
|
151
|
+
ctx.addIssue({ code: "custom", message })
|
|
152
|
+
}
|
|
153
|
+
})
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Translate a well-known Effect Schema filter into a native Zod method call on
|
|
157
|
+
// `out`. Dispatch is keyed on `filter.annotations.meta._tag`, which every
|
|
158
|
+
// built-in check factory (isInt, isGreaterThan, isPattern, …) attaches at
|
|
159
|
+
// construction time. Returns `undefined` for unrecognised filters so the
|
|
160
|
+
// caller can fall back to the generic .superRefine path.
|
|
161
|
+
function translateFilter(out: z.ZodTypeAny, filter: SchemaAST.Filter<unknown>): z.ZodTypeAny | undefined {
|
|
162
|
+
const meta = (filter.annotations as { meta?: Record<string, unknown> } | undefined)?.meta
|
|
163
|
+
if (!meta || typeof meta._tag !== "string") return undefined
|
|
164
|
+
switch (meta._tag) {
|
|
165
|
+
case "isInt":
|
|
166
|
+
return call(out, "int")
|
|
167
|
+
case "isFinite":
|
|
168
|
+
return call(out, "finite")
|
|
169
|
+
case "isGreaterThan":
|
|
170
|
+
return call(out, "gt", meta.exclusiveMinimum)
|
|
171
|
+
case "isGreaterThanOrEqualTo":
|
|
172
|
+
return call(out, "gte", meta.minimum)
|
|
173
|
+
case "isLessThan":
|
|
174
|
+
return call(out, "lt", meta.exclusiveMaximum)
|
|
175
|
+
case "isLessThanOrEqualTo":
|
|
176
|
+
return call(out, "lte", meta.maximum)
|
|
177
|
+
case "isBetween": {
|
|
178
|
+
const lo = meta.exclusiveMinimum ? call(out, "gt", meta.minimum) : call(out, "gte", meta.minimum)
|
|
179
|
+
if (!lo) return undefined
|
|
180
|
+
return meta.exclusiveMaximum ? call(lo, "lt", meta.maximum) : call(lo, "lte", meta.maximum)
|
|
181
|
+
}
|
|
182
|
+
case "isMultipleOf":
|
|
183
|
+
return call(out, "multipleOf", meta.divisor)
|
|
184
|
+
case "isMinLength":
|
|
185
|
+
return call(out, "min", meta.minLength)
|
|
186
|
+
case "isMaxLength":
|
|
187
|
+
return call(out, "max", meta.maxLength)
|
|
188
|
+
case "isLengthBetween": {
|
|
189
|
+
const lo = call(out, "min", meta.minimum)
|
|
190
|
+
if (!lo) return undefined
|
|
191
|
+
return call(lo, "max", meta.maximum)
|
|
192
|
+
}
|
|
193
|
+
case "isPattern":
|
|
194
|
+
return call(out, "regex", meta.regExp)
|
|
195
|
+
case "isStartsWith":
|
|
196
|
+
return call(out, "startsWith", meta.startsWith)
|
|
197
|
+
case "isEndsWith":
|
|
198
|
+
return call(out, "endsWith", meta.endsWith)
|
|
199
|
+
case "isIncludes":
|
|
200
|
+
return call(out, "includes", meta.includes)
|
|
201
|
+
case "isUUID":
|
|
202
|
+
return call(out, "uuid")
|
|
203
|
+
case "isULID":
|
|
204
|
+
return call(out, "ulid")
|
|
205
|
+
case "isBase64":
|
|
206
|
+
return call(out, "base64")
|
|
207
|
+
case "isBase64Url":
|
|
208
|
+
return call(out, "base64url")
|
|
209
|
+
}
|
|
210
|
+
return undefined
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// Invoke a named Zod method on `target` if it exists, otherwise return
|
|
214
|
+
// undefined so the caller can fall back. Using this helper instead of a
|
|
215
|
+
// typed cast keeps `translateFilter` free of per-case narrowing noise.
|
|
216
|
+
function call(target: z.ZodTypeAny, method: string, ...args: unknown[]): z.ZodTypeAny | undefined {
|
|
217
|
+
const fn = (target as unknown as Record<string, ((...a: unknown[]) => z.ZodTypeAny) | undefined>)[method]
|
|
218
|
+
return typeof fn === "function" ? fn.apply(target, args) : undefined
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
function issueMessage(issue: any): string | undefined {
|
|
222
|
+
if (typeof issue?.annotations?.message === "string") return issue.annotations.message
|
|
223
|
+
if (typeof issue?.message === "string") return issue.message
|
|
224
|
+
return undefined
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
function body(ast: SchemaAST.AST): z.ZodTypeAny {
|
|
228
|
+
if (SchemaAST.isOptional(ast)) return opt(ast)
|
|
229
|
+
|
|
230
|
+
switch (ast._tag) {
|
|
231
|
+
case "String":
|
|
232
|
+
return z.string()
|
|
233
|
+
case "Number":
|
|
234
|
+
return z.number()
|
|
235
|
+
case "Boolean":
|
|
236
|
+
return z.boolean()
|
|
237
|
+
case "Null":
|
|
238
|
+
return z.null()
|
|
239
|
+
case "Undefined":
|
|
240
|
+
return z.undefined()
|
|
241
|
+
case "Any":
|
|
242
|
+
case "Unknown":
|
|
243
|
+
return z.unknown()
|
|
244
|
+
case "Never":
|
|
245
|
+
return z.never()
|
|
246
|
+
case "Literal":
|
|
247
|
+
return z.literal(ast.literal)
|
|
248
|
+
case "Union":
|
|
249
|
+
return union(ast)
|
|
250
|
+
case "Objects":
|
|
251
|
+
return object(ast)
|
|
252
|
+
case "Arrays":
|
|
253
|
+
return array(ast)
|
|
254
|
+
case "Declaration":
|
|
255
|
+
return decl(ast)
|
|
256
|
+
default:
|
|
257
|
+
return fail(ast)
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
function opt(ast: SchemaAST.AST): z.ZodTypeAny {
|
|
262
|
+
if (ast._tag !== "Union") return fail(ast)
|
|
263
|
+
const items = ast.types.filter((item) => item._tag !== "Undefined")
|
|
264
|
+
const inner =
|
|
265
|
+
items.length === 1
|
|
266
|
+
? walk(items[0])
|
|
267
|
+
: items.length > 1
|
|
268
|
+
? z.union(items.map(walk) as [z.ZodTypeAny, z.ZodTypeAny, ...Array<z.ZodTypeAny>])
|
|
269
|
+
: z.undefined()
|
|
270
|
+
// Schema.withDecodingDefault attaches an encoding `Link` whose transformation
|
|
271
|
+
// decode Getter resolves `Option.none()` to `Option.some(default)`. Invoke
|
|
272
|
+
// it to extract the default and emit `.default(...)` instead of `.optional()`.
|
|
273
|
+
const fallback = extractDefault(ast)
|
|
274
|
+
if (fallback !== undefined) return inner.default(fallback.value)
|
|
275
|
+
return inner.optional()
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
type DecodeLink = {
|
|
279
|
+
readonly transformation: {
|
|
280
|
+
readonly decode: {
|
|
281
|
+
readonly run: (
|
|
282
|
+
input: Option.Option<unknown>,
|
|
283
|
+
options: SchemaAST.ParseOptions,
|
|
284
|
+
) => Effect.Effect<Option.Option<unknown>, unknown>
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
function extractDefault(ast: SchemaAST.AST): { value: unknown } | undefined {
|
|
290
|
+
const encoding = (ast as { encoding?: ReadonlyArray<DecodeLink> }).encoding
|
|
291
|
+
if (!encoding?.length) return undefined
|
|
292
|
+
// Walk the chain of encoding Links in order; the first Getter that produces
|
|
293
|
+
// a value from Option.none wins. withDecodingDefault always puts its
|
|
294
|
+
// defaulting Link adjacent to the optional Union.
|
|
295
|
+
for (const link of encoding) {
|
|
296
|
+
const probe = Effect.runSyncExit(link.transformation.decode.run(Option.none(), {}))
|
|
297
|
+
if (probe._tag !== "Success") continue
|
|
298
|
+
if (Option.isSome(probe.value)) return { value: probe.value.value }
|
|
299
|
+
}
|
|
300
|
+
return undefined
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
function union(ast: SchemaAST.Union): z.ZodTypeAny {
|
|
304
|
+
// When every member is a string literal, emit z.enum() so that
|
|
305
|
+
// JSON Schema produces { "enum": [...] } instead of { "anyOf": [{ "const": ... }] }.
|
|
306
|
+
if (ast.types.length >= 2 && ast.types.every((t) => t._tag === "Literal" && typeof t.literal === "string")) {
|
|
307
|
+
return z.enum(ast.types.map((t) => (t as SchemaAST.Literal).literal as string) as [string, ...string[]])
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
const items = ast.types.map(walk)
|
|
311
|
+
if (items.length === 1) return items[0]
|
|
312
|
+
if (items.length < 2) return fail(ast)
|
|
313
|
+
|
|
314
|
+
const discriminator = ast.annotations?.discriminator
|
|
315
|
+
if (typeof discriminator === "string") {
|
|
316
|
+
return z.discriminatedUnion(discriminator, items as [z.ZodObject<any>, z.ZodObject<any>, ...z.ZodObject<any>[]])
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
return z.union(items as [z.ZodTypeAny, z.ZodTypeAny, ...Array<z.ZodTypeAny>])
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
function object(ast: SchemaAST.Objects): z.ZodTypeAny {
|
|
323
|
+
// Pure record: { [k: string]: V }
|
|
324
|
+
if (ast.propertySignatures.length === 0 && ast.indexSignatures.length === 1) {
|
|
325
|
+
const sig = ast.indexSignatures[0]
|
|
326
|
+
if (sig.parameter._tag !== "String") return fail(ast)
|
|
327
|
+
return z.record(z.string(), walk(sig.type))
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// Pure object with known fields and no index signatures.
|
|
331
|
+
if (ast.indexSignatures.length === 0) {
|
|
332
|
+
return z.object(Object.fromEntries(ast.propertySignatures.map((sig) => [String(sig.name), walk(sig.type)])))
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// Struct with a catchall (StructWithRest): known fields + index signature.
|
|
336
|
+
// Only supports a single string-keyed index signature; multi-signature or
|
|
337
|
+
// symbol/number keys fall through to fail.
|
|
338
|
+
if (ast.indexSignatures.length !== 1) return fail(ast)
|
|
339
|
+
const sig = ast.indexSignatures[0]
|
|
340
|
+
if (sig.parameter._tag !== "String") return fail(ast)
|
|
341
|
+
return z
|
|
342
|
+
.object(Object.fromEntries(ast.propertySignatures.map((p) => [String(p.name), walk(p.type)])))
|
|
343
|
+
.catchall(walk(sig.type))
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
function array(ast: SchemaAST.Arrays): z.ZodTypeAny {
|
|
347
|
+
// Pure variadic arrays: { elements: [], rest: [item] }
|
|
348
|
+
if (ast.elements.length === 0) {
|
|
349
|
+
if (ast.rest.length !== 1) return fail(ast)
|
|
350
|
+
return z.array(walk(ast.rest[0]))
|
|
351
|
+
}
|
|
352
|
+
// Fixed-length tuples: { elements: [a, b, ...], rest: [] }
|
|
353
|
+
// Tuples with a variadic tail (...rest) are not yet supported.
|
|
354
|
+
if (ast.rest.length > 0) return fail(ast)
|
|
355
|
+
const items = ast.elements.map(walk)
|
|
356
|
+
return z.tuple(items as [z.ZodTypeAny, ...Array<z.ZodTypeAny>])
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
function decl(ast: SchemaAST.Declaration): z.ZodTypeAny {
|
|
360
|
+
if (ast.typeParameters.length !== 1) return fail(ast)
|
|
361
|
+
return walk(ast.typeParameters[0])
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
function fail(ast: SchemaAST.AST): never {
|
|
365
|
+
const ref = SchemaAST.resolveIdentifier(ast)
|
|
366
|
+
throw new Error(`unsupported effect schema: ${ref ?? ast._tag}`)
|
|
367
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { isRecord } from "./record"
|
|
2
|
+
|
|
3
|
+
export function errorFormat(error: unknown): string {
|
|
4
|
+
if (error instanceof Error) {
|
|
5
|
+
return error.stack ?? `${error.name}: ${error.message}`
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
if (typeof error === "object" && error !== null) {
|
|
9
|
+
try {
|
|
10
|
+
return JSON.stringify(error, null, 2)
|
|
11
|
+
} catch {
|
|
12
|
+
return "Unexpected error (unserializable)"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return String(error)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function errorMessage(error: unknown): string {
|
|
20
|
+
if (error instanceof Error) {
|
|
21
|
+
if (error.message) return error.message
|
|
22
|
+
if (error.name) return error.name
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (isRecord(error) && typeof error.message === "string" && error.message) {
|
|
26
|
+
return error.message
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const text = String(error)
|
|
30
|
+
if (text && text !== "[object Object]") return text
|
|
31
|
+
|
|
32
|
+
const formatted = errorFormat(error)
|
|
33
|
+
if (formatted && formatted !== "{}") return formatted
|
|
34
|
+
return "unknown error"
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function errorData(error: unknown) {
|
|
38
|
+
if (error instanceof Error) {
|
|
39
|
+
return {
|
|
40
|
+
type: error.name,
|
|
41
|
+
message: errorMessage(error),
|
|
42
|
+
stack: error.stack,
|
|
43
|
+
cause: error.cause === undefined ? undefined : errorFormat(error.cause),
|
|
44
|
+
formatted: errorFormatted(error),
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (!isRecord(error)) {
|
|
49
|
+
return {
|
|
50
|
+
type: typeof error,
|
|
51
|
+
message: errorMessage(error),
|
|
52
|
+
formatted: errorFormatted(error),
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const data = Object.getOwnPropertyNames(error).reduce<Record<string, unknown>>((acc, key) => {
|
|
57
|
+
const value = error[key]
|
|
58
|
+
if (value === undefined) return acc
|
|
59
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
|
|
60
|
+
acc[key] = value
|
|
61
|
+
return acc
|
|
62
|
+
}
|
|
63
|
+
// oxlint-disable-next-line no-base-to-string -- intentional coercion of arbitrary error properties
|
|
64
|
+
acc[key] = value instanceof Error ? value.message : String(value)
|
|
65
|
+
return acc
|
|
66
|
+
}, {})
|
|
67
|
+
|
|
68
|
+
if (typeof data.message !== "string") data.message = errorMessage(error)
|
|
69
|
+
if (typeof data.type !== "string") data.type = error.constructor?.name
|
|
70
|
+
data.formatted = errorFormatted(error)
|
|
71
|
+
return data
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function errorFormatted(error: unknown) {
|
|
75
|
+
const formatted = errorFormat(error)
|
|
76
|
+
if (formatted !== "{}") return formatted
|
|
77
|
+
return String(error)
|
|
78
|
+
}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { chmod, mkdir, readFile, stat as statFile, writeFile } from "fs/promises"
|
|
2
|
+
import { createWriteStream, existsSync, statSync } from "fs"
|
|
3
|
+
import { realpathSync } from "fs"
|
|
4
|
+
import { dirname, join, relative, resolve as pathResolve, win32 } from "path"
|
|
5
|
+
import { Readable } from "stream"
|
|
6
|
+
import { pipeline } from "stream/promises"
|
|
7
|
+
import { Glob } from "@tuling-ai/shared/util/glob"
|
|
8
|
+
|
|
9
|
+
// Fast sync version for metadata checks
|
|
10
|
+
export async function exists(p: string): Promise<boolean> {
|
|
11
|
+
return existsSync(p)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export async function isDir(p: string): Promise<boolean> {
|
|
15
|
+
try {
|
|
16
|
+
return statSync(p).isDirectory()
|
|
17
|
+
} catch {
|
|
18
|
+
return false
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function stat(p: string): ReturnType<typeof statSync> | undefined {
|
|
23
|
+
return statSync(p, { throwIfNoEntry: false }) ?? undefined
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export async function statAsync(p: string): Promise<ReturnType<typeof statSync> | undefined> {
|
|
27
|
+
return statFile(p).catch((e) => {
|
|
28
|
+
if (isEnoent(e)) return undefined
|
|
29
|
+
throw e
|
|
30
|
+
})
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export async function size(p: string): Promise<number> {
|
|
34
|
+
const s = stat(p)?.size ?? 0
|
|
35
|
+
return typeof s === "bigint" ? Number(s) : s
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export async function readText(p: string): Promise<string> {
|
|
39
|
+
return readFile(p, "utf-8")
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export async function readJson<T = unknown>(p: string): Promise<T> {
|
|
43
|
+
return JSON.parse(await readFile(p, "utf-8"))
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export async function readBytes(p: string): Promise<Buffer> {
|
|
47
|
+
return readFile(p)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export async function readArrayBuffer(p: string): Promise<ArrayBuffer> {
|
|
51
|
+
const buf = await readFile(p)
|
|
52
|
+
return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength) as ArrayBuffer
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function isEnoent(e: unknown): e is { code: "ENOENT" } {
|
|
56
|
+
return typeof e === "object" && e !== null && "code" in e && (e as { code: string }).code === "ENOENT"
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export async function write(p: string, content: string | Buffer | Uint8Array, mode?: number): Promise<void> {
|
|
60
|
+
try {
|
|
61
|
+
if (mode) {
|
|
62
|
+
await writeFile(p, content, { mode })
|
|
63
|
+
} else {
|
|
64
|
+
await writeFile(p, content)
|
|
65
|
+
}
|
|
66
|
+
} catch (e) {
|
|
67
|
+
if (isEnoent(e)) {
|
|
68
|
+
await mkdir(dirname(p), { recursive: true })
|
|
69
|
+
if (mode) {
|
|
70
|
+
await writeFile(p, content, { mode })
|
|
71
|
+
} else {
|
|
72
|
+
await writeFile(p, content)
|
|
73
|
+
}
|
|
74
|
+
return
|
|
75
|
+
}
|
|
76
|
+
throw e
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export async function writeJson(p: string, data: unknown, mode?: number): Promise<void> {
|
|
81
|
+
return write(p, JSON.stringify(data, null, 2), mode)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export async function writeStream(
|
|
85
|
+
p: string,
|
|
86
|
+
stream: ReadableStream<Uint8Array> | Readable,
|
|
87
|
+
mode?: number,
|
|
88
|
+
): Promise<void> {
|
|
89
|
+
const dir = dirname(p)
|
|
90
|
+
if (!existsSync(dir)) {
|
|
91
|
+
await mkdir(dir, { recursive: true })
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const nodeStream = stream instanceof ReadableStream ? Readable.fromWeb(stream as any) : stream
|
|
95
|
+
const writeStream = createWriteStream(p)
|
|
96
|
+
await pipeline(nodeStream, writeStream)
|
|
97
|
+
|
|
98
|
+
if (mode) {
|
|
99
|
+
await chmod(p, mode)
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export async function mimeType(p: string): Promise<string> {
|
|
104
|
+
const { lookup } = await import("mime-types")
|
|
105
|
+
return lookup(p) || "application/octet-stream"
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* On Windows, normalize a path to its canonical casing using the filesystem.
|
|
110
|
+
* This is needed because Windows paths are case-insensitive but LSP servers
|
|
111
|
+
* may return paths with different casing than what we send them.
|
|
112
|
+
*/
|
|
113
|
+
export function normalizePath(p: string): string {
|
|
114
|
+
if (process.platform !== "win32") return p
|
|
115
|
+
const resolved = win32.normalize(win32.resolve(windowsPath(p)))
|
|
116
|
+
try {
|
|
117
|
+
return realpathSync.native(resolved)
|
|
118
|
+
} catch {
|
|
119
|
+
return resolved
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export function normalizePathPattern(p: string): string {
|
|
124
|
+
if (process.platform !== "win32") return p
|
|
125
|
+
if (p === "*") return p
|
|
126
|
+
const match = p.match(/^(.*)[\\/]\*$/)
|
|
127
|
+
if (!match) return normalizePath(p)
|
|
128
|
+
const dir = /^[A-Za-z]:$/.test(match[1]) ? match[1] + "\\" : match[1]
|
|
129
|
+
return join(normalizePath(dir), "*")
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// We cannot rely on path.resolve() here because git.exe may come from Git Bash, Cygwin, or MSYS2, so we need to translate these paths at the boundary.
|
|
133
|
+
// Also resolves symlinks so that callers using the result as a cache key
|
|
134
|
+
// always get the same canonical path for a given physical directory.
|
|
135
|
+
export function resolve(p: string): string {
|
|
136
|
+
const resolved = pathResolve(windowsPath(p))
|
|
137
|
+
try {
|
|
138
|
+
return normalizePath(realpathSync(resolved))
|
|
139
|
+
} catch (e) {
|
|
140
|
+
if (isEnoent(e)) return normalizePath(resolved)
|
|
141
|
+
throw e
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export function windowsPath(p: string): string {
|
|
146
|
+
if (process.platform !== "win32") return p
|
|
147
|
+
return (
|
|
148
|
+
p
|
|
149
|
+
.replace(/^\/([a-zA-Z]):(?:[\\/]|$)/, (_, drive) => `${drive.toUpperCase()}:/`)
|
|
150
|
+
// Git Bash for Windows paths are typically /<drive>/...
|
|
151
|
+
.replace(/^\/([a-zA-Z])(?:\/|$)/, (_, drive) => `${drive.toUpperCase()}:/`)
|
|
152
|
+
// Cygwin git paths are typically /cygdrive/<drive>/...
|
|
153
|
+
.replace(/^\/cygdrive\/([a-zA-Z])(?:\/|$)/, (_, drive) => `${drive.toUpperCase()}:/`)
|
|
154
|
+
// WSL paths are typically /mnt/<drive>/...
|
|
155
|
+
.replace(/^\/mnt\/([a-zA-Z])(?:\/|$)/, (_, drive) => `${drive.toUpperCase()}:/`)
|
|
156
|
+
)
|
|
157
|
+
}
|
|
158
|
+
export function overlaps(a: string, b: string) {
|
|
159
|
+
const relA = relative(a, b)
|
|
160
|
+
const relB = relative(b, a)
|
|
161
|
+
return !relA || !relA.startsWith("..") || !relB || !relB.startsWith("..")
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export function contains(parent: string, child: string) {
|
|
165
|
+
return !relative(parent, child).startsWith("..")
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export async function findUp(
|
|
169
|
+
target: string,
|
|
170
|
+
start: string,
|
|
171
|
+
stop?: string,
|
|
172
|
+
options?: { rootFirst?: boolean },
|
|
173
|
+
): Promise<string[]>
|
|
174
|
+
export async function findUp(
|
|
175
|
+
target: string[],
|
|
176
|
+
start: string,
|
|
177
|
+
stop?: string,
|
|
178
|
+
options?: { rootFirst?: boolean },
|
|
179
|
+
): Promise<string[]>
|
|
180
|
+
export async function findUp(
|
|
181
|
+
target: string | string[],
|
|
182
|
+
start: string,
|
|
183
|
+
stop?: string,
|
|
184
|
+
options?: { rootFirst?: boolean },
|
|
185
|
+
) {
|
|
186
|
+
const dirs = [start]
|
|
187
|
+
let current = start
|
|
188
|
+
while (true) {
|
|
189
|
+
if (stop === current) break
|
|
190
|
+
const parent = dirname(current)
|
|
191
|
+
if (parent === current) break
|
|
192
|
+
dirs.push(parent)
|
|
193
|
+
current = parent
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const targets = Array.isArray(target) ? target : [target]
|
|
197
|
+
const result = []
|
|
198
|
+
for (const dir of options?.rootFirst ? dirs.toReversed() : dirs) {
|
|
199
|
+
for (const item of targets) {
|
|
200
|
+
const search = join(dir, item)
|
|
201
|
+
if (await exists(search)) result.push(search)
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return result
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export async function* up(options: { targets: string[]; start: string; stop?: string }) {
|
|
208
|
+
const { targets, start, stop } = options
|
|
209
|
+
let current = start
|
|
210
|
+
while (true) {
|
|
211
|
+
for (const target of targets) {
|
|
212
|
+
const search = join(current, target)
|
|
213
|
+
if (await exists(search)) yield search
|
|
214
|
+
}
|
|
215
|
+
if (stop === current) break
|
|
216
|
+
const parent = dirname(current)
|
|
217
|
+
if (parent === current) break
|
|
218
|
+
current = parent
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export async function globUp(pattern: string, start: string, stop?: string) {
|
|
223
|
+
let current = start
|
|
224
|
+
const result = []
|
|
225
|
+
while (true) {
|
|
226
|
+
try {
|
|
227
|
+
const matches = await Glob.scan(pattern, {
|
|
228
|
+
cwd: current,
|
|
229
|
+
absolute: true,
|
|
230
|
+
include: "file",
|
|
231
|
+
dot: true,
|
|
232
|
+
})
|
|
233
|
+
result.push(...matches)
|
|
234
|
+
} catch {
|
|
235
|
+
// Skip invalid glob patterns
|
|
236
|
+
}
|
|
237
|
+
if (stop === current) break
|
|
238
|
+
const parent = dirname(current)
|
|
239
|
+
if (parent === current) break
|
|
240
|
+
current = parent
|
|
241
|
+
}
|
|
242
|
+
return result
|
|
243
|
+
}
|