bonecode 1.0.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/ARCHITECTURE.md +183 -0
- package/README.md +71 -0
- package/bin/bonecode +62 -0
- package/bone/migrations/rag_vectors.sql +258 -0
- package/bone/output/agent/.dockerignore +7 -0
- package/bone/output/agent/.env.example +36 -0
- package/bone/output/agent/.github/workflows/ci.yaml +58 -0
- package/bone/output/agent/AgentDomain.bone.map +350 -0
- package/bone/output/agent/AgentDomain.postman_collection.json +958 -0
- package/bone/output/agent/Dockerfile +22 -0
- package/bone/output/agent/README.md +47 -0
- package/bone/output/agent/admin/index.html +740 -0
- package/bone/output/agent/docker-compose.yaml +22 -0
- package/bone/output/agent/k8s/deployment.yaml +75 -0
- package/bone/output/agent/migrations/agent.sql +36 -0
- package/bone/output/agent/migrations/agent_instance.sql +36 -0
- package/bone/output/agent/migrations/audit_log.sql +18 -0
- package/bone/output/agent/migrations/build_step.sql +34 -0
- package/bone/output/agent/migrations/event_outbox.sql +31 -0
- package/bone/output/agent/migrations/plan.sql +30 -0
- package/bone/output/agent/migrations/task.sql +30 -0
- package/bone/output/agent/migrations/tool_call.sql +33 -0
- package/bone/output/agent/openapi.yaml +1116 -0
- package/bone/output/agent/package.json +36 -0
- package/bone/output/agent/schema.graphql +233 -0
- package/bone/output/agent/sdk/client.ts +231 -0
- package/bone/output/agent/src/algorithms.ts +2 -0
- package/bone/output/agent/src/audit.ts +44 -0
- package/bone/output/agent/src/auth.ts +57 -0
- package/bone/output/agent/src/cron.ts +12 -0
- package/bone/output/agent/src/db.ts +32 -0
- package/bone/output/agent/src/debug.ts +66 -0
- package/bone/output/agent/src/events.ts +243 -0
- package/bone/output/agent/src/extensions.ts +54 -0
- package/bone/output/agent/src/failure_rules.ts +323 -0
- package/bone/output/agent/src/flows.ts +168 -0
- package/bone/output/agent/src/health.ts +43 -0
- package/bone/output/agent/src/index.ts +100 -0
- package/bone/output/agent/src/logger.ts +66 -0
- package/bone/output/agent/src/metrics.ts +75 -0
- package/bone/output/agent/src/migrate.ts +352 -0
- package/bone/output/agent/src/migration_diff.ts +108 -0
- package/bone/output/agent/src/notify.ts +125 -0
- package/bone/output/agent/src/routes/agent_instance.ts +234 -0
- package/bone/output/agent/src/routes/build_step.ts +105 -0
- package/bone/output/agent/src/routes/plan.ts +91 -0
- package/bone/output/agent/src/routes/task.ts +105 -0
- package/bone/output/agent/src/routes/tool_call.ts +166 -0
- package/bone/output/agent/src/schemas.ts +384 -0
- package/bone/output/agent/src/state_machines/agent_instance.ts +24 -0
- package/bone/output/agent/src/state_machines/build_step.ts +22 -0
- package/bone/output/agent/src/state_machines/plan.ts +22 -0
- package/bone/output/agent/src/state_machines/task.ts +22 -0
- package/bone/output/agent/src/state_machines/tool_call.ts +22 -0
- package/bone/output/agent/src/tests.ts +362 -0
- package/bone/output/agent/src/websocket.ts +201 -0
- package/bone/output/agent/tsconfig.json +25 -0
- package/bone/output/rag/.dockerignore +7 -0
- package/bone/output/rag/.env.example +36 -0
- package/bone/output/rag/.github/workflows/ci.yaml +58 -0
- package/bone/output/rag/Dockerfile +22 -0
- package/bone/output/rag/RAGDomain.bone.map +287 -0
- package/bone/output/rag/RAGDomain.postman_collection.json +923 -0
- package/bone/output/rag/README.md +47 -0
- package/bone/output/rag/admin/index.html +818 -0
- package/bone/output/rag/docker-compose.yaml +22 -0
- package/bone/output/rag/k8s/deployment.yaml +75 -0
- package/bone/output/rag/migrations/audit_log.sql +18 -0
- package/bone/output/rag/migrations/code_chunk.sql +34 -0
- package/bone/output/rag/migrations/code_file.sql +33 -0
- package/bone/output/rag/migrations/event_outbox.sql +31 -0
- package/bone/output/rag/migrations/indexing_job.sql +33 -0
- package/bone/output/rag/migrations/knowledge_base.sql +35 -0
- package/bone/output/rag/migrations/memory_entry.sql +34 -0
- package/bone/output/rag/openapi.yaml +1097 -0
- package/bone/output/rag/package.json +36 -0
- package/bone/output/rag/schema.graphql +245 -0
- package/bone/output/rag/sdk/client.ts +234 -0
- package/bone/output/rag/src/algorithms.ts +2 -0
- package/bone/output/rag/src/audit.ts +37 -0
- package/bone/output/rag/src/auth.ts +57 -0
- package/bone/output/rag/src/cron.ts +12 -0
- package/bone/output/rag/src/db.ts +32 -0
- package/bone/output/rag/src/debug.ts +66 -0
- package/bone/output/rag/src/events.ts +243 -0
- package/bone/output/rag/src/extensions.ts +350 -0
- package/bone/output/rag/src/failure_rules.ts +315 -0
- package/bone/output/rag/src/flows.ts +239 -0
- package/bone/output/rag/src/health.ts +43 -0
- package/bone/output/rag/src/index.ts +95 -0
- package/bone/output/rag/src/logger.ts +66 -0
- package/bone/output/rag/src/metrics.ts +75 -0
- package/bone/output/rag/src/migrate.ts +364 -0
- package/bone/output/rag/src/migration_diff.ts +108 -0
- package/bone/output/rag/src/notify.ts +99 -0
- package/bone/output/rag/src/routes/code_chunk.ts +75 -0
- package/bone/output/rag/src/routes/code_file.ts +101 -0
- package/bone/output/rag/src/routes/indexing_job.ts +87 -0
- package/bone/output/rag/src/routes/knowledge_base.ts +230 -0
- package/bone/output/rag/src/routes/memory_entry.ts +87 -0
- package/bone/output/rag/src/schemas.ts +394 -0
- package/bone/output/rag/src/state_machines/code_file.ts +23 -0
- package/bone/output/rag/src/state_machines/indexing_job.ts +22 -0
- package/bone/output/rag/src/state_machines/knowledge_base.ts +23 -0
- package/bone/output/rag/src/state_machines/memory_entry.ts +20 -0
- package/bone/output/rag/src/tests.ts +340 -0
- package/bone/output/rag/tsconfig.json +25 -0
- package/bone/output/session/.dockerignore +7 -0
- package/bone/output/session/.env.example +36 -0
- package/bone/output/session/.github/workflows/ci.yaml +58 -0
- package/bone/output/session/Dockerfile +22 -0
- package/bone/output/session/README.md +47 -0
- package/bone/output/session/SessionDomain.bone.map +350 -0
- package/bone/output/session/SessionDomain.postman_collection.json +958 -0
- package/bone/output/session/admin/index.html +667 -0
- package/bone/output/session/docker-compose.yaml +22 -0
- package/bone/output/session/k8s/deployment.yaml +75 -0
- package/bone/output/session/migrations/audit_log.sql +18 -0
- package/bone/output/session/migrations/event_outbox.sql +31 -0
- package/bone/output/session/migrations/message.sql +31 -0
- package/bone/output/session/migrations/part.sql +28 -0
- package/bone/output/session/migrations/permission.sql +28 -0
- package/bone/output/session/migrations/project.sql +28 -0
- package/bone/output/session/migrations/session.sql +38 -0
- package/bone/output/session/openapi.yaml +1101 -0
- package/bone/output/session/package.json +36 -0
- package/bone/output/session/schema.graphql +222 -0
- package/bone/output/session/sdk/client.ts +225 -0
- package/bone/output/session/src/algorithms.ts +2 -0
- package/bone/output/session/src/audit.ts +44 -0
- package/bone/output/session/src/auth.ts +57 -0
- package/bone/output/session/src/cron.ts +12 -0
- package/bone/output/session/src/db.ts +32 -0
- package/bone/output/session/src/debug.ts +66 -0
- package/bone/output/session/src/events.ts +270 -0
- package/bone/output/session/src/extensions.ts +215 -0
- package/bone/output/session/src/failure_rules.ts +284 -0
- package/bone/output/session/src/flows.ts +168 -0
- package/bone/output/session/src/health.ts +43 -0
- package/bone/output/session/src/index.ts +100 -0
- package/bone/output/session/src/logger.ts +66 -0
- package/bone/output/session/src/metrics.ts +75 -0
- package/bone/output/session/src/migrate.ts +332 -0
- package/bone/output/session/src/migration_diff.ts +108 -0
- package/bone/output/session/src/notify.ts +112 -0
- package/bone/output/session/src/routes/message.ts +93 -0
- package/bone/output/session/src/routes/part.ts +79 -0
- package/bone/output/session/src/routes/permission.ts +79 -0
- package/bone/output/session/src/routes/project.ts +79 -0
- package/bone/output/session/src/routes/session.ts +294 -0
- package/bone/output/session/src/schemas.ts +357 -0
- package/bone/output/session/src/state_machines/session.ts +23 -0
- package/bone/output/session/src/tests.ts +326 -0
- package/bone/output/session/src/websocket.ts +201 -0
- package/bone/output/session/tsconfig.json +25 -0
- package/bone/output/workspace/.dockerignore +7 -0
- package/bone/output/workspace/.env.example +36 -0
- package/bone/output/workspace/.github/workflows/ci.yaml +58 -0
- package/bone/output/workspace/Dockerfile +22 -0
- package/bone/output/workspace/README.md +45 -0
- package/bone/output/workspace/WorkspaceDomain.bone.map +189 -0
- package/bone/output/workspace/WorkspaceDomain.postman_collection.json +621 -0
- package/bone/output/workspace/admin/index.html +485 -0
- package/bone/output/workspace/docker-compose.yaml +22 -0
- package/bone/output/workspace/k8s/deployment.yaml +75 -0
- package/bone/output/workspace/migrations/audit_log.sql +18 -0
- package/bone/output/workspace/migrations/codebase.sql +34 -0
- package/bone/output/workspace/migrations/event_outbox.sql +31 -0
- package/bone/output/workspace/migrations/snapshot.sql +32 -0
- package/bone/output/workspace/migrations/workspace.sql +33 -0
- package/bone/output/workspace/openapi.yaml +721 -0
- package/bone/output/workspace/package.json +36 -0
- package/bone/output/workspace/schema.graphql +153 -0
- package/bone/output/workspace/sdk/client.ts +155 -0
- package/bone/output/workspace/src/algorithms.ts +2 -0
- package/bone/output/workspace/src/audit.ts +37 -0
- package/bone/output/workspace/src/auth.ts +57 -0
- package/bone/output/workspace/src/cron.ts +12 -0
- package/bone/output/workspace/src/db.ts +32 -0
- package/bone/output/workspace/src/debug.ts +66 -0
- package/bone/output/workspace/src/events.ts +243 -0
- package/bone/output/workspace/src/extensions.ts +44 -0
- package/bone/output/workspace/src/failure_rules.ts +153 -0
- package/bone/output/workspace/src/health.ts +43 -0
- package/bone/output/workspace/src/index.ts +89 -0
- package/bone/output/workspace/src/logger.ts +66 -0
- package/bone/output/workspace/src/metrics.ts +75 -0
- package/bone/output/workspace/src/migrate.ts +220 -0
- package/bone/output/workspace/src/migration_diff.ts +108 -0
- package/bone/output/workspace/src/notify.ts +73 -0
- package/bone/output/workspace/src/routes/codebase.ts +87 -0
- package/bone/output/workspace/src/routes/snapshot.ts +127 -0
- package/bone/output/workspace/src/routes/workspace.ts +190 -0
- package/bone/output/workspace/src/schemas.ts +231 -0
- package/bone/output/workspace/src/state_machines/codebase.ts +21 -0
- package/bone/output/workspace/src/state_machines/snapshot.ts +20 -0
- package/bone/output/workspace/src/state_machines/workspace.ts +21 -0
- package/bone/output/workspace/src/tests.ts +249 -0
- package/bone/output/workspace/tsconfig.json +25 -0
- package/compat/opencode_adapter.ts +410 -0
- package/package.json +69 -0
- package/scripts/check_benchmark_session.js +34 -0
- package/scripts/check_finish_event.js +24 -0
- package/scripts/check_parts.js +15 -0
- package/scripts/compile.js +79 -0
- package/scripts/copy_opencode.ps1 +53 -0
- package/scripts/create_functions.sql +129 -0
- package/scripts/migrate.js +85 -0
- package/scripts/migrate_from_opencode.ts +218 -0
- package/scripts/test_agent_loop.js +101 -0
- package/scripts/test_api.ps1 +116 -0
- package/scripts/test_context_builder.js +136 -0
- package/scripts/test_context_builder.ts +97 -0
- package/scripts/test_rag.js +189 -0
- package/scripts/test_stream_events.js +36 -0
- package/scripts/test_websocket_and_saga.js +216 -0
- package/src/cli.ts +475 -0
- package/src/config.ts +162 -0
- package/src/context_builder.ts +598 -0
- package/src/engine/account/account.sql.ts +39 -0
- package/src/engine/account/account.ts +456 -0
- package/src/engine/account/repo.ts +166 -0
- package/src/engine/account/schema.ts +99 -0
- package/src/engine/account/url.ts +8 -0
- package/src/engine/acp/README.md +174 -0
- package/src/engine/acp/agent.ts +1968 -0
- package/src/engine/acp/runtime.ts +22 -0
- package/src/engine/acp/session.ts +122 -0
- package/src/engine/acp/types.ts +24 -0
- package/src/engine/agent/agent.ts +463 -0
- package/src/engine/agent/generate.txt +75 -0
- package/src/engine/agent/prompt/compaction.txt +9 -0
- package/src/engine/agent/prompt/explore.txt +18 -0
- package/src/engine/agent/prompt/scout.txt +36 -0
- package/src/engine/agent/prompt/summary.txt +11 -0
- package/src/engine/agent/prompt/title.txt +44 -0
- package/src/engine/agent/subagent-permissions.ts +34 -0
- package/src/engine/auth/index.ts +96 -0
- package/src/engine/background/background/job.ts +200 -0
- package/src/engine/background/job.ts +200 -0
- package/src/engine/bus/bus-event.ts +45 -0
- package/src/engine/bus/global.ts +22 -0
- package/src/engine/bus/index.ts +203 -0
- package/src/engine/command/command/index.ts +181 -0
- package/src/engine/command/command/template/initialize.txt +66 -0
- package/src/engine/command/command/template/review.txt +101 -0
- package/src/engine/command/index.ts +181 -0
- package/src/engine/command/template/initialize.txt +66 -0
- package/src/engine/command/template/review.txt +101 -0
- package/src/engine/config/agent.ts +172 -0
- package/src/engine/config/attachment.ts +25 -0
- package/src/engine/config/command.ts +62 -0
- package/src/engine/config/config.ts +833 -0
- package/src/engine/config/console-state.ts +14 -0
- package/src/engine/config/entry-name.ts +16 -0
- package/src/engine/config/error.ts +23 -0
- package/src/engine/config/formatter.ts +13 -0
- package/src/engine/config/layout.ts +6 -0
- package/src/engine/config/lsp.ts +43 -0
- package/src/engine/config/managed.ts +71 -0
- package/src/engine/config/markdown.ts +96 -0
- package/src/engine/config/mcp.ts +56 -0
- package/src/engine/config/model-id.ts +5 -0
- package/src/engine/config/parse.ts +79 -0
- package/src/engine/config/paths.ts +45 -0
- package/src/engine/config/permission.ts +58 -0
- package/src/engine/config/plugin.ts +84 -0
- package/src/engine/config/provider.ts +111 -0
- package/src/engine/config/reference.ts +23 -0
- package/src/engine/config/server.ts +19 -0
- package/src/engine/config/skills.ts +14 -0
- package/src/engine/config/variable.ts +90 -0
- package/src/engine/control-plane/adapters/index.ts +41 -0
- package/src/engine/control-plane/adapters/worktree.ts +96 -0
- package/src/engine/control-plane/dev/README.md +19 -0
- package/src/engine/control-plane/dev/debug-workspace-plugin.ts +73 -0
- package/src/engine/control-plane/schema.ts +14 -0
- package/src/engine/control-plane/types.ts +59 -0
- package/src/engine/control-plane/util.ts +39 -0
- package/src/engine/control-plane/workspace-adapter-runtime.ts +51 -0
- package/src/engine/control-plane/workspace-context.ts +26 -0
- package/src/engine/control-plane/workspace.sql.ts +20 -0
- package/src/engine/control-plane/workspace.ts +1072 -0
- package/src/engine/data-migration.ts +161 -0
- package/src/engine/effect/app-runtime.ts +143 -0
- package/src/engine/effect/bootstrap-runtime.ts +29 -0
- package/src/engine/effect/bridge.ts +84 -0
- package/src/engine/effect/config-service.ts +67 -0
- package/src/engine/effect/instance-ref.ts +11 -0
- package/src/engine/effect/instance-registry.ts +12 -0
- package/src/engine/effect/instance-state.ts +72 -0
- package/src/engine/effect/promise.ts +17 -0
- package/src/engine/effect/run-service.ts +47 -0
- package/src/engine/effect/runner.ts +217 -0
- package/src/engine/effect/runtime-flags.ts +74 -0
- package/src/engine/effect/service-use.ts +38 -0
- package/src/engine/env/index.ts +37 -0
- package/src/engine/event-v2-bridge.ts +89 -0
- package/src/engine/file/file/ignore.ts +81 -0
- package/src/engine/file/file/index.ts +651 -0
- package/src/engine/file/file/protected.ts +59 -0
- package/src/engine/file/file/ripgrep.ts +481 -0
- package/src/engine/file/file/watcher.ts +167 -0
- package/src/engine/file/ignore.ts +81 -0
- package/src/engine/file/index.ts +651 -0
- package/src/engine/file/protected.ts +59 -0
- package/src/engine/file/ripgrep.ts +481 -0
- package/src/engine/file/watcher.ts +167 -0
- package/src/engine/format/format/formatter.ts +404 -0
- package/src/engine/format/format/index.ts +209 -0
- package/src/engine/format/formatter.ts +404 -0
- package/src/engine/format/index.ts +209 -0
- package/src/engine/git/git/index.ts +347 -0
- package/src/engine/git/index.ts +347 -0
- package/src/engine/id/id.ts +80 -0
- package/src/engine/ide/index.ts +70 -0
- package/src/engine/image/image/image.ts +176 -0
- package/src/engine/image/image.ts +176 -0
- package/src/engine/index.ts +251 -0
- package/src/engine/installation/index.ts +327 -0
- package/src/engine/lsp/client.ts +707 -0
- package/src/engine/lsp/diagnostic.ts +29 -0
- package/src/engine/lsp/language.ts +121 -0
- package/src/engine/lsp/launch.ts +21 -0
- package/src/engine/lsp/lsp/client.ts +707 -0
- package/src/engine/lsp/lsp/diagnostic.ts +29 -0
- package/src/engine/lsp/lsp/language.ts +121 -0
- package/src/engine/lsp/lsp/launch.ts +21 -0
- package/src/engine/lsp/lsp/lsp.ts +507 -0
- package/src/engine/lsp/lsp/server.ts +2064 -0
- package/src/engine/lsp/lsp.ts +507 -0
- package/src/engine/lsp/server.ts +2064 -0
- package/src/engine/mcp/auth.ts +146 -0
- package/src/engine/mcp/index.ts +958 -0
- package/src/engine/mcp/mcp/auth.ts +146 -0
- package/src/engine/mcp/mcp/index.ts +958 -0
- package/src/engine/mcp/mcp/oauth-callback.ts +232 -0
- package/src/engine/mcp/mcp/oauth-provider.ts +214 -0
- package/src/engine/mcp/oauth-callback.ts +232 -0
- package/src/engine/mcp/oauth-provider.ts +214 -0
- package/src/engine/node.ts +6 -0
- package/src/engine/patch/index.ts +689 -0
- package/src/engine/patch/patch/index.ts +689 -0
- package/src/engine/permission/arity.ts +163 -0
- package/src/engine/permission/evaluate.ts +15 -0
- package/src/engine/permission/index.ts +306 -0
- package/src/engine/permission/permission/arity.ts +163 -0
- package/src/engine/permission/permission/evaluate.ts +15 -0
- package/src/engine/permission/permission/index.ts +306 -0
- package/src/engine/permission/permission/schema.ts +13 -0
- package/src/engine/permission/schema.ts +13 -0
- package/src/engine/plugin/azure.ts +26 -0
- package/src/engine/plugin/cloudflare.ts +76 -0
- package/src/engine/plugin/codex.ts +622 -0
- package/src/engine/plugin/digitalocean.ts +411 -0
- package/src/engine/plugin/github-copilot/copilot.ts +394 -0
- package/src/engine/plugin/github-copilot/models.ts +196 -0
- package/src/engine/plugin/index.ts +295 -0
- package/src/engine/plugin/install.ts +439 -0
- package/src/engine/plugin/loader.ts +216 -0
- package/src/engine/plugin/meta.ts +188 -0
- package/src/engine/plugin/shared.ts +323 -0
- package/src/engine/project/bootstrap-service.ts +9 -0
- package/src/engine/project/bootstrap.ts +75 -0
- package/src/engine/project/instance-context.ts +24 -0
- package/src/engine/project/instance-layer.ts +11 -0
- package/src/engine/project/instance-runtime.ts +16 -0
- package/src/engine/project/instance-store.ts +193 -0
- package/src/engine/project/project.sql.ts +17 -0
- package/src/engine/project/project.ts +537 -0
- package/src/engine/project/schema.ts +13 -0
- package/src/engine/project/vcs.ts +405 -0
- package/src/engine/provider/auth.ts +225 -0
- package/src/engine/provider/error.ts +204 -0
- package/src/engine/provider/model-status.ts +8 -0
- package/src/engine/provider/provider.ts +1843 -0
- package/src/engine/provider/schema.ts +30 -0
- package/src/engine/provider/sdk/copilot/AGENTS.md +1 -0
- package/src/engine/provider/transform.ts +1376 -0
- package/src/engine/pty/index.ts +365 -0
- package/src/engine/pty/input.ts +24 -0
- package/src/engine/pty/pty/index.ts +365 -0
- package/src/engine/pty/pty/input.ts +24 -0
- package/src/engine/pty/pty/pty.bun.ts +26 -0
- package/src/engine/pty/pty/pty.node.ts +27 -0
- package/src/engine/pty/pty/pty.ts +25 -0
- package/src/engine/pty/pty/schema.ts +14 -0
- package/src/engine/pty/pty/ticket.ts +68 -0
- package/src/engine/pty/pty.bun.ts +26 -0
- package/src/engine/pty/pty.node.ts +27 -0
- package/src/engine/pty/pty.ts +25 -0
- package/src/engine/pty/schema.ts +14 -0
- package/src/engine/pty/ticket.ts +68 -0
- package/src/engine/question/index.ts +213 -0
- package/src/engine/question/question/index.ts +213 -0
- package/src/engine/question/question/schema.ts +10 -0
- package/src/engine/question/schema.ts +10 -0
- package/src/engine/reference/reference/reference.ts +241 -0
- package/src/engine/reference/reference/repository-cache.ts +147 -0
- package/src/engine/reference/reference.ts +241 -0
- package/src/engine/reference/repository-cache.ts +147 -0
- package/src/engine/session/compaction.ts +651 -0
- package/src/engine/session/compaction_logic.ts +120 -0
- package/src/engine/session/instruction.ts +238 -0
- package/src/engine/session/instruction_loader.ts +54 -0
- package/src/engine/session/llm.ts +459 -0
- package/src/engine/session/message-error.ts +14 -0
- package/src/engine/session/message-v2.ts +1202 -0
- package/src/engine/session/message.ts +146 -0
- package/src/engine/session/overflow.ts +32 -0
- package/src/engine/session/overflow_check.ts +46 -0
- package/src/engine/session/processor.ts +823 -0
- package/src/engine/session/prompt/anthropic.txt +105 -0
- package/src/engine/session/prompt/beast.txt +147 -0
- package/src/engine/session/prompt/build-switch.txt +5 -0
- package/src/engine/session/prompt/codex.txt +79 -0
- package/src/engine/session/prompt/copilot-gpt-5.txt +143 -0
- package/src/engine/session/prompt/default.txt +105 -0
- package/src/engine/session/prompt/gemini.txt +155 -0
- package/src/engine/session/prompt/gpt.txt +107 -0
- package/src/engine/session/prompt/kimi.txt +95 -0
- package/src/engine/session/prompt/max-steps.txt +16 -0
- package/src/engine/session/prompt/plan-reminder-anthropic.txt +67 -0
- package/src/engine/session/prompt/plan.txt +26 -0
- package/src/engine/session/prompt/trinity.txt +97 -0
- package/src/engine/session/prompt.ts +671 -0
- package/src/engine/session/provider_transform.ts +187 -0
- package/src/engine/session/retry.ts +200 -0
- package/src/engine/session/retry_logic.ts +65 -0
- package/src/engine/session/revert.ts +162 -0
- package/src/engine/session/run-state.ts +153 -0
- package/src/engine/session/schema.ts +26 -0
- package/src/engine/session/session.sql.ts +137 -0
- package/src/engine/session/session.ts +1011 -0
- package/src/engine/session/status.ts +94 -0
- package/src/engine/session/summary.ts +164 -0
- package/src/engine/session/system.ts +84 -0
- package/src/engine/session/system_prompt.ts +65 -0
- package/src/engine/session/todo.ts +81 -0
- package/src/engine/session/tool_registry.ts +162 -0
- package/src/engine/share/session.ts +61 -0
- package/src/engine/share/share-next.ts +376 -0
- package/src/engine/share/share.sql.ts +13 -0
- package/src/engine/shell/shell/shell.ts +215 -0
- package/src/engine/shell/shell.ts +215 -0
- package/src/engine/skill/discovery.ts +116 -0
- package/src/engine/skill/index.ts +336 -0
- package/src/engine/skill/prompt/customize-opencode.md +377 -0
- package/src/engine/skill/skill/discovery.ts +116 -0
- package/src/engine/skill/skill/index.ts +336 -0
- package/src/engine/skill/skill/prompt/customize-opencode.md +377 -0
- package/src/engine/snapshot/index.ts +762 -0
- package/src/engine/snapshot/snapshot/index.ts +762 -0
- package/src/engine/sync/README.md +179 -0
- package/src/engine/sync/event.sql.ts +17 -0
- package/src/engine/sync/index.ts +410 -0
- package/src/engine/sync/schema.ts +11 -0
- package/src/engine/temporary.ts +33 -0
- package/src/engine/tool/apply_patch.ts +313 -0
- package/src/engine/tool/apply_patch.txt +33 -0
- package/src/engine/tool/edit.ts +711 -0
- package/src/engine/tool/edit.txt +10 -0
- package/src/engine/tool/external-directory.ts +49 -0
- package/src/engine/tool/glob.ts +103 -0
- package/src/engine/tool/glob.txt +6 -0
- package/src/engine/tool/grep.ts +156 -0
- package/src/engine/tool/grep.txt +8 -0
- package/src/engine/tool/invalid.ts +21 -0
- package/src/engine/tool/json-schema.ts +164 -0
- package/src/engine/tool/lsp.ts +113 -0
- package/src/engine/tool/lsp.txt +24 -0
- package/src/engine/tool/mcp-websearch.ts +96 -0
- package/src/engine/tool/plan-enter.txt +14 -0
- package/src/engine/tool/plan-exit.txt +13 -0
- package/src/engine/tool/plan.ts +78 -0
- package/src/engine/tool/question.ts +44 -0
- package/src/engine/tool/question.txt +10 -0
- package/src/engine/tool/read.ts +337 -0
- package/src/engine/tool/read.txt +14 -0
- package/src/engine/tool/registry.ts +472 -0
- package/src/engine/tool/repo_clone.ts +80 -0
- package/src/engine/tool/repo_clone.txt +5 -0
- package/src/engine/tool/repo_overview.ts +279 -0
- package/src/engine/tool/repo_overview.txt +4 -0
- package/src/engine/tool/schema.ts +14 -0
- package/src/engine/tool/shell/id.ts +19 -0
- package/src/engine/tool/shell/prompt.ts +295 -0
- package/src/engine/tool/shell/shell.txt +77 -0
- package/src/engine/tool/shell.ts +647 -0
- package/src/engine/tool/skill.ts +75 -0
- package/src/engine/tool/skill.txt +5 -0
- package/src/engine/tool/task.ts +337 -0
- package/src/engine/tool/task.txt +58 -0
- package/src/engine/tool/task_status.ts +179 -0
- package/src/engine/tool/task_status.txt +13 -0
- package/src/engine/tool/todo.ts +57 -0
- package/src/engine/tool/todowrite.txt +167 -0
- package/src/engine/tool/tool/apply_patch.ts +313 -0
- package/src/engine/tool/tool/apply_patch.txt +33 -0
- package/src/engine/tool/tool/edit.ts +711 -0
- package/src/engine/tool/tool/edit.txt +10 -0
- package/src/engine/tool/tool/external-directory.ts +49 -0
- package/src/engine/tool/tool/glob.ts +103 -0
- package/src/engine/tool/tool/glob.txt +6 -0
- package/src/engine/tool/tool/grep.ts +156 -0
- package/src/engine/tool/tool/grep.txt +8 -0
- package/src/engine/tool/tool/invalid.ts +21 -0
- package/src/engine/tool/tool/json-schema.ts +164 -0
- package/src/engine/tool/tool/lsp.ts +113 -0
- package/src/engine/tool/tool/lsp.txt +24 -0
- package/src/engine/tool/tool/mcp-websearch.ts +96 -0
- package/src/engine/tool/tool/plan-enter.txt +14 -0
- package/src/engine/tool/tool/plan-exit.txt +13 -0
- package/src/engine/tool/tool/plan.ts +78 -0
- package/src/engine/tool/tool/question.ts +44 -0
- package/src/engine/tool/tool/question.txt +10 -0
- package/src/engine/tool/tool/read.ts +337 -0
- package/src/engine/tool/tool/read.txt +14 -0
- package/src/engine/tool/tool/registry.ts +472 -0
- package/src/engine/tool/tool/repo_clone.ts +80 -0
- package/src/engine/tool/tool/repo_clone.txt +5 -0
- package/src/engine/tool/tool/repo_overview.ts +279 -0
- package/src/engine/tool/tool/repo_overview.txt +4 -0
- package/src/engine/tool/tool/schema.ts +14 -0
- package/src/engine/tool/tool/shell/id.ts +19 -0
- package/src/engine/tool/tool/shell/prompt.ts +295 -0
- package/src/engine/tool/tool/shell/shell.txt +77 -0
- package/src/engine/tool/tool/shell.ts +647 -0
- package/src/engine/tool/tool/skill.ts +75 -0
- package/src/engine/tool/tool/skill.txt +5 -0
- package/src/engine/tool/tool/task.ts +337 -0
- package/src/engine/tool/tool/task.txt +58 -0
- package/src/engine/tool/tool/task_status.ts +179 -0
- package/src/engine/tool/tool/task_status.txt +13 -0
- package/src/engine/tool/tool/todo.ts +57 -0
- package/src/engine/tool/tool/todowrite.txt +167 -0
- package/src/engine/tool/tool/tool.ts +164 -0
- package/src/engine/tool/tool/truncate.ts +160 -0
- package/src/engine/tool/tool/truncation-dir.ts +4 -0
- package/src/engine/tool/tool/webfetch.ts +192 -0
- package/src/engine/tool/tool/webfetch.txt +13 -0
- package/src/engine/tool/tool/websearch.ts +143 -0
- package/src/engine/tool/tool/websearch.txt +14 -0
- package/src/engine/tool/tool/write.ts +104 -0
- package/src/engine/tool/tool/write.txt +8 -0
- package/src/engine/tool/tool.ts +164 -0
- package/src/engine/tool/truncate.ts +160 -0
- package/src/engine/tool/truncation-dir.ts +4 -0
- package/src/engine/tool/webfetch.ts +192 -0
- package/src/engine/tool/webfetch.txt +13 -0
- package/src/engine/tool/websearch.ts +143 -0
- package/src/engine/tool/websearch.txt +14 -0
- package/src/engine/tool/write.ts +104 -0
- package/src/engine/tool/write.txt +8 -0
- package/src/engine/util/archive.ts +17 -0
- package/src/engine/util/bom.ts +31 -0
- package/src/engine/util/data-url.ts +9 -0
- package/src/engine/util/defer.ts +10 -0
- package/src/engine/util/effect-http-client.ts +11 -0
- package/src/engine/util/error.ts +88 -0
- package/src/engine/util/filesystem.ts +252 -0
- package/src/engine/util/format.ts +20 -0
- package/src/engine/util/iife.ts +3 -0
- package/src/engine/util/lazy.ts +20 -0
- package/src/engine/util/local-context.ts +25 -0
- package/src/engine/util/locale.ts +86 -0
- package/src/engine/util/media.ts +26 -0
- package/src/engine/util/process.ts +176 -0
- package/src/engine/util/queue.ts +32 -0
- package/src/engine/util/record.ts +3 -0
- package/src/engine/util/repository.ts +158 -0
- package/src/engine/util/rpc.ts +66 -0
- package/src/engine/util/signal.ts +12 -0
- package/src/engine/util/timeout.ts +13 -0
- package/src/engine/util/token.ts +7 -0
- package/src/engine/util/util/archive.ts +17 -0
- package/src/engine/util/util/bom.ts +31 -0
- package/src/engine/util/util/data-url.ts +9 -0
- package/src/engine/util/util/defer.ts +10 -0
- package/src/engine/util/util/effect-http-client.ts +11 -0
- package/src/engine/util/util/error.ts +88 -0
- package/src/engine/util/util/filesystem.ts +252 -0
- package/src/engine/util/util/format.ts +20 -0
- package/src/engine/util/util/iife.ts +3 -0
- package/src/engine/util/util/lazy.ts +20 -0
- package/src/engine/util/util/local-context.ts +25 -0
- package/src/engine/util/util/locale.ts +86 -0
- package/src/engine/util/util/media.ts +26 -0
- package/src/engine/util/util/process.ts +176 -0
- package/src/engine/util/util/queue.ts +32 -0
- package/src/engine/util/util/record.ts +3 -0
- package/src/engine/util/util/repository.ts +158 -0
- package/src/engine/util/util/rpc.ts +66 -0
- package/src/engine/util/util/signal.ts +12 -0
- package/src/engine/util/util/timeout.ts +13 -0
- package/src/engine/util/util/token.ts +7 -0
- package/src/engine/util/util/which.ts +14 -0
- package/src/engine/util/util/wildcard.ts +59 -0
- package/src/engine/util/which.ts +14 -0
- package/src/engine/util/wildcard.ts +59 -0
- package/src/engine/worktree/index.ts +621 -0
- package/src/rag_worker.ts +519 -0
- package/src/server.ts +201 -0
- package/src/tui.ts +637 -0
- package/tsconfig.json +24 -0
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BoneCode RAG Integration Test
|
|
3
|
+
* Tests: embedding, chunk insert, hybrid search, memory search, LLM prompt
|
|
4
|
+
*/
|
|
5
|
+
require("dotenv").config();
|
|
6
|
+
const { Pool } = require("pg");
|
|
7
|
+
const { v4: uuid } = require("uuid");
|
|
8
|
+
|
|
9
|
+
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
|
|
10
|
+
const BASE = "http://localhost:3000";
|
|
11
|
+
const LLM_BASE = "http://10.0.0.20:1234/v1";
|
|
12
|
+
const EMBED_MODEL = process.env.EMBEDDING_MODEL || "text-embedding-nomic-embed-text-v1.5";
|
|
13
|
+
const CHAT_MODEL = process.env.DEFAULT_MODEL || "qwen3.6-35b-a3b-uncensored-heretic-apex";
|
|
14
|
+
|
|
15
|
+
const jwt = require("jsonwebtoken");
|
|
16
|
+
const token = jwt.sign({ sub: "test-user" }, process.env.JWT_SECRET, { expiresIn: "1h" });
|
|
17
|
+
const auth = { Authorization: "Bearer " + token, "Content-Type": "application/json" };
|
|
18
|
+
|
|
19
|
+
let pass = 0, fail = 0;
|
|
20
|
+
const check = (label, ok, detail = "") => {
|
|
21
|
+
console.log((ok ? "PASS" : "FAIL"), label, detail || "");
|
|
22
|
+
ok ? pass++ : fail++;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
async function embed(text) {
|
|
26
|
+
const r = await fetch(`${LLM_BASE}/embeddings`, {
|
|
27
|
+
method: "POST",
|
|
28
|
+
headers: { "Content-Type": "application/json", Authorization: "Bearer not-needed" },
|
|
29
|
+
body: JSON.stringify({ model: EMBED_MODEL, input: text }),
|
|
30
|
+
});
|
|
31
|
+
const d = await r.json();
|
|
32
|
+
return d.data?.[0]?.embedding;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async function main() {
|
|
36
|
+
console.log("\n[BoneCode RAG Integration Tests]\n");
|
|
37
|
+
|
|
38
|
+
// ── 1. Embedding API ────────────────────────────────────────────────────────
|
|
39
|
+
const emb = await embed("function hello() { return 'world'; }");
|
|
40
|
+
check("Embedding API", emb?.length === 768, `dims=${emb?.length}`);
|
|
41
|
+
|
|
42
|
+
// ── 2. Create project + KB ──────────────────────────────────────────────────
|
|
43
|
+
let r = await fetch(`${BASE}/projects`, {
|
|
44
|
+
method: "POST", headers: auth,
|
|
45
|
+
body: JSON.stringify({ root_commit_hash: "rag-test-" + Date.now(), worktree: "C:/tmp/rag-test", vcs: "git", name: "rag-test", sandboxes: [] }),
|
|
46
|
+
});
|
|
47
|
+
const proj = await r.json();
|
|
48
|
+
check("Create project", r.status === 201, proj.id);
|
|
49
|
+
const projectId = proj.id;
|
|
50
|
+
|
|
51
|
+
r = await fetch(`${BASE}/knowledge-bases`, {
|
|
52
|
+
method: "POST", headers: auth,
|
|
53
|
+
body: JSON.stringify({
|
|
54
|
+
project_id: projectId, name: "rag-test-kb",
|
|
55
|
+
embedding_model: EMBED_MODEL, chunk_strategy: "ast",
|
|
56
|
+
embedding_dimensions: 768, chunk_size: 1500, chunk_overlap: 150,
|
|
57
|
+
total_files: 0, total_chunks: 0,
|
|
58
|
+
}),
|
|
59
|
+
});
|
|
60
|
+
const kb = await r.json();
|
|
61
|
+
check("Create knowledge base", r.status === 201, kb.id);
|
|
62
|
+
const kbId = kb.id;
|
|
63
|
+
|
|
64
|
+
// ── 3. Create code file ─────────────────────────────────────────────────────
|
|
65
|
+
r = await fetch(`${BASE}/code-files`, {
|
|
66
|
+
method: "POST", headers: auth,
|
|
67
|
+
body: JSON.stringify({
|
|
68
|
+
knowledge_base_id: kbId, project_id: projectId,
|
|
69
|
+
file_path: "C:/tmp/rag-test/hello.ts", language: "typescript",
|
|
70
|
+
file_hash: "a".repeat(64), file_size_bytes: 200,
|
|
71
|
+
total_chunks: 2, last_modified_at: new Date().toISOString(),
|
|
72
|
+
}),
|
|
73
|
+
});
|
|
74
|
+
const cf = await r.json();
|
|
75
|
+
check("Create code file", r.status === 201, cf.id);
|
|
76
|
+
const codeFileId = cf.id;
|
|
77
|
+
|
|
78
|
+
// ── 4. Insert chunks with real embeddings ───────────────────────────────────
|
|
79
|
+
const chunks = [
|
|
80
|
+
{ content: "function hello() { return 'world'; }", symbol_name: "hello", symbol_type: "function" },
|
|
81
|
+
{ content: "class Greeter { greet(name: string) { return `Hello ${name}`; } }", symbol_name: "Greeter", symbol_type: "class" },
|
|
82
|
+
];
|
|
83
|
+
|
|
84
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
85
|
+
const c = chunks[i];
|
|
86
|
+
const embedding = await embed(c.content);
|
|
87
|
+
const embStr = "[" + embedding.join(",") + "]";
|
|
88
|
+
await pool.query(
|
|
89
|
+
`INSERT INTO code_chunks (id, code_file_id, knowledge_base_id, project_id, content, start_line, end_line, chunk_index, language, symbol_name, symbol_type, embedding)
|
|
90
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12::vector)`,
|
|
91
|
+
[uuid(), codeFileId, kbId, projectId, c.content, i * 10 + 1, i * 10 + 5, i, "typescript", c.symbol_name, c.symbol_type, embStr]
|
|
92
|
+
);
|
|
93
|
+
check(`Insert chunk ${i + 1} with embedding`, true, c.symbol_name);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// ── 5. Hybrid search via stored function ────────────────────────────────────
|
|
97
|
+
const queryEmb = await embed("how to greet someone");
|
|
98
|
+
const queryEmbStr = "[" + queryEmb.join(",") + "]";
|
|
99
|
+
|
|
100
|
+
const searchResult = await pool.query(
|
|
101
|
+
"SELECT * FROM bonecode_hybrid_search($1, $2::vector, $3, NULL, NULL, 5)",
|
|
102
|
+
[kbId, queryEmbStr, "greet hello"]
|
|
103
|
+
);
|
|
104
|
+
check("Hybrid search returns results", searchResult.rows.length > 0, `count=${searchResult.rows.length}`);
|
|
105
|
+
|
|
106
|
+
if (searchResult.rows.length > 0) {
|
|
107
|
+
const top = searchResult.rows[0];
|
|
108
|
+
check("Top result has content", !!top.content, top.content?.slice(0, 50));
|
|
109
|
+
check("Top result has rrf_score > 0", top.rrf_score > 0, `score=${parseFloat(top.rrf_score).toFixed(4)}`);
|
|
110
|
+
check("Top result has vector_score", top.vector_score > 0, `vscore=${parseFloat(top.vector_score).toFixed(4)}`);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// ── 6. Memory entry with embedding ─────────────────────────────────────────
|
|
114
|
+
const sessionId = uuid(); // fake session for memory test
|
|
115
|
+
const memEmb = await embed("The user prefers TypeScript over JavaScript");
|
|
116
|
+
const memEmbStr = "[" + memEmb.join(",") + "]";
|
|
117
|
+
|
|
118
|
+
await pool.query(
|
|
119
|
+
`INSERT INTO memory_entrys (id, session_id, project_id, memory_type, content, importance, access_count, state, embedding)
|
|
120
|
+
VALUES ($1, $2, $3, $4, $5, $6, 0, 'active', $7::vector)`,
|
|
121
|
+
[uuid(), sessionId, projectId, "preference", "The user prefers TypeScript over JavaScript", 0.8, memEmbStr]
|
|
122
|
+
);
|
|
123
|
+
check("Insert memory entry with embedding", true);
|
|
124
|
+
|
|
125
|
+
const memSearch = await pool.query(
|
|
126
|
+
"SELECT * FROM bonecode_memory_search($1, $2, $3::vector, $4, NULL, 5)",
|
|
127
|
+
[sessionId, projectId, memEmbStr, "TypeScript preference"]
|
|
128
|
+
);
|
|
129
|
+
check("Memory search returns results", memSearch.rows.length > 0, `count=${memSearch.rows.length}`);
|
|
130
|
+
|
|
131
|
+
// ── 7. LLM chat with RAG context ────────────────────────────────────────────
|
|
132
|
+
const ragContext = searchResult.rows.map((row, i) =>
|
|
133
|
+
`[${i + 1}] ${row.file_path}:${row.start_line}-${row.end_line}\n\`\`\`typescript\n${row.content}\n\`\`\``
|
|
134
|
+
).join("\n\n");
|
|
135
|
+
|
|
136
|
+
const systemPrompt = `You are a code assistant. Here is relevant code context:\n\n${ragContext}`;
|
|
137
|
+
const llmR = await fetch(`${LLM_BASE}/chat/completions`, {
|
|
138
|
+
method: "POST",
|
|
139
|
+
headers: { "Content-Type": "application/json", Authorization: "Bearer not-needed" },
|
|
140
|
+
body: JSON.stringify({
|
|
141
|
+
model: CHAT_MODEL,
|
|
142
|
+
messages: [
|
|
143
|
+
{ role: "system", content: systemPrompt },
|
|
144
|
+
{ role: "user", content: "What does the hello function return?" },
|
|
145
|
+
],
|
|
146
|
+
max_tokens: 512,
|
|
147
|
+
temperature: 0,
|
|
148
|
+
}),
|
|
149
|
+
});
|
|
150
|
+
const llmData = await llmR.json();
|
|
151
|
+
const msg = llmData.choices?.[0]?.message;
|
|
152
|
+
// Qwen3 reasoning models put final answer in content, thinking in reasoning_content
|
|
153
|
+
const reply = (msg?.content?.trim() || msg?.reasoning_content?.trim() || "").slice(0, 200);
|
|
154
|
+
check("LLM answers with RAG context", llmR.status === 200 && !!reply, `reply="${reply?.slice(0, 60)}"`);
|
|
155
|
+
|
|
156
|
+
// ── 8. Full /v2/session prompt flow ─────────────────────────────────────────
|
|
157
|
+
// Create a real session and send a prompt through the compat API
|
|
158
|
+
r = await fetch(`${BASE}/v2/session`, {
|
|
159
|
+
method: "POST", headers: auth,
|
|
160
|
+
body: JSON.stringify({ title: "Prompt Test", directory: "C:/tmp" }),
|
|
161
|
+
});
|
|
162
|
+
const sess = await r.json();
|
|
163
|
+
check("Create session for prompt test", r.status === 201, sess.id);
|
|
164
|
+
|
|
165
|
+
// Note: /v2/session/:id/prompt streams SSE — we just verify it starts correctly
|
|
166
|
+
const promptController = new AbortController();
|
|
167
|
+
const promptTimeout = setTimeout(() => promptController.abort(), 8000);
|
|
168
|
+
try {
|
|
169
|
+
r = await fetch(`${BASE}/v2/session/${sess.id}/prompt`, {
|
|
170
|
+
method: "POST", headers: auth,
|
|
171
|
+
body: JSON.stringify({ content: "What is 2+2?", modelID: CHAT_MODEL, providerID: "openai_compatible" }),
|
|
172
|
+
signal: promptController.signal,
|
|
173
|
+
});
|
|
174
|
+
clearTimeout(promptTimeout);
|
|
175
|
+
check("POST /v2/session/:id/prompt starts", r.status === 200, `content-type=${r.headers.get("content-type")}`);
|
|
176
|
+
} catch (e) {
|
|
177
|
+
clearTimeout(promptTimeout);
|
|
178
|
+
// AbortError means SSE started streaming (expected)
|
|
179
|
+
check("POST /v2/session/:id/prompt starts (SSE)", e.name === "AbortError", e.name);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// ── Summary ─────────────────────────────────────────────────────────────────
|
|
183
|
+
await pool.end();
|
|
184
|
+
console.log("\n-------------------------------------");
|
|
185
|
+
console.log(`Results: ${pass} passed, ${fail} failed`);
|
|
186
|
+
if (fail > 0) process.exit(1);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
main().catch(e => { console.error("FATAL:", e.message, e.stack); process.exit(1); });
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require("dotenv").config();
|
|
2
|
+
const { streamText } = require("ai");
|
|
3
|
+
const { createOpenAI } = require("@ai-sdk/openai");
|
|
4
|
+
const { z } = require("zod");
|
|
5
|
+
|
|
6
|
+
(async () => {
|
|
7
|
+
const model = createOpenAI({
|
|
8
|
+
apiKey: process.env.OPENAI_API_KEY || "not-needed",
|
|
9
|
+
baseURL: process.env.OPENAI_BASE_URL,
|
|
10
|
+
})(process.env.DEFAULT_MODEL);
|
|
11
|
+
|
|
12
|
+
console.log("Streaming from:", process.env.DEFAULT_MODEL);
|
|
13
|
+
|
|
14
|
+
const result = streamText({
|
|
15
|
+
model,
|
|
16
|
+
messages: [{ role: "user", content: "Say hello in one word." }],
|
|
17
|
+
maxTokens: 200,
|
|
18
|
+
temperature: 0,
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
const events = [];
|
|
22
|
+
for await (const event of result.fullStream) {
|
|
23
|
+
events.push({ type: event.type, data: JSON.stringify(event).slice(0, 100) });
|
|
24
|
+
console.log("Event:", event.type, JSON.stringify(event).slice(0, 120));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
console.log("\nTotal events:", events.length);
|
|
28
|
+
console.log("Event types:", [...new Set(events.map(e => e.type))].join(", "));
|
|
29
|
+
|
|
30
|
+
try {
|
|
31
|
+
const text = await result.text;
|
|
32
|
+
console.log("result.text:", JSON.stringify(text));
|
|
33
|
+
} catch (e) {
|
|
34
|
+
console.log("result.text error:", e.message);
|
|
35
|
+
}
|
|
36
|
+
})().catch(e => console.error("FATAL:", e.message));
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BoneCode: WebSocket + Ingestion Saga Integration Test
|
|
3
|
+
*
|
|
4
|
+
* Tests:
|
|
5
|
+
* 1. WebSocket connection to session_events channel
|
|
6
|
+
* 2. Receiving events via WebSocket when session state changes
|
|
7
|
+
* 3. IndexingJob creation → worker picks it up → saga runs → KB transitions to ready
|
|
8
|
+
* 4. State machine enforcement (invalid transitions rejected)
|
|
9
|
+
*/
|
|
10
|
+
require("dotenv").config();
|
|
11
|
+
const { Pool } = require("pg");
|
|
12
|
+
const { v4: uuid } = require("uuid");
|
|
13
|
+
const WebSocket = require("ws");
|
|
14
|
+
const jwt = require("jsonwebtoken");
|
|
15
|
+
const fs = require("fs");
|
|
16
|
+
const path = require("path");
|
|
17
|
+
const os = require("os");
|
|
18
|
+
|
|
19
|
+
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
|
|
20
|
+
const BASE = "http://localhost:3000";
|
|
21
|
+
const WS_BASE = "ws://localhost:3000";
|
|
22
|
+
const token = jwt.sign({ sub: "test-user" }, process.env.JWT_SECRET, { expiresIn: "1h" });
|
|
23
|
+
const auth = { Authorization: "Bearer " + token, "Content-Type": "application/json" };
|
|
24
|
+
|
|
25
|
+
let pass = 0, fail = 0;
|
|
26
|
+
const check = (label, ok, detail = "") => {
|
|
27
|
+
console.log((ok ? "PASS" : "FAIL"), label, detail || "");
|
|
28
|
+
ok ? pass++ : fail++;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
async function sleep(ms) { return new Promise(r => setTimeout(r, ms)); }
|
|
32
|
+
|
|
33
|
+
async function main() {
|
|
34
|
+
console.log("\n[BoneCode WebSocket + Saga Tests]\n");
|
|
35
|
+
|
|
36
|
+
// ── 1. WebSocket: connect to session_events channel ─────────────────────────
|
|
37
|
+
const wsEvents = [];
|
|
38
|
+
const ws = new WebSocket(`${WS_BASE}/ws?channel=session_events&token=${token}`);
|
|
39
|
+
|
|
40
|
+
await new Promise((resolve, reject) => {
|
|
41
|
+
ws.on("open", resolve);
|
|
42
|
+
ws.on("error", reject);
|
|
43
|
+
setTimeout(() => reject(new Error("WS connect timeout")), 5000);
|
|
44
|
+
});
|
|
45
|
+
check("WebSocket connects to session_events", ws.readyState === WebSocket.OPEN);
|
|
46
|
+
|
|
47
|
+
ws.on("message", (data) => {
|
|
48
|
+
try { wsEvents.push(JSON.parse(data.toString())); } catch {}
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// Wait for the 'connected' message
|
|
52
|
+
await sleep(500);
|
|
53
|
+
const connMsg = wsEvents.find(e => e.type === "connected");
|
|
54
|
+
check("WebSocket receives 'connected' message", !!connMsg, connMsg ? `channel=${connMsg.channel}` : "");
|
|
55
|
+
|
|
56
|
+
// ── 2. WebSocket: create session and verify event arrives ───────────────────
|
|
57
|
+
const r1 = await fetch(`${BASE}/v2/session`, {
|
|
58
|
+
method: "POST", headers: auth,
|
|
59
|
+
body: JSON.stringify({ title: "WS Test Session", directory: "C:/tmp" }),
|
|
60
|
+
});
|
|
61
|
+
const sess = await r1.json();
|
|
62
|
+
check("Create session for WS test", r1.status === 201, sess.id);
|
|
63
|
+
|
|
64
|
+
// Give the event bus time to deliver
|
|
65
|
+
await sleep(1000);
|
|
66
|
+
|
|
67
|
+
// The SessionCreated event should have been broadcast to the WS channel
|
|
68
|
+
const sessionEvent = wsEvents.find(e => e.session_id === sess.id || e.id === sess.id);
|
|
69
|
+
check("SessionCreated event received via WebSocket", !!sessionEvent, sessionEvent ? JSON.stringify(sessionEvent).slice(0, 80) : "no event");
|
|
70
|
+
|
|
71
|
+
// ── 3. State machine: invalid transition rejected ───────────────────────────
|
|
72
|
+
// Sessions start in 'created' state. Trying to go directly to 'archived' should fail.
|
|
73
|
+
const r2 = await fetch(`${BASE}/sessions/${sess.id}`, {
|
|
74
|
+
method: "PUT", headers: auth,
|
|
75
|
+
body: JSON.stringify({ state: "archived" }),
|
|
76
|
+
});
|
|
77
|
+
// created → archived is not a valid transition (must go created → active → ... → archived)
|
|
78
|
+
check("Invalid state transition rejected (created→archived)", r2.status === 422, `status=${r2.status}`);
|
|
79
|
+
|
|
80
|
+
// Valid transition: created → active
|
|
81
|
+
const r3 = await fetch(`${BASE}/sessions/${sess.id}`, {
|
|
82
|
+
method: "PUT", headers: auth,
|
|
83
|
+
body: JSON.stringify({ state: "active" }),
|
|
84
|
+
});
|
|
85
|
+
check("Valid state transition accepted (created→active)", r3.status === 200, `status=${r3.status}`);
|
|
86
|
+
|
|
87
|
+
// ── 4. Ingestion saga: create KB + job, worker processes it ─────────────────
|
|
88
|
+
// Create a temp directory with some test files
|
|
89
|
+
const tmpDir = path.join(os.tmpdir(), "bonecode-test-" + Date.now());
|
|
90
|
+
fs.mkdirSync(tmpDir, { recursive: true });
|
|
91
|
+
fs.writeFileSync(path.join(tmpDir, "hello.ts"), `
|
|
92
|
+
export function hello(name: string): string {
|
|
93
|
+
return \`Hello, \${name}!\`;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export class Greeter {
|
|
97
|
+
constructor(private prefix: string) {}
|
|
98
|
+
greet(name: string): string {
|
|
99
|
+
return \`\${this.prefix} \${name}\`;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
`);
|
|
103
|
+
fs.writeFileSync(path.join(tmpDir, "utils.ts"), `
|
|
104
|
+
export function add(a: number, b: number): number {
|
|
105
|
+
return a + b;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export function multiply(a: number, b: number): number {
|
|
109
|
+
return a * b;
|
|
110
|
+
}
|
|
111
|
+
`);
|
|
112
|
+
|
|
113
|
+
// Create project + KB
|
|
114
|
+
const projR = await fetch(`${BASE}/projects`, {
|
|
115
|
+
method: "POST", headers: auth,
|
|
116
|
+
body: JSON.stringify({ root_commit_hash: "saga-test-" + Date.now(), worktree: tmpDir, vcs: "git", name: "saga-test", sandboxes: [] }),
|
|
117
|
+
});
|
|
118
|
+
const proj = await projR.json();
|
|
119
|
+
check("Create project for saga test", projR.status === 201, proj.id);
|
|
120
|
+
|
|
121
|
+
const kbR = await fetch(`${BASE}/knowledge-bases`, {
|
|
122
|
+
method: "POST", headers: auth,
|
|
123
|
+
body: JSON.stringify({
|
|
124
|
+
project_id: proj.id, name: "saga-test-kb",
|
|
125
|
+
embedding_model: process.env.EMBEDDING_MODEL || "text-embedding-nomic-embed-text-v1.5",
|
|
126
|
+
chunk_strategy: "ast", embedding_dimensions: 768,
|
|
127
|
+
chunk_size: 1500, chunk_overlap: 150, total_files: 0, total_chunks: 0,
|
|
128
|
+
}),
|
|
129
|
+
});
|
|
130
|
+
const kb = await kbR.json();
|
|
131
|
+
check("Create knowledge base for saga test", kbR.status === 201, kb.id);
|
|
132
|
+
check("KB starts in 'empty' state", kb.state === "empty", `state=${kb.state}`);
|
|
133
|
+
|
|
134
|
+
// Create an indexing job — this is what the worker picks up
|
|
135
|
+
const jobR = await fetch(`${BASE}/indexing-jobs`, {
|
|
136
|
+
method: "POST", headers: auth,
|
|
137
|
+
body: JSON.stringify({
|
|
138
|
+
knowledge_base_id: kb.id, project_id: proj.id,
|
|
139
|
+
job_type: "full_index",
|
|
140
|
+
file_paths: JSON.stringify([path.join(tmpDir, "hello.ts"), path.join(tmpDir, "utils.ts")]),
|
|
141
|
+
files_total: 2, files_processed: 0, chunks_total: 0, chunks_embedded: 0,
|
|
142
|
+
}),
|
|
143
|
+
});
|
|
144
|
+
const job = await jobR.json();
|
|
145
|
+
check("Create indexing job", jobR.status === 201, `id=${job.id} state=${job.state}`);
|
|
146
|
+
check("Job starts in 'queued' state", job.state === "queued", `state=${job.state}`);
|
|
147
|
+
|
|
148
|
+
// Wait for the worker to process it (worker polls every 2s)
|
|
149
|
+
console.log(" Waiting for worker to process job (up to 30s)...");
|
|
150
|
+
let kbReady = false;
|
|
151
|
+
for (let i = 0; i < 15; i++) {
|
|
152
|
+
await sleep(2000);
|
|
153
|
+
const kbCheck = await fetch(`${BASE}/knowledge-bases/${kb.id}`, { headers: auth });
|
|
154
|
+
const kbData = await kbCheck.json();
|
|
155
|
+
if (kbData.state === "ready") { kbReady = true; break; }
|
|
156
|
+
if (kbData.state === "error") { check("KB saga failed", false, `state=${kbData.state}`); break; }
|
|
157
|
+
process.stdout.write(` KB state: ${kbData.state}...\r`);
|
|
158
|
+
}
|
|
159
|
+
console.log("");
|
|
160
|
+
|
|
161
|
+
check("KB transitions to 'ready' after saga", kbReady, kbReady ? "state=ready" : "timed out");
|
|
162
|
+
|
|
163
|
+
if (kbReady) {
|
|
164
|
+
// Verify chunks were created
|
|
165
|
+
const chunksR = await fetch(`${BASE}/knowledge-bases/${kb.id}/files`, { headers: auth });
|
|
166
|
+
const chunksData = await chunksR.json();
|
|
167
|
+
check("Code files indexed", chunksData.total >= 2, `files=${chunksData.total}`);
|
|
168
|
+
|
|
169
|
+
const chunkCount = await pool.query(
|
|
170
|
+
"SELECT COUNT(*) as count FROM code_chunks WHERE knowledge_base_id = $1",
|
|
171
|
+
[kb.id]
|
|
172
|
+
);
|
|
173
|
+
const numChunks = parseInt(chunkCount.rows[0].count);
|
|
174
|
+
check("Code chunks created with embeddings", numChunks > 0, `chunks=${numChunks}`);
|
|
175
|
+
|
|
176
|
+
const embeddedCount = await pool.query(
|
|
177
|
+
"SELECT COUNT(*) as count FROM code_chunks WHERE knowledge_base_id = $1 AND embedding IS NOT NULL",
|
|
178
|
+
[kb.id]
|
|
179
|
+
);
|
|
180
|
+
const numEmbedded = parseInt(embeddedCount.rows[0].count);
|
|
181
|
+
check("All chunks have embeddings", numEmbedded === numChunks, `embedded=${numEmbedded}/${numChunks}`);
|
|
182
|
+
|
|
183
|
+
// Verify hybrid search works on the indexed content
|
|
184
|
+
const embR = await fetch("http://10.0.0.20:1234/v1/embeddings", {
|
|
185
|
+
method: "POST",
|
|
186
|
+
headers: { "Content-Type": "application/json", Authorization: "Bearer not-needed" },
|
|
187
|
+
body: JSON.stringify({ model: process.env.EMBEDDING_MODEL, input: "greet someone by name" }),
|
|
188
|
+
});
|
|
189
|
+
const embData = await embR.json();
|
|
190
|
+
const qEmb = embData.data?.[0]?.embedding;
|
|
191
|
+
const searchResult = await pool.query(
|
|
192
|
+
"SELECT * FROM bonecode_hybrid_search($1, $2::vector, $3, NULL, NULL, 5)",
|
|
193
|
+
[kb.id, "[" + qEmb.join(",") + "]", "greet name"]
|
|
194
|
+
);
|
|
195
|
+
check("Hybrid search finds indexed content", searchResult.rows.length > 0, `results=${searchResult.rows.length}`);
|
|
196
|
+
if (searchResult.rows.length > 0) {
|
|
197
|
+
check("Top result is relevant", searchResult.rows[0].content.includes("greet") || searchResult.rows[0].content.includes("Greeter"), searchResult.rows[0].content.slice(0, 60));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// ── 5. Verify job state machine ─────────────────────────────────────────────
|
|
202
|
+
const jobCheck = await fetch(`${BASE}/indexing-jobs/${job.id}`, { headers: auth });
|
|
203
|
+
const jobData = await jobCheck.json();
|
|
204
|
+
check("Job transitions to 'done' after saga", jobData.state === "done", `state=${jobData.state}`);
|
|
205
|
+
|
|
206
|
+
// ── Cleanup ──────────────────────────────────────────────────────────────────
|
|
207
|
+
ws.close();
|
|
208
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
209
|
+
await pool.end();
|
|
210
|
+
|
|
211
|
+
console.log("\n-------------------------------------");
|
|
212
|
+
console.log(`Results: ${pass} passed, ${fail} failed`);
|
|
213
|
+
if (fail > 0) process.exit(1);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
main().catch(e => { console.error("FATAL:", e.message, e.stack); process.exit(1); });
|