bonecode 1.0.0 → 1.2.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/bin/bonecode +47 -42
- 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 +282 -34
- package/dist/bone/output/agent/src/algorithms.d.ts +1 -0
- package/dist/bone/output/agent/src/algorithms.js +3 -0
- package/dist/bone/output/agent/src/algorithms.js.map +1 -0
- package/dist/bone/output/agent/src/audit.d.ts +3 -0
- package/dist/bone/output/agent/src/audit.js +40 -0
- package/dist/bone/output/agent/src/audit.js.map +1 -0
- package/dist/bone/output/agent/src/auth.d.ts +8 -0
- package/dist/bone/output/agent/src/auth.js +56 -0
- package/dist/bone/output/agent/src/auth.js.map +1 -0
- package/dist/bone/output/agent/src/db.d.ts +6 -0
- package/dist/bone/output/agent/src/db.js +63 -0
- package/dist/bone/output/agent/src/db.js.map +1 -0
- package/dist/bone/output/agent/src/events.d.ts +25 -0
- package/dist/bone/output/agent/src/events.js +184 -0
- package/dist/bone/output/agent/src/events.js.map +1 -0
- package/dist/bone/output/agent/src/logger.d.ts +28 -0
- package/dist/bone/output/agent/src/logger.js +45 -0
- package/dist/bone/output/agent/src/logger.js.map +1 -0
- package/dist/bone/output/agent/src/metrics.d.ts +5 -0
- package/dist/bone/output/agent/src/metrics.js +60 -0
- package/dist/bone/output/agent/src/metrics.js.map +1 -0
- package/dist/bone/output/agent/src/routes/agent_instance.d.ts +1 -0
- package/dist/bone/output/agent/src/routes/agent_instance.js +253 -0
- package/dist/bone/output/agent/src/routes/agent_instance.js.map +1 -0
- package/dist/bone/output/agent/src/routes/build_step.d.ts +1 -0
- package/dist/bone/output/agent/src/routes/build_step.js +133 -0
- package/dist/bone/output/agent/src/routes/build_step.js.map +1 -0
- package/dist/bone/output/agent/src/routes/plan.d.ts +1 -0
- package/dist/bone/output/agent/src/routes/plan.js +119 -0
- package/dist/bone/output/agent/src/routes/plan.js.map +1 -0
- package/dist/bone/output/agent/src/routes/task.d.ts +1 -0
- package/dist/bone/output/agent/src/routes/task.js +133 -0
- package/dist/bone/output/agent/src/routes/task.js.map +1 -0
- package/dist/bone/output/agent/src/routes/tool_call.d.ts +1 -0
- package/dist/bone/output/agent/src/routes/tool_call.js +190 -0
- package/dist/bone/output/agent/src/routes/tool_call.js.map +1 -0
- package/dist/bone/output/agent/src/state_machines/agent_instance.d.ts +9 -0
- package/dist/bone/output/agent/src/state_machines/agent_instance.js +22 -0
- package/dist/bone/output/agent/src/state_machines/agent_instance.js.map +1 -0
- package/dist/bone/output/agent/src/state_machines/build_step.d.ts +9 -0
- package/dist/bone/output/agent/src/state_machines/build_step.js +20 -0
- package/dist/bone/output/agent/src/state_machines/build_step.js.map +1 -0
- package/dist/bone/output/agent/src/state_machines/plan.d.ts +9 -0
- package/dist/bone/output/agent/src/state_machines/plan.js +20 -0
- package/dist/bone/output/agent/src/state_machines/plan.js.map +1 -0
- package/dist/bone/output/agent/src/state_machines/task.d.ts +9 -0
- package/dist/bone/output/agent/src/state_machines/task.js +20 -0
- package/dist/bone/output/agent/src/state_machines/task.js.map +1 -0
- package/dist/bone/output/agent/src/state_machines/tool_call.d.ts +9 -0
- package/dist/bone/output/agent/src/state_machines/tool_call.js +20 -0
- package/dist/bone/output/agent/src/state_machines/tool_call.js.map +1 -0
- package/dist/bone/output/rag/src/algorithms.d.ts +1 -0
- package/dist/bone/output/rag/src/algorithms.js +3 -0
- package/dist/bone/output/rag/src/algorithms.js.map +1 -0
- package/dist/bone/output/rag/src/auth.d.ts +8 -0
- package/dist/bone/output/rag/src/auth.js +56 -0
- package/dist/bone/output/rag/src/auth.js.map +1 -0
- package/dist/bone/output/rag/src/db.d.ts +6 -0
- package/dist/bone/output/rag/src/db.js +63 -0
- package/dist/bone/output/rag/src/db.js.map +1 -0
- package/dist/bone/output/rag/src/events.d.ts +25 -0
- package/dist/bone/output/rag/src/events.js +184 -0
- package/dist/bone/output/rag/src/events.js.map +1 -0
- package/dist/bone/output/rag/src/extensions.d.ts +83 -0
- package/dist/bone/output/rag/src/extensions.js +329 -0
- package/dist/bone/output/rag/src/extensions.js.map +1 -0
- package/dist/bone/output/rag/src/flows.d.ts +24 -0
- package/dist/bone/output/rag/src/flows.js +236 -0
- package/dist/bone/output/rag/src/flows.js.map +1 -0
- package/dist/bone/output/rag/src/logger.d.ts +28 -0
- package/dist/bone/output/rag/src/logger.js +45 -0
- package/dist/bone/output/rag/src/logger.js.map +1 -0
- package/dist/bone/output/rag/src/metrics.d.ts +5 -0
- package/dist/bone/output/rag/src/metrics.js +60 -0
- package/dist/bone/output/rag/src/metrics.js.map +1 -0
- package/dist/bone/output/rag/src/routes/code_chunk.d.ts +1 -0
- package/dist/bone/output/rag/src/routes/code_chunk.js +100 -0
- package/dist/bone/output/rag/src/routes/code_chunk.js.map +1 -0
- package/dist/bone/output/rag/src/routes/code_file.d.ts +1 -0
- package/dist/bone/output/rag/src/routes/code_file.js +127 -0
- package/dist/bone/output/rag/src/routes/code_file.js.map +1 -0
- package/dist/bone/output/rag/src/routes/indexing_job.d.ts +1 -0
- package/dist/bone/output/rag/src/routes/indexing_job.js +113 -0
- package/dist/bone/output/rag/src/routes/indexing_job.js.map +1 -0
- package/dist/bone/output/rag/src/routes/knowledge_base.d.ts +1 -0
- package/dist/bone/output/rag/src/routes/knowledge_base.js +242 -0
- package/dist/bone/output/rag/src/routes/knowledge_base.js.map +1 -0
- package/dist/bone/output/rag/src/routes/memory_entry.d.ts +1 -0
- package/dist/bone/output/rag/src/routes/memory_entry.js +113 -0
- package/dist/bone/output/rag/src/routes/memory_entry.js.map +1 -0
- package/dist/bone/output/rag/src/state_machines/code_file.d.ts +9 -0
- package/dist/bone/output/rag/src/state_machines/code_file.js +21 -0
- package/dist/bone/output/rag/src/state_machines/code_file.js.map +1 -0
- package/dist/bone/output/rag/src/state_machines/indexing_job.d.ts +9 -0
- package/dist/bone/output/rag/src/state_machines/indexing_job.js +20 -0
- package/dist/bone/output/rag/src/state_machines/indexing_job.js.map +1 -0
- package/dist/bone/output/rag/src/state_machines/knowledge_base.d.ts +9 -0
- package/dist/bone/output/rag/src/state_machines/knowledge_base.js +21 -0
- package/dist/bone/output/rag/src/state_machines/knowledge_base.js.map +1 -0
- package/dist/bone/output/rag/src/state_machines/memory_entry.d.ts +9 -0
- package/dist/bone/output/rag/src/state_machines/memory_entry.js +18 -0
- package/dist/bone/output/rag/src/state_machines/memory_entry.js.map +1 -0
- package/dist/bone/output/session/src/algorithms.d.ts +1 -0
- package/dist/bone/output/session/src/algorithms.js +3 -0
- package/dist/bone/output/session/src/algorithms.js.map +1 -0
- package/dist/bone/output/session/src/audit.d.ts +3 -0
- package/dist/bone/output/session/src/audit.js +40 -0
- package/dist/bone/output/session/src/audit.js.map +1 -0
- package/dist/bone/output/session/src/auth.d.ts +8 -0
- package/dist/bone/output/session/src/auth.js +56 -0
- package/dist/bone/output/session/src/auth.js.map +1 -0
- package/dist/bone/output/session/src/db.d.ts +6 -0
- package/dist/bone/output/session/src/db.js +63 -0
- package/dist/bone/output/session/src/db.js.map +1 -0
- package/dist/bone/output/session/src/events.d.ts +26 -0
- package/dist/bone/output/session/src/events.js +212 -0
- package/dist/bone/output/session/src/events.js.map +1 -0
- package/dist/bone/output/session/src/extensions.d.ts +41 -0
- package/dist/bone/output/session/src/extensions.js +217 -0
- package/dist/bone/output/session/src/extensions.js.map +1 -0
- package/dist/bone/output/session/src/logger.d.ts +28 -0
- package/dist/bone/output/session/src/logger.js +44 -0
- package/dist/bone/output/session/src/logger.js.map +1 -0
- package/dist/bone/output/session/src/metrics.d.ts +5 -0
- package/dist/bone/output/session/src/metrics.js +60 -0
- package/dist/bone/output/session/src/metrics.js.map +1 -0
- package/dist/bone/output/session/src/routes/message.d.ts +1 -0
- package/dist/bone/output/session/src/routes/message.js +120 -0
- package/dist/bone/output/session/src/routes/message.js.map +1 -0
- package/dist/bone/output/session/src/routes/part.d.ts +1 -0
- package/dist/bone/output/session/src/routes/part.js +106 -0
- package/dist/bone/output/session/src/routes/part.js.map +1 -0
- package/dist/bone/output/session/src/routes/permission.d.ts +1 -0
- package/dist/bone/output/session/src/routes/permission.js +106 -0
- package/dist/bone/output/session/src/routes/permission.js.map +1 -0
- package/dist/bone/output/session/src/routes/project.d.ts +1 -0
- package/dist/bone/output/session/src/routes/project.js +106 -0
- package/dist/bone/output/session/src/routes/project.js.map +1 -0
- package/dist/bone/output/session/src/routes/session.d.ts +1 -0
- package/dist/bone/output/session/src/routes/session.js +308 -0
- package/dist/bone/output/session/src/routes/session.js.map +1 -0
- package/dist/bone/output/session/src/state_machines/session.d.ts +9 -0
- package/dist/bone/output/session/src/state_machines/session.js +21 -0
- package/dist/bone/output/session/src/state_machines/session.js.map +1 -0
- package/dist/bone/output/session/src/websocket.d.ts +15 -0
- package/dist/bone/output/session/src/websocket.js +215 -0
- package/dist/bone/output/session/src/websocket.js.map +1 -0
- package/dist/bone/output/workspace/src/algorithms.d.ts +1 -0
- package/dist/bone/output/workspace/src/algorithms.js +3 -0
- package/dist/bone/output/workspace/src/algorithms.js.map +1 -0
- package/dist/bone/output/workspace/src/auth.d.ts +8 -0
- package/dist/bone/output/workspace/src/auth.js +56 -0
- package/dist/bone/output/workspace/src/auth.js.map +1 -0
- package/dist/bone/output/workspace/src/db.d.ts +6 -0
- package/dist/bone/output/workspace/src/db.js +63 -0
- package/dist/bone/output/workspace/src/db.js.map +1 -0
- package/dist/bone/output/workspace/src/events.d.ts +25 -0
- package/dist/bone/output/workspace/src/events.js +184 -0
- package/dist/bone/output/workspace/src/events.js.map +1 -0
- package/dist/bone/output/workspace/src/logger.d.ts +28 -0
- package/dist/bone/output/workspace/src/logger.js +45 -0
- package/dist/bone/output/workspace/src/logger.js.map +1 -0
- package/dist/bone/output/workspace/src/metrics.d.ts +5 -0
- package/dist/bone/output/workspace/src/metrics.js +60 -0
- package/dist/bone/output/workspace/src/metrics.js.map +1 -0
- package/dist/bone/output/workspace/src/routes/codebase.d.ts +1 -0
- package/dist/bone/output/workspace/src/routes/codebase.js +113 -0
- package/dist/bone/output/workspace/src/routes/codebase.js.map +1 -0
- package/dist/bone/output/workspace/src/routes/snapshot.d.ts +1 -0
- package/dist/bone/output/workspace/src/routes/snapshot.js +151 -0
- package/dist/bone/output/workspace/src/routes/snapshot.js.map +1 -0
- package/dist/bone/output/workspace/src/routes/workspace.d.ts +1 -0
- package/dist/bone/output/workspace/src/routes/workspace.js +209 -0
- package/dist/bone/output/workspace/src/routes/workspace.js.map +1 -0
- package/dist/bone/output/workspace/src/state_machines/codebase.d.ts +9 -0
- package/dist/bone/output/workspace/src/state_machines/codebase.js +19 -0
- package/dist/bone/output/workspace/src/state_machines/codebase.js.map +1 -0
- package/dist/bone/output/workspace/src/state_machines/snapshot.d.ts +9 -0
- package/dist/bone/output/workspace/src/state_machines/snapshot.js +18 -0
- package/dist/bone/output/workspace/src/state_machines/snapshot.js.map +1 -0
- package/dist/bone/output/workspace/src/state_machines/workspace.d.ts +9 -0
- package/dist/bone/output/workspace/src/state_machines/workspace.js +19 -0
- package/dist/bone/output/workspace/src/state_machines/workspace.js.map +1 -0
- package/dist/compat/opencode_adapter.d.ts +25 -0
- package/dist/compat/opencode_adapter.js +599 -0
- package/dist/compat/opencode_adapter.js.map +1 -0
- package/dist/extensions/chunker.d.ts +24 -0
- package/dist/extensions/chunker.js +360 -0
- package/dist/extensions/chunker.js.map +1 -0
- package/dist/extensions/embedding_provider.d.ts +18 -0
- package/dist/extensions/embedding_provider.js +150 -0
- package/dist/extensions/embedding_provider.js.map +1 -0
- package/dist/extensions/llm_provider.d.ts +33 -0
- package/dist/extensions/llm_provider.js +338 -0
- package/dist/extensions/llm_provider.js.map +1 -0
- package/dist/extensions/mcp_bridge.d.ts +44 -0
- package/dist/extensions/mcp_bridge.js +151 -0
- package/dist/extensions/mcp_bridge.js.map +1 -0
- package/dist/extensions/rag_search.d.ts +38 -0
- package/dist/extensions/rag_search.js +242 -0
- package/dist/extensions/rag_search.js.map +1 -0
- package/dist/extensions/snapshot.d.ts +14 -0
- package/dist/extensions/snapshot.js +158 -0
- package/dist/extensions/snapshot.js.map +1 -0
- package/dist/extensions/tool_executor.d.ts +28 -0
- package/dist/extensions/tool_executor.js +268 -0
- package/dist/extensions/tool_executor.js.map +1 -0
- package/dist/src/cli.d.ts +15 -0
- package/dist/src/cli.js +687 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/config.d.ts +44 -0
- package/dist/src/config.js +165 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/context_builder.d.ts +51 -0
- package/dist/src/context_builder.js +558 -0
- package/dist/src/context_builder.js.map +1 -0
- package/dist/src/db_adapter.d.ts +24 -0
- package/dist/src/db_adapter.js +341 -0
- package/dist/src/db_adapter.js.map +1 -0
- package/dist/src/engine/session/compaction_logic.d.ts +11 -0
- package/dist/src/engine/session/compaction_logic.js +113 -0
- package/dist/src/engine/session/compaction_logic.js.map +1 -0
- package/dist/src/engine/session/instruction_loader.d.ts +5 -0
- package/dist/src/engine/session/instruction_loader.js +78 -0
- package/dist/src/engine/session/instruction_loader.js.map +1 -0
- package/dist/src/engine/session/overflow_check.d.ts +14 -0
- package/dist/src/engine/session/overflow_check.js +45 -0
- package/dist/src/engine/session/overflow_check.js.map +1 -0
- package/dist/src/engine/session/prompt.d.ts +45 -0
- package/dist/src/engine/session/prompt.js +584 -0
- package/dist/src/engine/session/prompt.js.map +1 -0
- package/dist/src/engine/session/provider_transform.d.ts +59 -0
- package/dist/src/engine/session/provider_transform.js +193 -0
- package/dist/src/engine/session/provider_transform.js.map +1 -0
- package/dist/src/engine/session/retry_logic.d.ts +12 -0
- package/dist/src/engine/session/retry_logic.js +72 -0
- package/dist/src/engine/session/retry_logic.js.map +1 -0
- package/dist/src/engine/session/system_prompt.d.ts +9 -0
- package/dist/src/engine/session/system_prompt.js +96 -0
- package/dist/src/engine/session/system_prompt.js.map +1 -0
- package/dist/src/engine/session/tool_registry.d.ts +5 -0
- package/dist/src/engine/session/tool_registry.js +117 -0
- package/dist/src/engine/session/tool_registry.js.map +1 -0
- package/dist/src/export.d.ts +13 -0
- package/dist/src/export.js +103 -0
- package/dist/src/export.js.map +1 -0
- package/dist/src/mdns.d.ts +7 -0
- package/dist/src/mdns.js +60 -0
- package/dist/src/mdns.js.map +1 -0
- package/dist/src/rag_worker.d.ts +38 -0
- package/dist/src/rag_worker.js +435 -0
- package/dist/src/rag_worker.js.map +1 -0
- package/dist/src/server.d.ts +11 -0
- package/dist/src/server.js +214 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/stats.d.ts +45 -0
- package/dist/src/stats.js +233 -0
- package/dist/src/stats.js.map +1 -0
- package/dist/src/tui.d.ts +29 -0
- package/dist/src/tui.js +1053 -0
- package/dist/src/tui.js.map +1 -0
- package/package.json +21 -5
- package/src/cli.ts +314 -113
- 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/export.ts +122 -0
- package/src/mdns.ts +53 -0
- package/src/server.ts +151 -156
- package/src/stats.ts +290 -0
- package/src/tui.ts +964 -480
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BoneCode Agent Loop — improved fork of OpenCode's session/prompt.ts
|
|
3
|
+
*
|
|
4
|
+
* What's the same as OpenCode:
|
|
5
|
+
* - Multi-turn loop until finish_reason === "stop"
|
|
6
|
+
* - Context compaction (prune → summarize → replay)
|
|
7
|
+
* - Retry with exponential backoff + retry-after headers
|
|
8
|
+
* - Doom-loop detection (3 identical consecutive tool calls)
|
|
9
|
+
* - Permission system (suspend/resume via Deferred)
|
|
10
|
+
* - Provider message transforms (Anthropic, Mistral, DeepSeek, etc.)
|
|
11
|
+
* - Per-provider system prompts
|
|
12
|
+
* - Skills injection
|
|
13
|
+
* - Instruction file discovery (AGENTS.md, CLAUDE.md)
|
|
14
|
+
* - Tool registry (all OpenCode tools)
|
|
15
|
+
* - Sub-agent task delegation
|
|
16
|
+
*
|
|
17
|
+
* What's improved with BoneScript:
|
|
18
|
+
* - All session/message/part persistence goes through generated capability
|
|
19
|
+
* endpoints (state machine enforced, events emitted automatically)
|
|
20
|
+
* - RAG context injected from pgvector knowledge base before each LLM call
|
|
21
|
+
* - Part deltas broadcast to WebSocket part_stream channel in real time
|
|
22
|
+
* - Agent state tracked in agent_instances table (cost, tokens, state machine)
|
|
23
|
+
* - Tool calls recorded in tool_calls table with permission decisions
|
|
24
|
+
* - Durable event bus for long-running tasks
|
|
25
|
+
*/
|
|
26
|
+
export interface PromptInput {
|
|
27
|
+
session_id: string;
|
|
28
|
+
message_id: string;
|
|
29
|
+
content: string;
|
|
30
|
+
model_id: string;
|
|
31
|
+
provider_id: string;
|
|
32
|
+
agent_name?: string;
|
|
33
|
+
/** Optional: force a specific variant (e.g. "high" for extended thinking) */
|
|
34
|
+
variant?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface LoopResult {
|
|
37
|
+
ok: boolean;
|
|
38
|
+
finish_reason: string;
|
|
39
|
+
total_tokens_in: number;
|
|
40
|
+
total_tokens_out: number;
|
|
41
|
+
total_cost: number;
|
|
42
|
+
compacted: boolean;
|
|
43
|
+
error?: string;
|
|
44
|
+
}
|
|
45
|
+
export declare function runAgentLoop(input: PromptInput): Promise<LoopResult>;
|
|
@@ -0,0 +1,584 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* BoneCode Agent Loop — improved fork of OpenCode's session/prompt.ts
|
|
4
|
+
*
|
|
5
|
+
* What's the same as OpenCode:
|
|
6
|
+
* - Multi-turn loop until finish_reason === "stop"
|
|
7
|
+
* - Context compaction (prune → summarize → replay)
|
|
8
|
+
* - Retry with exponential backoff + retry-after headers
|
|
9
|
+
* - Doom-loop detection (3 identical consecutive tool calls)
|
|
10
|
+
* - Permission system (suspend/resume via Deferred)
|
|
11
|
+
* - Provider message transforms (Anthropic, Mistral, DeepSeek, etc.)
|
|
12
|
+
* - Per-provider system prompts
|
|
13
|
+
* - Skills injection
|
|
14
|
+
* - Instruction file discovery (AGENTS.md, CLAUDE.md)
|
|
15
|
+
* - Tool registry (all OpenCode tools)
|
|
16
|
+
* - Sub-agent task delegation
|
|
17
|
+
*
|
|
18
|
+
* What's improved with BoneScript:
|
|
19
|
+
* - All session/message/part persistence goes through generated capability
|
|
20
|
+
* endpoints (state machine enforced, events emitted automatically)
|
|
21
|
+
* - RAG context injected from pgvector knowledge base before each LLM call
|
|
22
|
+
* - Part deltas broadcast to WebSocket part_stream channel in real time
|
|
23
|
+
* - Agent state tracked in agent_instances table (cost, tokens, state machine)
|
|
24
|
+
* - Tool calls recorded in tool_calls table with permission decisions
|
|
25
|
+
* - Durable event bus for long-running tasks
|
|
26
|
+
*/
|
|
27
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
28
|
+
if (k2 === undefined) k2 = k;
|
|
29
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
30
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
31
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
32
|
+
}
|
|
33
|
+
Object.defineProperty(o, k2, desc);
|
|
34
|
+
}) : (function(o, m, k, k2) {
|
|
35
|
+
if (k2 === undefined) k2 = k;
|
|
36
|
+
o[k2] = m[k];
|
|
37
|
+
}));
|
|
38
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
39
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
40
|
+
}) : function(o, v) {
|
|
41
|
+
o["default"] = v;
|
|
42
|
+
});
|
|
43
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
44
|
+
if (mod && mod.__esModule) return mod;
|
|
45
|
+
var result = {};
|
|
46
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
47
|
+
__setModuleDefault(result, mod);
|
|
48
|
+
return result;
|
|
49
|
+
};
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
exports.runAgentLoop = void 0;
|
|
52
|
+
const ai_1 = require("ai");
|
|
53
|
+
const anthropic_1 = require("@ai-sdk/anthropic");
|
|
54
|
+
const openai_1 = require("@ai-sdk/openai");
|
|
55
|
+
const google_1 = require("@ai-sdk/google");
|
|
56
|
+
const uuid_1 = require("uuid");
|
|
57
|
+
const db_1 = require("../../../bone/output/session/src/db");
|
|
58
|
+
const events_1 = require("../../../bone/output/session/src/events");
|
|
59
|
+
const logger_1 = require("../../../bone/output/session/src/logger");
|
|
60
|
+
const metrics_1 = require("../../../bone/output/session/src/metrics");
|
|
61
|
+
const websocket_1 = require("../../../bone/output/session/src/websocket");
|
|
62
|
+
const ProviderTransform = __importStar(require("./provider_transform"));
|
|
63
|
+
const retry_logic_1 = require("./retry_logic");
|
|
64
|
+
const overflow_check_1 = require("./overflow_check");
|
|
65
|
+
const compaction_logic_1 = require("./compaction_logic");
|
|
66
|
+
const system_prompt_1 = require("./system_prompt");
|
|
67
|
+
const instruction_loader_1 = require("./instruction_loader");
|
|
68
|
+
const tool_registry_1 = require("./tool_registry");
|
|
69
|
+
const DOOM_LOOP_THRESHOLD = 3;
|
|
70
|
+
const MAX_TURNS = 20; // safety cap — most tasks complete in 1-3 turns
|
|
71
|
+
// ─── Main Agent Loop ──────────────────────────────────────────────────────────
|
|
72
|
+
async function runAgentLoop(input) {
|
|
73
|
+
const { session_id, message_id, model_id, provider_id, agent_name = "build" } = input;
|
|
74
|
+
// Load session + project context
|
|
75
|
+
const sessionRow = await db_1.pool.query(`SELECT s.*, p.worktree, p.vcs FROM sessions s JOIN projects p ON p.id = s.project_id WHERE s.id = $1`, [session_id]);
|
|
76
|
+
if (!sessionRow.rows[0])
|
|
77
|
+
throw new Error(`Session not found: ${session_id}`);
|
|
78
|
+
const session = sessionRow.rows[0];
|
|
79
|
+
// Create or reuse agent instance
|
|
80
|
+
const agentId = (0, uuid_1.v4)();
|
|
81
|
+
await db_1.pool.query(`INSERT INTO agent_instances (id, session_id, model_id, provider_id, context_window_used, context_window_max, total_cost_usd, total_tokens_in, total_tokens_out, config, state)
|
|
82
|
+
VALUES ($1, $2, $3, $4, 0, 200000, 0, 0, 0, $5, 'running')`, [agentId, session_id, model_id, provider_id, JSON.stringify({ agent_name })]);
|
|
83
|
+
// Transition session to busy
|
|
84
|
+
await db_1.pool.query(`UPDATE sessions SET state = 'busy', updated_at = NOW() WHERE id = $1`, [session_id]);
|
|
85
|
+
await events_1.eventBus.publish("SessionStateChanged", { session_id, from_state: session.state, to_state: "busy", changed_at: new Date().toISOString() }, "AgentLoop");
|
|
86
|
+
const stats = { tokens_in: 0, tokens_out: 0, cost: 0, compacted: false };
|
|
87
|
+
let turn = 0;
|
|
88
|
+
let lastFinishReason = "unknown";
|
|
89
|
+
try {
|
|
90
|
+
// ── Main multi-turn loop ──────────────────────────────────────────────────
|
|
91
|
+
while (turn < MAX_TURNS) {
|
|
92
|
+
turn++;
|
|
93
|
+
if (turn === MAX_TURNS) {
|
|
94
|
+
logger_1.logger.error("agent_loop_max_turns", { event: "max_turns", metadata: { session_id, max: MAX_TURNS } });
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
// Load full message history
|
|
98
|
+
const messages = await loadMessageHistory(session_id);
|
|
99
|
+
// Check if we need compaction before calling the LLM
|
|
100
|
+
const lastAssistant = messages.filter(m => m.role === "assistant").slice(-1)[0];
|
|
101
|
+
// Estimate tokens from text length when model doesn't return counts (local models)
|
|
102
|
+
const estimatedTokens = lastAssistant?.tokens_input
|
|
103
|
+
? { input: lastAssistant.tokens_input, output: lastAssistant.tokens_output || 0, total: 0, cache: { read: 0, write: 0 } }
|
|
104
|
+
: (() => {
|
|
105
|
+
// Rough estimate: 1 token ≈ 4 chars
|
|
106
|
+
const totalChars = messages.reduce((sum, m) => {
|
|
107
|
+
const parts = m.parts || [];
|
|
108
|
+
return sum + parts.reduce((s, p) => s + (p.data?.text?.length || 0), 0);
|
|
109
|
+
}, 0);
|
|
110
|
+
return { input: Math.floor(totalChars / 4), output: 0, total: Math.floor(totalChars / 4), cache: { read: 0, write: 0 } };
|
|
111
|
+
})();
|
|
112
|
+
if ((0, overflow_check_1.isOverflow)(estimatedTokens, model_id)) {
|
|
113
|
+
logger_1.logger.info("context_overflow_detected", { event: "compaction", metadata: { session_id, turn } });
|
|
114
|
+
const compacted = await runCompaction(session_id, agentId, model_id, provider_id, messages);
|
|
115
|
+
if (!compacted)
|
|
116
|
+
break; // unrecoverable overflow
|
|
117
|
+
stats.compacted = true;
|
|
118
|
+
continue; // restart loop with compacted history
|
|
119
|
+
}
|
|
120
|
+
// Build AI SDK messages
|
|
121
|
+
const aiMessages = await buildAIMessages(session_id, messages, model_id);
|
|
122
|
+
// Inject RAG context into system prompt
|
|
123
|
+
const lastUserText = getLastUserText(messages);
|
|
124
|
+
const systemPrompt = await buildSystemPromptWithRAG(session_id, session.worktree, model_id, provider_id, agent_name, lastUserText);
|
|
125
|
+
// Load tools — pass empty for models that don't support function calling
|
|
126
|
+
const allTools = await (0, tool_registry_1.buildToolRegistry)(session_id, agentId, session.worktree);
|
|
127
|
+
// Check if model supports tools (some local models don't)
|
|
128
|
+
const tools = supportsTools(model_id) ? allTools : {};
|
|
129
|
+
// Get language model
|
|
130
|
+
const languageModel = getLanguageModel(provider_id, model_id);
|
|
131
|
+
// Stream the LLM response
|
|
132
|
+
const assistantMsgId = (0, uuid_1.v4)();
|
|
133
|
+
await db_1.pool.query(`INSERT INTO messages (id, session_id, role, model_id, provider_id) VALUES ($1, $2, 'assistant', $3, $4)`, [assistantMsgId, session_id, model_id, provider_id]);
|
|
134
|
+
await events_1.eventBus.publish("MessageAdded", { session_id, message_id: assistantMsgId, role: "assistant", added_at: new Date().toISOString() }, "AgentLoop");
|
|
135
|
+
const result = await streamWithRetry({
|
|
136
|
+
session_id, agentId, assistantMsgId,
|
|
137
|
+
languageModel, aiMessages, systemPrompt, tools,
|
|
138
|
+
model_id, provider_id, stats,
|
|
139
|
+
});
|
|
140
|
+
lastFinishReason = result.finish_reason;
|
|
141
|
+
// Update agent token counters
|
|
142
|
+
await db_1.pool.query(`UPDATE agent_instances SET total_tokens_in = total_tokens_in + $2, total_tokens_out = total_tokens_out + $3, total_cost_usd = total_cost_usd + $4, updated_at = NOW() WHERE id = $1`, [agentId, result.tokens_in, result.tokens_out, result.cost]);
|
|
143
|
+
// Check termination conditions:
|
|
144
|
+
// 1. "stop" with no tool calls = model finished naturally
|
|
145
|
+
// 2. "length" = hit token limit — don't loop, the response is complete
|
|
146
|
+
// 3. "content-filter" = blocked — stop
|
|
147
|
+
// 4. "tool-calls" with no actual tool calls = model confused — stop
|
|
148
|
+
const terminalReasons = new Set(["stop", "length", "content-filter", "end-turn"]);
|
|
149
|
+
if (terminalReasons.has(result.finish_reason) && !result.has_tool_calls) {
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
// If there were tool calls, they were executed during streaming — loop continues
|
|
153
|
+
// If finish reason is unexpected and no tool calls, stop to avoid infinite loop
|
|
154
|
+
if (!result.has_tool_calls) {
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Transition agent to done
|
|
159
|
+
await db_1.pool.query(`UPDATE agent_instances SET state = 'done', updated_at = NOW() WHERE id = $1`, [agentId]);
|
|
160
|
+
await db_1.pool.query(`UPDATE sessions SET state = 'active', updated_at = NOW() WHERE id = $1`, [session_id]);
|
|
161
|
+
await events_1.eventBus.publish("AgentCompleted", {
|
|
162
|
+
agent_id: agentId, session_id,
|
|
163
|
+
total_cost_usd: stats.cost, total_tokens_in: stats.tokens_in, total_tokens_out: stats.tokens_out,
|
|
164
|
+
completed_at: new Date().toISOString(),
|
|
165
|
+
}, "AgentLoop");
|
|
166
|
+
(0, metrics_1.counter)("agent.loop.completed", { provider: provider_id, model: model_id, turns: String(turn) });
|
|
167
|
+
return { ok: true, finish_reason: lastFinishReason, total_tokens_in: stats.tokens_in, total_tokens_out: stats.tokens_out, total_cost: stats.cost, compacted: stats.compacted };
|
|
168
|
+
}
|
|
169
|
+
catch (e) {
|
|
170
|
+
await db_1.pool.query(`UPDATE agent_instances SET state = 'failed', updated_at = NOW() WHERE id = $1`, [agentId]);
|
|
171
|
+
await db_1.pool.query(`UPDATE sessions SET state = 'active', updated_at = NOW() WHERE id = $1`, [session_id]);
|
|
172
|
+
await events_1.eventBus.publish("AgentFailed", { agent_id: agentId, session_id, error: e.message, failed_at: new Date().toISOString() }, "AgentLoop");
|
|
173
|
+
logger_1.logger.error("agent_loop_failed", { event: "loop_error", metadata: { session_id, error: e.message } });
|
|
174
|
+
return { ok: false, finish_reason: "error", total_tokens_in: stats.tokens_in, total_tokens_out: stats.tokens_out, total_cost: stats.cost, compacted: stats.compacted, error: e.message };
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
exports.runAgentLoop = runAgentLoop;
|
|
178
|
+
// ─── Stream with Retry ────────────────────────────────────────────────────────
|
|
179
|
+
async function streamWithRetry(ctx) {
|
|
180
|
+
let attempt = 0;
|
|
181
|
+
const MAX_RETRIES = 5;
|
|
182
|
+
let currentCtx = { ...ctx };
|
|
183
|
+
while (true) {
|
|
184
|
+
try {
|
|
185
|
+
return await streamOnce(currentCtx);
|
|
186
|
+
}
|
|
187
|
+
catch (e) {
|
|
188
|
+
// On Bad Request with tools, retry without tools
|
|
189
|
+
if (e.message?.includes("Bad Request") && Object.keys(currentCtx.tools).length > 0 && attempt === 0) {
|
|
190
|
+
// Local model doesn't support function calling — silently retry without tools
|
|
191
|
+
currentCtx = { ...currentCtx, tools: {} };
|
|
192
|
+
attempt++;
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
const retryInfo = (0, retry_logic_1.retryable)(e, ctx.provider_id);
|
|
196
|
+
if (!retryInfo || attempt >= MAX_RETRIES)
|
|
197
|
+
throw e;
|
|
198
|
+
const waitMs = (0, retry_logic_1.delay)(attempt, e);
|
|
199
|
+
logger_1.logger.info("llm_retry", { event: "retry", metadata: { attempt, wait_ms: waitMs, reason: retryInfo.message } });
|
|
200
|
+
(0, websocket_1.broadcastToChannel)("session_events", {
|
|
201
|
+
type: "session.retry", session_id: ctx.session_id, attempt, message: retryInfo.message, next: Date.now() + waitMs,
|
|
202
|
+
});
|
|
203
|
+
await new Promise(r => setTimeout(r, waitMs));
|
|
204
|
+
attempt++;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// ─── Single Stream Pass ───────────────────────────────────────────────────────
|
|
209
|
+
async function streamOnce(ctx) {
|
|
210
|
+
const { session_id, assistantMsgId, languageModel, aiMessages, systemPrompt, tools, model_id, provider_id } = ctx;
|
|
211
|
+
const transformedMessages = ProviderTransform.message(aiMessages, { id: model_id, providerID: provider_id, api: { npm: providerToNpm(provider_id), id: model_id } }, {});
|
|
212
|
+
let currentTextPartId = null;
|
|
213
|
+
let currentTextContent = "";
|
|
214
|
+
let hasToolCalls = false;
|
|
215
|
+
let finishReason = "unknown";
|
|
216
|
+
const toolCallsThisTurn = [];
|
|
217
|
+
const result = (0, ai_1.streamText)({
|
|
218
|
+
model: languageModel,
|
|
219
|
+
system: systemPrompt,
|
|
220
|
+
messages: aiMessages,
|
|
221
|
+
tools,
|
|
222
|
+
maxRetries: 0,
|
|
223
|
+
temperature: ProviderTransform.temperature({ id: model_id, providerID: provider_id }) ?? 0.7,
|
|
224
|
+
topP: ProviderTransform.topP({ id: model_id, providerID: provider_id }),
|
|
225
|
+
topK: ProviderTransform.topK({ id: model_id, providerID: provider_id }),
|
|
226
|
+
// Use a high maxTokens so the model can complete long responses.
|
|
227
|
+
// The local model's context window is the real limit.
|
|
228
|
+
maxTokens: parseInt(process.env.MAX_TOKENS || "8192"),
|
|
229
|
+
experimental_repairToolCall: async (failed) => {
|
|
230
|
+
const lower = failed.toolCall.toolName.toLowerCase();
|
|
231
|
+
if (lower !== failed.toolCall.toolName && tools[lower]) {
|
|
232
|
+
return { ...failed.toolCall, toolName: lower };
|
|
233
|
+
}
|
|
234
|
+
return { ...failed.toolCall, args: JSON.stringify({ tool: failed.toolCall.toolName, error: failed.error?.message }), toolName: "invalid" };
|
|
235
|
+
},
|
|
236
|
+
});
|
|
237
|
+
// Process the stream
|
|
238
|
+
for await (const event of result.fullStream) {
|
|
239
|
+
switch (event.type) {
|
|
240
|
+
case "text-delta": {
|
|
241
|
+
const text = event.textDelta || event.text || "";
|
|
242
|
+
if (!text)
|
|
243
|
+
break;
|
|
244
|
+
if (!currentTextPartId) {
|
|
245
|
+
// Start a new text part on first delta
|
|
246
|
+
currentTextPartId = (0, uuid_1.v4)();
|
|
247
|
+
currentTextContent = "";
|
|
248
|
+
await db_1.pool.query(`INSERT INTO parts (id, message_id, session_id, part_type, data, order_index) VALUES ($1, $2, $3, 'text', $4, 0)`, [currentTextPartId, assistantMsgId, session_id, JSON.stringify({ text: "" })]);
|
|
249
|
+
}
|
|
250
|
+
currentTextContent += text;
|
|
251
|
+
// Broadcast delta to WebSocket part_stream for live streaming
|
|
252
|
+
(0, websocket_1.broadcastToChannel)("part_stream", {
|
|
253
|
+
type: "part.delta",
|
|
254
|
+
session_id,
|
|
255
|
+
message_id: assistantMsgId,
|
|
256
|
+
part_id: currentTextPartId,
|
|
257
|
+
delta: { type: "text", text },
|
|
258
|
+
});
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
261
|
+
case "tool-call": {
|
|
262
|
+
// Flush any pending text part first
|
|
263
|
+
if (currentTextPartId) {
|
|
264
|
+
await db_1.pool.query(`UPDATE parts SET data = $2, updated_at = NOW() WHERE id = $1`, [currentTextPartId, JSON.stringify({ text: currentTextContent })]);
|
|
265
|
+
await events_1.eventBus.publish("PartUpdated", {
|
|
266
|
+
session_id, message_id: assistantMsgId, part_id: currentTextPartId,
|
|
267
|
+
part_type: "text", updated_at: new Date().toISOString(),
|
|
268
|
+
}, "AgentLoop");
|
|
269
|
+
currentTextPartId = null;
|
|
270
|
+
currentTextContent = "";
|
|
271
|
+
}
|
|
272
|
+
hasToolCalls = true;
|
|
273
|
+
const toolArgs = event.args || event.input || {};
|
|
274
|
+
toolCallsThisTurn.push({ id: event.toolCallId, name: event.toolName, input: toolArgs });
|
|
275
|
+
// Record tool call in DB
|
|
276
|
+
const toolCallDbId = (0, uuid_1.v4)();
|
|
277
|
+
await db_1.pool.query(`INSERT INTO tool_calls (id, session_id, agent_id, tool_name, tool_input, state) VALUES ($1, $2, $3, $4, $5, 'running')`, [toolCallDbId, session_id, ctx.agentId, event.toolName, JSON.stringify(toolArgs)]);
|
|
278
|
+
// Record as part
|
|
279
|
+
const toolPartId = (0, uuid_1.v4)();
|
|
280
|
+
await db_1.pool.query(`INSERT INTO parts (id, message_id, session_id, part_type, data, order_index) VALUES ($1, $2, $3, 'tool_invocation', $4, 0)`, [toolPartId, assistantMsgId, session_id, JSON.stringify({ tool_call_id: event.toolCallId, tool_name: event.toolName, args: toolArgs, state: "running" })]);
|
|
281
|
+
await events_1.eventBus.publish("ToolCallRequested", {
|
|
282
|
+
tool_call_id: toolCallDbId, session_id, agent_id: ctx.agentId,
|
|
283
|
+
tool_name: event.toolName, tool_input: toolArgs, requested_at: new Date().toISOString(),
|
|
284
|
+
}, "AgentLoop");
|
|
285
|
+
// Doom-loop detection: 3 identical consecutive tool calls
|
|
286
|
+
const recentSame = toolCallsThisTurn.filter(tc => tc.name === event.toolName && JSON.stringify(tc.input) === JSON.stringify(toolArgs));
|
|
287
|
+
if (recentSame.length >= DOOM_LOOP_THRESHOLD) {
|
|
288
|
+
logger_1.logger.error("doom_loop_detected", { event: "doom_loop", metadata: { tool: event.toolName, session_id } });
|
|
289
|
+
throw new Error(`Doom loop detected: tool '${event.toolName}' called ${DOOM_LOOP_THRESHOLD} times with identical input`);
|
|
290
|
+
}
|
|
291
|
+
break;
|
|
292
|
+
}
|
|
293
|
+
case "step-finish": {
|
|
294
|
+
// Flush pending text part
|
|
295
|
+
if (currentTextPartId) {
|
|
296
|
+
await db_1.pool.query(`UPDATE parts SET data = $2, updated_at = NOW() WHERE id = $1`, [currentTextPartId, JSON.stringify({ text: currentTextContent })]);
|
|
297
|
+
await events_1.eventBus.publish("PartUpdated", {
|
|
298
|
+
session_id, message_id: assistantMsgId, part_id: currentTextPartId,
|
|
299
|
+
part_type: "text", updated_at: new Date().toISOString(),
|
|
300
|
+
}, "AgentLoop");
|
|
301
|
+
currentTextPartId = null;
|
|
302
|
+
currentTextContent = "";
|
|
303
|
+
}
|
|
304
|
+
const usage = event.usage;
|
|
305
|
+
const tokensIn = usage?.promptTokens || 0;
|
|
306
|
+
const tokensOut = usage?.completionTokens || 0;
|
|
307
|
+
ctx.stats.tokens_in += tokensIn;
|
|
308
|
+
ctx.stats.tokens_out += tokensOut;
|
|
309
|
+
await db_1.pool.query(`UPDATE messages SET tokens_input = $2, tokens_output = $3, updated_at = NOW() WHERE id = $1`, [assistantMsgId, tokensIn, tokensOut]);
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
case "finish": {
|
|
313
|
+
finishReason = event.finishReason || "stop";
|
|
314
|
+
break;
|
|
315
|
+
}
|
|
316
|
+
case "error": {
|
|
317
|
+
throw event.error;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
// Final flush — ensure any pending text part is saved
|
|
322
|
+
if (currentTextPartId && currentTextContent) {
|
|
323
|
+
await db_1.pool.query(`UPDATE parts SET data = $2, updated_at = NOW() WHERE id = $1`, [currentTextPartId, JSON.stringify({ text: currentTextContent })]);
|
|
324
|
+
await events_1.eventBus.publish("PartUpdated", {
|
|
325
|
+
session_id, message_id: assistantMsgId, part_id: currentTextPartId,
|
|
326
|
+
part_type: "text", updated_at: new Date().toISOString(),
|
|
327
|
+
}, "AgentLoop");
|
|
328
|
+
currentTextPartId = null;
|
|
329
|
+
currentTextContent = "";
|
|
330
|
+
}
|
|
331
|
+
// Collect final usage
|
|
332
|
+
let tokensIn = 0, tokensOut = 0;
|
|
333
|
+
try {
|
|
334
|
+
const finalUsage = await result.usage;
|
|
335
|
+
tokensIn = finalUsage?.promptTokens || ctx.stats.tokens_in;
|
|
336
|
+
tokensOut = finalUsage?.completionTokens || ctx.stats.tokens_out;
|
|
337
|
+
}
|
|
338
|
+
catch {
|
|
339
|
+
tokensIn = ctx.stats.tokens_in;
|
|
340
|
+
tokensOut = ctx.stats.tokens_out;
|
|
341
|
+
}
|
|
342
|
+
// If we still have no text part, try getting the full text from the result
|
|
343
|
+
if (!currentTextPartId) {
|
|
344
|
+
try {
|
|
345
|
+
const fullText = await result.text;
|
|
346
|
+
if (fullText && fullText.trim()) {
|
|
347
|
+
const fallbackPartId = (0, uuid_1.v4)();
|
|
348
|
+
await db_1.pool.query(`INSERT INTO parts (id, message_id, session_id, part_type, data, order_index) VALUES ($1, $2, $3, 'text', $4, 0)`, [fallbackPartId, assistantMsgId, session_id, JSON.stringify({ text: fullText })]);
|
|
349
|
+
await events_1.eventBus.publish("PartUpdated", {
|
|
350
|
+
session_id, message_id: assistantMsgId, part_id: fallbackPartId,
|
|
351
|
+
part_type: "text", updated_at: new Date().toISOString(),
|
|
352
|
+
}, "AgentLoop");
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
catch { /* non-fatal */ }
|
|
356
|
+
}
|
|
357
|
+
return {
|
|
358
|
+
finish_reason: finishReason,
|
|
359
|
+
tokens_in: tokensIn,
|
|
360
|
+
tokens_out: tokensOut,
|
|
361
|
+
cost: 0,
|
|
362
|
+
has_tool_calls: hasToolCalls,
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
// ─── Context Compaction ───────────────────────────────────────────────────────
|
|
366
|
+
async function runCompaction(session_id, agentId, model_id, provider_id, messages) {
|
|
367
|
+
try {
|
|
368
|
+
// Transition session to compacting
|
|
369
|
+
await db_1.pool.query(`UPDATE sessions SET state = 'compacting', updated_at = NOW() WHERE id = $1`, [session_id]);
|
|
370
|
+
await events_1.eventBus.publish("SessionStateChanged", { session_id, from_state: "busy", to_state: "compacting", changed_at: new Date().toISOString() }, "AgentLoop");
|
|
371
|
+
// Build summary using the compaction logic (ported from OpenCode)
|
|
372
|
+
const summary = await (0, compaction_logic_1.buildCompactionSummary)({
|
|
373
|
+
messages,
|
|
374
|
+
model_id,
|
|
375
|
+
provider_id,
|
|
376
|
+
session_id,
|
|
377
|
+
});
|
|
378
|
+
if (!summary)
|
|
379
|
+
return false;
|
|
380
|
+
// Store summary as a special assistant message
|
|
381
|
+
const summaryMsgId = (0, uuid_1.v4)();
|
|
382
|
+
await db_1.pool.query(`INSERT INTO messages (id, session_id, role, model_id, provider_id) VALUES ($1, $2, 'assistant', $3, $4)`, [summaryMsgId, session_id, model_id, provider_id]);
|
|
383
|
+
const summaryPartId = (0, uuid_1.v4)();
|
|
384
|
+
await db_1.pool.query(`INSERT INTO parts (id, message_id, session_id, part_type, data, order_index) VALUES ($1, $2, $3, 'text', $4, 0)`, [summaryPartId, summaryMsgId, session_id, JSON.stringify({ text: summary, is_compaction_summary: true })]);
|
|
385
|
+
// Transition back to busy
|
|
386
|
+
await db_1.pool.query(`UPDATE sessions SET state = 'busy', updated_at = NOW() WHERE id = $1`, [session_id]);
|
|
387
|
+
await events_1.eventBus.publish("SessionCompacted", {
|
|
388
|
+
session_id, tokens_before: 0, tokens_after: 0, compacted_at: new Date().toISOString(),
|
|
389
|
+
}, "AgentLoop");
|
|
390
|
+
(0, websocket_1.broadcastToChannel)("session_events", { type: "session.compacted", session_id });
|
|
391
|
+
return true;
|
|
392
|
+
}
|
|
393
|
+
catch (e) {
|
|
394
|
+
logger_1.logger.error("compaction_failed", { event: "compaction_error", metadata: { session_id, error: e.message } });
|
|
395
|
+
await db_1.pool.query(`UPDATE sessions SET state = 'busy', updated_at = NOW() WHERE id = $1`, [session_id]);
|
|
396
|
+
return false;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
// ─── Message History Builder ──────────────────────────────────────────────────
|
|
400
|
+
async function loadMessageHistory(session_id) {
|
|
401
|
+
const result = await db_1.pool.query(`SELECT m.id, m.role, m.model_id, m.provider_id, m.tokens_input, m.tokens_output,
|
|
402
|
+
json_agg(p.* ORDER BY p.order_index, p.created_at) FILTER (WHERE p.id IS NOT NULL) AS parts
|
|
403
|
+
FROM messages m
|
|
404
|
+
LEFT JOIN parts p ON p.message_id = m.id
|
|
405
|
+
WHERE m.session_id = $1
|
|
406
|
+
GROUP BY m.id ORDER BY m.created_at ASC`, [session_id]);
|
|
407
|
+
return result.rows;
|
|
408
|
+
}
|
|
409
|
+
async function buildAIMessages(session_id, messages, model_id) {
|
|
410
|
+
const aiMessages = [];
|
|
411
|
+
for (const msg of messages) {
|
|
412
|
+
const parts = msg.parts || [];
|
|
413
|
+
if (msg.role === "user") {
|
|
414
|
+
const content = [];
|
|
415
|
+
for (const p of parts) {
|
|
416
|
+
if (p.part_type === "text" && p.data?.text) {
|
|
417
|
+
content.push({ type: "text", text: p.data.text });
|
|
418
|
+
}
|
|
419
|
+
else if (p.part_type === "file" && p.data?.url) {
|
|
420
|
+
content.push({ type: "file", url: p.data.url, mediaType: p.data.mime || "text/plain" });
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
if (content.length > 0)
|
|
424
|
+
aiMessages.push({ role: "user", content });
|
|
425
|
+
}
|
|
426
|
+
else if (msg.role === "assistant") {
|
|
427
|
+
const content = [];
|
|
428
|
+
for (const p of parts) {
|
|
429
|
+
if (p.part_type === "text" && p.data?.text) {
|
|
430
|
+
// Skip compaction summaries — they're injected as system context
|
|
431
|
+
if (p.data.is_compaction_summary)
|
|
432
|
+
continue;
|
|
433
|
+
content.push({ type: "text", text: p.data.text });
|
|
434
|
+
}
|
|
435
|
+
else if (p.part_type === "tool_invocation" && p.data?.tool_call_id) {
|
|
436
|
+
content.push({ type: "tool-call", toolCallId: p.data.tool_call_id, toolName: p.data.tool_name, args: p.data.args || {} });
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
if (content.length > 0)
|
|
440
|
+
aiMessages.push({ role: "assistant", content });
|
|
441
|
+
}
|
|
442
|
+
else if (msg.role === "tool") {
|
|
443
|
+
const content = [];
|
|
444
|
+
for (const p of parts) {
|
|
445
|
+
if (p.part_type === "tool_result" && p.data?.tool_call_id) {
|
|
446
|
+
content.push({ type: "tool-result", toolCallId: p.data.tool_call_id, toolName: p.data.tool_name, result: p.data.result });
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
if (content.length > 0)
|
|
450
|
+
aiMessages.push({ role: "tool", content });
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
return aiMessages;
|
|
454
|
+
}
|
|
455
|
+
function getLastUserText(messages) {
|
|
456
|
+
const lastUser = messages.filter(m => m.role === "user").slice(-1)[0];
|
|
457
|
+
if (!lastUser)
|
|
458
|
+
return "";
|
|
459
|
+
return (lastUser.parts || [])
|
|
460
|
+
.filter((p) => p.part_type === "text")
|
|
461
|
+
.map((p) => p.data?.text || "")
|
|
462
|
+
.join(" ");
|
|
463
|
+
}
|
|
464
|
+
// ─── System Prompt with RAG ───────────────────────────────────────────────────
|
|
465
|
+
async function buildSystemPromptWithRAG(session_id, worktree, model_id, provider_id, agent_name, userText) {
|
|
466
|
+
// Base system prompt (provider-specific, from OpenCode)
|
|
467
|
+
const base = (0, system_prompt_1.getSystemPrompt)(model_id, provider_id, agent_name);
|
|
468
|
+
// Environment context
|
|
469
|
+
const envContext = [
|
|
470
|
+
`Working directory: ${worktree}`,
|
|
471
|
+
`Platform: ${process.platform}`,
|
|
472
|
+
`Today's date: ${new Date().toDateString()}`,
|
|
473
|
+
].join("\n");
|
|
474
|
+
// Instruction files (AGENTS.md, CLAUDE.md, etc.)
|
|
475
|
+
const instructions = await (0, instruction_loader_1.loadInstructionFiles)(worktree).catch(() => "");
|
|
476
|
+
// Codebase context — no embedding needed
|
|
477
|
+
// Uses FTS, git recency, session history, import graph, instruction files
|
|
478
|
+
let codebaseContext = "";
|
|
479
|
+
if (userText && worktree) {
|
|
480
|
+
try {
|
|
481
|
+
const { buildContext, formatContextForPrompt } = await Promise.resolve().then(() => __importStar(require("../../context_builder")));
|
|
482
|
+
const sessionRow = await db_1.pool.query(`SELECT project_id FROM sessions WHERE id = $1`, [session_id]);
|
|
483
|
+
const project_id = sessionRow.rows[0]?.project_id || "";
|
|
484
|
+
if (!project_id) {
|
|
485
|
+
// No project linked yet — skip RAG context
|
|
486
|
+
return [base, envContext, instructions].filter(Boolean).join("\n\n");
|
|
487
|
+
}
|
|
488
|
+
const ctxResult = await buildContext({
|
|
489
|
+
session_id,
|
|
490
|
+
project_id,
|
|
491
|
+
worktree,
|
|
492
|
+
query: userText,
|
|
493
|
+
max_chunks: 10,
|
|
494
|
+
max_chars: 10000,
|
|
495
|
+
});
|
|
496
|
+
codebaseContext = formatContextForPrompt(ctxResult, worktree);
|
|
497
|
+
if (ctxResult.summary !== "no relevant context found") {
|
|
498
|
+
logger_1.logger.info("context_injected", { event: "context", metadata: { summary: ctxResult.summary } });
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
catch (e) {
|
|
502
|
+
logger_1.logger.error("context_build_failed", { event: "context", metadata: { error: e.message } });
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
return [base, envContext, instructions, codebaseContext].filter(Boolean).join("\n\n");
|
|
506
|
+
}
|
|
507
|
+
// ─── Language Model Factory ───────────────────────────────────────────────────
|
|
508
|
+
function getLanguageModel(provider_id, model_id) {
|
|
509
|
+
const pid = provider_id.toLowerCase();
|
|
510
|
+
// "local" shorthand — use .env defaults
|
|
511
|
+
const resolvedProvider = pid === "local"
|
|
512
|
+
? (process.env.DEFAULT_PROVIDER || "openai_compatible").toLowerCase()
|
|
513
|
+
: pid;
|
|
514
|
+
const resolvedModel = pid === "local"
|
|
515
|
+
? (process.env.DEFAULT_MODEL || model_id)
|
|
516
|
+
: model_id;
|
|
517
|
+
const apiKey = (process.env[`${resolvedProvider.toUpperCase()}_API_KEY`] ||
|
|
518
|
+
process.env.OPENAI_API_KEY ||
|
|
519
|
+
"not-needed");
|
|
520
|
+
const baseUrl = (process.env[`${resolvedProvider.toUpperCase()}_BASE_URL`] ||
|
|
521
|
+
process.env.OPENAI_BASE_URL);
|
|
522
|
+
switch (resolvedProvider) {
|
|
523
|
+
case "anthropic":
|
|
524
|
+
return (0, anthropic_1.createAnthropic)({ apiKey, baseURL: baseUrl })(resolvedModel);
|
|
525
|
+
case "google":
|
|
526
|
+
return (0, google_1.createGoogleGenerativeAI)({ apiKey })(resolvedModel);
|
|
527
|
+
case "groq": {
|
|
528
|
+
const { createGroq } = require("@ai-sdk/groq");
|
|
529
|
+
return createGroq({ apiKey: process.env.GROQ_API_KEY || apiKey })(resolvedModel);
|
|
530
|
+
}
|
|
531
|
+
case "cerebras": {
|
|
532
|
+
const { createCerebras } = require("@ai-sdk/cerebras");
|
|
533
|
+
return createCerebras({ apiKey: process.env.CEREBRAS_API_KEY || apiKey })(resolvedModel);
|
|
534
|
+
}
|
|
535
|
+
case "deepseek": {
|
|
536
|
+
// DeepSeek is OpenAI-compatible
|
|
537
|
+
return (0, openai_1.createOpenAI)({
|
|
538
|
+
apiKey: process.env.DEEPSEEK_API_KEY || apiKey,
|
|
539
|
+
baseURL: "https://api.deepseek.com/v1",
|
|
540
|
+
})(resolvedModel);
|
|
541
|
+
}
|
|
542
|
+
case "openrouter": {
|
|
543
|
+
const { createOpenRouter } = require("@openrouter/ai-sdk-provider");
|
|
544
|
+
return createOpenRouter({
|
|
545
|
+
apiKey: process.env.OPENROUTER_API_KEY || apiKey,
|
|
546
|
+
})(resolvedModel);
|
|
547
|
+
}
|
|
548
|
+
case "ollama": {
|
|
549
|
+
// Ollama is OpenAI-compatible on localhost:11434
|
|
550
|
+
return (0, openai_1.createOpenAI)({
|
|
551
|
+
apiKey: "ollama",
|
|
552
|
+
baseURL: process.env.OLLAMA_BASE_URL || "http://localhost:11434/v1",
|
|
553
|
+
})(resolvedModel);
|
|
554
|
+
}
|
|
555
|
+
case "openai":
|
|
556
|
+
return (0, openai_1.createOpenAI)({ apiKey, baseURL: baseUrl })(resolvedModel);
|
|
557
|
+
case "openai_compatible":
|
|
558
|
+
default:
|
|
559
|
+
return (0, openai_1.createOpenAI)({ apiKey, baseURL: baseUrl })(resolvedModel);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
function providerToNpm(provider_id) {
|
|
563
|
+
const map = {
|
|
564
|
+
anthropic: "@ai-sdk/anthropic",
|
|
565
|
+
openai: "@ai-sdk/openai",
|
|
566
|
+
google: "@ai-sdk/google",
|
|
567
|
+
openai_compatible: "@ai-sdk/openai-compatible",
|
|
568
|
+
};
|
|
569
|
+
return map[provider_id.toLowerCase()] || "@ai-sdk/openai-compatible";
|
|
570
|
+
}
|
|
571
|
+
function supportsTools(model_id) {
|
|
572
|
+
const id = model_id.toLowerCase();
|
|
573
|
+
// Known models that support function calling
|
|
574
|
+
if (id.includes("gpt-") || id.includes("claude") || id.includes("gemini"))
|
|
575
|
+
return true;
|
|
576
|
+
// Qwen3 and other local models — check env override
|
|
577
|
+
if (process.env.MODEL_SUPPORTS_TOOLS === "true")
|
|
578
|
+
return true;
|
|
579
|
+
if (process.env.MODEL_SUPPORTS_TOOLS === "false")
|
|
580
|
+
return false;
|
|
581
|
+
// Default: try with tools, fall back gracefully on error
|
|
582
|
+
return true;
|
|
583
|
+
}
|
|
584
|
+
//# sourceMappingURL=prompt.js.map
|