@dsiloed/silo-link 1.13.7 → 1.15.1

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.
Files changed (55) hide show
  1. package/dist/api/dsiloed-client.d.ts +5 -1
  2. package/dist/api/dsiloed-client.d.ts.map +1 -1
  3. package/dist/api/dsiloed-client.js +11 -6
  4. package/dist/api/dsiloed-client.js.map +1 -1
  5. package/dist/cli/commands.d.ts.map +1 -1
  6. package/dist/cli/commands.js +21 -5
  7. package/dist/cli/commands.js.map +1 -1
  8. package/dist/cli/file-log.d.ts +21 -0
  9. package/dist/cli/file-log.d.ts.map +1 -0
  10. package/dist/cli/file-log.js +52 -0
  11. package/dist/cli/file-log.js.map +1 -0
  12. package/dist/core/agent-launcher.d.ts +24 -0
  13. package/dist/core/agent-launcher.d.ts.map +1 -1
  14. package/dist/core/auto-updater.d.ts +9 -2
  15. package/dist/core/auto-updater.d.ts.map +1 -1
  16. package/dist/core/auto-updater.js +57 -36
  17. package/dist/core/auto-updater.js.map +1 -1
  18. package/dist/core/base-tmux-launcher.d.ts +73 -3
  19. package/dist/core/base-tmux-launcher.d.ts.map +1 -1
  20. package/dist/core/base-tmux-launcher.js +212 -14
  21. package/dist/core/base-tmux-launcher.js.map +1 -1
  22. package/dist/core/bridge.d.ts +38 -0
  23. package/dist/core/bridge.d.ts.map +1 -1
  24. package/dist/core/bridge.js +226 -7
  25. package/dist/core/bridge.js.map +1 -1
  26. package/dist/core/claude-launcher.d.ts +8 -2
  27. package/dist/core/claude-launcher.d.ts.map +1 -1
  28. package/dist/core/claude-launcher.js +19 -4
  29. package/dist/core/claude-launcher.js.map +1 -1
  30. package/dist/core/codex-launcher.d.ts +4 -2
  31. package/dist/core/codex-launcher.d.ts.map +1 -1
  32. package/dist/core/codex-launcher.js +7 -4
  33. package/dist/core/codex-launcher.js.map +1 -1
  34. package/dist/core/gemini-launcher.d.ts +4 -2
  35. package/dist/core/gemini-launcher.d.ts.map +1 -1
  36. package/dist/core/gemini-launcher.js +7 -4
  37. package/dist/core/gemini-launcher.js.map +1 -1
  38. package/dist/core/launcher-factory.d.ts +2 -1
  39. package/dist/core/launcher-factory.d.ts.map +1 -1
  40. package/dist/core/launcher-factory.js +5 -5
  41. package/dist/core/launcher-factory.js.map +1 -1
  42. package/dist/core/usage-ledger.d.ts +55 -0
  43. package/dist/core/usage-ledger.d.ts.map +1 -0
  44. package/dist/core/usage-ledger.js +82 -0
  45. package/dist/core/usage-ledger.js.map +1 -0
  46. package/dist/index.js +0 -0
  47. package/dist/mcp/server.d.ts +9 -0
  48. package/dist/mcp/server.d.ts.map +1 -1
  49. package/dist/mcp/server.js +50 -0
  50. package/dist/mcp/server.js.map +1 -1
  51. package/package.json +1 -1
  52. package/dist/core/baseline-verify.d.ts +0 -54
  53. package/dist/core/baseline-verify.d.ts.map +0 -1
  54. package/dist/core/baseline-verify.js +0 -164
  55. package/dist/core/baseline-verify.js.map +0 -1
@@ -10,6 +10,19 @@ import { registerTools } from './tools/register-tools.js';
10
10
  const __filename = fileURLToPath(import.meta.url);
11
11
  const __dirname = path.dirname(__filename);
12
12
  const pkg = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../../package.json'), 'utf-8'));
13
+ /**
14
+ * True when an error means the code/modules this process was started from are
15
+ * gone or broken on disk (install swapped underneath us). Express/body-parser
16
+ * lazily load pieces (e.g. iconv-lite's encodings) on the first request that
17
+ * needs them, so this surfaces as a request error long after startup.
18
+ */
19
+ export function isModuleLoadFailure(err) {
20
+ if (!(err instanceof Error))
21
+ return false;
22
+ const code = err.code;
23
+ return code === 'MODULE_NOT_FOUND' || code === 'ERR_MODULE_NOT_FOUND'
24
+ || /Cannot find module/i.test(err.message);
25
+ }
13
26
  export class SiloLinkMcpServer {
14
27
  app;
15
28
  server = null;
@@ -102,8 +115,45 @@ export class SiloLinkMcpServer {
102
115
  uptime_seconds: uptimeSeconds,
103
116
  active_sessions: this.deps.sessionManager.getAll().length,
104
117
  cable: this.deps.cableClient.getState(),
118
+ // "Can this daemon actually parse an MCP POST?" — GET /health can't
119
+ // prove that (it parses no body), which let a broken-install daemon
120
+ // look healthy for hours. See POST /probe.
121
+ mcp_post: this.deps.probeStatus?.() ?? 'unknown',
105
122
  });
