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,90 +1,90 @@
|
|
|
1
|
-
export * as ConfigVariable from "./variable"
|
|
2
|
-
|
|
3
|
-
import path from "path"
|
|
4
|
-
import os from "os"
|
|
5
|
-
import { Filesystem } from "@/util/filesystem"
|
|
6
|
-
import { InvalidError } from "./error"
|
|
7
|
-
|
|
8
|
-
type ParseSource =
|
|
9
|
-
| {
|
|
10
|
-
type: "path"
|
|
11
|
-
path: string
|
|
12
|
-
}
|
|
13
|
-
| {
|
|
14
|
-
type: "virtual"
|
|
15
|
-
source: string
|
|
16
|
-
dir: string
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
type SubstituteInput = ParseSource & {
|
|
20
|
-
text: string
|
|
21
|
-
missing?: "error" | "empty"
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function source(input: ParseSource) {
|
|
25
|
-
return input.type === "path" ? input.path : input.source
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function dir(input: ParseSource) {
|
|
29
|
-
return input.type === "path" ? path.dirname(input.path) : input.dir
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/** Apply {env:VAR} and {file:path} substitutions to config text. */
|
|
33
|
-
export async function substitute(input: SubstituteInput) {
|
|
34
|
-
const missing = input.missing ?? "error"
|
|
35
|
-
let text = input.text.replace(/\{env:([^}]+)\}/g, (_, varName) => {
|
|
36
|
-
return process.env[varName] || ""
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
const fileMatches = Array.from(text.matchAll(/\{file:[^}]+\}/g))
|
|
40
|
-
if (!fileMatches.length) return text
|
|
41
|
-
|
|
42
|
-
const configDir = dir(input)
|
|
43
|
-
const configSource = source(input)
|
|
44
|
-
let out = ""
|
|
45
|
-
let cursor = 0
|
|
46
|
-
|
|
47
|
-
for (const match of fileMatches) {
|
|
48
|
-
const token = match[0]
|
|
49
|
-
const index = match.index!
|
|
50
|
-
out += text.slice(cursor, index)
|
|
51
|
-
|
|
52
|
-
const lineStart = text.lastIndexOf("\n", index - 1) + 1
|
|
53
|
-
const prefix = text.slice(lineStart, index).trimStart()
|
|
54
|
-
if (prefix.startsWith("//")) {
|
|
55
|
-
out += token
|
|
56
|
-
cursor = index + token.length
|
|
57
|
-
continue
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
let filePath = token.replace(/^\{file:/, "").replace(/\}$/, "")
|
|
61
|
-
if (filePath.startsWith("~/")) {
|
|
62
|
-
filePath = path.join(os.homedir(), filePath.slice(2))
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const resolvedPath = path.isAbsolute(filePath) ? filePath : path.resolve(configDir, filePath)
|
|
66
|
-
const fileContent = (
|
|
67
|
-
await Filesystem.readText(resolvedPath).catch((error: NodeJS.ErrnoException) => {
|
|
68
|
-
if (missing === "empty") return ""
|
|
69
|
-
|
|
70
|
-
const errMsg = `bad file reference: "${token}"`
|
|
71
|
-
if (error.code === "ENOENT") {
|
|
72
|
-
throw new InvalidError(
|
|
73
|
-
{
|
|
74
|
-
path: configSource,
|
|
75
|
-
message: errMsg + ` ${resolvedPath} does not exist`,
|
|
76
|
-
},
|
|
77
|
-
{ cause: error },
|
|
78
|
-
)
|
|
79
|
-
}
|
|
80
|
-
throw new InvalidError({ path: configSource, message: errMsg }, { cause: error })
|
|
81
|
-
})
|
|
82
|
-
).trim()
|
|
83
|
-
|
|
84
|
-
out += JSON.stringify(fileContent).slice(1, -1)
|
|
85
|
-
cursor = index + token.length
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
out += text.slice(cursor)
|
|
89
|
-
return out
|
|
90
|
-
}
|
|
1
|
+
export * as ConfigVariable from "./variable"
|
|
2
|
+
|
|
3
|
+
import path from "path"
|
|
4
|
+
import os from "os"
|
|
5
|
+
import { Filesystem } from "@/util/filesystem"
|
|
6
|
+
import { InvalidError } from "./error"
|
|
7
|
+
|
|
8
|
+
type ParseSource =
|
|
9
|
+
| {
|
|
10
|
+
type: "path"
|
|
11
|
+
path: string
|
|
12
|
+
}
|
|
13
|
+
| {
|
|
14
|
+
type: "virtual"
|
|
15
|
+
source: string
|
|
16
|
+
dir: string
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
type SubstituteInput = ParseSource & {
|
|
20
|
+
text: string
|
|
21
|
+
missing?: "error" | "empty"
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function source(input: ParseSource) {
|
|
25
|
+
return input.type === "path" ? input.path : input.source
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function dir(input: ParseSource) {
|
|
29
|
+
return input.type === "path" ? path.dirname(input.path) : input.dir
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Apply {env:VAR} and {file:path} substitutions to config text. */
|
|
33
|
+
export async function substitute(input: SubstituteInput) {
|
|
34
|
+
const missing = input.missing ?? "error"
|
|
35
|
+
let text = input.text.replace(/\{env:([^}]+)\}/g, (_, varName) => {
|
|
36
|
+
return process.env[varName] || ""
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
const fileMatches = Array.from(text.matchAll(/\{file:[^}]+\}/g))
|
|
40
|
+
if (!fileMatches.length) return text
|
|
41
|
+
|
|
42
|
+
const configDir = dir(input)
|
|
43
|
+
const configSource = source(input)
|
|
44
|
+
let out = ""
|
|
45
|
+
let cursor = 0
|
|
46
|
+
|
|
47
|
+
for (const match of fileMatches) {
|
|
48
|
+
const token = match[0]
|
|
49
|
+
const index = match.index!
|
|
50
|
+
out += text.slice(cursor, index)
|
|
51
|
+
|
|
52
|
+
const lineStart = text.lastIndexOf("\n", index - 1) + 1
|
|
53
|
+
const prefix = text.slice(lineStart, index).trimStart()
|
|
54
|
+
if (prefix.startsWith("//")) {
|
|
55
|
+
out += token
|
|
56
|
+
cursor = index + token.length
|
|
57
|
+
continue
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
let filePath = token.replace(/^\{file:/, "").replace(/\}$/, "")
|
|
61
|
+
if (filePath.startsWith("~/")) {
|
|
62
|
+
filePath = path.join(os.homedir(), filePath.slice(2))
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const resolvedPath = path.isAbsolute(filePath) ? filePath : path.resolve(configDir, filePath)
|
|
66
|
+
const fileContent = (
|
|
67
|
+
await Filesystem.readText(resolvedPath).catch((error: NodeJS.ErrnoException) => {
|
|
68
|
+
if (missing === "empty") return ""
|
|
69
|
+
|
|
70
|
+
const errMsg = `bad file reference: "${token}"`
|
|
71
|
+
if (error.code === "ENOENT") {
|
|
72
|
+
throw new InvalidError(
|
|
73
|
+
{
|
|
74
|
+
path: configSource,
|
|
75
|
+
message: errMsg + ` ${resolvedPath} does not exist`,
|
|
76
|
+
},
|
|
77
|
+
{ cause: error },
|
|
78
|
+
)
|
|
79
|
+
}
|
|
80
|
+
throw new InvalidError({ path: configSource, message: errMsg }, { cause: error })
|
|
81
|
+
})
|
|
82
|
+
).trim()
|
|
83
|
+
|
|
84
|
+
out += JSON.stringify(fileContent).slice(1, -1)
|
|
85
|
+
cursor = index + token.length
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
out += text.slice(cursor)
|
|
89
|
+
return out
|
|
90
|
+
}
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
import type { ProjectID } from "@/project/schema"
|
|
2
|
-
import type { WorkspaceAdapter, WorkspaceAdapterEntry } from "../types"
|
|
3
|
-
import { WorktreeAdapter } from "./worktree"
|
|
4
|
-
|
|
5
|
-
const BUILTIN: Record<string, WorkspaceAdapter> = {
|
|
6
|
-
worktree: WorktreeAdapter,
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
const state = new Map<ProjectID, Map<string, WorkspaceAdapter>>()
|
|
10
|
-
|
|
11
|
-
export function getAdapter(projectID: ProjectID, type: string): WorkspaceAdapter {
|
|
12
|
-
const custom = state.get(projectID)?.get(type)
|
|
13
|
-
if (custom) return custom
|
|
14
|
-
|
|
15
|
-
const builtin = BUILTIN[type]
|
|
16
|
-
if (builtin) return builtin
|
|
17
|
-
|
|
18
|
-
throw new Error(`Unknown workspace adapter: ${type}`)
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export function listAdapters(projectID: ProjectID): WorkspaceAdapterEntry[] {
|
|
22
|
-
return registeredAdapters(projectID).map(([type, adapter]) => ({
|
|
23
|
-
type,
|
|
24
|
-
name: adapter.name,
|
|
25
|
-
description: adapter.description,
|
|
26
|
-
}))
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function registeredAdapters(projectID: ProjectID): [string, WorkspaceAdapter][] {
|
|
30
|
-
const adapters = new Map(Object.entries(BUILTIN))
|
|
31
|
-
for (const [type, adapter] of state.get(projectID)?.entries() ?? []) adapters.set(type, adapter)
|
|
32
|
-
return [...adapters.entries()]
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// Plugins can be loaded per-project so we need to scope them. If you
|
|
36
|
-
// want to install a global one pass `ProjectID.global`
|
|
37
|
-
export function registerAdapter(projectID: ProjectID, type: string, adapter: WorkspaceAdapter) {
|
|
38
|
-
const adapters = state.get(projectID) ?? new Map<string, WorkspaceAdapter>()
|
|
39
|
-
adapters.set(type, adapter)
|
|
40
|
-
state.set(projectID, adapters)
|
|
41
|
-
}
|
|
1
|
+
import type { ProjectID } from "@/project/schema"
|
|
2
|
+
import type { WorkspaceAdapter, WorkspaceAdapterEntry } from "../types"
|
|
3
|
+
import { WorktreeAdapter } from "./worktree"
|
|
4
|
+
|
|
5
|
+
const BUILTIN: Record<string, WorkspaceAdapter> = {
|
|
6
|
+
worktree: WorktreeAdapter,
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const state = new Map<ProjectID, Map<string, WorkspaceAdapter>>()
|
|
10
|
+
|
|
11
|
+
export function getAdapter(projectID: ProjectID, type: string): WorkspaceAdapter {
|
|
12
|
+
const custom = state.get(projectID)?.get(type)
|
|
13
|
+
if (custom) return custom
|
|
14
|
+
|
|
15
|
+
const builtin = BUILTIN[type]
|
|
16
|
+
if (builtin) return builtin
|
|
17
|
+
|
|
18
|
+
throw new Error(`Unknown workspace adapter: ${type}`)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function listAdapters(projectID: ProjectID): WorkspaceAdapterEntry[] {
|
|
22
|
+
return registeredAdapters(projectID).map(([type, adapter]) => ({
|
|
23
|
+
type,
|
|
24
|
+
name: adapter.name,
|
|
25
|
+
description: adapter.description,
|
|
26
|
+
}))
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function registeredAdapters(projectID: ProjectID): [string, WorkspaceAdapter][] {
|
|
30
|
+
const adapters = new Map(Object.entries(BUILTIN))
|
|
31
|
+
for (const [type, adapter] of state.get(projectID)?.entries() ?? []) adapters.set(type, adapter)
|
|
32
|
+
return [...adapters.entries()]
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Plugins can be loaded per-project so we need to scope them. If you
|
|
36
|
+
// want to install a global one pass `ProjectID.global`
|
|
37
|
+
export function registerAdapter(projectID: ProjectID, type: string, adapter: WorkspaceAdapter) {
|
|
38
|
+
const adapters = state.get(projectID) ?? new Map<string, WorkspaceAdapter>()
|
|
39
|
+
adapters.set(type, adapter)
|
|
40
|
+
state.set(projectID, adapters)
|
|
41
|
+
}
|
|
@@ -1,96 +1,96 @@
|
|
|
1
|
-
import { Effect, Schema } from "effect"
|
|
2
|
-
import { InstanceRef, WorkspaceRef } from "@/effect/instance-ref"
|
|
3
|
-
import { type WorkspaceAdapter, type WorkspaceAdapterContext, WorkspaceInfo } from "../types"
|
|
4
|
-
|
|
5
|
-
const WorktreeConfig = Schema.Struct({
|
|
6
|
-
name: WorkspaceInfo.fields.name,
|
|
7
|
-
branch: Schema.optional(Schema.NullOr(Schema.String)),
|
|
8
|
-
directory: Schema.String,
|
|
9
|
-
})
|
|
10
|
-
const decodeWorktreeConfig = Schema.decodeUnknownSync(WorktreeConfig)
|
|
11
|
-
|
|
12
|
-
async function loadWorktree() {
|
|
13
|
-
const [{ AppRuntime }, { Worktree }] = await Promise.all([import("@/effect/app-runtime"), import("@/worktree")])
|
|
14
|
-
return { AppRuntime, Worktree }
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
function requireInstance(context: WorkspaceAdapterContext | undefined) {
|
|
18
|
-
if (!context?.instance) throw new Error("Worktree adapter requires an instance context")
|
|
19
|
-
return context.instance
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const provideContext = <A, E, R>(effect: Effect.Effect<A, E, R>, context: WorkspaceAdapterContext | undefined) =>
|
|
23
|
-
effect.pipe(
|
|
24
|
-
Effect.provideService(InstanceRef, requireInstance(context)),
|
|
25
|
-
Effect.provideService(WorkspaceRef, context?.workspaceID),
|
|
26
|
-
)
|
|
27
|
-
|
|
28
|
-
export const WorktreeAdapter: WorkspaceAdapter = {
|
|
29
|
-
name: "Worktree",
|
|
30
|
-
description: "Create a git worktree",
|
|
31
|
-
async configure(info, context) {
|
|
32
|
-
const { AppRuntime, Worktree } = await loadWorktree()
|
|
33
|
-
const next = await AppRuntime.runPromise(
|
|
34
|
-
provideContext(
|
|
35
|
-
Worktree.Service.use((svc) => svc.makeWorktreeInfo({ detached: true })),
|
|
36
|
-
context,
|
|
37
|
-
),
|
|
38
|
-
)
|
|
39
|
-
return {
|
|
40
|
-
...info,
|
|
41
|
-
name: next.name,
|
|
42
|
-
directory: next.directory,
|
|
43
|
-
}
|
|
44
|
-
},
|
|
45
|
-
async create(info, _env, _from, context) {
|
|
46
|
-
const { AppRuntime, Worktree } = await loadWorktree()
|
|
47
|
-
const config = decodeWorktreeConfig(info)
|
|
48
|
-
await AppRuntime.runPromise(
|
|
49
|
-
provideContext(
|
|
50
|
-
Worktree.Service.use((svc) =>
|
|
51
|
-
svc.createFromInfo({
|
|
52
|
-
name: config.name,
|
|
53
|
-
directory: config.directory,
|
|
54
|
-
...(config.branch ? { branch: config.branch } : {}),
|
|
55
|
-
}),
|
|
56
|
-
),
|
|
57
|
-
context,
|
|
58
|
-
),
|
|
59
|
-
)
|
|
60
|
-
},
|
|
61
|
-
async list(context) {
|
|
62
|
-
const { AppRuntime, Worktree } = await loadWorktree()
|
|
63
|
-
const ctx = requireInstance(context)
|
|
64
|
-
return (
|
|
65
|
-
await AppRuntime.runPromise(
|
|
66
|
-
provideContext(
|
|
67
|
-
Worktree.Service.use((svc) => svc.list()),
|
|
68
|
-
context,
|
|
69
|
-
),
|
|
70
|
-
)
|
|
71
|
-
).map((info) => ({
|
|
72
|
-
type: "worktree",
|
|
73
|
-
name: info.name,
|
|
74
|
-
branch: info.branch,
|
|
75
|
-
directory: info.directory,
|
|
76
|
-
projectID: ctx.project.id,
|
|
77
|
-
}))
|
|
78
|
-
},
|
|
79
|
-
async remove(info, context) {
|
|
80
|
-
const { AppRuntime, Worktree } = await loadWorktree()
|
|
81
|
-
const config = decodeWorktreeConfig(info)
|
|
82
|
-
await AppRuntime.runPromise(
|
|
83
|
-
provideContext(
|
|
84
|
-
Worktree.Service.use((svc) => svc.remove({ directory: config.directory })),
|
|
85
|
-
context,
|
|
86
|
-
),
|
|
87
|
-
)
|
|
88
|
-
},
|
|
89
|
-
target(info) {
|
|
90
|
-
const config = decodeWorktreeConfig(info)
|
|
91
|
-
return {
|
|
92
|
-
type: "local",
|
|
93
|
-
directory: config.directory,
|
|
94
|
-
}
|
|
95
|
-
},
|
|
96
|
-
}
|
|
1
|
+
import { Effect, Schema } from "effect"
|
|
2
|
+
import { InstanceRef, WorkspaceRef } from "@/effect/instance-ref"
|
|
3
|
+
import { type WorkspaceAdapter, type WorkspaceAdapterContext, WorkspaceInfo } from "../types"
|
|
4
|
+
|
|
5
|
+
const WorktreeConfig = Schema.Struct({
|
|
6
|
+
name: WorkspaceInfo.fields.name,
|
|
7
|
+
branch: Schema.optional(Schema.NullOr(Schema.String)),
|
|
8
|
+
directory: Schema.String,
|
|
9
|
+
})
|
|
10
|
+
const decodeWorktreeConfig = Schema.decodeUnknownSync(WorktreeConfig)
|
|
11
|
+
|
|
12
|
+
async function loadWorktree() {
|
|
13
|
+
const [{ AppRuntime }, { Worktree }] = await Promise.all([import("@/effect/app-runtime"), import("@/worktree")])
|
|
14
|
+
return { AppRuntime, Worktree }
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function requireInstance(context: WorkspaceAdapterContext | undefined) {
|
|
18
|
+
if (!context?.instance) throw new Error("Worktree adapter requires an instance context")
|
|
19
|
+
return context.instance
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const provideContext = <A, E, R>(effect: Effect.Effect<A, E, R>, context: WorkspaceAdapterContext | undefined) =>
|
|
23
|
+
effect.pipe(
|
|
24
|
+
Effect.provideService(InstanceRef, requireInstance(context)),
|
|
25
|
+
Effect.provideService(WorkspaceRef, context?.workspaceID),
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
export const WorktreeAdapter: WorkspaceAdapter = {
|
|
29
|
+
name: "Worktree",
|
|
30
|
+
description: "Create a git worktree",
|
|
31
|
+
async configure(info, context) {
|
|
32
|
+
const { AppRuntime, Worktree } = await loadWorktree()
|
|
33
|
+
const next = await AppRuntime.runPromise(
|
|
34
|
+
provideContext(
|
|
35
|
+
Worktree.Service.use((svc) => svc.makeWorktreeInfo({ detached: true })),
|
|
36
|
+
context,
|
|
37
|
+
),
|
|
38
|
+
)
|
|
39
|
+
return {
|
|
40
|
+
...info,
|
|
41
|
+
name: next.name,
|
|
42
|
+
directory: next.directory,
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
async create(info, _env, _from, context) {
|
|
46
|
+
const { AppRuntime, Worktree } = await loadWorktree()
|
|
47
|
+
const config = decodeWorktreeConfig(info)
|
|
48
|
+
await AppRuntime.runPromise(
|
|
49
|
+
provideContext(
|
|
50
|
+
Worktree.Service.use((svc) =>
|
|
51
|
+
svc.createFromInfo({
|
|
52
|
+
name: config.name,
|
|
53
|
+
directory: config.directory,
|
|
54
|
+
...(config.branch ? { branch: config.branch } : {}),
|
|
55
|
+
}),
|
|
56
|
+
),
|
|
57
|
+
context,
|
|
58
|
+
),
|
|
59
|
+
)
|
|
60
|
+
},
|
|
61
|
+
async list(context) {
|
|
62
|
+
const { AppRuntime, Worktree } = await loadWorktree()
|
|
63
|
+
const ctx = requireInstance(context)
|
|
64
|
+
return (
|
|
65
|
+
await AppRuntime.runPromise(
|
|
66
|
+
provideContext(
|
|
67
|
+
Worktree.Service.use((svc) => svc.list()),
|
|
68
|
+
context,
|
|
69
|
+
),
|
|
70
|
+
)
|
|
71
|
+
).map((info) => ({
|
|
72
|
+
type: "worktree",
|
|
73
|
+
name: info.name,
|
|
74
|
+
branch: info.branch,
|
|
75
|
+
directory: info.directory,
|
|
76
|
+
projectID: ctx.project.id,
|
|
77
|
+
}))
|
|
78
|
+
},
|
|
79
|
+
async remove(info, context) {
|
|
80
|
+
const { AppRuntime, Worktree } = await loadWorktree()
|
|
81
|
+
const config = decodeWorktreeConfig(info)
|
|
82
|
+
await AppRuntime.runPromise(
|
|
83
|
+
provideContext(
|
|
84
|
+
Worktree.Service.use((svc) => svc.remove({ directory: config.directory })),
|
|
85
|
+
context,
|
|
86
|
+
),
|
|
87
|
+
)
|
|
88
|
+
},
|
|
89
|
+
target(info) {
|
|
90
|
+
const config = decodeWorktreeConfig(info)
|
|
91
|
+
return {
|
|
92
|
+
type: "local",
|
|
93
|
+
directory: config.directory,
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
This is a plugin to simulate a remote environment locally. Add this to `.opencode/opencode.jsonc`:
|
|
2
|
-
|
|
3
|
-
```json
|
|
4
|
-
"plugin": ["../packages/opencode/src/control-plane/dev/debug-workspace-plugin.ts"],
|
|
5
|
-
```
|
|
6
|
-
|
|
7
|
-
In a separate terminal, run a separate OpenCode server. This will act like a remote server and the local instance will proxy all requests to it:
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
./packages/opencode/script/run-workspace-server
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
With the plugin install, you can now run OpenCode and create a `debug` workspace type. This will create a "remote" workspace which talks to the second workspace server started above.
|
|
14
|
-
|
|
15
|
-
How this works:
|
|
16
|
-
|
|
17
|
-
- The workspace server needs to know the workspace id and port to run. It waits for this information to be written to a file and starts the server when the data is written.
|
|
18
|
-
- The debug plugin writes this information in the `create` call to the workspace. So create a `debug` workspace will always kick off a new external server.
|
|
19
|
-
- The server script watches for file changes, so whenver you create a new `debug` workspace it will restart with the new information. This means that there is only ever one working `debug` workspace at a time; when you create a new one all previous sessions will show that it can't connect because previous debug workspaces do not exist.
|
|
1
|
+
This is a plugin to simulate a remote environment locally. Add this to `.opencode/opencode.jsonc`:
|
|
2
|
+
|
|
3
|
+
```json
|
|
4
|
+
"plugin": ["../packages/opencode/src/control-plane/dev/debug-workspace-plugin.ts"],
|
|
5
|
+
```
|
|
6
|
+
|
|
7
|
+
In a separate terminal, run a separate OpenCode server. This will act like a remote server and the local instance will proxy all requests to it:
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
./packages/opencode/script/run-workspace-server
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
With the plugin install, you can now run OpenCode and create a `debug` workspace type. This will create a "remote" workspace which talks to the second workspace server started above.
|
|
14
|
+
|
|
15
|
+
How this works:
|
|
16
|
+
|
|
17
|
+
- The workspace server needs to know the workspace id and port to run. It waits for this information to be written to a file and starts the server when the data is written.
|
|
18
|
+
- The debug plugin writes this information in the `create` call to the workspace. So create a `debug` workspace will always kick off a new external server.
|
|
19
|
+
- The server script watches for file changes, so whenver you create a new `debug` workspace it will restart with the new information. This means that there is only ever one working `debug` workspace at a time; when you create a new one all previous sessions will show that it can't connect because previous debug workspaces do not exist.
|
|
@@ -1,73 +1,73 @@
|
|
|
1
|
-
import type { Plugin } from "@opencode-ai/plugin"
|
|
2
|
-
import { rename, writeFile } from "node:fs/promises"
|
|
3
|
-
import { randomInt } from "node:crypto"
|
|
4
|
-
import { setTimeout as sleep } from "node:timers/promises"
|
|
5
|
-
|
|
6
|
-
const DEV_DATA_FILE = "/tmp/opencode-workspace-dev-data.json"
|
|
7
|
-
const DEV_DATA_TEMP_FILE = `${DEV_DATA_FILE}.tmp`
|
|
8
|
-
|
|
9
|
-
async function waitForHealth(port: number) {
|
|
10
|
-
const url = `http://127.0.0.1:${port}/global/health`
|
|
11
|
-
const started = Date.now()
|
|
12
|
-
|
|
13
|
-
while (Date.now() - started < 30_000) {
|
|
14
|
-
try {
|
|
15
|
-
const response = await fetch(url)
|
|
16
|
-
if (response.ok) {
|
|
17
|
-
return
|
|
18
|
-
}
|
|
19
|
-
} catch {}
|
|
20
|
-
|
|
21
|
-
await sleep(250)
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
throw new Error(`Timed out waiting for debug server health check at ${url}`)
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
let PORT: number | undefined
|
|
28
|
-
|
|
29
|
-
async function writeDebugData(port: number, id: string, env: Record<string, string | undefined>) {
|
|
30
|
-
await writeFile(
|
|
31
|
-
DEV_DATA_TEMP_FILE,
|
|
32
|
-
JSON.stringify(
|
|
33
|
-
{
|
|
34
|
-
port,
|
|
35
|
-
id,
|
|
36
|
-
env,
|
|
37
|
-
},
|
|
38
|
-
null,
|
|
39
|
-
2,
|
|
40
|
-
),
|
|
41
|
-
)
|
|
42
|
-
|
|
43
|
-
await rename(DEV_DATA_TEMP_FILE, DEV_DATA_FILE)
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export const DebugWorkspacePlugin: Plugin = async ({ experimental_workspace }) => {
|
|
47
|
-
experimental_workspace.register("debug", {
|
|
48
|
-
name: "Debug",
|
|
49
|
-
description: "Create a debugging server",
|
|
50
|
-
configure(config) {
|
|
51
|
-
return config
|
|
52
|
-
},
|
|
53
|
-
async create(config, env) {
|
|
54
|
-
const port = randomInt(5000, 9001)
|
|
55
|
-
PORT = port
|
|
56
|
-
|
|
57
|
-
await writeDebugData(port, config.id, env)
|
|
58
|
-
|
|
59
|
-
await waitForHealth(port)
|
|
60
|
-
},
|
|
61
|
-
async remove(_config) {},
|
|
62
|
-
target(_config) {
|
|
63
|
-
return {
|
|
64
|
-
type: "remote",
|
|
65
|
-
url: `http://localhost:${PORT!}/`,
|
|
66
|
-
}
|
|
67
|
-
},
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
return {}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
export default DebugWorkspacePlugin
|
|
1
|
+
import type { Plugin } from "@opencode-ai/plugin"
|
|
2
|
+
import { rename, writeFile } from "node:fs/promises"
|
|
3
|
+
import { randomInt } from "node:crypto"
|
|
4
|
+
import { setTimeout as sleep } from "node:timers/promises"
|
|
5
|
+
|
|
6
|
+
const DEV_DATA_FILE = "/tmp/opencode-workspace-dev-data.json"
|
|
7
|
+
const DEV_DATA_TEMP_FILE = `${DEV_DATA_FILE}.tmp`
|
|
8
|
+
|
|
9
|
+
async function waitForHealth(port: number) {
|
|
10
|
+
const url = `http://127.0.0.1:${port}/global/health`
|
|
11
|
+
const started = Date.now()
|
|
12
|
+
|
|
13
|
+
while (Date.now() - started < 30_000) {
|
|
14
|
+
try {
|
|
15
|
+
const response = await fetch(url)
|
|
16
|
+
if (response.ok) {
|
|
17
|
+
return
|
|
18
|
+
}
|
|
19
|
+
} catch {}
|
|
20
|
+
|
|
21
|
+
await sleep(250)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
throw new Error(`Timed out waiting for debug server health check at ${url}`)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
let PORT: number | undefined
|
|
28
|
+
|
|
29
|
+
async function writeDebugData(port: number, id: string, env: Record<string, string | undefined>) {
|
|
30
|
+
await writeFile(
|
|
31
|
+
DEV_DATA_TEMP_FILE,
|
|
32
|
+
JSON.stringify(
|
|
33
|
+
{
|
|
34
|
+
port,
|
|
35
|
+
id,
|
|
36
|
+
env,
|
|
37
|
+
},
|
|
38
|
+
null,
|
|
39
|
+
2,
|
|
40
|
+
),
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
await rename(DEV_DATA_TEMP_FILE, DEV_DATA_FILE)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export const DebugWorkspacePlugin: Plugin = async ({ experimental_workspace }) => {
|
|
47
|
+
experimental_workspace.register("debug", {
|
|
48
|
+
name: "Debug",
|
|
49
|
+
description: "Create a debugging server",
|
|
50
|
+
configure(config) {
|
|
51
|
+
return config
|
|
52
|
+
},
|
|
53
|
+
async create(config, env) {
|
|
54
|
+
const port = randomInt(5000, 9001)
|
|
55
|
+
PORT = port
|
|
56
|
+
|
|
57
|
+
await writeDebugData(port, config.id, env)
|
|
58
|
+
|
|
59
|
+
await waitForHealth(port)
|
|
60
|
+
},
|
|
61
|
+
async remove(_config) {},
|
|
62
|
+
target(_config) {
|
|
63
|
+
return {
|
|
64
|
+
type: "remote",
|
|
65
|
+
url: `http://localhost:${PORT!}/`,
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
return {}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export default DebugWorkspacePlugin
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { Schema } from "effect"
|
|
2
|
-
|
|
3
|
-
import { Identifier } from "@/id/id"
|
|
4
|
-
import { withStatics } from "@opencode-ai/core/schema"
|
|
5
|
-
|
|
6
|
-
const workspaceIdSchema = Schema.String.check(Schema.isStartsWith("wrk")).pipe(Schema.brand("WorkspaceID"))
|
|
7
|
-
|
|
8
|
-
export type WorkspaceID = typeof workspaceIdSchema.Type
|
|
9
|
-
|
|
10
|
-
export const WorkspaceID = workspaceIdSchema.pipe(
|
|
11
|
-
withStatics((schema: typeof workspaceIdSchema) => ({
|
|
12
|
-
ascending: (id?: string) => schema.make(Identifier.ascending("workspace", id)),
|
|
13
|
-
})),
|
|
14
|
-
)
|
|
1
|
+
import { Schema } from "effect"
|
|
2
|
+
|
|
3
|
+
import { Identifier } from "@/id/id"
|
|
4
|
+
import { withStatics } from "@opencode-ai/core/schema"
|
|
5
|
+
|
|
6
|
+
const workspaceIdSchema = Schema.String.check(Schema.isStartsWith("wrk")).pipe(Schema.brand("WorkspaceID"))
|
|
7
|
+
|
|
8
|
+
export type WorkspaceID = typeof workspaceIdSchema.Type
|
|
9
|
+
|
|
10
|
+
export const WorkspaceID = workspaceIdSchema.pipe(
|
|
11
|
+
withStatics((schema: typeof workspaceIdSchema) => ({
|
|
12
|
+
ascending: (id?: string) => schema.make(Identifier.ascending("workspace", id)),
|
|
13
|
+
})),
|
|
14
|
+
)
|