@renxqoo/renx-code 0.0.3 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -223
- package/bin/renx.cjs +50 -0
- package/package.json +12 -111
- package/src/App.tsx +297 -0
- package/src/agent/runtime/event-format.ts +258 -0
- package/src/agent/runtime/model-types.ts +13 -0
- package/src/agent/runtime/runtime.context-usage.test.ts +192 -0
- package/src/agent/runtime/runtime.error-handling.test.ts +235 -0
- package/src/agent/runtime/runtime.simple.test.ts +16 -0
- package/src/agent/runtime/runtime.test.ts +296 -0
- package/src/agent/runtime/runtime.ts +875 -0
- package/src/agent/runtime/runtime.usage-forwarding.test.ts +228 -0
- package/src/agent/runtime/source-modules.test.ts +38 -0
- package/src/agent/runtime/source-modules.ts +370 -0
- package/src/agent/runtime/tool-call-buffer.test.ts +65 -0
- package/src/agent/runtime/tool-call-buffer.ts +60 -0
- package/src/agent/runtime/tool-confirmation.test.ts +56 -0
- package/src/agent/runtime/tool-confirmation.ts +15 -0
- package/src/agent/runtime/types.ts +99 -0
- package/src/commands/slash-commands.test.ts +216 -0
- package/src/commands/slash-commands.ts +64 -0
- package/src/components/chat/assistant-reply.test.tsx +47 -0
- package/src/components/chat/assistant-reply.tsx +136 -0
- package/src/components/chat/assistant-segment.test.ts +99 -0
- package/src/components/chat/assistant-segment.tsx +125 -0
- package/src/components/chat/assistant-tool-group.tsx +900 -0
- package/src/components/chat/code-block.test.tsx +206 -0
- package/src/components/chat/code-block.tsx +313 -0
- package/src/components/chat/prompt-card.tsx +81 -0
- package/src/components/chat/segment-groups.test.ts +52 -0
- package/src/components/chat/segment-groups.ts +106 -0
- package/src/components/chat/turn-item.tsx +39 -0
- package/src/components/conversation-panel.tsx +43 -0
- package/src/components/file-mention-menu.tsx +77 -0
- package/src/components/file-picker-dialog.tsx +206 -0
- package/src/components/footer-hints.tsx +75 -0
- package/src/components/model-picker-dialog.tsx +248 -0
- package/src/components/prompt.tsx +233 -0
- package/src/components/slash-command-menu.tsx +65 -0
- package/src/components/tool-confirm-dialog-content.test.ts +103 -0
- package/src/components/tool-confirm-dialog-content.ts +186 -0
- package/src/components/tool-confirm-dialog.tsx +187 -0
- package/src/components/tool-display-config.ts +119 -0
- package/src/context-usage-regressions.test.ts +26 -0
- package/src/files/attachment-capabilities.test.ts +30 -0
- package/src/files/attachment-capabilities.ts +50 -0
- package/src/files/attachment-content.ts +153 -0
- package/src/files/file-mention-query.test.ts +34 -0
- package/src/files/file-mention-query.ts +32 -0
- package/src/files/prompt-display.ts +13 -0
- package/src/files/types.ts +5 -0
- package/src/files/workspace-files.ts +63 -0
- package/src/hooks/agent-event-handlers.test.ts +207 -0
- package/src/hooks/agent-event-handlers.ts +196 -0
- package/src/hooks/chat-local-replies.fixed.test.ts +119 -0
- package/src/hooks/chat-local-replies.test.ts +153 -0
- package/src/hooks/chat-local-replies.ts +63 -0
- package/src/hooks/turn-updater.test.ts +70 -0
- package/src/hooks/turn-updater.ts +166 -0
- package/src/hooks/use-agent-chat.context.test.ts +10 -0
- package/src/hooks/use-agent-chat.status.test.ts +14 -0
- package/src/hooks/use-agent-chat.test.ts +80 -0
- package/src/hooks/use-agent-chat.ts +621 -0
- package/src/hooks/use-file-mention-menu.ts +196 -0
- package/src/hooks/use-file-picker.ts +185 -0
- package/src/hooks/use-model-picker.ts +196 -0
- package/src/hooks/use-slash-command-menu.ts +154 -0
- package/src/index.tsx +55 -0
- package/src/runtime/clipboard.test.ts +43 -0
- package/src/runtime/clipboard.ts +89 -0
- package/src/runtime/exit.test.ts +177 -0
- package/src/runtime/exit.ts +98 -0
- package/src/runtime/runtime-support.test.ts +31 -0
- package/src/runtime/terminal-theme.test.ts +55 -0
- package/src/runtime/terminal-theme.ts +196 -0
- package/src/types/chat.ts +32 -0
- package/src/types/message-content.ts +48 -0
- package/src/ui/open-code-theme.ts +176 -0
- package/src/ui/opencode-markdown.ts +211 -0
- package/src/ui/theme.simple.test.ts +52 -0
- package/src/ui/theme.test.ts +151 -0
- package/src/ui/theme.ts +152 -0
- package/src/utils/time.test.ts +144 -0
- package/src/utils/time.ts +7 -0
- package/tsconfig.json +30 -0
- package/vendor/agent-root/src/agent/ENTERPRISE_ACCEPTANCE_CHECKLIST.md +95 -0
- package/vendor/agent-root/src/agent/ENTERPRISE_REALTIME.html +1345 -0
- package/vendor/agent-root/src/agent/ENTERPRISE_REALTIME.md +1353 -0
- package/vendor/agent-root/src/agent/ERROR_CONTRACT.md +60 -0
- package/vendor/agent-root/src/agent/TEST_COVERAGE_ANALYSIS.md +278 -0
- package/vendor/agent-root/src/agent/__test__/error-contract.test.ts +72 -0
- package/vendor/agent-root/src/agent/__test__/types.test.ts +137 -0
- package/vendor/agent-root/src/agent/agent/__test__/abort-runtime.test.ts +83 -0
- package/vendor/agent-root/src/agent/agent/__test__/callback-safety.test.ts +34 -0
- package/vendor/agent-root/src/agent/agent/__test__/compaction.test.ts +323 -0
- package/vendor/agent-root/src/agent/agent/__test__/concurrency.test.ts +290 -0
- package/vendor/agent-root/src/agent/agent/__test__/error-normalizer.test.ts +377 -0
- package/vendor/agent-root/src/agent/agent/__test__/error.test.ts +212 -0
- package/vendor/agent-root/src/agent/agent/__test__/fault-injection.test.ts +295 -0
- package/vendor/agent-root/src/agent/agent/__test__/index.test.ts +3607 -0
- package/vendor/agent-root/src/agent/agent/__test__/logger.test.ts +35 -0
- package/vendor/agent-root/src/agent/agent/__test__/message-utils.test.ts +517 -0
- package/vendor/agent-root/src/agent/agent/__test__/telemetry.test.ts +97 -0
- package/vendor/agent-root/src/agent/agent/__test__/timeout-budget.test.ts +479 -0
- package/vendor/agent-root/src/agent/agent/__test__/tool-call-merge.test.ts +80 -0
- package/vendor/agent-root/src/agent/agent/__test__/tool-execution-ledger.test.ts +76 -0
- package/vendor/agent-root/src/agent/agent/__test__/write-buffer.test.ts +173 -0
- package/vendor/agent-root/src/agent/agent/__test__/write-file-session.test.ts +109 -0
- package/vendor/agent-root/src/agent/agent/abort-runtime.ts +71 -0
- package/vendor/agent-root/src/agent/agent/callback-safety.ts +33 -0
- package/vendor/agent-root/src/agent/agent/compaction.ts +291 -0
- package/vendor/agent-root/src/agent/agent/concurrency.ts +103 -0
- package/vendor/agent-root/src/agent/agent/error-normalizer.ts +190 -0
- package/vendor/agent-root/src/agent/agent/error.ts +198 -0
- package/vendor/agent-root/src/agent/agent/index.ts +1772 -0
- package/vendor/agent-root/src/agent/agent/logger.ts +65 -0
- package/vendor/agent-root/src/agent/agent/message-utils.ts +101 -0
- package/vendor/agent-root/src/agent/agent/stream-events.ts +61 -0
- package/vendor/agent-root/src/agent/agent/telemetry.ts +123 -0
- package/vendor/agent-root/src/agent/agent/timeout-budget.ts +227 -0
- package/vendor/agent-root/src/agent/agent/tool-call-merge.ts +111 -0
- package/vendor/agent-root/src/agent/agent/tool-execution-ledger.ts +164 -0
- package/vendor/agent-root/src/agent/agent/write-buffer.ts +188 -0
- package/vendor/agent-root/src/agent/agent/write-file-session.ts +238 -0
- package/vendor/agent-root/src/agent/app/__test__/agent-app-service.test.ts +1053 -0
- package/vendor/agent-root/src/agent/app/__test__/minimal-agent-application.test.ts +158 -0
- package/vendor/agent-root/src/agent/app/__test__/sqlite-agent-app-store.test.ts +437 -0
- package/vendor/agent-root/src/agent/app/agent-app-service.ts +748 -0
- package/vendor/agent-root/src/agent/app/contracts.ts +109 -0
- package/vendor/agent-root/src/agent/app/index.ts +5 -0
- package/vendor/agent-root/src/agent/app/minimal-agent-application.ts +151 -0
- package/vendor/agent-root/src/agent/app/ports.ts +72 -0
- package/vendor/agent-root/src/agent/app/sqlite-agent-app-store.ts +1182 -0
- package/vendor/agent-root/src/agent/app/sqlite-client.ts +177 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/00-README.md +36 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/01-scope-and-goals.md +33 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/02-architecture-overview.md +40 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/03-domain-model-and-contracts.md +91 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/04-ports-and-interfaces.md +116 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/05-run-orchestration-and-state-machine.md +52 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/06-cli-commands-and-ux.md +53 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/07-storage-design-local.md +52 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/08-error-and-observability.md +40 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/09-security-and-policy-boundary.md +19 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/10-test-plan-and-acceptance.md +28 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/11-implementation-phases.md +26 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/12-open-questions-and-risks.md +30 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/13-sqlite-schema-fields-and-rationale.md +567 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/14-project-flow-mermaid.md +583 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/15-openclaw-style-project-blueprint.md +972 -0
- package/vendor/agent-root/src/agent/error-contract.ts +154 -0
- package/{dist/agent/prompts/system.js → vendor/agent-root/src/agent/prompts/system.ts} +47 -23
- package/vendor/agent-root/src/agent/prompts/system1.ts +208 -0
- package/vendor/agent-root/src/agent/storage/__test__/file-history-store.test.ts +98 -0
- package/vendor/agent-root/src/agent/storage/file-history-store.ts +313 -0
- package/vendor/agent-root/src/agent/storage/file-storage-config.ts +94 -0
- package/vendor/agent-root/src/agent/storage/file-system.ts +31 -0
- package/vendor/agent-root/src/agent/storage/file-write-service.ts +21 -0
- package/vendor/agent-root/src/agent/tool/__test__/base-tool.test.ts +413 -0
- package/vendor/agent-root/src/agent/tool/__test__/bash-policy.test.ts +356 -0
- package/vendor/agent-root/src/agent/tool/__test__/bash.mocked-coverage.test.ts +375 -0
- package/vendor/agent-root/src/agent/tool/__test__/bash.test.ts +372 -0
- package/vendor/agent-root/src/agent/tool/__test__/error.test.ts +108 -0
- package/vendor/agent-root/src/agent/tool/__test__/file-edit-tool.test.ts +258 -0
- package/vendor/agent-root/src/agent/tool/__test__/file-history-tools.test.ts +121 -0
- package/vendor/agent-root/src/agent/tool/__test__/file-read-tool.test.ts +210 -0
- package/vendor/agent-root/src/agent/tool/__test__/glob.test.ts +139 -0
- package/vendor/agent-root/src/agent/tool/__test__/grep.mocked-coverage.test.ts +456 -0
- package/vendor/agent-root/src/agent/tool/__test__/grep.test.ts +192 -0
- package/vendor/agent-root/src/agent/tool/__test__/lsp.test.ts +300 -0
- package/vendor/agent-root/src/agent/tool/__test__/outside-workspace-confirmation.test.ts +214 -0
- package/vendor/agent-root/src/agent/tool/__test__/path-security.test.ts +336 -0
- package/vendor/agent-root/src/agent/tool/__test__/skill-loader.test.ts +494 -0
- package/vendor/agent-root/src/agent/tool/__test__/skill-parser.test.ts +543 -0
- package/vendor/agent-root/src/agent/tool/__test__/skill-tool.test.ts +172 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-concurrency-and-version.test.ts +116 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-create-get-list-update.test.ts +267 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-create.test.ts +519 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-errors.test.ts +225 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-output-blocking.test.ts +223 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-output.test.ts +184 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-parent-abort.test.ts +287 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-real-runner-adapter.test.ts +190 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-run-lifecycle.test.ts +352 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-store-runner-branches.test.ts +395 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-store.test.ts +391 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-subagent-config-integration.test.ts +176 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-subagent-config.test.ts +68 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-tools-core-edges.test.ts +630 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-tools-runtime-edges.test.ts +732 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-types.test.ts +494 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-utils-branches.test.ts +175 -0
- package/vendor/agent-root/src/agent/tool/__test__/tool-manager.test.ts +505 -0
- package/vendor/agent-root/src/agent/tool/__test__/types.test.ts +55 -0
- package/vendor/agent-root/src/agent/tool/__test__/web-fetch.test.ts +244 -0
- package/vendor/agent-root/src/agent/tool/__test__/web-search.test.ts +290 -0
- package/vendor/agent-root/src/agent/tool/__test__/write-file.test.ts +368 -0
- package/vendor/agent-root/src/agent/tool/base-tool.ts +345 -0
- package/vendor/agent-root/src/agent/tool/bash-policy.ts +636 -0
- package/vendor/agent-root/src/agent/tool/bash.ts +688 -0
- package/vendor/agent-root/src/agent/tool/error.ts +131 -0
- package/vendor/agent-root/src/agent/tool/file-edit-tool.ts +264 -0
- package/vendor/agent-root/src/agent/tool/file-history-list.ts +103 -0
- package/vendor/agent-root/src/agent/tool/file-history-restore.ts +149 -0
- package/vendor/agent-root/src/agent/tool/file-read-tool.ts +211 -0
- package/vendor/agent-root/src/agent/tool/glob.ts +171 -0
- package/vendor/agent-root/src/agent/tool/grep.ts +496 -0
- package/vendor/agent-root/src/agent/tool/lsp.ts +481 -0
- package/vendor/agent-root/src/agent/tool/path-security.ts +117 -0
- package/vendor/agent-root/src/agent/tool/search/common.ts +153 -0
- package/vendor/agent-root/src/agent/tool/skill/index.ts +13 -0
- package/vendor/agent-root/src/agent/tool/skill/loader.ts +229 -0
- package/vendor/agent-root/src/agent/tool/skill/parser.ts +124 -0
- package/vendor/agent-root/src/agent/tool/skill/types.ts +27 -0
- package/vendor/agent-root/src/agent/tool/skill-tool.ts +143 -0
- package/vendor/agent-root/src/agent/tool/task-create.ts +186 -0
- package/vendor/agent-root/src/agent/tool/task-errors.ts +42 -0
- package/vendor/agent-root/src/agent/tool/task-get.ts +116 -0
- package/vendor/agent-root/src/agent/tool/task-graph.ts +78 -0
- package/vendor/agent-root/src/agent/tool/task-list.ts +141 -0
- package/vendor/agent-root/src/agent/tool/task-mock-runner-adapter.ts +232 -0
- package/vendor/agent-root/src/agent/tool/task-output.ts +223 -0
- package/vendor/agent-root/src/agent/tool/task-parent-abort.ts +115 -0
- package/vendor/agent-root/src/agent/tool/task-real-runner-adapter.ts +336 -0
- package/vendor/agent-root/src/agent/tool/task-runner-adapter.ts +55 -0
- package/vendor/agent-root/src/agent/tool/task-stop.ts +187 -0
- package/vendor/agent-root/src/agent/tool/task-store.ts +217 -0
- package/vendor/agent-root/src/agent/tool/task-subagent-config.ts +149 -0
- package/vendor/agent-root/src/agent/tool/task-types.ts +264 -0
- package/vendor/agent-root/src/agent/tool/task-update.ts +315 -0
- package/vendor/agent-root/src/agent/tool/task.ts +209 -0
- package/vendor/agent-root/src/agent/tool/tool-manager.ts +362 -0
- package/vendor/agent-root/src/agent/tool/tool-prompts.ts +242 -0
- package/vendor/agent-root/src/agent/tool/types.ts +116 -0
- package/vendor/agent-root/src/agent/tool/web-fetch.ts +227 -0
- package/vendor/agent-root/src/agent/tool/web-search.ts +208 -0
- package/vendor/agent-root/src/agent/tool/write-file.ts +497 -0
- package/vendor/agent-root/src/agent/types.ts +232 -0
- package/vendor/agent-root/src/agent/utils/__tests__/index.test.ts +18 -0
- package/vendor/agent-root/src/agent/utils/__tests__/message-utils.test.ts +610 -0
- package/vendor/agent-root/src/agent/utils/__tests__/message.test.ts +223 -0
- package/vendor/agent-root/src/agent/utils/__tests__/token.test.ts +42 -0
- package/vendor/agent-root/src/agent/utils/index.ts +16 -0
- package/vendor/agent-root/src/agent/utils/message.ts +171 -0
- package/vendor/agent-root/src/agent/utils/token.ts +28 -0
- package/vendor/agent-root/src/config/__tests__/load-config-to-env.test.ts +129 -0
- package/vendor/agent-root/src/config/__tests__/loader.test.ts +247 -0
- package/vendor/agent-root/src/config/__tests__/runtime.test.ts +88 -0
- package/vendor/agent-root/src/config/index.ts +54 -0
- package/vendor/agent-root/src/config/loader.ts +431 -0
- package/vendor/agent-root/src/config/paths.ts +30 -0
- package/vendor/agent-root/src/config/runtime.ts +163 -0
- package/vendor/agent-root/src/config/types.ts +70 -0
- package/vendor/agent-root/src/logger/index.ts +57 -0
- package/vendor/agent-root/src/logger/logger.ts +819 -0
- package/vendor/agent-root/src/logger/types.ts +150 -0
- package/vendor/agent-root/src/providers/__tests__/errors.test.ts +441 -0
- package/vendor/agent-root/src/providers/__tests__/index.test.ts +16 -0
- package/vendor/agent-root/src/providers/__tests__/openai-compatible.options.test.ts +318 -0
- package/vendor/agent-root/src/providers/__tests__/openai-compatible.test.ts +600 -0
- package/vendor/agent-root/src/providers/__tests__/registry.test.ts +449 -0
- package/vendor/agent-root/src/providers/__tests__/responses-adapter.test.ts +298 -0
- package/vendor/agent-root/src/providers/adapters/__tests__/anthropic.test.ts +354 -0
- package/vendor/agent-root/src/providers/adapters/__tests__/kimi.test.ts +58 -0
- package/vendor/agent-root/src/providers/adapters/__tests__/standard.test.ts +261 -0
- package/vendor/agent-root/src/providers/adapters/anthropic.ts +572 -0
- package/vendor/agent-root/src/providers/adapters/base.ts +131 -0
- package/vendor/agent-root/src/providers/adapters/kimi.ts +48 -0
- package/vendor/agent-root/src/providers/adapters/responses.ts +732 -0
- package/vendor/agent-root/src/providers/adapters/standard.ts +120 -0
- package/vendor/agent-root/src/providers/http/__tests__/client.timeout.test.ts +313 -0
- package/vendor/agent-root/src/providers/http/client.ts +289 -0
- package/vendor/agent-root/src/providers/http/stream-parser.ts +109 -0
- package/vendor/agent-root/src/providers/index.ts +76 -0
- package/vendor/agent-root/src/providers/kimi-headers.ts +177 -0
- package/vendor/agent-root/src/providers/openai-compatible.ts +387 -0
- package/vendor/agent-root/src/providers/registry/model-config.ts +230 -0
- package/vendor/agent-root/src/providers/registry/provider-factory.ts +123 -0
- package/vendor/agent-root/src/providers/registry.ts +135 -0
- package/vendor/agent-root/src/providers/types/api.ts +284 -0
- package/vendor/agent-root/src/providers/types/config.ts +58 -0
- package/vendor/agent-root/src/providers/types/errors.ts +323 -0
- package/vendor/agent-root/src/providers/types/index.ts +72 -0
- package/vendor/agent-root/src/providers/types/provider.ts +45 -0
- package/vendor/agent-root/src/providers/types/registry.ts +88 -0
- package/LICENSE +0 -21
- package/dist/App.d.ts +0 -2
- package/dist/App.d.ts.map +0 -1
- package/dist/App.js +0 -170
- package/dist/App.js.map +0 -1
- package/dist/agent/prompts/system.d.ts +0 -24
- package/dist/agent/prompts/system.d.ts.map +0 -1
- package/dist/agent/prompts/system.js.map +0 -1
- package/dist/agent/runtime/event-format.d.ts +0 -17
- package/dist/agent/runtime/event-format.d.ts.map +0 -1
- package/dist/agent/runtime/event-format.js +0 -194
- package/dist/agent/runtime/event-format.js.map +0 -1
- package/dist/agent/runtime/model-types.d.ts +0 -13
- package/dist/agent/runtime/model-types.d.ts.map +0 -1
- package/dist/agent/runtime/model-types.js +0 -1
- package/dist/agent/runtime/model-types.js.map +0 -1
- package/dist/agent/runtime/runtime.d.ts +0 -16
- package/dist/agent/runtime/runtime.d.ts.map +0 -1
- package/dist/agent/runtime/runtime.js +0 -691
- package/dist/agent/runtime/runtime.js.map +0 -1
- package/dist/agent/runtime/source-modules.d.ts +0 -176
- package/dist/agent/runtime/source-modules.d.ts.map +0 -1
- package/dist/agent/runtime/source-modules.js +0 -110
- package/dist/agent/runtime/source-modules.js.map +0 -1
- package/dist/agent/runtime/tool-call-buffer.d.ts +0 -12
- package/dist/agent/runtime/tool-call-buffer.d.ts.map +0 -1
- package/dist/agent/runtime/tool-call-buffer.js +0 -48
- package/dist/agent/runtime/tool-call-buffer.js.map +0 -1
- package/dist/agent/runtime/tool-confirmation.d.ts +0 -3
- package/dist/agent/runtime/tool-confirmation.d.ts.map +0 -1
- package/dist/agent/runtime/tool-confirmation.js +0 -9
- package/dist/agent/runtime/tool-confirmation.js.map +0 -1
- package/dist/agent/runtime/types.d.ts +0 -86
- package/dist/agent/runtime/types.d.ts.map +0 -1
- package/dist/agent/runtime/types.js +0 -1
- package/dist/agent/runtime/types.js.map +0 -1
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -12
- package/dist/cli.js.map +0 -1
- package/dist/commands/slash-commands.d.ts +0 -11
- package/dist/commands/slash-commands.d.ts.map +0 -1
- package/dist/commands/slash-commands.js +0 -48
- package/dist/commands/slash-commands.js.map +0 -1
- package/dist/components/chat/assistant-reply.d.ts +0 -13
- package/dist/components/chat/assistant-reply.d.ts.map +0 -1
- package/dist/components/chat/assistant-reply.js +0 -78
- package/dist/components/chat/assistant-reply.js.map +0 -1
- package/dist/components/chat/assistant-segment.d.ts +0 -8
- package/dist/components/chat/assistant-segment.d.ts.map +0 -1
- package/dist/components/chat/assistant-segment.js +0 -54
- package/dist/components/chat/assistant-segment.js.map +0 -1
- package/dist/components/chat/assistant-tool-group.d.ts +0 -7
- package/dist/components/chat/assistant-tool-group.d.ts.map +0 -1
- package/dist/components/chat/assistant-tool-group.js +0 -695
- package/dist/components/chat/assistant-tool-group.js.map +0 -1
- package/dist/components/chat/code-block.d.ts +0 -16
- package/dist/components/chat/code-block.d.ts.map +0 -1
- package/dist/components/chat/code-block.js +0 -194
- package/dist/components/chat/code-block.js.map +0 -1
- package/dist/components/chat/prompt-card.d.ts +0 -9
- package/dist/components/chat/prompt-card.d.ts.map +0 -1
- package/dist/components/chat/prompt-card.js +0 -18
- package/dist/components/chat/prompt-card.js.map +0 -1
- package/dist/components/chat/segment-groups.d.ts +0 -24
- package/dist/components/chat/segment-groups.d.ts.map +0 -1
- package/dist/components/chat/segment-groups.js +0 -69
- package/dist/components/chat/segment-groups.js.map +0 -1
- package/dist/components/chat/turn-item.d.ts +0 -9
- package/dist/components/chat/turn-item.d.ts.map +0 -1
- package/dist/components/chat/turn-item.js +0 -11
- package/dist/components/chat/turn-item.js.map +0 -1
- package/dist/components/conversation-panel.d.ts +0 -8
- package/dist/components/conversation-panel.d.ts.map +0 -1
- package/dist/components/conversation-panel.js +0 -8
- package/dist/components/conversation-panel.js.map +0 -1
- package/dist/components/file-mention-menu.d.ts +0 -11
- package/dist/components/file-mention-menu.d.ts.map +0 -1
- package/dist/components/file-mention-menu.js +0 -15
- package/dist/components/file-mention-menu.js.map +0 -1
- package/dist/components/file-picker-dialog.d.ts +0 -21
- package/dist/components/file-picker-dialog.d.ts.map +0 -1
- package/dist/components/file-picker-dialog.js +0 -48
- package/dist/components/file-picker-dialog.js.map +0 -1
- package/dist/components/footer-hints.d.ts +0 -7
- package/dist/components/footer-hints.d.ts.map +0 -1
- package/dist/components/footer-hints.js +0 -29
- package/dist/components/footer-hints.js.map +0 -1
- package/dist/components/model-picker-dialog.d.ts +0 -20
- package/dist/components/model-picker-dialog.d.ts.map +0 -1
- package/dist/components/model-picker-dialog.js +0 -72
- package/dist/components/model-picker-dialog.js.map +0 -1
- package/dist/components/prompt.d.ts +0 -18
- package/dist/components/prompt.d.ts.map +0 -1
- package/dist/components/prompt.js +0 -96
- package/dist/components/prompt.js.map +0 -1
- package/dist/components/slash-command-menu.d.ts +0 -9
- package/dist/components/slash-command-menu.d.ts.map +0 -1
- package/dist/components/slash-command-menu.js +0 -20
- package/dist/components/slash-command-menu.js.map +0 -1
- package/dist/components/tool-confirm-dialog-content.d.ts +0 -15
- package/dist/components/tool-confirm-dialog-content.d.ts.map +0 -1
- package/dist/components/tool-confirm-dialog-content.js +0 -143
- package/dist/components/tool-confirm-dialog-content.js.map +0 -1
- package/dist/components/tool-confirm-dialog.d.ts +0 -12
- package/dist/components/tool-confirm-dialog.d.ts.map +0 -1
- package/dist/components/tool-confirm-dialog.js +0 -21
- package/dist/components/tool-confirm-dialog.js.map +0 -1
- package/dist/components/tool-display-config.d.ts +0 -11
- package/dist/components/tool-display-config.d.ts.map +0 -1
- package/dist/components/tool-display-config.js +0 -94
- package/dist/components/tool-display-config.js.map +0 -1
- package/dist/config/paths.d.ts +0 -7
- package/dist/config/paths.d.ts.map +0 -1
- package/dist/config/paths.js +0 -24
- package/dist/config/paths.js.map +0 -1
- package/dist/files/attachment-capabilities.d.ts +0 -19
- package/dist/files/attachment-capabilities.d.ts.map +0 -1
- package/dist/files/attachment-capabilities.js +0 -26
- package/dist/files/attachment-capabilities.js.map +0 -1
- package/dist/files/attachment-content.d.ts +0 -5
- package/dist/files/attachment-content.d.ts.map +0 -1
- package/dist/files/attachment-content.js +0 -117
- package/dist/files/attachment-content.js.map +0 -1
- package/dist/files/file-mention-query.d.ts +0 -9
- package/dist/files/file-mention-query.d.ts.map +0 -1
- package/dist/files/file-mention-query.js +0 -23
- package/dist/files/file-mention-query.js.map +0 -1
- package/dist/files/prompt-display.d.ts +0 -3
- package/dist/files/prompt-display.d.ts.map +0 -1
- package/dist/files/prompt-display.js +0 -11
- package/dist/files/prompt-display.js.map +0 -1
- package/dist/files/types.d.ts +0 -6
- package/dist/files/types.d.ts.map +0 -1
- package/dist/files/types.js +0 -1
- package/dist/files/types.js.map +0 -1
- package/dist/files/workspace-files.d.ts +0 -3
- package/dist/files/workspace-files.d.ts.map +0 -1
- package/dist/files/workspace-files.js +0 -48
- package/dist/files/workspace-files.js.map +0 -1
- package/dist/hooks/agent-event-handlers.d.ts +0 -11
- package/dist/hooks/agent-event-handlers.d.ts.map +0 -1
- package/dist/hooks/agent-event-handlers.js +0 -137
- package/dist/hooks/agent-event-handlers.js.map +0 -1
- package/dist/hooks/chat-local-replies.d.ts +0 -9
- package/dist/hooks/chat-local-replies.d.ts.map +0 -1
- package/dist/hooks/chat-local-replies.js +0 -54
- package/dist/hooks/chat-local-replies.js.map +0 -1
- package/dist/hooks/turn-updater.d.ts +0 -9
- package/dist/hooks/turn-updater.d.ts.map +0 -1
- package/dist/hooks/turn-updater.js +0 -103
- package/dist/hooks/turn-updater.js.map +0 -1
- package/dist/hooks/use-agent-chat.d.ts +0 -29
- package/dist/hooks/use-agent-chat.d.ts.map +0 -1
- package/dist/hooks/use-agent-chat.js +0 -455
- package/dist/hooks/use-agent-chat.js.map +0 -1
- package/dist/hooks/use-file-mention-menu.d.ts +0 -22
- package/dist/hooks/use-file-mention-menu.d.ts.map +0 -1
- package/dist/hooks/use-file-mention-menu.js +0 -137
- package/dist/hooks/use-file-mention-menu.js.map +0 -1
- package/dist/hooks/use-file-picker.d.ts +0 -21
- package/dist/hooks/use-file-picker.d.ts.map +0 -1
- package/dist/hooks/use-file-picker.js +0 -145
- package/dist/hooks/use-file-picker.js.map +0 -1
- package/dist/hooks/use-model-picker.d.ts +0 -23
- package/dist/hooks/use-model-picker.d.ts.map +0 -1
- package/dist/hooks/use-model-picker.js +0 -151
- package/dist/hooks/use-model-picker.js.map +0 -1
- package/dist/hooks/use-slash-command-menu.d.ts +0 -19
- package/dist/hooks/use-slash-command-menu.d.ts.map +0 -1
- package/dist/hooks/use-slash-command-menu.js +0 -101
- package/dist/hooks/use-slash-command-menu.js.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -6
- package/dist/index.js.map +0 -1
- package/dist/run-cli-app.d.ts +0 -2
- package/dist/run-cli-app.d.ts.map +0 -1
- package/dist/run-cli-app.js +0 -41
- package/dist/run-cli-app.js.map +0 -1
- package/dist/runtime/clipboard.d.ts +0 -10
- package/dist/runtime/clipboard.d.ts.map +0 -1
- package/dist/runtime/clipboard.js +0 -64
- package/dist/runtime/clipboard.js.map +0 -1
- package/dist/runtime/exit.d.ts +0 -7
- package/dist/runtime/exit.d.ts.map +0 -1
- package/dist/runtime/exit.js +0 -85
- package/dist/runtime/exit.js.map +0 -1
- package/dist/runtime/runtime-support.d.ts +0 -4
- package/dist/runtime/runtime-support.d.ts.map +0 -1
- package/dist/runtime/runtime-support.js +0 -19
- package/dist/runtime/runtime-support.js.map +0 -1
- package/dist/runtime/terminal-theme.d.ts +0 -25
- package/dist/runtime/terminal-theme.d.ts.map +0 -1
- package/dist/runtime/terminal-theme.js +0 -148
- package/dist/runtime/terminal-theme.js.map +0 -1
- package/dist/types/chat.d.ts +0 -29
- package/dist/types/chat.d.ts.map +0 -1
- package/dist/types/chat.js +0 -1
- package/dist/types/chat.js.map +0 -1
- package/dist/types/message-content.d.ts +0 -38
- package/dist/types/message-content.d.ts.map +0 -1
- package/dist/types/message-content.js +0 -1
- package/dist/types/message-content.js.map +0 -1
- package/dist/ui/open-code-theme.d.ts +0 -58
- package/dist/ui/open-code-theme.d.ts.map +0 -1
- package/dist/ui/open-code-theme.js +0 -113
- package/dist/ui/open-code-theme.js.map +0 -1
- package/dist/ui/opencode-markdown.d.ts +0 -7
- package/dist/ui/opencode-markdown.d.ts.map +0 -1
- package/dist/ui/opencode-markdown.js +0 -169
- package/dist/ui/opencode-markdown.js.map +0 -1
- package/dist/ui/theme.d.ts +0 -68
- package/dist/ui/theme.d.ts.map +0 -1
- package/dist/ui/theme.js +0 -80
- package/dist/ui/theme.js.map +0 -1
- package/dist/utils/time.d.ts +0 -2
- package/dist/utils/time.d.ts.map +0 -1
- package/dist/utils/time.js +0 -7
- package/dist/utils/time.js.map +0 -1
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
import { randomUUID } from 'node:crypto';
|
|
5
|
+
import { createEmptyNamespaceState, safeJsonClone, type TaskNamespaceState } from './task-types';
|
|
6
|
+
|
|
7
|
+
interface NamespaceLockState {
|
|
8
|
+
locked: boolean;
|
|
9
|
+
waiters: Array<() => void>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface TaskStoreOptions {
|
|
13
|
+
baseDir?: string;
|
|
14
|
+
now?: () => number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export class TaskStore {
|
|
18
|
+
readonly baseDir: string;
|
|
19
|
+
|
|
20
|
+
private readonly now: () => number;
|
|
21
|
+
private readonly namespaceCache = new Map<string, TaskNamespaceState>();
|
|
22
|
+
private readonly lockStates = new Map<string, NamespaceLockState>();
|
|
23
|
+
private initialized = false;
|
|
24
|
+
|
|
25
|
+
constructor(options: TaskStoreOptions = {}) {
|
|
26
|
+
this.baseDir = path.resolve(options.baseDir || path.join(os.homedir(), '.renx', 'task'));
|
|
27
|
+
this.now = options.now || Date.now;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async getState(namespaceInput?: string): Promise<TaskNamespaceState> {
|
|
31
|
+
const namespace = this.normalizeNamespace(namespaceInput);
|
|
32
|
+
await this.ensureInitialized();
|
|
33
|
+
const state = await this.readNamespaceState(namespace);
|
|
34
|
+
return safeJsonClone(state);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async updateState<T>(
|
|
38
|
+
namespaceInput: string | undefined,
|
|
39
|
+
updater: (state: TaskNamespaceState) => Promise<T> | T
|
|
40
|
+
): Promise<{ state: TaskNamespaceState; result: T }> {
|
|
41
|
+
const namespace = this.normalizeNamespace(namespaceInput);
|
|
42
|
+
await this.ensureInitialized();
|
|
43
|
+
await this.acquireNamespaceLock(namespace);
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
const current = await this.readNamespaceState(namespace);
|
|
47
|
+
const working = safeJsonClone(current);
|
|
48
|
+
const result = await updater(working);
|
|
49
|
+
working.updatedAt = this.now();
|
|
50
|
+
await this.writeNamespaceState(namespace, working);
|
|
51
|
+
this.namespaceCache.set(namespace, safeJsonClone(working));
|
|
52
|
+
return {
|
|
53
|
+
state: safeJsonClone(working),
|
|
54
|
+
result,
|
|
55
|
+
};
|
|
56
|
+
} finally {
|
|
57
|
+
this.releaseNamespaceLock(namespace);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
normalizeNamespace(namespaceInput?: string): string {
|
|
62
|
+
const raw = (namespaceInput || 'default').trim();
|
|
63
|
+
if (!raw) {
|
|
64
|
+
return 'default';
|
|
65
|
+
}
|
|
66
|
+
if (!/^[a-zA-Z0-9._-]+$/.test(raw)) {
|
|
67
|
+
throw new Error('TASK_INVALID_NAMESPACE: namespace allows only [a-zA-Z0-9._-]');
|
|
68
|
+
}
|
|
69
|
+
return raw;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
getNamespaceFilePath(namespace: string): string {
|
|
73
|
+
return path.join(this.baseDir, `${namespace}.json`);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
private async ensureInitialized(): Promise<void> {
|
|
77
|
+
if (this.initialized) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
await fs.mkdir(this.baseDir, { recursive: true });
|
|
81
|
+
this.initialized = true;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
private async readNamespaceState(namespace: string): Promise<TaskNamespaceState> {
|
|
85
|
+
const cached = this.namespaceCache.get(namespace);
|
|
86
|
+
if (cached) {
|
|
87
|
+
return safeJsonClone(cached);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const filePath = this.getNamespaceFilePath(namespace);
|
|
91
|
+
try {
|
|
92
|
+
const raw = await fs.readFile(filePath, 'utf8');
|
|
93
|
+
const parsed = JSON.parse(raw) as Partial<TaskNamespaceState>;
|
|
94
|
+
const hydrated = this.hydrateState(namespace, parsed);
|
|
95
|
+
this.namespaceCache.set(namespace, safeJsonClone(hydrated));
|
|
96
|
+
return hydrated;
|
|
97
|
+
} catch (error) {
|
|
98
|
+
const nodeError = error as NodeJS.ErrnoException;
|
|
99
|
+
if (nodeError?.code !== 'ENOENT') {
|
|
100
|
+
throw new Error(
|
|
101
|
+
`TASK_STORE_IO_ERROR: failed to load namespace ${namespace}: ${nodeError.message}`
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
const emptyState = createEmptyNamespaceState(namespace);
|
|
105
|
+
this.namespaceCache.set(namespace, safeJsonClone(emptyState));
|
|
106
|
+
await this.writeNamespaceState(namespace, emptyState);
|
|
107
|
+
return emptyState;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
private hydrateState(
|
|
112
|
+
namespace: string,
|
|
113
|
+
partial: Partial<TaskNamespaceState>
|
|
114
|
+
): TaskNamespaceState {
|
|
115
|
+
const base = createEmptyNamespaceState(namespace);
|
|
116
|
+
const merged: TaskNamespaceState = {
|
|
117
|
+
...base,
|
|
118
|
+
...partial,
|
|
119
|
+
namespace,
|
|
120
|
+
tasks: partial.tasks || {},
|
|
121
|
+
agentRuns: partial.agentRuns || {},
|
|
122
|
+
graph: {
|
|
123
|
+
adjacency: partial.graph?.adjacency || {},
|
|
124
|
+
reverse: partial.graph?.reverse || {},
|
|
125
|
+
},
|
|
126
|
+
updatedAt: typeof partial.updatedAt === 'number' ? partial.updatedAt : base.updatedAt,
|
|
127
|
+
schemaVersion: 1,
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
for (const taskId of Object.keys(merged.tasks)) {
|
|
131
|
+
if (!merged.graph.adjacency[taskId]) {
|
|
132
|
+
merged.graph.adjacency[taskId] = [];
|
|
133
|
+
}
|
|
134
|
+
if (!merged.graph.reverse[taskId]) {
|
|
135
|
+
merged.graph.reverse[taskId] = [];
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return merged;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
private async writeNamespaceState(namespace: string, state: TaskNamespaceState): Promise<void> {
|
|
143
|
+
const filePath = this.getNamespaceFilePath(namespace);
|
|
144
|
+
const dirPath = path.dirname(filePath);
|
|
145
|
+
await fs.mkdir(dirPath, { recursive: true });
|
|
146
|
+
const tmpPath = `${filePath}.tmp.${randomUUID().slice(0, 8)}`;
|
|
147
|
+
const json = `${JSON.stringify(state, null, 2)}\n`;
|
|
148
|
+
await fs.writeFile(tmpPath, json, 'utf8');
|
|
149
|
+
|
|
150
|
+
try {
|
|
151
|
+
await fs.rename(tmpPath, filePath);
|
|
152
|
+
} catch (error) {
|
|
153
|
+
const nodeError = error as NodeJS.ErrnoException;
|
|
154
|
+
if (nodeError.code === 'EPERM' && process.platform === 'win32') {
|
|
155
|
+
await fs.copyFile(tmpPath, filePath);
|
|
156
|
+
await fs.unlink(tmpPath).catch(() => undefined);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
throw error;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
private async acquireNamespaceLock(namespace: string): Promise<void> {
|
|
164
|
+
let lockState = this.lockStates.get(namespace);
|
|
165
|
+
if (!lockState) {
|
|
166
|
+
lockState = {
|
|
167
|
+
locked: false,
|
|
168
|
+
waiters: [],
|
|
169
|
+
};
|
|
170
|
+
this.lockStates.set(namespace, lockState);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (!lockState.locked) {
|
|
174
|
+
lockState.locked = true;
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
await new Promise<void>((resolve) => {
|
|
179
|
+
lockState?.waiters.push(resolve);
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
private releaseNamespaceLock(namespace: string): void {
|
|
184
|
+
const lockState = this.lockStates.get(namespace);
|
|
185
|
+
if (!lockState) {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const next = lockState.waiters.shift();
|
|
190
|
+
if (next) {
|
|
191
|
+
next();
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
lockState.locked = false;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
let globalTaskStore: TaskStore | null = null;
|
|
200
|
+
let globalTaskStoreKey = '';
|
|
201
|
+
|
|
202
|
+
export function getTaskStore(options: TaskStoreOptions = {}): TaskStore {
|
|
203
|
+
const baseDir = path.resolve(options.baseDir || path.join(os.homedir(), '.renx', 'task'));
|
|
204
|
+
if (!globalTaskStore || globalTaskStoreKey !== baseDir) {
|
|
205
|
+
globalTaskStore = new TaskStore({
|
|
206
|
+
...options,
|
|
207
|
+
baseDir,
|
|
208
|
+
});
|
|
209
|
+
globalTaskStoreKey = baseDir;
|
|
210
|
+
}
|
|
211
|
+
return globalTaskStore;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
export function resetTaskStoreSingleton(): void {
|
|
215
|
+
globalTaskStore = null;
|
|
216
|
+
globalTaskStoreKey = '';
|
|
217
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import type { SubagentType } from './task-types';
|
|
2
|
+
|
|
3
|
+
export interface TaskSubagentConfig {
|
|
4
|
+
tools: string[];
|
|
5
|
+
systemPrompt: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const TOOLSET = {
|
|
9
|
+
bash: ['bash'],
|
|
10
|
+
readOnly: ['glob', 'grep', 'file_read', 'file_history_list', 'skill'],
|
|
11
|
+
restore: ['glob', 'file_read', 'file_history_list', 'file_history_restore'],
|
|
12
|
+
general: [
|
|
13
|
+
'bash',
|
|
14
|
+
'glob',
|
|
15
|
+
'grep',
|
|
16
|
+
'file_read',
|
|
17
|
+
'file_edit',
|
|
18
|
+
'write_file',
|
|
19
|
+
'file_history_list',
|
|
20
|
+
'file_history_restore',
|
|
21
|
+
'skill',
|
|
22
|
+
],
|
|
23
|
+
findSkills: ['skill', 'bash'],
|
|
24
|
+
} as const;
|
|
25
|
+
|
|
26
|
+
const SYSTEM_PROMPTS: Record<SubagentType, string> = {
|
|
27
|
+
Bash: `You are a shell execution specialist.
|
|
28
|
+
Run safe, minimal commands and report exact outcomes.
|
|
29
|
+
Prefer non-interactive commands and always surface stderr on failure.`,
|
|
30
|
+
'general-purpose': `You are a general software engineering subagent.
|
|
31
|
+
Use tools pragmatically, verify key changes, and keep responses concise and evidence-based.`,
|
|
32
|
+
Explore: `You are a codebase exploration specialist.
|
|
33
|
+
Use glob/grep/file_read to find relevant implementation details quickly and accurately.`,
|
|
34
|
+
Restore: `You are a file restoration specialist.
|
|
35
|
+
Your job is to restore one or more files from saved history with minimal risk.
|
|
36
|
+
|
|
37
|
+
Workflow:
|
|
38
|
+
1. Prefer exact absolute file paths provided by the parent agent.
|
|
39
|
+
2. If the parent already gave an absolute path, do not search broadly unless the path fails.
|
|
40
|
+
3. Use file_history_list to inspect available saved versions for that file.
|
|
41
|
+
4. Unless the parent specifies a versionId, restore the latest saved version.
|
|
42
|
+
5. Use file_history_restore to perform the rollback.
|
|
43
|
+
6. Read the file after restoring to confirm the content changed as expected.
|
|
44
|
+
|
|
45
|
+
Rules:
|
|
46
|
+
- Prefer absolute file paths.
|
|
47
|
+
- If only a file path is needed and the parent supplied one, that is sufficient.
|
|
48
|
+
- Do not use file_edit or write_file.
|
|
49
|
+
- Do not modify unrelated files.
|
|
50
|
+
- Report exactly which file path was restored and which versionId was used.`,
|
|
51
|
+
Plan: `You are a planning specialist.
|
|
52
|
+
Produce concrete implementation plans with clear steps, risks, and acceptance criteria.`,
|
|
53
|
+
'research-agent': `You are a research-focused subagent.
|
|
54
|
+
Collect evidence from available files and synthesize concise, structured findings.`,
|
|
55
|
+
'find-skills': `
|
|
56
|
+
## Role
|
|
57
|
+
You are a **Skill Discovery and Installation Specialist**.
|
|
58
|
+
Your goal is to **help the parent agent quickly and reliably find the correct skill required to complete a task.**
|
|
59
|
+
## Workflow
|
|
60
|
+
1. **Check local skills first**
|
|
61
|
+
Use the \`skill\` tool to read local skills using **exact or likely names**.
|
|
62
|
+
2. **If the skill is missing or insufficient**
|
|
63
|
+
Use the \`skill\` tool to load the **\`find-skills\`** skill and follow its workflow to:
|
|
64
|
+
* search skills using **exact or likely names**
|
|
65
|
+
* discover candidates
|
|
66
|
+
* install the appropriate skill
|
|
67
|
+
3. **If \`find-skills\` is missing**
|
|
68
|
+
Use \`bash\` only for the required installation command:
|
|
69
|
+
\`\`\`bash
|
|
70
|
+
npx skills add https://github.com/vercel-labs/skills --skill find-skills
|
|
71
|
+
\`\`\`
|
|
72
|
+
After installation, retry using the \`skill\` tool.
|
|
73
|
+
4. **Verify after installation**
|
|
74
|
+
Run the \`skill\` tool again to confirm the target skill is **readable and available**.
|
|
75
|
+
## Critical Rules
|
|
76
|
+
* **Never invent skill content**
|
|
77
|
+
* Only report **actual tool results**
|
|
78
|
+
* Do not assume a skill exists
|
|
79
|
+
* Always **verify after installation**
|
|
80
|
+
## Output Format (Markdown required)
|
|
81
|
+
Your response must include:
|
|
82
|
+
### Skill Status
|
|
83
|
+
* Found locally
|
|
84
|
+
* Found remotely and installed
|
|
85
|
+
* Still missing
|
|
86
|
+
### Recommended Skill
|
|
87
|
+
* Skill name
|
|
88
|
+
* Why it fits the task
|
|
89
|
+
### Next Step
|
|
90
|
+
What the parent agent should do next.
|
|
91
|
+
Keep the response **concise, clear, and action-oriented**.
|
|
92
|
+
`,
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const TASK_SUBAGENT_CONFIGS: Record<SubagentType, TaskSubagentConfig> = {
|
|
96
|
+
Bash: {
|
|
97
|
+
tools: [...TOOLSET.bash],
|
|
98
|
+
systemPrompt: SYSTEM_PROMPTS.Bash,
|
|
99
|
+
},
|
|
100
|
+
'general-purpose': {
|
|
101
|
+
tools: [...TOOLSET.general],
|
|
102
|
+
systemPrompt: SYSTEM_PROMPTS['general-purpose'],
|
|
103
|
+
},
|
|
104
|
+
Explore: {
|
|
105
|
+
tools: [...TOOLSET.readOnly],
|
|
106
|
+
systemPrompt: SYSTEM_PROMPTS.Explore,
|
|
107
|
+
},
|
|
108
|
+
Restore: {
|
|
109
|
+
tools: [...TOOLSET.restore],
|
|
110
|
+
systemPrompt: SYSTEM_PROMPTS.Restore,
|
|
111
|
+
},
|
|
112
|
+
Plan: {
|
|
113
|
+
tools: [...TOOLSET.readOnly],
|
|
114
|
+
systemPrompt: SYSTEM_PROMPTS.Plan,
|
|
115
|
+
},
|
|
116
|
+
'research-agent': {
|
|
117
|
+
tools: [...TOOLSET.readOnly],
|
|
118
|
+
systemPrompt: SYSTEM_PROMPTS['research-agent'],
|
|
119
|
+
},
|
|
120
|
+
'find-skills': {
|
|
121
|
+
tools: [...TOOLSET.findSkills],
|
|
122
|
+
systemPrompt: SYSTEM_PROMPTS['find-skills'],
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
export function getTaskSubagentConfig(subagentType: SubagentType): TaskSubagentConfig {
|
|
127
|
+
const config = TASK_SUBAGENT_CONFIGS[subagentType];
|
|
128
|
+
return {
|
|
129
|
+
tools: [...config.tools],
|
|
130
|
+
systemPrompt: config.systemPrompt,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export function resolveTaskSubagentTools(
|
|
135
|
+
subagentType: SubagentType,
|
|
136
|
+
requestedTools?: string[]
|
|
137
|
+
): string[] {
|
|
138
|
+
const defaults = getTaskSubagentConfig(subagentType).tools;
|
|
139
|
+
if (!requestedTools || requestedTools.length === 0) {
|
|
140
|
+
return defaults;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const defaultSet = new Set(defaults);
|
|
144
|
+
const narrowed = requestedTools.filter((tool) => defaultSet.has(tool));
|
|
145
|
+
if (narrowed.length === 0) {
|
|
146
|
+
return defaults;
|
|
147
|
+
}
|
|
148
|
+
return narrowed;
|
|
149
|
+
}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
|
|
3
|
+
export const TASK_STATUS_VALUES = [
|
|
4
|
+
'pending',
|
|
5
|
+
'in_progress',
|
|
6
|
+
'completed',
|
|
7
|
+
'cancelled',
|
|
8
|
+
'failed',
|
|
9
|
+
] as const;
|
|
10
|
+
|
|
11
|
+
export type TaskStatus = (typeof TASK_STATUS_VALUES)[number];
|
|
12
|
+
|
|
13
|
+
export const TASK_PRIORITY_VALUES = ['critical', 'high', 'normal', 'low'] as const;
|
|
14
|
+
|
|
15
|
+
export type TaskPriority = (typeof TASK_PRIORITY_VALUES)[number];
|
|
16
|
+
|
|
17
|
+
export const AGENT_RUN_STATUS_VALUES = [
|
|
18
|
+
'queued',
|
|
19
|
+
'running',
|
|
20
|
+
'completed',
|
|
21
|
+
'failed',
|
|
22
|
+
'cancelled',
|
|
23
|
+
'paused',
|
|
24
|
+
'timed_out',
|
|
25
|
+
] as const;
|
|
26
|
+
|
|
27
|
+
export type AgentRunStatus = (typeof AGENT_RUN_STATUS_VALUES)[number];
|
|
28
|
+
|
|
29
|
+
export const SUBAGENT_TYPE_VALUES = [
|
|
30
|
+
'Bash',
|
|
31
|
+
'general-purpose',
|
|
32
|
+
'Explore',
|
|
33
|
+
'Restore',
|
|
34
|
+
'Plan',
|
|
35
|
+
'research-agent',
|
|
36
|
+
'find-skills',
|
|
37
|
+
] as const;
|
|
38
|
+
|
|
39
|
+
export type SubagentType = (typeof SUBAGENT_TYPE_VALUES)[number];
|
|
40
|
+
|
|
41
|
+
export interface TaskCheckpoint {
|
|
42
|
+
id: string;
|
|
43
|
+
name: string;
|
|
44
|
+
completed: boolean;
|
|
45
|
+
completedAt?: number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface TaskTag {
|
|
49
|
+
name: string;
|
|
50
|
+
color?: string;
|
|
51
|
+
category?: string;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface RetryConfig {
|
|
55
|
+
maxRetries: number;
|
|
56
|
+
retryDelayMs: number;
|
|
57
|
+
backoffMultiplier: number;
|
|
58
|
+
retryOn: string[];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export interface TaskHistoryEntry {
|
|
62
|
+
timestamp: number;
|
|
63
|
+
action: string;
|
|
64
|
+
fromStatus?: TaskStatus;
|
|
65
|
+
toStatus?: TaskStatus;
|
|
66
|
+
actor?: string | null;
|
|
67
|
+
reason?: string;
|
|
68
|
+
metadata?: Record<string, unknown>;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export interface TaskEntity {
|
|
72
|
+
id: string;
|
|
73
|
+
subject: string;
|
|
74
|
+
description: string;
|
|
75
|
+
activeForm: string;
|
|
76
|
+
status: TaskStatus;
|
|
77
|
+
priority: TaskPriority;
|
|
78
|
+
owner: string | null;
|
|
79
|
+
blockedBy: string[];
|
|
80
|
+
blocks: string[];
|
|
81
|
+
progress: number;
|
|
82
|
+
checkpoints: TaskCheckpoint[];
|
|
83
|
+
retryConfig: RetryConfig;
|
|
84
|
+
retryCount: number;
|
|
85
|
+
lastError?: string;
|
|
86
|
+
lastErrorAt?: number;
|
|
87
|
+
timeoutMs?: number;
|
|
88
|
+
tags: TaskTag[];
|
|
89
|
+
metadata: Record<string, unknown>;
|
|
90
|
+
history: TaskHistoryEntry[];
|
|
91
|
+
agentId?: string;
|
|
92
|
+
createdAt: number;
|
|
93
|
+
updatedAt: number;
|
|
94
|
+
startedAt?: number;
|
|
95
|
+
completedAt?: number;
|
|
96
|
+
cancelledAt?: number;
|
|
97
|
+
version: number;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export interface AgentRunEntity {
|
|
101
|
+
agentId: string;
|
|
102
|
+
status: AgentRunStatus;
|
|
103
|
+
subagentType: SubagentType;
|
|
104
|
+
prompt: string;
|
|
105
|
+
description?: string;
|
|
106
|
+
model?: 'sonnet' | 'opus' | 'haiku';
|
|
107
|
+
maxTurns?: number;
|
|
108
|
+
allowedTools?: string[];
|
|
109
|
+
linkedTaskId?: string;
|
|
110
|
+
output?: string;
|
|
111
|
+
error?: string;
|
|
112
|
+
progress?: number;
|
|
113
|
+
createdAt: number;
|
|
114
|
+
startedAt?: number;
|
|
115
|
+
endedAt?: number;
|
|
116
|
+
updatedAt: number;
|
|
117
|
+
outputFile?: string;
|
|
118
|
+
metadata: Record<string, unknown>;
|
|
119
|
+
version: number;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export interface DependencyGraphState {
|
|
123
|
+
adjacency: Record<string, string[]>;
|
|
124
|
+
reverse: Record<string, string[]>;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export interface TaskNamespaceState {
|
|
128
|
+
namespace: string;
|
|
129
|
+
tasks: Record<string, TaskEntity>;
|
|
130
|
+
agentRuns: Record<string, AgentRunEntity>;
|
|
131
|
+
graph: DependencyGraphState;
|
|
132
|
+
updatedAt: number;
|
|
133
|
+
schemaVersion: 1;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export interface CanStartResult {
|
|
137
|
+
canStart: boolean;
|
|
138
|
+
reason?: string;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export const DEFAULT_RETRY_CONFIG: RetryConfig = {
|
|
142
|
+
maxRetries: 3,
|
|
143
|
+
retryDelayMs: 5000,
|
|
144
|
+
backoffMultiplier: 2,
|
|
145
|
+
retryOn: ['timeout', 'network_error'],
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
export const VALID_TASK_TRANSITIONS: Record<TaskStatus, TaskStatus[]> = {
|
|
149
|
+
pending: ['in_progress', 'cancelled'],
|
|
150
|
+
in_progress: ['completed', 'pending', 'cancelled', 'failed'],
|
|
151
|
+
completed: [],
|
|
152
|
+
cancelled: [],
|
|
153
|
+
failed: ['pending'],
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
export function createTaskId(): string {
|
|
157
|
+
return `task_${Date.now()}_${randomUUID().slice(0, 8)}`;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export function createAgentId(): string {
|
|
161
|
+
return `agent_${Date.now()}_${randomUUID().slice(0, 8)}`;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export function isTaskTerminal(status: TaskStatus): boolean {
|
|
165
|
+
return status === 'completed' || status === 'cancelled';
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export function isTaskFinal(status: TaskStatus): boolean {
|
|
169
|
+
return status === 'completed' || status === 'cancelled' || status === 'failed';
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export function isAgentRunTerminal(status: AgentRunStatus): boolean {
|
|
173
|
+
return (
|
|
174
|
+
status === 'completed' ||
|
|
175
|
+
status === 'failed' ||
|
|
176
|
+
status === 'cancelled' ||
|
|
177
|
+
status === 'timed_out'
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export function validateTaskTransition(from: TaskStatus, to: TaskStatus): boolean {
|
|
182
|
+
if (from === to) {
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
return VALID_TASK_TRANSITIONS[from].includes(to);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
export function createEmptyNamespaceState(namespace: string): TaskNamespaceState {
|
|
189
|
+
return {
|
|
190
|
+
namespace,
|
|
191
|
+
tasks: {},
|
|
192
|
+
agentRuns: {},
|
|
193
|
+
graph: {
|
|
194
|
+
adjacency: {},
|
|
195
|
+
reverse: {},
|
|
196
|
+
},
|
|
197
|
+
updatedAt: Date.now(),
|
|
198
|
+
schemaVersion: 1,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export function evaluateTaskCanStart(
|
|
203
|
+
task: TaskEntity,
|
|
204
|
+
allTasks: Record<string, TaskEntity>
|
|
205
|
+
): CanStartResult {
|
|
206
|
+
if (task.status !== 'pending') {
|
|
207
|
+
return {
|
|
208
|
+
canStart: false,
|
|
209
|
+
reason: `Task status is ${task.status}, expected pending`,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if (task.owner) {
|
|
214
|
+
return {
|
|
215
|
+
canStart: false,
|
|
216
|
+
reason: `Task is already owned by ${task.owner}`,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const cancelledBlockers: string[] = [];
|
|
221
|
+
const failedBlockers: string[] = [];
|
|
222
|
+
const incompleteBlockers: string[] = [];
|
|
223
|
+
|
|
224
|
+
for (const blockerId of task.blockedBy) {
|
|
225
|
+
const blocker = allTasks[blockerId];
|
|
226
|
+
if (!blocker) {
|
|
227
|
+
incompleteBlockers.push(blockerId);
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
if (blocker.status === 'cancelled') {
|
|
231
|
+
cancelledBlockers.push(blockerId);
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
if (blocker.status === 'failed') {
|
|
235
|
+
failedBlockers.push(blockerId);
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
if (blocker.status !== 'completed') {
|
|
239
|
+
incompleteBlockers.push(blockerId);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
if (cancelledBlockers.length > 0 || failedBlockers.length > 0) {
|
|
244
|
+
return {
|
|
245
|
+
canStart: false,
|
|
246
|
+
reason:
|
|
247
|
+
`Blocked by cancelled/failed dependencies: ` +
|
|
248
|
+
`${[...cancelledBlockers, ...failedBlockers].join(', ')}`,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
if (incompleteBlockers.length > 0) {
|
|
253
|
+
return {
|
|
254
|
+
canStart: false,
|
|
255
|
+
reason: `Blocked by incomplete dependencies: ${incompleteBlockers.join(', ')}`,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
return { canStart: true };
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
export function safeJsonClone<T>(value: T): T {
|
|
263
|
+
return JSON.parse(JSON.stringify(value)) as T;
|
|
264
|
+
}
|