106
123
  });
124
+ /**
125
+ * POST /probe — exercises the JSON body-parse path (the same middleware
126
+ * every MCP call goes through). Two jobs:
127
+ * 1. Warm-up: the bridge hits this once at startup, forcing body-parser/
128
+ * iconv-lite to load their lazy pieces while the install is intact —
129
+ * so a later file swap can't break already-cached codecs.
130
+ * 2. Canary: the bridge re-probes periodically; if the install has been
131
+ * replaced underneath us, the parse throws MODULE_NOT_FOUND, the error
132
+ * middleware below reports it, and the daemon self-restarts instead of
133
+ * zombie-ing with a green /health.
134
+ */
135
+ this.app.post('/probe', (req, res) => {
136
+ res.json({ ok: true, echoed: req.body ?? null });
137
+ });
138
+ // Error middleware (must be registered last, must keep 4 args). A module-
139
+ // load failure here means our files were swapped out from under us — every
140
+ // subsequent MCP POST would fail the same way, so escalate for self-heal.
141
+ this.app.use((err, _req, res, _next) => {
142
+ if (isModuleLoadFailure(err)) {
143
+ console.error(`[MCP] FATAL: request failed loading a module — the installed package has likely been replaced/deleted under this running daemon: ${err.message}`);
144
+ this.deps.onModuleLoadFailure?.(err);
145
+ if (!res.headersSent) {
146
+ res.status(503).json({ error: 'silolink install replaced under running daemon; restarting', detail: err.message });
147
+ }
148
+ return;
149
+ }
150
+ const status = err.status
151
+ ?? err.statusCode
152
+ ?? 500;
153
+ if (!res.headersSent) {
154
+ res.status(status).json({ error: err.message });
155
+ }
156
+ });
107
157
  }
