bonecode 1.1.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/bin/bonecode +47 -42
- package/compat/opencode_adapter.ts +188 -17
- 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 +7 -4
- package/src/cli.ts +247 -5
- package/src/export.ts +122 -0
- package/src/mdns.ts +53 -0
- package/src/server.ts +32 -0
- package/src/stats.ts +290 -0
- package/src/tui.ts +749 -248
package/bin/bonecode
CHANGED
|
@@ -1,62 +1,67 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
// Resolves and runs the CLI via ts-node (dev) or compiled JS (prod).
|
|
2
|
+
"use strict";
|
|
4
3
|
|
|
5
4
|
const path = require("path");
|
|
6
5
|
const { spawnSync } = require("child_process");
|
|
7
6
|
const fs = require("fs");
|
|
8
|
-
const os = require("os");
|
|
9
7
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
// Resolve the package root (two levels up from bin/)
|
|
13
|
-
const scriptPath = fs.realpathSync(__filename);
|
|
14
|
-
const pkgRoot = path.dirname(path.dirname(scriptPath));
|
|
8
|
+
// Resolve package root (one level up from bin/)
|
|
9
|
+
const pkgRoot = path.dirname(path.dirname(fs.realpathSync(__filename)));
|
|
15
10
|
|
|
11
|
+
// Prefer compiled JS — always built by `npm run build`
|
|
16
12
|
const cliJs = path.join(pkgRoot, "dist", "src", "cli.js");
|
|
17
|
-
|
|
13
|
+
if (fs.existsSync(cliJs)) {
|
|
14
|
+
const result = spawnSync(process.execPath, [cliJs, ...process.argv.slice(2)], {
|
|
15
|
+
stdio: "inherit",
|
|
16
|
+
cwd: process.cwd(),
|
|
17
|
+
env: process.env,
|
|
18
|
+
});
|
|
19
|
+
process.exit(result.status ?? 0);
|
|
20
|
+
}
|
|
18
21
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
// Dev fallback: try tsx (works without compilation, no .cmd issues)
|
|
23
|
+
const cliTs = path.join(pkgRoot, "src", "cli.ts");
|
|
24
|
+
if (!fs.existsSync(cliTs)) {
|
|
25
|
+
console.error("BoneCode: CLI entry point not found.");
|
|
26
|
+
console.error(" Run `npm run build` inside the BoneCode directory first.");
|
|
27
|
+
process.exit(1);
|
|
25
28
|
}
|
|
26
29
|
|
|
27
|
-
|
|
28
|
-
|
|
30
|
+
// Find tsx in local node_modules
|
|
31
|
+
const tsxLocal = path.join(pkgRoot, "node_modules", ".bin", "tsx");
|
|
32
|
+
const tsxLocalCmd = tsxLocal + (process.platform === "win32" ? ".cmd" : "");
|
|
33
|
+
|
|
34
|
+
if (fs.existsSync(tsxLocalCmd)) {
|
|
35
|
+
const result = spawnSync(tsxLocalCmd, [cliTs, ...process.argv.slice(2)], {
|
|
29
36
|
stdio: "inherit",
|
|
30
37
|
cwd: process.cwd(),
|
|
31
38
|
env: process.env,
|
|
32
|
-
shell:
|
|
39
|
+
shell: process.platform === "win32",
|
|
33
40
|
});
|
|
34
|
-
|
|
35
|
-
if (result.error) {
|
|
36
|
-
// If the command failed (e.g. .cmd not found), try with shell: true
|
|
37
|
-
const result2 = spawnSync(cmd, args, {
|
|
38
|
-
stdio: "inherit",
|
|
39
|
-
cwd: process.cwd(),
|
|
40
|
-
env: process.env,
|
|
41
|
-
shell: true,
|
|
42
|
-
});
|
|
43
|
-
process.exit(result2.status ?? 0);
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
41
|
process.exit(result.status ?? 0);
|
|
48
42
|
}
|
|
49
43
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
console.error("BoneCode: could not find CLI entry point.");
|
|
60
|
-
console.error(" Run `npm run build` to compile, or ensure ts-node is installed.");
|
|
44
|
+
// Last resort: npx tsx (downloads on first run)
|
|
45
|
+
console.error("BoneCode: compiled JS not found. Building now...");
|
|
46
|
+
const build = spawnSync(
|
|
47
|
+
process.platform === "win32" ? "npm.cmd" : "npm",
|
|
48
|
+
["run", "build"],
|
|
49
|
+
{ stdio: "inherit", cwd: pkgRoot, shell: process.platform === "win32" }
|
|
50
|
+
);
|
|
51
|
+
if (build.status !== 0) {
|
|
52
|
+
console.error("Build failed. Run `npm run build` manually in the BoneCode directory.");
|
|
61
53
|
process.exit(1);
|
|
62
54
|
}
|
|
55
|
+
|
|
56
|
+
// Retry with compiled JS
|
|
57
|
+
if (fs.existsSync(cliJs)) {
|
|
58
|
+
const result = spawnSync(process.execPath, [cliJs, ...process.argv.slice(2)], {
|
|
59
|
+
stdio: "inherit",
|
|
60
|
+
cwd: process.cwd(),
|
|
61
|
+
env: process.env,
|
|
62
|
+
});
|
|
63
|
+
process.exit(result.status ?? 0);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
console.error("Build succeeded but CLI not found at:", cliJs);
|
|
67
|
+
process.exit(1);
|
|
@@ -11,7 +11,9 @@
|
|
|
11
11
|
* GET /v2/session/:id → get session
|
|
12
12
|
* DELETE /v2/session/:id → delete_session
|
|
13
13
|
* POST /v2/session/:id/prompt → run_agent_turn (streaming SSE)
|
|
14
|
-
*
|
|
14
|
+
* POST /v2/session/:id/cancel → cancel in-flight agent turn
|
|
15
|
+
* POST /v2/session/:id/subagent → spawn child session
|
|
16
|
+
* GET /v2/session/:id/message → list messages (cursor pagination)
|
|
15
17
|
* GET /v2/session/:id/message/:msgId → get message
|
|
16
18
|
* GET /v2/event → SSE event stream (global)
|
|
17
19
|
* GET /v2/provider → list providers
|
|
@@ -86,10 +88,12 @@ compatRouter.post("/v2/session", async (req: Request, res: Response) => {
|
|
|
86
88
|
}
|
|
87
89
|
});
|
|
88
90
|
|
|
89
|
-
// GET /v2/session — list sessions
|
|
91
|
+
// GET /v2/session — list sessions (with optional cursor pagination)
|
|
90
92
|
compatRouter.get("/v2/session", async (req: Request, res: Response) => {
|
|
91
93
|
try {
|
|
92
|
-
const { projectID, directory, search } = req.query;
|
|
94
|
+
const { projectID, directory, search, cursor, limit: limitStr, direction = "next", roots } = req.query;
|
|
95
|
+
const limit = Math.min(parseInt(String(limitStr || "100")), 200);
|
|
96
|
+
|
|
93
97
|
let sql = `SELECT * FROM sessions WHERE state != 'deleted'`;
|
|
94
98
|
const params: unknown[] = [];
|
|
95
99
|
let idx = 1;
|
|
@@ -97,11 +101,43 @@ compatRouter.get("/v2/session", async (req: Request, res: Response) => {
|
|
|
97
101
|
if (projectID) { sql += ` AND project_id = $${idx++}`; params.push(projectID); }
|
|
98
102
|
if (directory) { sql += ` AND directory = $${idx++}`; params.push(directory); }
|
|
99
103
|
if (search) { sql += ` AND title ILIKE $${idx++}`; params.push(`%${search}%`); }
|
|
104
|
+
if (roots === "true") { sql += ` AND parent_id IS NULL`; }
|
|
105
|
+
|
|
106
|
+
// Cursor-based keyset pagination (opencode v2 pattern)
|
|
107
|
+
if (cursor) {
|
|
108
|
+
try {
|
|
109
|
+
const decoded = JSON.parse(Buffer.from(String(cursor), "base64url").toString("utf8"));
|
|
110
|
+
const { id, time } = decoded;
|
|
111
|
+
if (direction === "next") {
|
|
112
|
+
sql += ` AND (updated_at < $${idx++} OR (updated_at = $${idx++} AND id < $${idx++}))`;
|
|
113
|
+
params.push(new Date(time), new Date(time), id);
|
|
114
|
+
idx += 2; // already incremented above
|
|
115
|
+
} else {
|
|
116
|
+
sql += ` AND (updated_at > $${idx++} OR (updated_at = $${idx++} AND id > $${idx++}))`;
|
|
117
|
+
params.push(new Date(time), new Date(time), id);
|
|
118
|
+
idx += 2;
|
|
119
|
+
}
|
|
120
|
+
} catch {}
|
|
121
|
+
}
|
|
100
122
|
|
|
101
|
-
|
|
123
|
+
const orderDir = direction === "previous" ? "ASC" : "DESC";
|
|
124
|
+
sql += ` ORDER BY updated_at ${orderDir}, id ${orderDir} LIMIT $${idx++}`;
|
|
125
|
+
params.push(limit + 1); // fetch one extra to detect "more"
|
|
102
126
|
|
|
103
127
|
const result = await pool.query(sql, params);
|
|
104
|
-
|
|
128
|
+
const rows = result.rows;
|
|
129
|
+
const more = rows.length > limit;
|
|
130
|
+
const slice = more ? rows.slice(0, limit) : rows;
|
|
131
|
+
const items = direction === "previous" ? slice.reverse() : slice;
|
|
132
|
+
|
|
133
|
+
const nextCursor = more && slice.length > 0
|
|
134
|
+
? Buffer.from(JSON.stringify({
|
|
135
|
+
id: slice[slice.length - 1].id,
|
|
136
|
+
time: new Date(slice[slice.length - 1].updated_at).getTime(),
|
|
137
|
+
})).toString("base64url")
|
|
138
|
+
: undefined;
|
|
139
|
+
|
|
140
|
+
res.json(items.map(toOpenCodeSession));
|
|
105
141
|
} catch (e: any) {
|
|
106
142
|
res.status(500).json({ error: { code: "LIST_FAILED", message: e.message } });
|
|
107
143
|
}
|
|
@@ -128,6 +164,35 @@ compatRouter.delete("/v2/session/:id", async (req: Request, res: Response) => {
|
|
|
128
164
|
}
|
|
129
165
|
});
|
|
130
166
|
|
|
167
|
+
// POST /v2/session/:id/cancel — cancel an in-flight agent turn
|
|
168
|
+
compatRouter.post("/v2/session/:id/cancel", async (req: Request, res: Response) => {
|
|
169
|
+
const session_id = req.params.id;
|
|
170
|
+
try {
|
|
171
|
+
// Mark any running agents as cancelled
|
|
172
|
+
await pool.query(
|
|
173
|
+
`UPDATE agent_instances SET state = 'cancelled', updated_at = NOW()
|
|
174
|
+
WHERE session_id = $1 AND state IN ('running', 'waiting_for_tool', 'compacting')`,
|
|
175
|
+
[session_id]
|
|
176
|
+
);
|
|
177
|
+
// Move session back to active so the user can keep working
|
|
178
|
+
await pool.query(
|
|
179
|
+
`UPDATE sessions SET state = 'active', updated_at = NOW()
|
|
180
|
+
WHERE id = $1 AND state IN ('busy', 'compacting')`,
|
|
181
|
+
[session_id]
|
|
182
|
+
);
|
|
183
|
+
// Notify subscribers
|
|
184
|
+
await eventBus.publish("AgentFailed", {
|
|
185
|
+
agent_id: "",
|
|
186
|
+
session_id,
|
|
187
|
+
error: "cancelled by user",
|
|
188
|
+
failed_at: new Date().toISOString(),
|
|
189
|
+
}, "CompatAdapter");
|
|
190
|
+
res.json({ ok: true });
|
|
191
|
+
} catch (e: any) {
|
|
192
|
+
res.status(500).json({ error: { code: "CANCEL_FAILED", message: e.message } });
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
|
|
131
196
|
// POST /v2/session/:id/prompt — run agent turn (streaming SSE)
|
|
132
197
|
compatRouter.post("/v2/session/:id/prompt", requireAuth, async (req: Request, res: Response) => {
|
|
133
198
|
const session_id = req.params.id;
|
|
@@ -211,24 +276,109 @@ compatRouter.post("/v2/session/:id/prompt", requireAuth, async (req: Request, re
|
|
|
211
276
|
}
|
|
212
277
|
});
|
|
213
278
|
|
|
214
|
-
// GET /v2/session/:id/message — list messages
|
|
279
|
+
// GET /v2/session/:id/message — list messages (with cursor pagination)
|
|
215
280
|
compatRouter.get("/v2/session/:id/message", async (req: Request, res: Response) => {
|
|
216
281
|
try {
|
|
217
|
-
const
|
|
218
|
-
|
|
282
|
+
const { cursor, limit: limitStr, direction = "next" } = req.query;
|
|
283
|
+
const limit = Math.min(parseInt(String(limitStr || "200")), 500);
|
|
284
|
+
|
|
285
|
+
let sql = `SELECT m.*, json_agg(p.* ORDER BY p.order_index) FILTER (WHERE p.id IS NOT NULL) as parts
|
|
219
286
|
FROM messages m
|
|
220
287
|
LEFT JOIN parts p ON p.message_id = m.id
|
|
221
|
-
WHERE m.session_id = $1
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
)
|
|
226
|
-
|
|
288
|
+
WHERE m.session_id = $1`;
|
|
289
|
+
const params: unknown[] = [req.params.id];
|
|
290
|
+
let idx = 2;
|
|
291
|
+
|
|
292
|
+
if (cursor) {
|
|
293
|
+
try {
|
|
294
|
+
const decoded = JSON.parse(Buffer.from(String(cursor), "base64url").toString("utf8"));
|
|
295
|
+
const { id, time } = decoded;
|
|
296
|
+
if (direction === "next") {
|
|
297
|
+
sql += ` AND (m.created_at < $${idx++} OR (m.created_at = $${idx++} AND m.id < $${idx++}))`;
|
|
298
|
+
params.push(new Date(time), new Date(time), id);
|
|
299
|
+
idx += 2;
|
|
300
|
+
} else {
|
|
301
|
+
sql += ` AND (m.created_at > $${idx++} OR (m.created_at = $${idx++} AND m.id > $${idx++}))`;
|
|
302
|
+
params.push(new Date(time), new Date(time), id);
|
|
303
|
+
idx += 2;
|
|
304
|
+
}
|
|
305
|
+
} catch {}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
const orderDir = direction === "previous" ? "ASC" : "DESC";
|
|
309
|
+
sql += ` GROUP BY m.id ORDER BY m.created_at ${orderDir}, m.id ${orderDir} LIMIT $${idx++}`;
|
|
310
|
+
params.push(limit + 1);
|
|
311
|
+
|
|
312
|
+
const result = await pool.query(sql, params);
|
|
313
|
+
const rows = result.rows;
|
|
314
|
+
const more = rows.length > limit;
|
|
315
|
+
const slice = more ? rows.slice(0, limit) : rows;
|
|
316
|
+
const items = direction === "previous" ? slice.reverse() : slice;
|
|
317
|
+
|
|
318
|
+
const nextCursor = more && slice.length > 0
|
|
319
|
+
? Buffer.from(JSON.stringify({
|
|
320
|
+
id: slice[slice.length - 1].id,
|
|
321
|
+
time: new Date(slice[slice.length - 1].created_at).getTime(),
|
|
322
|
+
})).toString("base64url")
|
|
323
|
+
: undefined;
|
|
324
|
+
|
|
325
|
+
res.json(items.map(toOpenCodeMessage));
|
|
227
326
|
} catch (e: any) {
|
|
228
327
|
res.status(500).json({ error: { code: "DB_ERROR", message: e.message } });
|
|
229
328
|
}
|
|
230
329
|
});
|
|
231
330
|
|
|
331
|
+
// POST /v2/session/:id/subagent — spawn a child session and run it
|
|
332
|
+
compatRouter.post("/v2/session/:parentId/subagent", requireAuth, async (req: Request, res: Response) => {
|
|
333
|
+
try {
|
|
334
|
+
const { prompt, agent = "build", modelID, providerID } = req.body;
|
|
335
|
+
if (!prompt) return res.status(400).json({ error: { code: "MISSING_PROMPT", message: "prompt is required" } });
|
|
336
|
+
|
|
337
|
+
const parentId = req.params.parentId;
|
|
338
|
+
const parentResult = await pool.query(`SELECT * FROM sessions WHERE id = $1`, [parentId]);
|
|
339
|
+
if (!parentResult.rows[0]) return res.status(404).json({ error: { code: "NOT_FOUND", message: "Parent session not found" } });
|
|
340
|
+
const parent = parentResult.rows[0];
|
|
341
|
+
|
|
342
|
+
// Create child session
|
|
343
|
+
const childId = require("uuid").v4();
|
|
344
|
+
const slug = `subagent-${Date.now()}`;
|
|
345
|
+
await pool.query(
|
|
346
|
+
`INSERT INTO sessions (id, slug, project_id, parent_id, directory, title, version, state)
|
|
347
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, 'created')`,
|
|
348
|
+
[childId, slug, parent.project_id, parentId, parent.directory, `Subagent: ${prompt.slice(0, 60)}`, "1.0.0"]
|
|
349
|
+
);
|
|
350
|
+
|
|
351
|
+
// Add user message
|
|
352
|
+
const msgId = require("uuid").v4();
|
|
353
|
+
await pool.query(
|
|
354
|
+
`INSERT INTO messages (id, session_id, role) VALUES ($1, $2, 'user')`,
|
|
355
|
+
[msgId, childId]
|
|
356
|
+
);
|
|
357
|
+
const partId = require("uuid").v4();
|
|
358
|
+
await pool.query(
|
|
359
|
+
`INSERT INTO parts (id, message_id, session_id, part_type, data, order_index) VALUES ($1, $2, $3, 'text', $4, 0)`,
|
|
360
|
+
[partId, msgId, childId, JSON.stringify({ text: prompt })]
|
|
361
|
+
);
|
|
362
|
+
|
|
363
|
+
// Run agent asynchronously
|
|
364
|
+
const { runAgentLoop } = await import("../src/engine/session/prompt");
|
|
365
|
+
runAgentLoop({
|
|
366
|
+
session_id: childId,
|
|
367
|
+
message_id: msgId,
|
|
368
|
+
content: prompt,
|
|
369
|
+
model_id: modelID || process.env.DEFAULT_MODEL || "claude-sonnet-4-5",
|
|
370
|
+
provider_id: providerID || process.env.DEFAULT_PROVIDER || "anthropic",
|
|
371
|
+
agent_name: agent,
|
|
372
|
+
}).catch((e: any) => {
|
|
373
|
+
console.error(`[Subagent] Failed for session ${childId}:`, e.message);
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
res.status(202).json({ childSessionId: childId, status: "running" });
|
|
377
|
+
} catch (e: any) {
|
|
378
|
+
res.status(500).json({ error: { code: "SUBAGENT_FAILED", message: e.message } });
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
|
|
232
382
|
// ─── Global SSE Event Stream ──────────────────────────────────────────────────
|
|
233
383
|
|
|
234
384
|
// GET /v2/event — global SSE stream for all events
|
|
@@ -458,16 +608,35 @@ function subscribeToSessionEvents(
|
|
|
458
608
|
): () => void {
|
|
459
609
|
const handler = async (event: any) => {
|
|
460
610
|
if (event.payload?.session_id === session_id) {
|
|
461
|
-
|
|
611
|
+
// Pass through key tool fields directly so SSE listeners can render them
|
|
612
|
+
const payload: any = { ...event.payload };
|
|
613
|
+
if (event.type === "ToolCallRequested") {
|
|
614
|
+
payload.tool_call_id = event.payload.tool_call_id;
|
|
615
|
+
payload.tool_name = event.payload.tool_name;
|
|
616
|
+
payload.tool_input = event.payload.tool_input;
|
|
617
|
+
}
|
|
618
|
+
if (event.type === "ToolCallCompleted") {
|
|
619
|
+
payload.tool_call_id = event.payload.tool_call_id;
|
|
620
|
+
payload.tool_name = event.payload.tool_name;
|
|
621
|
+
payload.duration_ms = event.payload.duration_ms;
|
|
622
|
+
}
|
|
623
|
+
callback({ type: mapEventType(event.type), data: payload });
|
|
462
624
|
}
|
|
463
625
|
};
|
|
464
626
|
|
|
465
|
-
const types = [
|
|
627
|
+
const types = [
|
|
628
|
+
"PartUpdated",
|
|
629
|
+
"MessageAdded",
|
|
630
|
+
"AgentCompleted",
|
|
631
|
+
"AgentFailed",
|
|
632
|
+
"ToolCallRequested",
|
|
633
|
+
"ToolCallCompleted",
|
|
634
|
+
"SessionCompacted",
|
|
635
|
+
];
|
|
466
636
|
for (const type of types) {
|
|
467
637
|
eventBus.subscribe(type, handler);
|
|
468
638
|
}
|
|
469
639
|
|
|
470
|
-
// Return a real cleanup function that removes all registered handlers
|
|
471
640
|
return () => {
|
|
472
641
|
for (const type of types) {
|
|
473
642
|
eventBus.unsubscribe(type, handler);
|
|
@@ -482,6 +651,8 @@ function mapEventType(boneEventType: string): string {
|
|
|
482
651
|
AgentCompleted: "session.updated",
|
|
483
652
|
AgentFailed: "session.updated",
|
|
484
653
|
ToolCallRequested: "tool.requested",
|
|
654
|
+
ToolCallCompleted: "tool.completed",
|
|
655
|
+
SessionCompacted: "session.compacted",
|
|
485
656
|
};
|
|
486
657
|
return map[boneEventType] || boneEventType.toLowerCase();
|
|
487
658
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"algorithms.js","sourceRoot":"","sources":["../../../../../bone/output/agent/src/algorithms.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { Request, Response, NextFunction } from "express";
|
|
2
|
+
export declare function auditLog(action: string, entityType?: string): (req: Request, _res: Response, next: NextFunction) => Promise<void>;
|
|
3
|
+
export declare function getAuditLog(entityType: string, entityId: string): Promise<any[]>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Generated by BoneScript compiler.
|
|
3
|
+
// Audit middleware for: AgentDomain v1.0.0
|
|
4
|
+
//
|
|
5
|
+
// Modules requiring audit logging:
|
|
6
|
+
// - AgentInstanceService
|
|
7
|
+
// - TaskService
|
|
8
|
+
// - PlanService
|
|
9
|
+
// - BuildStepService
|
|
10
|
+
// - ToolCallService
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.getAuditLog = exports.auditLog = void 0;
|
|
13
|
+
const db_1 = require("./db");
|
|
14
|
+
function auditLog(action, entityType) {
|
|
15
|
+
return async (req, _res, next) => {
|
|
16
|
+
try {
|
|
17
|
+
const auth = req.auth;
|
|
18
|
+
const actorId = auth?.actor_id ?? null;
|
|
19
|
+
const entityId = req.params.id ?? req.body?.id ?? null;
|
|
20
|
+
const payload = req.body ?? null;
|
|
21
|
+
const ipAddress = req.ip ?? null;
|
|
22
|
+
const userAgent = req.headers["user-agent"] ?? null;
|
|
23
|
+
await (0, db_1.query)(`INSERT INTO audit_log
|
|
24
|
+
(actor_id, action, entity_type, entity_id, payload, ip_address, user_agent)
|
|
25
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7)`, [actorId, action, entityType ?? null, entityId, JSON.stringify(payload), ipAddress, userAgent]);
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
// Audit failures must not block the request — log and continue
|
|
29
|
+
console.error("[audit] Failed to write audit log:", err);
|
|
30
|
+
}
|
|
31
|
+
next();
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
exports.auditLog = auditLog;
|
|
35
|
+
async function getAuditLog(entityType, entityId) {
|
|
36
|
+
const result = await (0, db_1.query)("SELECT * FROM audit_log WHERE entity_type = $1 AND entity_id = $2 ORDER BY created_at DESC LIMIT 100", [entityType, entityId]);
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
exports.getAuditLog = getAuditLog;
|
|
40
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../../../bone/output/agent/src/audit.ts"],"names":[],"mappings":";AAAA,oCAAoC;AACpC,2CAA2C;AAC3C,EAAE;AACF,mCAAmC;AACnC,2BAA2B;AAC3B,kBAAkB;AAClB,kBAAkB;AAClB,uBAAuB;AACvB,sBAAsB;;;AAGtB,6BAA6B;AAE7B,SAAgB,QAAQ,CAAC,MAAc,EAAE,UAAmB;IAC1D,OAAO,KAAK,EAAE,GAAY,EAAE,IAAc,EAAE,IAAkB,EAAiB,EAAE;QAC/E,IAAI,CAAC;YACH,MAAM,IAAI,GAAI,GAAW,CAAC,IAAgD,CAAC;YAC3E,MAAM,OAAO,GAAG,IAAI,EAAE,QAAQ,IAAI,IAAI,CAAC;YACvC,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,IAAK,GAAG,CAAC,IAAgC,EAAE,EAAE,IAAI,IAAI,CAAC;YACpF,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;YACjC,MAAM,SAAS,GAAG,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC;YACjC,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC;YAEpD,MAAM,IAAA,UAAK,EACT;;8CAEsC,EACtC,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,IAAI,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,CAC/F,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,+DAA+D;YAC/D,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC;AAtBD,4BAsBC;AAEM,KAAK,UAAU,WAAW,CAAC,UAAkB,EAAE,QAAgB;IACpE,MAAM,MAAM,GAAG,MAAM,IAAA,UAAK,EACxB,sGAAsG,EACtG,CAAC,UAAU,EAAE,QAAQ,CAAC,CACvB,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAND,kCAMC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Request, Response, NextFunction } from "express";
|
|
2
|
+
export interface AuthContext {
|
|
3
|
+
authenticated: boolean;
|
|
4
|
+
actor_id: string | null;
|
|
5
|
+
trace_id: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function authMiddleware(req: Request, res: Response, next: NextFunction): void;
|
|
8
|
+
export declare function requireAuth(req: Request, res: Response, next: NextFunction): void;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.requireAuth = exports.authMiddleware = void 0;
|
|
7
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
8
|
+
// JWT_SECRET must be set in production. The server will refuse to start without it
|
|
9
|
+
// when NODE_ENV is "production" to prevent accidental use of a weak fallback.
|
|
10
|
+
const JWT_SECRET = (() => {
|
|
11
|
+
const secret = process.env.JWT_SECRET;
|
|
12
|
+
if (!secret) {
|
|
13
|
+
if (process.env.NODE_ENV === "production") {
|
|
14
|
+
console.error("[FATAL] JWT_SECRET environment variable is not set. Refusing to start in production.");
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
console.warn("[WARN] JWT_SECRET is not set. Using insecure default — do not use in production.");
|
|
18
|
+
return "bonescript-dev-secret-do-not-use-in-production";
|
|
19
|
+
}
|
|
20
|
+
if (secret.length < 32) {
|
|
21
|
+
console.warn("[WARN] JWT_SECRET is shorter than 32 characters. Use a longer secret in production.");
|
|
22
|
+
}
|
|
23
|
+
return secret;
|
|
24
|
+
})();
|
|
25
|
+
function authMiddleware(req, res, next) {
|
|
26
|
+
const header = req.headers.authorization;
|
|
27
|
+
if (!header || !header.startsWith("Bearer ")) {
|
|
28
|
+
req.auth = { authenticated: false, actor_id: null, trace_id: req.headers["x-trace-id"] || "" };
|
|
29
|
+
next();
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const token = header.slice(7);
|
|
34
|
+
const decoded = jsonwebtoken_1.default.verify(token, JWT_SECRET);
|
|
35
|
+
req.auth = {
|
|
36
|
+
authenticated: true,
|
|
37
|
+
actor_id: decoded.sub,
|
|
38
|
+
trace_id: req.headers["x-trace-id"] || "",
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
req.auth = { authenticated: false, actor_id: null, trace_id: req.headers["x-trace-id"] || "" };
|
|
43
|
+
}
|
|
44
|
+
next();
|
|
45
|
+
}
|
|
46
|
+
exports.authMiddleware = authMiddleware;
|
|
47
|
+
function requireAuth(req, res, next) {
|
|
48
|
+
const auth = req.auth;
|
|
49
|
+
if (!auth || !auth.authenticated) {
|
|
50
|
+
res.status(401).json({ error: { code: "UNAUTHORIZED", message: "Authentication required" } });
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
next();
|
|
54
|
+
}
|
|
55
|
+
exports.requireAuth = requireAuth;
|
|
56
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../../bone/output/agent/src/auth.ts"],"names":[],"mappings":";;;;;;AAEA,gEAA+B;AAE/B,mFAAmF;AACnF,8EAA8E;AAC9E,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE;IACvB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC1C,OAAO,CAAC,KAAK,CAAC,sFAAsF,CAAC,CAAC;YACtG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC;QACjG,OAAO,gDAAgD,CAAC;IAC1D,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,qFAAqF,CAAC,CAAC;IACtG,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC,EAAE,CAAC;AAQL,SAAgB,cAAc,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IAC5E,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;IACzC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5C,GAAW,CAAC,IAAI,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,YAAY,CAAW,IAAI,EAAE,EAAE,CAAC;QAClH,IAAI,EAAE,CAAC;QACP,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,sBAAG,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAoB,CAAC;QAChE,GAAW,CAAC,IAAI,GAAG;YAClB,aAAa,EAAE,IAAI;YACnB,QAAQ,EAAE,OAAO,CAAC,GAAG;YACrB,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,YAAY,CAAW,IAAI,EAAE;SACpD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACN,GAAW,CAAC,IAAI,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,YAAY,CAAW,IAAI,EAAE,EAAE,CAAC;IACpH,CAAC;IACD,IAAI,EAAE,CAAC;AACT,CAAC;AAnBD,wCAmBC;AAED,SAAgB,WAAW,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IACzE,MAAM,IAAI,GAAiB,GAAW,CAAC,IAAI,CAAC;IAC5C,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QACjC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,yBAAyB,EAAE,EAAE,CAAC,CAAC;QAC9F,OAAO;IACT,CAAC;IACD,IAAI,EAAE,CAAC;AACT,CAAC;AAPD,kCAOC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { PoolClient } from "pg";
|
|
2
|
+
export declare const pool: any;
|
|
3
|
+
export declare function query<T = any>(text: string, params?: any[]): Promise<T[]>;
|
|
4
|
+
export declare function queryOne<T = any>(text: string, params?: any[]): Promise<T | null>;
|
|
5
|
+
export declare function execute(text: string, params?: any[]): Promise<number>;
|
|
6
|
+
export declare function transaction<T>(fn: (client: PoolClient) => Promise<T>): Promise<T>;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.transaction = exports.execute = exports.queryOne = exports.query = exports.pool = void 0;
|
|
4
|
+
// Generated by BoneScript compiler. DO NOT EDIT.
|
|
5
|
+
const pg_1 = require("pg");
|
|
6
|
+
// Lazy pool — created on first use so DATABASE_URL is read after dotenv loads
|
|
7
|
+
let _pool = null;
|
|
8
|
+
function getPool() {
|
|
9
|
+
if (!_pool) {
|
|
10
|
+
_pool = new pg_1.Pool({ connectionString: process.env.DATABASE_URL || "postgresql://localhost:5432/agent_domain", max: 20 });
|
|
11
|
+
_pool.on("error", (err) => console.error("[DB] Pool error (non-fatal):", err.message));
|
|
12
|
+
}
|
|
13
|
+
return _pool;
|
|
14
|
+
}
|
|
15
|
+
exports.pool = new Proxy({}, { get(_t, p) { return getPool()[p]; } });
|
|
16
|
+
async function query(text, params) {
|
|
17
|
+
try {
|
|
18
|
+
const result = await exports.pool.query(text, params);
|
|
19
|
+
return result.rows;
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
throw new Error(`DB query failed: ${e.message}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.query = query;
|
|
26
|
+
async function queryOne(text, params) {
|
|
27
|
+
try {
|
|
28
|
+
const rows = await query(text, params);
|
|
29
|
+
return rows[0] || null;
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
throw new Error(`DB query failed: ${e.message}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.queryOne = queryOne;
|
|
36
|
+
async function execute(text, params) {
|
|
37
|
+
try {
|
|
38
|
+
const result = await exports.pool.query(text, params);
|
|
39
|
+
return result.rowCount || 0;
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
throw new Error(`DB execute failed: ${e.message}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.execute = execute;
|
|
46
|
+
async function transaction(fn) {
|
|
47
|
+
const client = await exports.pool.connect();
|
|
48
|
+
try {
|
|
49
|
+
await client.query("BEGIN");
|
|
50
|
+
const result = await fn(client);
|
|
51
|
+
await client.query("COMMIT");
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
await client.query("ROLLBACK");
|
|
56
|
+
throw e;
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
client.release();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.transaction = transaction;
|
|
63
|
+
//# sourceMappingURL=db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../../../../bone/output/agent/src/db.ts"],"names":[],"mappings":";;;AAAA,iDAAiD;AACjD,2BAAsC;AAEtC,8EAA8E;AAC9E,IAAI,KAAK,GAAgB,IAAI,CAAC;AAC9B,SAAS,OAAO;IACd,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,KAAK,GAAG,IAAI,SAAI,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,0CAA0C,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;QACxH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AACY,QAAA,IAAI,GAAG,IAAI,KAAK,CAAC,EAAU,EAAE,EAAE,GAAG,CAAC,EAAO,EAAE,CAAM,IAAI,OAAQ,OAAO,EAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAE/F,KAAK,UAAU,KAAK,CAAU,IAAY,EAAE,MAAc;IAC/D,IAAI,CAAC;QAAC,MAAM,MAAM,GAAG,MAAM,YAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAAC,OAAO,MAAM,CAAC,IAAW,CAAC;IAAC,CAAC;IACjF,OAAO,CAAM,EAAE,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAAC,CAAC;AACtE,CAAC;AAHD,sBAGC;AACM,KAAK,UAAU,QAAQ,CAAU,IAAY,EAAE,MAAc;IAClE,IAAI,CAAC;QAAC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAI,IAAI,EAAE,MAAM,CAAC,CAAC;QAAC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAAC,CAAC;IAC1E,OAAO,CAAM,EAAE,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAAC,CAAC;AACtE,CAAC;AAHD,4BAGC;AACM,KAAK,UAAU,OAAO,CAAC,IAAY,EAAE,MAAc;IACxD,IAAI,CAAC;QAAC,MAAM,MAAM,GAAG,MAAM,YAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAAC,OAAO,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IAAC,CAAC;IACnF,OAAO,CAAM,EAAE,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAAC,CAAC;AACxE,CAAC;AAHD,0BAGC;AACM,KAAK,UAAU,WAAW,CAAI,EAAsC;IACzE,MAAM,MAAM,GAAG,MAAM,YAAI,CAAC,OAAO,EAAE,CAAC;IACpC,IAAI,CAAC;QAAC,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAAC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;QAAC,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAAC,OAAO,MAAM,CAAC;IAAC,CAAC;IAClH,OAAO,CAAC,EAAE,CAAC;QAAC,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAAC,MAAM,CAAC,CAAC;IAAC,CAAC;YAC9C,CAAC;QAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AAC/B,CAAC;AALD,kCAKC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
/// <reference types="node" />
|
|
4
|
+
/// <reference types="node" />
|
|
5
|
+
/// <reference types="node" />
|
|
6
|
+
import { PoolClient } from "pg";
|
|
7
|
+
export type EventDeliveryMode = "in_process" | "durable";
|
|
8
|
+
export interface EventMetadata {
|
|
9
|
+
source: string;
|
|
10
|
+
timestamp: Date;
|
|
11
|
+
correlation_id: string;
|
|
12
|
+
causation_id: string;
|
|
13
|
+
}
|
|
14
|
+
export interface SystemEvent {
|
|
15
|
+
type: string;
|
|
16
|
+
payload: Record<string, unknown>;
|
|
17
|
+
metadata: EventMetadata;
|
|
18
|
+
}
|
|
19
|
+
type Handler = (event: SystemEvent) => Promise<void>;
|
|
20
|
+
export declare const eventBus: {
|
|
21
|
+
subscribe(type: string, handler: Handler): void;
|
|
22
|
+
publish(type: string, payload: Record<string, unknown>, source: string, correlationId?: string, client?: PoolClient): Promise<void>;
|
|
23
|
+
startWorker(intervalMs?: number): NodeJS.Timeout | null;
|
|
24
|
+
};
|
|
25
|
+
export {};
|