bonecode 1.0.0 → 1.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/LICENSE +21 -0
- package/README.md +64 -50
- package/bone/output/agent/.dockerignore +7 -7
- package/bone/output/agent/.env.example +36 -36
- package/bone/output/agent/.github/workflows/ci.yaml +58 -58
- package/bone/output/agent/AgentDomain.bone.map +349 -349
- package/bone/output/agent/AgentDomain.postman_collection.json +957 -957
- package/bone/output/agent/Dockerfile +22 -22
- package/bone/output/agent/README.md +47 -47
- package/bone/output/agent/admin/index.html +739 -739
- package/bone/output/agent/docker-compose.yaml +22 -22
- package/bone/output/agent/k8s/deployment.yaml +75 -75
- package/bone/output/agent/migrations/agent.sql +36 -36
- package/bone/output/agent/migrations/agent_instance.sql +36 -36
- package/bone/output/agent/migrations/audit_log.sql +18 -18
- package/bone/output/agent/migrations/build_step.sql +34 -34
- package/bone/output/agent/migrations/event_outbox.sql +31 -31
- package/bone/output/agent/migrations/plan.sql +30 -30
- package/bone/output/agent/migrations/task.sql +30 -30
- package/bone/output/agent/migrations/tool_call.sql +33 -33
- package/bone/output/agent/openapi.yaml +1116 -1116
- package/bone/output/agent/package.json +35 -35
- package/bone/output/agent/schema.graphql +233 -233
- package/bone/output/agent/sdk/client.ts +231 -231
- package/bone/output/agent/src/algorithms.ts +2 -2
- package/bone/output/agent/src/audit.ts +44 -44
- package/bone/output/agent/src/auth.ts +57 -57
- package/bone/output/agent/src/cron.ts +12 -12
- package/bone/output/agent/src/db.ts +31 -31
- package/bone/output/agent/src/debug.ts +66 -66
- package/bone/output/agent/src/events.ts +243 -243
- package/bone/output/agent/src/extensions.ts +54 -54
- package/bone/output/agent/src/failure_rules.ts +322 -322
- package/bone/output/agent/src/flows.ts +168 -168
- package/bone/output/agent/src/health.ts +43 -43
- package/bone/output/agent/src/index.ts +99 -99
- package/bone/output/agent/src/logger.ts +69 -66
- package/bone/output/agent/src/metrics.ts +75 -75
- package/bone/output/agent/src/migrate.ts +351 -351
- package/bone/output/agent/src/migration_diff.ts +108 -108
- package/bone/output/agent/src/notify.ts +125 -125
- package/bone/output/agent/src/routes/plan.ts +91 -91
- package/bone/output/agent/src/routes/task.ts +105 -105
- package/bone/output/agent/src/routes/tool_call.ts +166 -166
- package/bone/output/agent/src/schemas.ts +384 -384
- package/bone/output/agent/src/state_machines/agent_instance.ts +24 -24
- package/bone/output/agent/src/state_machines/build_step.ts +22 -22
- package/bone/output/agent/src/state_machines/plan.ts +22 -22
- package/bone/output/agent/src/state_machines/task.ts +22 -22
- package/bone/output/agent/src/state_machines/tool_call.ts +22 -22
- package/bone/output/agent/src/tests.ts +361 -361
- package/bone/output/agent/src/websocket.ts +200 -200
- package/bone/output/agent/tsconfig.json +24 -24
- package/bone/output/rag/.dockerignore +7 -7
- package/bone/output/rag/.env.example +36 -36
- package/bone/output/rag/.github/workflows/ci.yaml +58 -58
- package/bone/output/rag/Dockerfile +22 -22
- package/bone/output/rag/RAGDomain.bone.map +286 -286
- package/bone/output/rag/RAGDomain.postman_collection.json +922 -922
- package/bone/output/rag/README.md +47 -47
- package/bone/output/rag/admin/index.html +817 -817
- package/bone/output/rag/docker-compose.yaml +22 -22
- package/bone/output/rag/k8s/deployment.yaml +75 -75
- package/bone/output/rag/migrations/audit_log.sql +18 -18
- package/bone/output/rag/migrations/code_chunk.sql +34 -34
- package/bone/output/rag/migrations/code_file.sql +33 -33
- package/bone/output/rag/migrations/event_outbox.sql +31 -31
- package/bone/output/rag/migrations/indexing_job.sql +33 -33
- package/bone/output/rag/migrations/knowledge_base.sql +35 -35
- package/bone/output/rag/migrations/memory_entry.sql +34 -34
- package/bone/output/rag/openapi.yaml +1097 -1097
- package/bone/output/rag/package.json +35 -35
- package/bone/output/rag/schema.graphql +245 -245
- package/bone/output/rag/sdk/client.ts +234 -234
- package/bone/output/rag/src/algorithms.ts +2 -2
- package/bone/output/rag/src/audit.ts +37 -37
- package/bone/output/rag/src/auth.ts +57 -57
- package/bone/output/rag/src/cron.ts +12 -12
- package/bone/output/rag/src/db.ts +31 -31
- package/bone/output/rag/src/debug.ts +66 -66
- package/bone/output/rag/src/events.ts +243 -243
- package/bone/output/rag/src/extensions.ts +350 -350
- package/bone/output/rag/src/failure_rules.ts +314 -314
- package/bone/output/rag/src/flows.ts +239 -239
- package/bone/output/rag/src/health.ts +43 -43
- package/bone/output/rag/src/index.ts +94 -94
- package/bone/output/rag/src/logger.ts +69 -66
- package/bone/output/rag/src/metrics.ts +75 -75
- package/bone/output/rag/src/migrate.ts +363 -363
- package/bone/output/rag/src/migration_diff.ts +108 -108
- package/bone/output/rag/src/notify.ts +99 -99
- package/bone/output/rag/src/routes/code_chunk.ts +75 -75
- package/bone/output/rag/src/routes/code_file.ts +101 -101
- package/bone/output/rag/src/routes/indexing_job.ts +87 -87
- package/bone/output/rag/src/routes/knowledge_base.ts +230 -230
- package/bone/output/rag/src/routes/memory_entry.ts +87 -87
- package/bone/output/rag/src/schemas.ts +394 -394
- package/bone/output/rag/src/state_machines/code_file.ts +23 -23
- package/bone/output/rag/src/state_machines/indexing_job.ts +22 -22
- package/bone/output/rag/src/state_machines/knowledge_base.ts +23 -23
- package/bone/output/rag/src/state_machines/memory_entry.ts +20 -20
- package/bone/output/rag/src/tests.ts +339 -339
- package/bone/output/rag/tsconfig.json +24 -24
- package/bone/output/session/.dockerignore +7 -7
- package/bone/output/session/.env.example +36 -36
- package/bone/output/session/.github/workflows/ci.yaml +58 -58
- package/bone/output/session/Dockerfile +22 -22
- package/bone/output/session/README.md +47 -47
- package/bone/output/session/SessionDomain.bone.map +349 -349
- package/bone/output/session/SessionDomain.postman_collection.json +957 -957
- package/bone/output/session/admin/index.html +666 -666
- package/bone/output/session/docker-compose.yaml +22 -22
- package/bone/output/session/k8s/deployment.yaml +75 -75
- package/bone/output/session/migrations/audit_log.sql +18 -18
- package/bone/output/session/migrations/event_outbox.sql +31 -31
- package/bone/output/session/migrations/message.sql +31 -31
- package/bone/output/session/migrations/part.sql +28 -28
- package/bone/output/session/migrations/permission.sql +28 -28
- package/bone/output/session/migrations/project.sql +28 -28
- package/bone/output/session/migrations/session.sql +38 -38
- package/bone/output/session/openapi.yaml +1101 -1101
- package/bone/output/session/package.json +35 -35
- package/bone/output/session/schema.graphql +222 -222
- package/bone/output/session/sdk/client.ts +225 -225
- package/bone/output/session/src/algorithms.ts +2 -2
- package/bone/output/session/src/audit.ts +44 -44
- package/bone/output/session/src/auth.ts +57 -57
- package/bone/output/session/src/cron.ts +12 -12
- package/bone/output/session/src/db.ts +31 -31
- package/bone/output/session/src/debug.ts +66 -66
- package/bone/output/session/src/events.ts +270 -270
- package/bone/output/session/src/extensions.ts +215 -215
- package/bone/output/session/src/failure_rules.ts +283 -283
- package/bone/output/session/src/flows.ts +168 -168
- package/bone/output/session/src/health.ts +43 -43
- package/bone/output/session/src/index.ts +99 -99
- package/bone/output/session/src/logger.ts +67 -66
- package/bone/output/session/src/metrics.ts +75 -75
- package/bone/output/session/src/migrate.ts +331 -331
- package/bone/output/session/src/migration_diff.ts +108 -108
- package/bone/output/session/src/notify.ts +112 -112
- package/bone/output/session/src/routes/message.ts +93 -93
- package/bone/output/session/src/routes/part.ts +79 -79
- package/bone/output/session/src/routes/permission.ts +79 -79
- package/bone/output/session/src/routes/project.ts +79 -79
- package/bone/output/session/src/routes/session.ts +294 -294
- package/bone/output/session/src/schemas.ts +357 -357
- package/bone/output/session/src/state_machines/session.ts +23 -23
- package/bone/output/session/src/tests.ts +325 -325
- package/bone/output/session/src/websocket.ts +223 -200
- package/bone/output/session/tsconfig.json +24 -24
- package/bone/output/workspace/.dockerignore +7 -7
- package/bone/output/workspace/.env.example +36 -36
- package/bone/output/workspace/.github/workflows/ci.yaml +58 -58
- package/bone/output/workspace/Dockerfile +22 -22
- package/bone/output/workspace/README.md +45 -45
- package/bone/output/workspace/WorkspaceDomain.bone.map +188 -188
- package/bone/output/workspace/WorkspaceDomain.postman_collection.json +620 -620
- package/bone/output/workspace/admin/index.html +484 -484
- package/bone/output/workspace/docker-compose.yaml +22 -22
- package/bone/output/workspace/k8s/deployment.yaml +75 -75
- package/bone/output/workspace/migrations/audit_log.sql +18 -18
- package/bone/output/workspace/migrations/codebase.sql +34 -34
- package/bone/output/workspace/migrations/event_outbox.sql +31 -31
- package/bone/output/workspace/migrations/snapshot.sql +32 -32
- package/bone/output/workspace/migrations/workspace.sql +33 -33
- package/bone/output/workspace/openapi.yaml +721 -721
- package/bone/output/workspace/package.json +35 -35
- package/bone/output/workspace/schema.graphql +153 -153
- package/bone/output/workspace/sdk/client.ts +155 -155
- package/bone/output/workspace/src/algorithms.ts +2 -2
- package/bone/output/workspace/src/audit.ts +37 -37
- package/bone/output/workspace/src/auth.ts +57 -57
- package/bone/output/workspace/src/cron.ts +12 -12
- package/bone/output/workspace/src/db.ts +31 -31
- package/bone/output/workspace/src/debug.ts +66 -66
- package/bone/output/workspace/src/events.ts +243 -243
- package/bone/output/workspace/src/extensions.ts +44 -44
- package/bone/output/workspace/src/failure_rules.ts +152 -152
- package/bone/output/workspace/src/health.ts +43 -43
- package/bone/output/workspace/src/index.ts +88 -88
- package/bone/output/workspace/src/logger.ts +69 -66
- package/bone/output/workspace/src/metrics.ts +75 -75
- package/bone/output/workspace/src/migrate.ts +219 -219
- package/bone/output/workspace/src/migration_diff.ts +108 -108
- package/bone/output/workspace/src/notify.ts +73 -73
- package/bone/output/workspace/src/routes/codebase.ts +87 -87
- package/bone/output/workspace/src/routes/snapshot.ts +127 -127
- package/bone/output/workspace/src/routes/workspace.ts +190 -190
- package/bone/output/workspace/src/schemas.ts +231 -231
- package/bone/output/workspace/src/state_machines/codebase.ts +21 -21
- package/bone/output/workspace/src/state_machines/snapshot.ts +20 -20
- package/bone/output/workspace/src/state_machines/workspace.ts +21 -21
- package/bone/output/workspace/src/tests.ts +248 -248
- package/bone/output/workspace/tsconfig.json +24 -24
- package/compat/opencode_adapter.ts +94 -17
- package/package.json +15 -2
- package/src/cli.ts +66 -107
- package/src/db_adapter.ts +354 -0
- package/src/engine/account/account.sql.ts +39 -39
- package/src/engine/account/account.ts +456 -456
- package/src/engine/account/repo.ts +166 -166
- package/src/engine/account/schema.ts +99 -99
- package/src/engine/account/url.ts +8 -8
- package/src/engine/acp/README.md +174 -174
- package/src/engine/acp/agent.ts +1968 -1968
- package/src/engine/acp/runtime.ts +22 -22
- package/src/engine/acp/session.ts +122 -122
- package/src/engine/acp/types.ts +24 -24
- package/src/engine/agent/agent.ts +463 -463
- package/src/engine/agent/generate.txt +75 -75
- package/src/engine/agent/prompt/compaction.txt +9 -9
- package/src/engine/agent/prompt/explore.txt +18 -18
- package/src/engine/agent/prompt/scout.txt +36 -36
- package/src/engine/agent/prompt/summary.txt +11 -11
- package/src/engine/agent/prompt/title.txt +44 -44
- package/src/engine/agent/subagent-permissions.ts +34 -34
- package/src/engine/auth/index.ts +96 -96
- package/src/engine/background/background/job.ts +200 -200
- package/src/engine/background/job.ts +200 -200
- package/src/engine/bus/bus-event.ts +45 -45
- package/src/engine/bus/global.ts +22 -22
- package/src/engine/bus/index.ts +203 -203
- package/src/engine/command/command/index.ts +181 -181
- package/src/engine/command/command/template/initialize.txt +66 -66
- package/src/engine/command/command/template/review.txt +101 -101
- package/src/engine/command/index.ts +181 -181
- package/src/engine/command/template/initialize.txt +66 -66
- package/src/engine/command/template/review.txt +101 -101
- package/src/engine/config/agent.ts +172 -172
- package/src/engine/config/attachment.ts +25 -25
- package/src/engine/config/command.ts +62 -62
- package/src/engine/config/config.ts +833 -833
- package/src/engine/config/console-state.ts +14 -14
- package/src/engine/config/entry-name.ts +16 -16
- package/src/engine/config/error.ts +23 -23
- package/src/engine/config/formatter.ts +13 -13
- package/src/engine/config/layout.ts +6 -6
- package/src/engine/config/lsp.ts +43 -43
- package/src/engine/config/managed.ts +71 -71
- package/src/engine/config/markdown.ts +96 -96
- package/src/engine/config/mcp.ts +56 -56
- package/src/engine/config/model-id.ts +5 -5
- package/src/engine/config/parse.ts +79 -79
- package/src/engine/config/paths.ts +45 -45
- package/src/engine/config/permission.ts +58 -58
- package/src/engine/config/plugin.ts +84 -84
- package/src/engine/config/provider.ts +111 -111
- package/src/engine/config/reference.ts +23 -23
- package/src/engine/config/server.ts +19 -19
- package/src/engine/config/skills.ts +14 -14
- package/src/engine/config/variable.ts +90 -90
- package/src/engine/control-plane/adapters/index.ts +41 -41
- package/src/engine/control-plane/adapters/worktree.ts +96 -96
- package/src/engine/control-plane/dev/README.md +19 -19
- package/src/engine/control-plane/dev/debug-workspace-plugin.ts +73 -73
- package/src/engine/control-plane/schema.ts +14 -14
- package/src/engine/control-plane/types.ts +59 -59
- package/src/engine/control-plane/util.ts +39 -39
- package/src/engine/control-plane/workspace-adapter-runtime.ts +51 -51
- package/src/engine/control-plane/workspace-context.ts +26 -26
- package/src/engine/control-plane/workspace.sql.ts +20 -20
- package/src/engine/control-plane/workspace.ts +1072 -1072
- package/src/engine/data-migration.ts +161 -161
- package/src/engine/effect/app-runtime.ts +143 -143
- package/src/engine/effect/bootstrap-runtime.ts +29 -29
- package/src/engine/effect/bridge.ts +84 -84
- package/src/engine/effect/config-service.ts +67 -67
- package/src/engine/effect/instance-ref.ts +11 -11
- package/src/engine/effect/instance-registry.ts +12 -12
- package/src/engine/effect/instance-state.ts +72 -72
- package/src/engine/effect/promise.ts +17 -17
- package/src/engine/effect/run-service.ts +47 -47
- package/src/engine/effect/runner.ts +217 -217
- package/src/engine/effect/runtime-flags.ts +74 -74
- package/src/engine/effect/service-use.ts +38 -38
- package/src/engine/env/index.ts +37 -37
- package/src/engine/event-v2-bridge.ts +89 -89
- package/src/engine/file/file/ignore.ts +81 -81
- package/src/engine/file/file/index.ts +651 -651
- package/src/engine/file/file/protected.ts +59 -59
- package/src/engine/file/file/ripgrep.ts +481 -481
- package/src/engine/file/file/watcher.ts +167 -167
- package/src/engine/file/ignore.ts +81 -81
- package/src/engine/file/index.ts +651 -651
- package/src/engine/file/protected.ts +59 -59
- package/src/engine/file/ripgrep.ts +481 -481
- package/src/engine/file/watcher.ts +167 -167
- package/src/engine/format/format/formatter.ts +404 -404
- package/src/engine/format/format/index.ts +209 -209
- package/src/engine/format/formatter.ts +404 -404
- package/src/engine/format/index.ts +209 -209
- package/src/engine/git/git/index.ts +347 -347
- package/src/engine/git/index.ts +347 -347
- package/src/engine/id/id.ts +80 -80
- package/src/engine/ide/index.ts +70 -70
- package/src/engine/image/image/image.ts +176 -176
- package/src/engine/image/image.ts +176 -176
- package/src/engine/index.ts +251 -251
- package/src/engine/installation/index.ts +327 -327
- package/src/engine/lsp/client.ts +707 -707
- package/src/engine/lsp/diagnostic.ts +29 -29
- package/src/engine/lsp/language.ts +121 -121
- package/src/engine/lsp/launch.ts +21 -21
- package/src/engine/lsp/lsp/client.ts +707 -707
- package/src/engine/lsp/lsp/diagnostic.ts +29 -29
- package/src/engine/lsp/lsp/language.ts +121 -121
- package/src/engine/lsp/lsp/launch.ts +21 -21
- package/src/engine/lsp/lsp/lsp.ts +507 -507
- package/src/engine/lsp/lsp/server.ts +2064 -2064
- package/src/engine/lsp/lsp.ts +507 -507
- package/src/engine/lsp/server.ts +2064 -2064
- package/src/engine/mcp/auth.ts +146 -146
- package/src/engine/mcp/index.ts +958 -958
- package/src/engine/mcp/mcp/auth.ts +146 -146
- package/src/engine/mcp/mcp/index.ts +958 -958
- package/src/engine/mcp/mcp/oauth-callback.ts +232 -232
- package/src/engine/mcp/mcp/oauth-provider.ts +214 -214
- package/src/engine/mcp/oauth-callback.ts +232 -232
- package/src/engine/mcp/oauth-provider.ts +214 -214
- package/src/engine/node.ts +6 -6
- package/src/engine/patch/index.ts +689 -689
- package/src/engine/patch/patch/index.ts +689 -689
- package/src/engine/permission/arity.ts +163 -163
- package/src/engine/permission/evaluate.ts +15 -15
- package/src/engine/permission/index.ts +306 -306
- package/src/engine/permission/permission/arity.ts +163 -163
- package/src/engine/permission/permission/evaluate.ts +15 -15
- package/src/engine/permission/permission/index.ts +306 -306
- package/src/engine/permission/permission/schema.ts +13 -13
- package/src/engine/permission/schema.ts +13 -13
- package/src/engine/plugin/azure.ts +26 -26
- package/src/engine/plugin/cloudflare.ts +76 -76
- package/src/engine/plugin/codex.ts +622 -622
- package/src/engine/plugin/digitalocean.ts +411 -411
- package/src/engine/plugin/github-copilot/copilot.ts +394 -394
- package/src/engine/plugin/github-copilot/models.ts +196 -196
- package/src/engine/plugin/index.ts +295 -295
- package/src/engine/plugin/install.ts +439 -439
- package/src/engine/plugin/loader.ts +216 -216
- package/src/engine/plugin/meta.ts +188 -188
- package/src/engine/plugin/shared.ts +323 -323
- package/src/engine/project/bootstrap-service.ts +9 -9
- package/src/engine/project/bootstrap.ts +75 -75
- package/src/engine/project/instance-context.ts +24 -24
- package/src/engine/project/instance-layer.ts +11 -11
- package/src/engine/project/instance-runtime.ts +16 -16
- package/src/engine/project/instance-store.ts +193 -193
- package/src/engine/project/project.sql.ts +17 -17
- package/src/engine/project/project.ts +537 -537
- package/src/engine/project/schema.ts +13 -13
- package/src/engine/project/vcs.ts +405 -405
- package/src/engine/provider/auth.ts +225 -225
- package/src/engine/provider/error.ts +204 -204
- package/src/engine/provider/model-status.ts +8 -8
- package/src/engine/provider/provider.ts +1843 -1843
- package/src/engine/provider/schema.ts +30 -30
- package/src/engine/provider/transform.ts +1376 -1376
- package/src/engine/pty/index.ts +365 -365
- package/src/engine/pty/input.ts +24 -24
- package/src/engine/pty/pty/index.ts +365 -365
- package/src/engine/pty/pty/input.ts +24 -24
- package/src/engine/pty/pty/pty.bun.ts +26 -26
- package/src/engine/pty/pty/pty.node.ts +27 -27
- package/src/engine/pty/pty/pty.ts +25 -25
- package/src/engine/pty/pty/schema.ts +14 -14
- package/src/engine/pty/pty/ticket.ts +68 -68
- package/src/engine/pty/pty.bun.ts +26 -26
- package/src/engine/pty/pty.node.ts +27 -27
- package/src/engine/pty/pty.ts +25 -25
- package/src/engine/pty/schema.ts +14 -14
- package/src/engine/pty/ticket.ts +68 -68
- package/src/engine/question/index.ts +213 -213
- package/src/engine/question/question/index.ts +213 -213
- package/src/engine/question/question/schema.ts +10 -10
- package/src/engine/question/schema.ts +10 -10
- package/src/engine/reference/reference/reference.ts +241 -241
- package/src/engine/reference/reference/repository-cache.ts +147 -147
- package/src/engine/reference/reference.ts +241 -241
- package/src/engine/reference/repository-cache.ts +147 -147
- package/src/engine/session/compaction.ts +651 -651
- package/src/engine/session/instruction.ts +238 -238
- package/src/engine/session/llm.ts +459 -459
- package/src/engine/session/message-error.ts +14 -14
- package/src/engine/session/message-v2.ts +1202 -1202
- package/src/engine/session/message.ts +146 -146
- package/src/engine/session/overflow.ts +32 -32
- package/src/engine/session/processor.ts +823 -823
- package/src/engine/session/prompt/anthropic.txt +105 -105
- package/src/engine/session/prompt/beast.txt +147 -147
- package/src/engine/session/prompt/build-switch.txt +5 -5
- package/src/engine/session/prompt/codex.txt +79 -79
- package/src/engine/session/prompt/copilot-gpt-5.txt +143 -143
- package/src/engine/session/prompt/default.txt +105 -105
- package/src/engine/session/prompt/gemini.txt +155 -155
- package/src/engine/session/prompt/gpt.txt +107 -107
- package/src/engine/session/prompt/kimi.txt +95 -95
- package/src/engine/session/prompt/max-steps.txt +15 -15
- package/src/engine/session/prompt/plan-reminder-anthropic.txt +67 -67
- package/src/engine/session/prompt/plan.txt +26 -26
- package/src/engine/session/prompt/trinity.txt +97 -97
- package/src/engine/session/prompt.ts +66 -9
- package/src/engine/session/retry.ts +200 -200
- package/src/engine/session/revert.ts +162 -162
- package/src/engine/session/run-state.ts +153 -153
- package/src/engine/session/schema.ts +26 -26
- package/src/engine/session/session.sql.ts +137 -137
- package/src/engine/session/session.ts +1011 -1011
- package/src/engine/session/status.ts +94 -94
- package/src/engine/session/summary.ts +164 -164
- package/src/engine/session/system.ts +84 -84
- package/src/engine/session/todo.ts +81 -81
- package/src/engine/share/session.ts +61 -61
- package/src/engine/share/share-next.ts +376 -376
- package/src/engine/share/share.sql.ts +13 -13
- package/src/engine/shell/shell/shell.ts +215 -215
- package/src/engine/shell/shell.ts +215 -215
- package/src/engine/skill/discovery.ts +116 -116
- package/src/engine/skill/index.ts +336 -336
- package/src/engine/skill/prompt/customize-opencode.md +377 -377
- package/src/engine/skill/skill/discovery.ts +116 -116
- package/src/engine/skill/skill/index.ts +336 -336
- package/src/engine/skill/skill/prompt/customize-opencode.md +377 -377
- package/src/engine/snapshot/index.ts +762 -762
- package/src/engine/snapshot/snapshot/index.ts +762 -762
- package/src/engine/sync/README.md +179 -179
- package/src/engine/sync/event.sql.ts +17 -17
- package/src/engine/sync/index.ts +410 -410
- package/src/engine/sync/schema.ts +11 -11
- package/src/engine/temporary.ts +33 -33
- package/src/engine/tool/apply_patch.ts +313 -313
- package/src/engine/tool/apply_patch.txt +33 -33
- package/src/engine/tool/edit.ts +711 -711
- package/src/engine/tool/edit.txt +10 -10
- package/src/engine/tool/external-directory.ts +49 -49
- package/src/engine/tool/glob.ts +103 -103
- package/src/engine/tool/glob.txt +6 -6
- package/src/engine/tool/grep.ts +156 -156
- package/src/engine/tool/grep.txt +8 -8
- package/src/engine/tool/invalid.ts +21 -21
- package/src/engine/tool/json-schema.ts +164 -164
- package/src/engine/tool/lsp.ts +113 -113
- package/src/engine/tool/lsp.txt +24 -24
- package/src/engine/tool/mcp-websearch.ts +96 -96
- package/src/engine/tool/plan-enter.txt +14 -14
- package/src/engine/tool/plan-exit.txt +13 -13
- package/src/engine/tool/plan.ts +78 -78
- package/src/engine/tool/question.ts +44 -44
- package/src/engine/tool/question.txt +10 -10
- package/src/engine/tool/read.ts +337 -337
- package/src/engine/tool/read.txt +14 -14
- package/src/engine/tool/registry.ts +472 -472
- package/src/engine/tool/repo_clone.ts +80 -80
- package/src/engine/tool/repo_clone.txt +5 -5
- package/src/engine/tool/repo_overview.ts +279 -279
- package/src/engine/tool/repo_overview.txt +4 -4
- package/src/engine/tool/schema.ts +14 -14
- package/src/engine/tool/shell/id.ts +19 -19
- package/src/engine/tool/shell/prompt.ts +295 -295
- package/src/engine/tool/shell/shell.txt +77 -77
- package/src/engine/tool/shell.ts +647 -647
- package/src/engine/tool/skill.ts +75 -75
- package/src/engine/tool/skill.txt +5 -5
- package/src/engine/tool/task.ts +337 -337
- package/src/engine/tool/task.txt +58 -58
- package/src/engine/tool/task_status.ts +179 -179
- package/src/engine/tool/task_status.txt +13 -13
- package/src/engine/tool/todo.ts +57 -57
- package/src/engine/tool/todowrite.txt +167 -167
- package/src/engine/tool/tool/apply_patch.ts +313 -313
- package/src/engine/tool/tool/apply_patch.txt +33 -33
- package/src/engine/tool/tool/edit.ts +711 -711
- package/src/engine/tool/tool/edit.txt +10 -10
- package/src/engine/tool/tool/external-directory.ts +49 -49
- package/src/engine/tool/tool/glob.ts +103 -103
- package/src/engine/tool/tool/glob.txt +6 -6
- package/src/engine/tool/tool/grep.ts +156 -156
- package/src/engine/tool/tool/grep.txt +8 -8
- package/src/engine/tool/tool/invalid.ts +21 -21
- package/src/engine/tool/tool/json-schema.ts +164 -164
- package/src/engine/tool/tool/lsp.ts +113 -113
- package/src/engine/tool/tool/lsp.txt +24 -24
- package/src/engine/tool/tool/mcp-websearch.ts +96 -96
- package/src/engine/tool/tool/plan-enter.txt +14 -14
- package/src/engine/tool/tool/plan-exit.txt +13 -13
- package/src/engine/tool/tool/plan.ts +78 -78
- package/src/engine/tool/tool/question.ts +44 -44
- package/src/engine/tool/tool/question.txt +10 -10
- package/src/engine/tool/tool/read.ts +337 -337
- package/src/engine/tool/tool/read.txt +14 -14
- package/src/engine/tool/tool/registry.ts +472 -472
- package/src/engine/tool/tool/repo_clone.ts +80 -80
- package/src/engine/tool/tool/repo_clone.txt +5 -5
- package/src/engine/tool/tool/repo_overview.ts +279 -279
- package/src/engine/tool/tool/repo_overview.txt +4 -4
- package/src/engine/tool/tool/schema.ts +14 -14
- package/src/engine/tool/tool/shell/id.ts +19 -19
- package/src/engine/tool/tool/shell/prompt.ts +295 -295
- package/src/engine/tool/tool/shell/shell.txt +77 -77
- package/src/engine/tool/tool/shell.ts +647 -647
- package/src/engine/tool/tool/skill.ts +75 -75
- package/src/engine/tool/tool/skill.txt +5 -5
- package/src/engine/tool/tool/task.ts +337 -337
- package/src/engine/tool/tool/task.txt +58 -58
- package/src/engine/tool/tool/task_status.ts +179 -179
- package/src/engine/tool/tool/task_status.txt +13 -13
- package/src/engine/tool/tool/todo.ts +57 -57
- package/src/engine/tool/tool/todowrite.txt +167 -167
- package/src/engine/tool/tool/tool.ts +164 -164
- package/src/engine/tool/tool/truncate.ts +160 -160
- package/src/engine/tool/tool/truncation-dir.ts +4 -4
- package/src/engine/tool/tool/webfetch.ts +192 -192
- package/src/engine/tool/tool/webfetch.txt +13 -13
- package/src/engine/tool/tool/websearch.ts +143 -143
- package/src/engine/tool/tool/websearch.txt +14 -14
- package/src/engine/tool/tool/write.ts +104 -104
- package/src/engine/tool/tool/write.txt +8 -8
- package/src/engine/tool/tool.ts +164 -164
- package/src/engine/tool/truncate.ts +160 -160
- package/src/engine/tool/truncation-dir.ts +4 -4
- package/src/engine/tool/webfetch.ts +192 -192
- package/src/engine/tool/webfetch.txt +13 -13
- package/src/engine/tool/websearch.ts +143 -143
- package/src/engine/tool/websearch.txt +14 -14
- package/src/engine/tool/write.ts +104 -104
- package/src/engine/tool/write.txt +8 -8
- package/src/engine/util/archive.ts +17 -17
- package/src/engine/util/bom.ts +31 -31
- package/src/engine/util/data-url.ts +9 -9
- package/src/engine/util/defer.ts +10 -10
- package/src/engine/util/effect-http-client.ts +11 -11
- package/src/engine/util/error.ts +88 -88
- package/src/engine/util/filesystem.ts +252 -252
- package/src/engine/util/format.ts +20 -20
- package/src/engine/util/iife.ts +3 -3
- package/src/engine/util/lazy.ts +20 -20
- package/src/engine/util/local-context.ts +25 -25
- package/src/engine/util/locale.ts +86 -86
- package/src/engine/util/media.ts +26 -26
- package/src/engine/util/process.ts +176 -176
- package/src/engine/util/queue.ts +32 -32
- package/src/engine/util/record.ts +3 -3
- package/src/engine/util/repository.ts +158 -158
- package/src/engine/util/rpc.ts +66 -66
- package/src/engine/util/signal.ts +12 -12
- package/src/engine/util/timeout.ts +13 -13
- package/src/engine/util/token.ts +7 -7
- package/src/engine/util/util/archive.ts +17 -17
- package/src/engine/util/util/bom.ts +31 -31
- package/src/engine/util/util/data-url.ts +9 -9
- package/src/engine/util/util/defer.ts +10 -10
- package/src/engine/util/util/effect-http-client.ts +11 -11
- package/src/engine/util/util/error.ts +88 -88
- package/src/engine/util/util/filesystem.ts +252 -252
- package/src/engine/util/util/format.ts +20 -20
- package/src/engine/util/util/iife.ts +3 -3
- package/src/engine/util/util/lazy.ts +20 -20
- package/src/engine/util/util/local-context.ts +25 -25
- package/src/engine/util/util/locale.ts +86 -86
- package/src/engine/util/util/media.ts +26 -26
- package/src/engine/util/util/process.ts +176 -176
- package/src/engine/util/util/queue.ts +32 -32
- package/src/engine/util/util/record.ts +3 -3
- package/src/engine/util/util/repository.ts +158 -158
- package/src/engine/util/util/rpc.ts +66 -66
- package/src/engine/util/util/signal.ts +12 -12
- package/src/engine/util/util/timeout.ts +13 -13
- package/src/engine/util/util/token.ts +7 -7
- package/src/engine/util/util/which.ts +14 -14
- package/src/engine/util/util/wildcard.ts +59 -59
- package/src/engine/util/which.ts +14 -14
- package/src/engine/util/wildcard.ts +59 -59
- package/src/engine/worktree/index.ts +621 -621
- package/src/server.ts +121 -158
- package/src/tui.ts +485 -502
|
@@ -1,164 +1,164 @@
|
|
|
1
|
-
import { Effect, Schema } from "effect"
|
|
2
|
-
import type { JSONSchema7 } from "@ai-sdk/provider"
|
|
3
|
-
import type { MessageV2 } from "../session/message-v2"
|
|
4
|
-
import type { Permission } from "../permission"
|
|
5
|
-
import type { SessionID, MessageID } from "../session/schema"
|
|
6
|
-
import * as Truncate from "./truncate"
|
|
7
|
-
import { Agent } from "@/agent/agent"
|
|
8
|
-
|
|
9
|
-
interface Metadata {
|
|
10
|
-
[key: string]: any
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
// TODO: remove this hack
|
|
14
|
-
export type DynamicDescription = (agent: Agent.Info) => Effect.Effect<string>
|
|
15
|
-
|
|
16
|
-
export type Context<M extends Metadata = Metadata> = {
|
|
17
|
-
sessionID: SessionID
|
|
18
|
-
messageID: MessageID
|
|
19
|
-
agent: string
|
|
20
|
-
abort: AbortSignal
|
|
21
|
-
callID?: string
|
|
22
|
-
extra?: { [key: string]: unknown }
|
|
23
|
-
messages: MessageV2.WithParts[]
|
|
24
|
-
metadata(input: { title?: string; metadata?: M }): Effect.Effect<void>
|
|
25
|
-
ask(input: Omit<Permission.Request, "id" | "sessionID" | "tool">): Effect.Effect<void>
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export interface ExecuteResult<M extends Metadata = Metadata> {
|
|
29
|
-
title: string
|
|
30
|
-
metadata: M
|
|
31
|
-
output: string
|
|
32
|
-
attachments?: Omit<MessageV2.FilePart, "id" | "sessionID" | "messageID">[]
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export interface Def<
|
|
36
|
-
Parameters extends Schema.Decoder<unknown> = Schema.Decoder<unknown>,
|
|
37
|
-
M extends Metadata = Metadata,
|
|
38
|
-
> {
|
|
39
|
-
id: string
|
|
40
|
-
description: string
|
|
41
|
-
parameters: Parameters
|
|
42
|
-
jsonSchema?: JSONSchema7
|
|
43
|
-
execute(args: Schema.Schema.Type<Parameters>, ctx: Context): Effect.Effect<ExecuteResult<M>>
|
|
44
|
-
formatValidationError?(error: unknown): string
|
|
45
|
-
}
|
|
46
|
-
export type DefWithoutID<
|
|
47
|
-
Parameters extends Schema.Decoder<unknown> = Schema.Decoder<unknown>,
|
|
48
|
-
M extends Metadata = Metadata,
|
|
49
|
-
> = Omit<Def<Parameters, M>, "id">
|
|
50
|
-
|
|
51
|
-
export interface Info<
|
|
52
|
-
Parameters extends Schema.Decoder<unknown> = Schema.Decoder<unknown>,
|
|
53
|
-
M extends Metadata = Metadata,
|
|
54
|
-
> {
|
|
55
|
-
id: string
|
|
56
|
-
init: () => Effect.Effect<DefWithoutID<Parameters, M>>
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
type Init<Parameters extends Schema.Decoder<unknown>, M extends Metadata> =
|
|
60
|
-
| DefWithoutID<Parameters, M>
|
|
61
|
-
| (() => Effect.Effect<DefWithoutID<Parameters, M>>)
|
|
62
|
-
|
|
63
|
-
export type InferParameters<T> =
|
|
64
|
-
T extends Info<infer P, any>
|
|
65
|
-
? Schema.Schema.Type<P>
|
|
66
|
-
: T extends Effect.Effect<Info<infer P, any>, any, any>
|
|
67
|
-
? Schema.Schema.Type<P>
|
|
68
|
-
: never
|
|
69
|
-
export type InferMetadata<T> =
|
|
70
|
-
T extends Info<any, infer M> ? M : T extends Effect.Effect<Info<any, infer M>, any, any> ? M : never
|
|
71
|
-
|
|
72
|
-
export type InferDef<T> =
|
|
73
|
-
T extends Info<infer P, infer M>
|
|
74
|
-
? Def<P, M>
|
|
75
|
-
: T extends Effect.Effect<Info<infer P, infer M>, any, any>
|
|
76
|
-
? Def<P, M>
|
|
77
|
-
: never
|
|
78
|
-
|
|
79
|
-
function wrap<Parameters extends Schema.Decoder<unknown>, Result extends Metadata>(
|
|
80
|
-
id: string,
|
|
81
|
-
init: Init<Parameters, Result>,
|
|
82
|
-
truncate: Truncate.Interface,
|
|
83
|
-
agents: Agent.Interface,
|
|
84
|
-
) {
|
|
85
|
-
return () =>
|
|
86
|
-
Effect.gen(function* () {
|
|
87
|
-
const toolInfo = typeof init === "function" ? { ...(yield* init()) } : { ...init }
|
|
88
|
-
// Compile the parser closure once per tool init; `decodeUnknownEffect`
|
|
89
|
-
// allocates a new closure per call, so hoisting avoids re-closing it for
|
|
90
|
-
// every LLM tool invocation.
|
|
91
|
-
const decode = Schema.decodeUnknownEffect(toolInfo.parameters)
|
|
92
|
-
const execute = toolInfo.execute
|
|
93
|
-
toolInfo.execute = (args, ctx) => {
|
|
94
|
-
const attrs = {
|
|
95
|
-
"tool.name": id,
|
|
96
|
-
"session.id": ctx.sessionID,
|
|
97
|
-
"message.id": ctx.messageID,
|
|
98
|
-
...(ctx.callID ? { "tool.call_id": ctx.callID } : {}),
|
|
99
|
-
}
|
|
100
|
-
return Effect.gen(function* () {
|
|
101
|
-
const decoded = yield* decode(args).pipe(
|
|
102
|
-
Effect.mapError((error) =>
|
|
103
|
-
toolInfo.formatValidationError
|
|
104
|
-
? new Error(toolInfo.formatValidationError(error), { cause: error })
|
|
105
|
-
: new Error(
|
|
106
|
-
`The ${id} tool was called with invalid arguments: ${error}.\nPlease rewrite the input so it satisfies the expected schema.`,
|
|
107
|
-
{ cause: error },
|
|
108
|
-
),
|
|
109
|
-
),
|
|
110
|
-
)
|
|
111
|
-
const result = yield* execute(decoded as Schema.Schema.Type<Parameters>, ctx)
|
|
112
|
-
if (result.metadata.truncated !== undefined) {
|
|
113
|
-
return result
|
|
114
|
-
}
|
|
115
|
-
const agent = yield* agents.get(ctx.agent)
|
|
116
|
-
const truncated = yield* truncate.output(result.output, {}, agent)
|
|
117
|
-
return {
|
|
118
|
-
...result,
|
|
119
|
-
output: truncated.content,
|
|
120
|
-
metadata: {
|
|
121
|
-
...result.metadata,
|
|
122
|
-
truncated: truncated.truncated,
|
|
123
|
-
...(truncated.truncated && { outputPath: truncated.outputPath }),
|
|
124
|
-
},
|
|
125
|
-
}
|
|
126
|
-
}).pipe(Effect.orDie, Effect.withSpan("Tool.execute", { attributes: attrs }))
|
|
127
|
-
}
|
|
128
|
-
return toolInfo
|
|
129
|
-
})
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
export function define<
|
|
133
|
-
Parameters extends Schema.Decoder<unknown>,
|
|
134
|
-
Result extends Metadata,
|
|
135
|
-
R,
|
|
136
|
-
ID extends string = string,
|
|
137
|
-
>(
|
|
138
|
-
id: ID,
|
|
139
|
-
init: Effect.Effect<Init<Parameters, Result>, never, R>,
|
|
140
|
-
): Effect.Effect<Info<Parameters, Result>, never, R | Truncate.Service | Agent.Service> & { id: ID } {
|
|
141
|
-
return Object.assign(
|
|
142
|
-
Effect.gen(function* () {
|
|
143
|
-
const resolved = yield* init
|
|
144
|
-
const truncate = yield* Truncate.Service
|
|
145
|
-
const agents = yield* Agent.Service
|
|
146
|
-
return { id, init: wrap(id, resolved, truncate, agents) }
|
|
147
|
-
}),
|
|
148
|
-
{ id },
|
|
149
|
-
)
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
export function init<P extends Schema.Decoder<unknown>, M extends Metadata>(
|
|
153
|
-
info: Info<P, M>,
|
|
154
|
-
): Effect.Effect<Def<P, M>> {
|
|
155
|
-
return Effect.gen(function* () {
|
|
156
|
-
const init = yield* info.init()
|
|
157
|
-
return {
|
|
158
|
-
...init,
|
|
159
|
-
id: info.id,
|
|
160
|
-
}
|
|
161
|
-
})
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
export * as Tool from "./tool"
|
|
1
|
+
import { Effect, Schema } from "effect"
|
|
2
|
+
import type { JSONSchema7 } from "@ai-sdk/provider"
|
|
3
|
+
import type { MessageV2 } from "../session/message-v2"
|
|
4
|
+
import type { Permission } from "../permission"
|
|
5
|
+
import type { SessionID, MessageID } from "../session/schema"
|
|
6
|
+
import * as Truncate from "./truncate"
|
|
7
|
+
import { Agent } from "@/agent/agent"
|
|
8
|
+
|
|
9
|
+
interface Metadata {
|
|
10
|
+
[key: string]: any
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// TODO: remove this hack
|
|
14
|
+
export type DynamicDescription = (agent: Agent.Info) => Effect.Effect<string>
|
|
15
|
+
|
|
16
|
+
export type Context<M extends Metadata = Metadata> = {
|
|
17
|
+
sessionID: SessionID
|
|
18
|
+
messageID: MessageID
|
|
19
|
+
agent: string
|
|
20
|
+
abort: AbortSignal
|
|
21
|
+
callID?: string
|
|
22
|
+
extra?: { [key: string]: unknown }
|
|
23
|
+
messages: MessageV2.WithParts[]
|
|
24
|
+
metadata(input: { title?: string; metadata?: M }): Effect.Effect<void>
|
|
25
|
+
ask(input: Omit<Permission.Request, "id" | "sessionID" | "tool">): Effect.Effect<void>
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface ExecuteResult<M extends Metadata = Metadata> {
|
|
29
|
+
title: string
|
|
30
|
+
metadata: M
|
|
31
|
+
output: string
|
|
32
|
+
attachments?: Omit<MessageV2.FilePart, "id" | "sessionID" | "messageID">[]
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface Def<
|
|
36
|
+
Parameters extends Schema.Decoder<unknown> = Schema.Decoder<unknown>,
|
|
37
|
+
M extends Metadata = Metadata,
|
|
38
|
+
> {
|
|
39
|
+
id: string
|
|
40
|
+
description: string
|
|
41
|
+
parameters: Parameters
|
|
42
|
+
jsonSchema?: JSONSchema7
|
|
43
|
+
execute(args: Schema.Schema.Type<Parameters>, ctx: Context): Effect.Effect<ExecuteResult<M>>
|
|
44
|
+
formatValidationError?(error: unknown): string
|
|
45
|
+
}
|
|
46
|
+
export type DefWithoutID<
|
|
47
|
+
Parameters extends Schema.Decoder<unknown> = Schema.Decoder<unknown>,
|
|
48
|
+
M extends Metadata = Metadata,
|
|
49
|
+
> = Omit<Def<Parameters, M>, "id">
|
|
50
|
+
|
|
51
|
+
export interface Info<
|
|
52
|
+
Parameters extends Schema.Decoder<unknown> = Schema.Decoder<unknown>,
|
|
53
|
+
M extends Metadata = Metadata,
|
|
54
|
+
> {
|
|
55
|
+
id: string
|
|
56
|
+
init: () => Effect.Effect<DefWithoutID<Parameters, M>>
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
type Init<Parameters extends Schema.Decoder<unknown>, M extends Metadata> =
|
|
60
|
+
| DefWithoutID<Parameters, M>
|
|
61
|
+
| (() => Effect.Effect<DefWithoutID<Parameters, M>>)
|
|
62
|
+
|
|
63
|
+
export type InferParameters<T> =
|
|
64
|
+
T extends Info<infer P, any>
|
|
65
|
+
? Schema.Schema.Type<P>
|
|
66
|
+
: T extends Effect.Effect<Info<infer P, any>, any, any>
|
|
67
|
+
? Schema.Schema.Type<P>
|
|
68
|
+
: never
|
|
69
|
+
export type InferMetadata<T> =
|
|
70
|
+
T extends Info<any, infer M> ? M : T extends Effect.Effect<Info<any, infer M>, any, any> ? M : never
|
|
71
|
+
|
|
72
|
+
export type InferDef<T> =
|
|
73
|
+
T extends Info<infer P, infer M>
|
|
74
|
+
? Def<P, M>
|
|
75
|
+
: T extends Effect.Effect<Info<infer P, infer M>, any, any>
|
|
76
|
+
? Def<P, M>
|
|
77
|
+
: never
|
|
78
|
+
|
|
79
|
+
function wrap<Parameters extends Schema.Decoder<unknown>, Result extends Metadata>(
|
|
80
|
+
id: string,
|
|
81
|
+
init: Init<Parameters, Result>,
|
|
82
|
+
truncate: Truncate.Interface,
|
|
83
|
+
agents: Agent.Interface,
|
|
84
|
+
) {
|
|
85
|
+
return () =>
|
|
86
|
+
Effect.gen(function* () {
|
|
87
|
+
const toolInfo = typeof init === "function" ? { ...(yield* init()) } : { ...init }
|
|
88
|
+
// Compile the parser closure once per tool init; `decodeUnknownEffect`
|
|
89
|
+
// allocates a new closure per call, so hoisting avoids re-closing it for
|
|
90
|
+
// every LLM tool invocation.
|
|
91
|
+
const decode = Schema.decodeUnknownEffect(toolInfo.parameters)
|
|
92
|
+
const execute = toolInfo.execute
|
|
93
|
+
toolInfo.execute = (args, ctx) => {
|
|
94
|
+
const attrs = {
|
|
95
|
+
"tool.name": id,
|
|
96
|
+
"session.id": ctx.sessionID,
|
|
97
|
+
"message.id": ctx.messageID,
|
|
98
|
+
...(ctx.callID ? { "tool.call_id": ctx.callID } : {}),
|
|
99
|
+
}
|
|
100
|
+
return Effect.gen(function* () {
|
|
101
|
+
const decoded = yield* decode(args).pipe(
|
|
102
|
+
Effect.mapError((error) =>
|
|
103
|
+
toolInfo.formatValidationError
|
|
104
|
+
? new Error(toolInfo.formatValidationError(error), { cause: error })
|
|
105
|
+
: new Error(
|
|
106
|
+
`The ${id} tool was called with invalid arguments: ${error}.\nPlease rewrite the input so it satisfies the expected schema.`,
|
|
107
|
+
{ cause: error },
|
|
108
|
+
),
|
|
109
|
+
),
|
|
110
|
+
)
|
|
111
|
+
const result = yield* execute(decoded as Schema.Schema.Type<Parameters>, ctx)
|
|
112
|
+
if (result.metadata.truncated !== undefined) {
|
|
113
|
+
return result
|
|
114
|
+
}
|
|
115
|
+
const agent = yield* agents.get(ctx.agent)
|
|
116
|
+
const truncated = yield* truncate.output(result.output, {}, agent)
|
|
117
|
+
return {
|
|
118
|
+
...result,
|
|
119
|
+
output: truncated.content,
|
|
120
|
+
metadata: {
|
|
121
|
+
...result.metadata,
|
|
122
|
+
truncated: truncated.truncated,
|
|
123
|
+
...(truncated.truncated && { outputPath: truncated.outputPath }),
|
|
124
|
+
},
|
|
125
|
+
}
|
|
126
|
+
}).pipe(Effect.orDie, Effect.withSpan("Tool.execute", { attributes: attrs }))
|
|
127
|
+
}
|
|
128
|
+
return toolInfo
|
|
129
|
+
})
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export function define<
|
|
133
|
+
Parameters extends Schema.Decoder<unknown>,
|
|
134
|
+
Result extends Metadata,
|
|
135
|
+
R,
|
|
136
|
+
ID extends string = string,
|
|
137
|
+
>(
|
|
138
|
+
id: ID,
|
|
139
|
+
init: Effect.Effect<Init<Parameters, Result>, never, R>,
|
|
140
|
+
): Effect.Effect<Info<Parameters, Result>, never, R | Truncate.Service | Agent.Service> & { id: ID } {
|
|
141
|
+
return Object.assign(
|
|
142
|
+
Effect.gen(function* () {
|
|
143
|
+
const resolved = yield* init
|
|
144
|
+
const truncate = yield* Truncate.Service
|
|
145
|
+
const agents = yield* Agent.Service
|
|
146
|
+
return { id, init: wrap(id, resolved, truncate, agents) }
|
|
147
|
+
}),
|
|
148
|
+
{ id },
|
|
149
|
+
)
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export function init<P extends Schema.Decoder<unknown>, M extends Metadata>(
|
|
153
|
+
info: Info<P, M>,
|
|
154
|
+
): Effect.Effect<Def<P, M>> {
|
|
155
|
+
return Effect.gen(function* () {
|
|
156
|
+
const init = yield* info.init()
|
|
157
|
+
return {
|
|
158
|
+
...init,
|
|
159
|
+
id: info.id,
|
|
160
|
+
}
|
|
161
|
+
})
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export * as Tool from "./tool"
|
|
@@ -1,160 +1,160 @@
|
|
|
1
|
-
import { NodePath } from "@effect/platform-node"
|
|
2
|
-
import { Cause, Duration, Effect, Layer, Option, Schedule, Context } from "effect"
|
|
3
|
-
import path from "path"
|
|
4
|
-
import type { Agent } from "../agent/agent"
|
|
5
|
-
import { AppFileSystem } from "@opencode-ai/core/filesystem"
|
|
6
|
-
import { evaluate } from "@/permission/evaluate"
|
|
7
|
-
import { Config } from "@/config/config"
|
|
8
|
-
import { Identifier } from "../id/id"
|
|
9
|
-
import * as Log from "@opencode-ai/core/util/log"
|
|
10
|
-
import { ToolID } from "./schema"
|
|
11
|
-
import { TRUNCATION_DIR } from "./truncation-dir"
|
|
12
|
-
|
|
13
|
-
const log = Log.create({ service: "truncation" })
|
|
14
|
-
const RETENTION = Duration.days(7)
|
|
15
|
-
|
|
16
|
-
export const MAX_LINES = 2000
|
|
17
|
-
export const MAX_BYTES = 50 * 1024
|
|
18
|
-
export const DIR = TRUNCATION_DIR
|
|
19
|
-
export const GLOB = path.join(TRUNCATION_DIR, "*")
|
|
20
|
-
|
|
21
|
-
export type Result = { content: string; truncated: false } | { content: string; truncated: true; outputPath: string }
|
|
22
|
-
|
|
23
|
-
export interface Options {
|
|
24
|
-
maxLines?: number
|
|
25
|
-
maxBytes?: number
|
|
26
|
-
direction?: "head" | "tail"
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function hasTaskTool(agent?: Agent.Info) {
|
|
30
|
-
if (!agent?.permission) return false
|
|
31
|
-
return evaluate("task", "*", agent.permission).action !== "deny"
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export interface Interface {
|
|
35
|
-
readonly cleanup: () => Effect.Effect<void>
|
|
36
|
-
readonly write: (text: string) => Effect.Effect<string>
|
|
37
|
-
/**
|
|
38
|
-
* Returns output unchanged when it fits within the limits, otherwise writes the full text
|
|
39
|
-
* to the truncation directory and returns a preview plus a hint to inspect the saved file.
|
|
40
|
-
*/
|
|
41
|
-
readonly output: (text: string, options?: Options, agent?: Agent.Info) => Effect.Effect<Result>
|
|
42
|
-
/**
|
|
43
|
-
* Resolved truncation limits: values from `tool_output` in opencode config, or MAX_LINES / MAX_BYTES if unset.
|
|
44
|
-
*/
|
|
45
|
-
readonly limits: () => Effect.Effect<{ maxLines: number; maxBytes: number }>
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export class Service extends Context.Service<Service, Interface>()("@opencode/Truncate") {}
|
|
49
|
-
|
|
50
|
-
export const layer = Layer.effect(
|
|
51
|
-
Service,
|
|
52
|
-
Effect.gen(function* () {
|
|
53
|
-
const fs = yield* AppFileSystem.Service
|
|
54
|
-
|
|
55
|
-
const cleanup = Effect.fn("Truncate.cleanup")(function* () {
|
|
56
|
-
const cutoff = Identifier.timestamp(
|
|
57
|
-
Identifier.create("tool", "ascending", Date.now() - Duration.toMillis(RETENTION)),
|
|
58
|
-
)
|
|
59
|
-
const entries = yield* fs.readDirectory(TRUNCATION_DIR).pipe(
|
|
60
|
-
Effect.map((all) => all.filter((name) => name.startsWith("tool_"))),
|
|
61
|
-
Effect.catch(() => Effect.succeed([])),
|
|
62
|
-
)
|
|
63
|
-
for (const entry of entries) {
|
|
64
|
-
if (Identifier.timestamp(entry) >= cutoff) continue
|
|
65
|
-
yield* fs.remove(path.join(TRUNCATION_DIR, entry)).pipe(Effect.catch(() => Effect.void))
|
|
66
|
-
}
|
|
67
|
-
})
|
|
68
|
-
|
|
69
|
-
const write = Effect.fn("Truncate.write")(function* (text: string) {
|
|
70
|
-
const file = path.join(TRUNCATION_DIR, ToolID.ascending())
|
|
71
|
-
yield* fs.ensureDir(TRUNCATION_DIR).pipe(Effect.orDie)
|
|
72
|
-
yield* fs.writeFileString(file, text).pipe(Effect.orDie)
|
|
73
|
-
return file
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
const limits = Effect.fn("Truncate.limits")(function* () {
|
|
77
|
-
const configSvc = yield* Effect.serviceOption(Config.Service)
|
|
78
|
-
if (Option.isNone(configSvc)) return { maxLines: MAX_LINES, maxBytes: MAX_BYTES }
|
|
79
|
-
const cfg = yield* configSvc.value.get().pipe(Effect.catch(() => Effect.succeed(undefined)))
|
|
80
|
-
return {
|
|
81
|
-
maxLines: cfg?.tool_output?.max_lines ?? MAX_LINES,
|
|
82
|
-
maxBytes: cfg?.tool_output?.max_bytes ?? MAX_BYTES,
|
|
83
|
-
}
|
|
84
|
-
})
|
|
85
|
-
|
|
86
|
-
const output = Effect.fn("Truncate.output")(function* (text: string, options: Options = {}, agent?: Agent.Info) {
|
|
87
|
-
const resolved = yield* limits()
|
|
88
|
-
const maxLines = options.maxLines ?? resolved.maxLines
|
|
89
|
-
const maxBytes = options.maxBytes ?? resolved.maxBytes
|
|
90
|
-
const direction = options.direction ?? "head"
|
|
91
|
-
const lines = text.split("\n")
|
|
92
|
-
const totalBytes = Buffer.byteLength(text, "utf-8")
|
|
93
|
-
|
|
94
|
-
if (lines.length <= maxLines && totalBytes <= maxBytes) {
|
|
95
|
-
return { content: text, truncated: false } as const
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
const out: string[] = []
|
|
99
|
-
let i = 0
|
|
100
|
-
let bytes = 0
|
|
101
|
-
let hitBytes = false
|
|
102
|
-
|
|
103
|
-
if (direction === "head") {
|
|
104
|
-
for (i = 0; i < lines.length && i < maxLines; i++) {
|
|
105
|
-
const size = Buffer.byteLength(lines[i], "utf-8") + (i > 0 ? 1 : 0)
|
|
106
|
-
if (bytes + size > maxBytes) {
|
|
107
|
-
hitBytes = true
|
|
108
|
-
break
|
|
109
|
-
}
|
|
110
|
-
out.push(lines[i])
|
|
111
|
-
bytes += size
|
|
112
|
-
}
|
|
113
|
-
} else {
|
|
114
|
-
for (i = lines.length - 1; i >= 0 && out.length < maxLines; i--) {
|
|
115
|
-
const size = Buffer.byteLength(lines[i], "utf-8") + (out.length > 0 ? 1 : 0)
|
|
116
|
-
if (bytes + size > maxBytes) {
|
|
117
|
-
hitBytes = true
|
|
118
|
-
break
|
|
119
|
-
}
|
|
120
|
-
out.unshift(lines[i])
|
|
121
|
-
bytes += size
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
const removed = hitBytes ? totalBytes - bytes : lines.length - out.length
|
|
126
|
-
const unit = hitBytes ? "bytes" : "lines"
|
|
127
|
-
const preview = out.join("\n")
|
|
128
|
-
const file = yield* write(text)
|
|
129
|
-
|
|
130
|
-
const hint = hasTaskTool(agent)
|
|
131
|
-
? `The tool call succeeded but the output was truncated. Full output saved to: ${file}\nUse the Task tool to have explore agent process this file with Grep and Read (with offset/limit). Do NOT read the full file yourself - delegate to save context.`
|
|
132
|
-
: `The tool call succeeded but the output was truncated. Full output saved to: ${file}\nUse Grep to search the full content or Read with offset/limit to view specific sections.`
|
|
133
|
-
|
|
134
|
-
return {
|
|
135
|
-
content:
|
|
136
|
-
direction === "head"
|
|
137
|
-
? `${preview}\n\n...${removed} ${unit} truncated...\n\n${hint}`
|
|
138
|
-
: `...${removed} ${unit} truncated...\n\n${hint}\n\n${preview}`,
|
|
139
|
-
truncated: true,
|
|
140
|
-
outputPath: file,
|
|
141
|
-
} as const
|
|
142
|
-
})
|
|
143
|
-
|
|
144
|
-
yield* cleanup().pipe(
|
|
145
|
-
Effect.catchCause((cause) => {
|
|
146
|
-
log.error("truncation cleanup failed", { cause: Cause.pretty(cause) })
|
|
147
|
-
return Effect.void
|
|
148
|
-
}),
|
|
149
|
-
Effect.repeat(Schedule.spaced(Duration.hours(1))),
|
|
150
|
-
Effect.delay(Duration.minutes(1)),
|
|
151
|
-
Effect.forkScoped,
|
|
152
|
-
)
|
|
153
|
-
|
|
154
|
-
return Service.of({ cleanup, write, output, limits })
|
|
155
|
-
}),
|
|
156
|
-
)
|
|
157
|
-
|
|
158
|
-
export const defaultLayer = layer.pipe(Layer.provide(AppFileSystem.defaultLayer), Layer.provide(NodePath.layer))
|
|
159
|
-
|
|
160
|
-
export * as Truncate from "./truncate"
|
|
1
|
+
import { NodePath } from "@effect/platform-node"
|
|
2
|
+
import { Cause, Duration, Effect, Layer, Option, Schedule, Context } from "effect"
|
|
3
|
+
import path from "path"
|
|
4
|
+
import type { Agent } from "../agent/agent"
|
|
5
|
+
import { AppFileSystem } from "@opencode-ai/core/filesystem"
|
|
6
|
+
import { evaluate } from "@/permission/evaluate"
|
|
7
|
+
import { Config } from "@/config/config"
|
|
8
|
+
import { Identifier } from "../id/id"
|
|
9
|
+
import * as Log from "@opencode-ai/core/util/log"
|
|
10
|
+
import { ToolID } from "./schema"
|
|
11
|
+
import { TRUNCATION_DIR } from "./truncation-dir"
|
|
12
|
+
|
|
13
|
+
const log = Log.create({ service: "truncation" })
|
|
14
|
+
const RETENTION = Duration.days(7)
|
|
15
|
+
|
|
16
|
+
export const MAX_LINES = 2000
|
|
17
|
+
export const MAX_BYTES = 50 * 1024
|
|
18
|
+
export const DIR = TRUNCATION_DIR
|
|
19
|
+
export const GLOB = path.join(TRUNCATION_DIR, "*")
|
|
20
|
+
|
|
21
|
+
export type Result = { content: string; truncated: false } | { content: string; truncated: true; outputPath: string }
|
|
22
|
+
|
|
23
|
+
export interface Options {
|
|
24
|
+
maxLines?: number
|
|
25
|
+
maxBytes?: number
|
|
26
|
+
direction?: "head" | "tail"
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function hasTaskTool(agent?: Agent.Info) {
|
|
30
|
+
if (!agent?.permission) return false
|
|
31
|
+
return evaluate("task", "*", agent.permission).action !== "deny"
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface Interface {
|
|
35
|
+
readonly cleanup: () => Effect.Effect<void>
|
|
36
|
+
readonly write: (text: string) => Effect.Effect<string>
|
|
37
|
+
/**
|
|
38
|
+
* Returns output unchanged when it fits within the limits, otherwise writes the full text
|
|
39
|
+
* to the truncation directory and returns a preview plus a hint to inspect the saved file.
|
|
40
|
+
*/
|
|
41
|
+
readonly output: (text: string, options?: Options, agent?: Agent.Info) => Effect.Effect<Result>
|
|
42
|
+
/**
|
|
43
|
+
* Resolved truncation limits: values from `tool_output` in opencode config, or MAX_LINES / MAX_BYTES if unset.
|
|
44
|
+
*/
|
|
45
|
+
readonly limits: () => Effect.Effect<{ maxLines: number; maxBytes: number }>
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export class Service extends Context.Service<Service, Interface>()("@opencode/Truncate") {}
|
|
49
|
+
|
|
50
|
+
export const layer = Layer.effect(
|
|
51
|
+
Service,
|
|
52
|
+
Effect.gen(function* () {
|
|
53
|
+
const fs = yield* AppFileSystem.Service
|
|
54
|
+
|
|
55
|
+
const cleanup = Effect.fn("Truncate.cleanup")(function* () {
|
|
56
|
+
const cutoff = Identifier.timestamp(
|
|
57
|
+
Identifier.create("tool", "ascending", Date.now() - Duration.toMillis(RETENTION)),
|
|
58
|
+
)
|
|
59
|
+
const entries = yield* fs.readDirectory(TRUNCATION_DIR).pipe(
|
|
60
|
+
Effect.map((all) => all.filter((name) => name.startsWith("tool_"))),
|
|
61
|
+
Effect.catch(() => Effect.succeed([])),
|
|
62
|
+
)
|
|
63
|
+
for (const entry of entries) {
|
|
64
|
+
if (Identifier.timestamp(entry) >= cutoff) continue
|
|
65
|
+
yield* fs.remove(path.join(TRUNCATION_DIR, entry)).pipe(Effect.catch(() => Effect.void))
|
|
66
|
+
}
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
const write = Effect.fn("Truncate.write")(function* (text: string) {
|
|
70
|
+
const file = path.join(TRUNCATION_DIR, ToolID.ascending())
|
|
71
|
+
yield* fs.ensureDir(TRUNCATION_DIR).pipe(Effect.orDie)
|
|
72
|
+
yield* fs.writeFileString(file, text).pipe(Effect.orDie)
|
|
73
|
+
return file
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
const limits = Effect.fn("Truncate.limits")(function* () {
|
|
77
|
+
const configSvc = yield* Effect.serviceOption(Config.Service)
|
|
78
|
+
if (Option.isNone(configSvc)) return { maxLines: MAX_LINES, maxBytes: MAX_BYTES }
|
|
79
|
+
const cfg = yield* configSvc.value.get().pipe(Effect.catch(() => Effect.succeed(undefined)))
|
|
80
|
+
return {
|
|
81
|
+
maxLines: cfg?.tool_output?.max_lines ?? MAX_LINES,
|
|
82
|
+
maxBytes: cfg?.tool_output?.max_bytes ?? MAX_BYTES,
|
|
83
|
+
}
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
const output = Effect.fn("Truncate.output")(function* (text: string, options: Options = {}, agent?: Agent.Info) {
|
|
87
|
+
const resolved = yield* limits()
|
|
88
|
+
const maxLines = options.maxLines ?? resolved.maxLines
|
|
89
|
+
const maxBytes = options.maxBytes ?? resolved.maxBytes
|
|
90
|
+
const direction = options.direction ?? "head"
|
|
91
|
+
const lines = text.split("\n")
|
|
92
|
+
const totalBytes = Buffer.byteLength(text, "utf-8")
|
|
93
|
+
|
|
94
|
+
if (lines.length <= maxLines && totalBytes <= maxBytes) {
|
|
95
|
+
return { content: text, truncated: false } as const
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const out: string[] = []
|
|
99
|
+
let i = 0
|
|
100
|
+
let bytes = 0
|
|
101
|
+
let hitBytes = false
|
|
102
|
+
|
|
103
|
+
if (direction === "head") {
|
|
104
|
+
for (i = 0; i < lines.length && i < maxLines; i++) {
|
|
105
|
+
const size = Buffer.byteLength(lines[i], "utf-8") + (i > 0 ? 1 : 0)
|
|
106
|
+
if (bytes + size > maxBytes) {
|
|
107
|
+
hitBytes = true
|
|
108
|
+
break
|
|
109
|
+
}
|
|
110
|
+
out.push(lines[i])
|
|
111
|
+
bytes += size
|
|
112
|
+
}
|
|
113
|
+
} else {
|
|
114
|
+
for (i = lines.length - 1; i >= 0 && out.length < maxLines; i--) {
|
|
115
|
+
const size = Buffer.byteLength(lines[i], "utf-8") + (out.length > 0 ? 1 : 0)
|
|
116
|
+
if (bytes + size > maxBytes) {
|
|
117
|
+
hitBytes = true
|
|
118
|
+
break
|
|
119
|
+
}
|
|
120
|
+
out.unshift(lines[i])
|
|
121
|
+
bytes += size
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const removed = hitBytes ? totalBytes - bytes : lines.length - out.length
|
|
126
|
+
const unit = hitBytes ? "bytes" : "lines"
|
|
127
|
+
const preview = out.join("\n")
|
|
128
|
+
const file = yield* write(text)
|
|
129
|
+
|
|
130
|
+
const hint = hasTaskTool(agent)
|
|
131
|
+
? `The tool call succeeded but the output was truncated. Full output saved to: ${file}\nUse the Task tool to have explore agent process this file with Grep and Read (with offset/limit). Do NOT read the full file yourself - delegate to save context.`
|
|
132
|
+
: `The tool call succeeded but the output was truncated. Full output saved to: ${file}\nUse Grep to search the full content or Read with offset/limit to view specific sections.`
|
|
133
|
+
|
|
134
|
+
return {
|
|
135
|
+
content:
|
|
136
|
+
direction === "head"
|
|
137
|
+
? `${preview}\n\n...${removed} ${unit} truncated...\n\n${hint}`
|
|
138
|
+
: `...${removed} ${unit} truncated...\n\n${hint}\n\n${preview}`,
|
|
139
|
+
truncated: true,
|
|
140
|
+
outputPath: file,
|
|
141
|
+
} as const
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
yield* cleanup().pipe(
|
|
145
|
+
Effect.catchCause((cause) => {
|
|
146
|
+
log.error("truncation cleanup failed", { cause: Cause.pretty(cause) })
|
|
147
|
+
return Effect.void
|
|
148
|
+
}),
|
|
149
|
+
Effect.repeat(Schedule.spaced(Duration.hours(1))),
|
|
150
|
+
Effect.delay(Duration.minutes(1)),
|
|
151
|
+
Effect.forkScoped,
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
return Service.of({ cleanup, write, output, limits })
|
|
155
|
+
}),
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
export const defaultLayer = layer.pipe(Layer.provide(AppFileSystem.defaultLayer), Layer.provide(NodePath.layer))
|
|
159
|
+
|
|
160
|
+
export * as Truncate from "./truncate"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import path from "path"
|
|
2
|
-
import { Global } from "@opencode-ai/core/global"
|
|
3
|
-
|
|
4
|
-
export const TRUNCATION_DIR = path.join(Global.Path.data, "tool-output")
|
|
1
|
+
import path from "path"
|
|
2
|
+
import { Global } from "@opencode-ai/core/global"
|
|
3
|
+
|
|
4
|
+
export const TRUNCATION_DIR = path.join(Global.Path.data, "tool-output")
|