108
158
  /**
109
159
  * Bind the MCP server, preferring `preferredPort`. If that port is already
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dsiloed/silo-link",
3
- "version": "1.13.7",
3
+ "version": "1.15.1",
4
4
  "description": "Claude Code Remote Bridge — connects Claude Code sessions to DSiloed via MCP + ActionCable",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1,54 +0,0 @@
1
- import type { DSiloedClient } from '../api/dsiloed-client.js';
2
- import type { WorkspaceManager } from '../core/workspace-manager.js';
3
- import type { Session } from '../types/index.js';
4
- import type { ParsedTestRun, TestResultsResponse } from '../types/index.js';
5
- export declare const DEFAULT_TEST_TIMEOUT_MS: number;
6
- export interface CommandRunResult {
7
- stdout: string;
8
- stderr: string;
9
- exitCode: number;
10
- }
11
- export type CommandRunner = (command: string, cwd: string, timeoutMs: number) => CommandRunResult;
12
- export declare const defaultCommandRunner: CommandRunner;
13
- /**
14
- * Extract the single `{ "examples": <int>, "failed_ids": [...] }` JSON object the
15
- * test-command wrapper prints to stdout. Tolerant of surrounding suite output:
16
- * scans lines bottom-up for a JSON object carrying both keys (the wrapper prints
17
- * it last). Returns null if no parseable, well-shaped object is found.
18
- */
19
- export declare function parseTestRunOutput(stdout: string): ParsedTestRun | null;
20
- export interface BaselineVerifyDeps {
21
- dsiloedClient: DSiloedClient;
22
- workspaceManager: WorkspaceManager;
23
- runCommand?: CommandRunner;
24
- }
25
- export interface BaselineVerifyArgs {
26
- session: Session;
27
- base_branch: string;
28
- test_command: string;
29
- conversation_id?: number;
30
- timeout_ms?: number;
31
- }
32
- export interface BaselineVerifyResult {
33
- verdict: 'pass' | 'fail' | 'error';
34
- message: string;
35
- engine?: TestResultsResponse;
36
- head?: ParsedTestRun & {
37
- branch: string;
38
- };
39
- base?: ParsedTestRun & {
40
- branch: string;
41
- };
42
- }
43
- /**
44
- * Deterministic, daemon-side baseline-verify runner. NO LLM judgment:
45
- * 1. Resolve the calling worker's HEAD worktree (its existing workspace).
46
- * 2. Run `test_command` there, parse {examples, failed_ids}.
47
- * 3. Create a SECOND worktree for `base_branch`, run + parse there, then
48
- * discard it (no-merge teardown).
49
- * 4. POST both structured results to the engine, which computes the verdict.
50
- *
51
- * Never throws: any failure returns { verdict: 'error', message }.
52
- */
53
- export declare function runBaselineVerify(deps: BaselineVerifyDeps, args: BaselineVerifyArgs): Promise<BaselineVerifyResult>;
54
- //# sourceMappingURL=baseline-verify.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"baseline-verify.d.ts","sourceRoot":"","sources":["../../src/core/baseline-verify.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAI5E,eAAO,MAAM,uBAAuB,QAAiB,CAAC;AAmCtD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,gBAAgB,CAAC;AAElG,eAAO,MAAM,oBAAoB,EAAE,aAelC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAuBvE;AAOD,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,aAAa,CAAC;IAC7B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAEhB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,IAAI,CAAC,EAAE,aAAa,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,IAAI,CAAC,EAAE,aAAa,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,kBAAkB,EACxB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,oBAAoB,CAAC,CAyD/B"}
@@ -1,164 +0,0 @@
1
- import { spawnSync, execFileSync } from 'node:child_process';
2
- import { existsSync, copyFileSync, readdirSync } from 'node:fs';
3
- import { join } from 'node:path';
4
- // Default test-command timeout. The full suite can take ~15 min; allow generous
5
- // headroom. Configurable per-call via the tool's `timeout_ms` input.
6
- export const DEFAULT_TEST_TIMEOUT_MS = 30 * 60 * 1000;
7
- // Fast-forward the local base branch to origin so the base worktree is built from
8
- // CURRENT base code (stale local base ⇒ wrong baseline AND missing newly-committed
9
- // helper scripts). `fetch origin <b>:<b>` only updates a fast-forwardable local
10
- // branch; never throws (offline/diverged is non-fatal — createWorktree's own fetch
11
- // fallback still runs).
12
- function fastForwardBaseBranch(repoPath, baseBranch) {
13
- try {
14
- execFileSync('git', ['-C', repoPath, 'fetch', 'origin', `${baseBranch}:${baseBranch}`], { stdio: 'pipe' });
15
- }
16
- catch {
17
- try {
18
- execFileSync('git', ['-C', repoPath, 'fetch', 'origin', baseBranch], { stdio: 'pipe' });
19
- }
20
- catch { /* offline */ }
21
- }
22
- }
23
- // Copy gitignored runtime config the test command needs to boot from the HEAD
24
- // worktree (which has them) into a freshly-created base worktree (which doesn't).
25
- // Best-effort + language-agnostic: only copies files that exist; never throws.
26
- function copyGitignoredConfig(fromDir, toDir) {
27
- const fixed = ['config/app_environment_variables.rb', 'config/master.key', 'config/credentials.yml.enc'];
28
- for (const rel of fixed) {
29
- try {
30
- const src = join(fromDir, rel);
31
- if (existsSync(src))
32
- copyFileSync(src, join(toDir, rel));
33
- }
34
- catch { /* best-effort */ }
35
- }
36
- // Root-level dotenv files (.env, .env.test, .env.local, …).
37
- try {
38
- for (const name of readdirSync(fromDir)) {
39
- if (!name.startsWith('.env'))
40
- continue;
41
- try {
42
- copyFileSync(join(fromDir, name), join(toDir, name));
43
- }
44
- catch { /* best-effort */ }
45
- }
46
- }
47
- catch { /* best-effort */ }
48
- }
49
- export const defaultCommandRunner = (command, cwd, timeoutMs) => {
50
- const res = spawnSync(command, {
51
- cwd,
52
- shell: true,
53
- encoding: 'utf-8',
54
- timeout: timeoutMs,
55
- // Large suites print a lot before the JSON line; lift the default 1MB cap.
56
- maxBuffer: 64 * 1024 * 1024,
57
- });
58
- return {
59
- stdout: res.stdout ?? '',
60
- stderr: res.stderr ?? '',
61
- // spawnSync sets status=null on signal (e.g. timeout) — treat as nonzero.
62
- exitCode: res.status ?? 1,
63
- };
64
- };
65
- /**
66
- * Extract the single `{ "examples": <int>, "failed_ids": [...] }` JSON object the
67
- * test-command wrapper prints to stdout. Tolerant of surrounding suite output:
68
- * scans lines bottom-up for a JSON object carrying both keys (the wrapper prints
69
- * it last). Returns null if no parseable, well-shaped object is found.
70
- */
71
- export function parseTestRunOutput(stdout) {
72
- const lines = stdout.split('\n');
73
- for (let i = lines.length - 1; i >= 0; i--) {
74
- const line = lines[i].trim();
75
- if (!line.startsWith('{') || !line.endsWith('}'))
76
- continue;
77
- try {
78
- const obj = JSON.parse(line);
79
- if (obj && typeof obj === 'object' &&
80
- typeof obj.examples === 'number' &&
81
- Array.isArray(obj.failed_ids)) {
82
- const o = obj;
83
- return {
84
- examples: o.examples,
85
- failed_ids: o.failed_ids.map((x) => String(x)),
86
- };
87
- }
88
- }
89
- catch {
90
- // Not JSON — keep scanning upward.
91
- }
92
- }
93
- return null;
94
- }
95
- function tail(text, max = 2000) {
96
- const t = (text || '').trim();
97
- return t.length > max ? t.slice(-max) : t;
98
- }
99
- /**
100
- * Deterministic, daemon-side baseline-verify runner. NO LLM judgment:
101
- * 1. Resolve the calling worker's HEAD worktree (its existing workspace).
102
- * 2. Run `test_command` there, parse {examples, failed_ids}.
103
- * 3. Create a SECOND worktree for `base_branch`, run + parse there, then
104
- * discard it (no-merge teardown).
105
- * 4. POST both structured results to the engine, which computes the verdict.
106
- *
107
- * Never throws: any failure returns { verdict: 'error', message }.
108
- */
109
- export async function runBaselineVerify(deps, args) {
110
- const { dsiloedClient, workspaceManager } = deps;
111
- const runCommand = deps.runCommand ?? defaultCommandRunner;
112
- const timeoutMs = args.timeout_ms ?? DEFAULT_TEST_TIMEOUT_MS;
113
- // --- 1. Resolve the HEAD worktree (the worker's own workspace) ---
114
- const headWorkspace = workspaceManager.getWorkspace(args.session.sessionId);
115
- if (!headWorkspace) {
116
- return {
117
- verdict: 'error',
118
- message: 'No workspace (worktree) found for this session. The worker must run inside an isolated worktree before baseline-verify.',
119
- };
120
- }
121
- const headDir = headWorkspace.worktreePath;
122
- const headBranch = headWorkspace.branch;
123
- const baseBranch = args.base_branch;
124
- // --- 2. Run the suite on HEAD ---
125
- let head;
126
- try {
127
- const headRun = runCommand(args.test_command, headDir, timeoutMs);
128
- const parsed = parseTestRunOutput(headRun.stdout);
129
- if (!parsed) {
130
- // Nonzero AND no parseable JSON → genuine failure to produce evidence.
131
- // (A nonzero exit WITH valid JSON is normal: failing specs make the runner
132
- // exit nonzero but it still prints the result line.)
133
- return {
134
- verdict: 'error',
135
- message: `HEAD test command produced no parseable {examples, failed_ids} JSON (exit ${headRun.exitCode}). stderr tail: ${tail(headRun.stderr)}`,
136
- };
137
- }
138
- head = parsed;
139
- }
140
- catch (err) {
141
- return { verdict: 'error', message: `HEAD test run threw: ${err instanceof Error ? err.message : String(err)}` };
142
- }
143
- // --- 3. POST head-only structured results to the engine ---
144
- // A GREEN base branch reduces the gate to "head must be green", so we run the
145
- // suite on HEAD only and skip a base worktree entirely — that second worktree
146
- // (with its own test-DB + gitignored-config setup) was the fragile, error-prone
147
- // part. test_command runs the suite IN DOCKER (see verify_json.sh), so the host's
148
- // ruby/PATH doesn't matter. The engine passes when head.failed_ids is empty.
149
- try {
150
- const conversationId = args.conversation_id ?? args.session.conversationId;
151
- const engine = await dsiloedClient.reportTestResults({
152
- conversation_id: conversationId,
153
- command: args.test_command,
154
- head: { branch: headBranch, examples: head.examples, failed_ids: head.failed_ids },
155
- });
156
- const summary = `head: ${head.failed_ids.length} failed (${head.examples} examples) → verdict: ${engine.verdict}` +
157
- (engine.message ? ` — ${engine.message}` : '');
158
- return { verdict: engine.verdict, message: summary, engine, head: { branch: headBranch, ...head } };
159
- }
160
- catch (err) {
161
- return { verdict: 'error', message: `Failed to report test results to engine: ${err instanceof Error ? err.message : String(err)}` };
162
- }
163
- }
164
- //# sourceMappingURL=baseline-verify.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"baseline-verify.js","sourceRoot":"","sources":["../../src/core/baseline-verify.ts"],"names":[],"mappings":"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"}