@bookedsolid/reagent 0.7.2 → 0.10.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.
Files changed (119) hide show
  1. package/README.md +277 -140
  2. package/agents/engineering/pr-voice-reviewer.md +229 -0
  3. package/agents/product-owner.md +152 -0
  4. package/agents/reagent-orchestrator.md +8 -0
  5. package/commands/pm-status.md +230 -0
  6. package/commands/review-pr.md +197 -0
  7. package/dist/cli/commands/catalyze/gap-detector.d.ts.map +1 -1
  8. package/dist/cli/commands/catalyze/gap-detector.js +1 -3
  9. package/dist/cli/commands/catalyze/gap-detector.js.map +1 -1
  10. package/dist/cli/commands/daemon/index.d.ts +5 -0
  11. package/dist/cli/commands/daemon/index.d.ts.map +1 -0
  12. package/dist/cli/commands/daemon/index.js +59 -0
  13. package/dist/cli/commands/daemon/index.js.map +1 -0
  14. package/dist/cli/commands/daemon/restart.d.ts +10 -0
  15. package/dist/cli/commands/daemon/restart.d.ts.map +1 -0
  16. package/dist/cli/commands/daemon/restart.js +20 -0
  17. package/dist/cli/commands/daemon/restart.js.map +1 -0
  18. package/dist/cli/commands/daemon/start.d.ts +2 -0
  19. package/dist/cli/commands/daemon/start.d.ts.map +1 -0
  20. package/dist/cli/commands/daemon/start.js +143 -0
  21. package/dist/cli/commands/daemon/start.js.map +1 -0
  22. package/dist/cli/commands/daemon/status.d.ts +2 -0
  23. package/dist/cli/commands/daemon/status.d.ts.map +1 -0
  24. package/dist/cli/commands/daemon/status.js +90 -0
  25. package/dist/cli/commands/daemon/status.js.map +1 -0
  26. package/dist/cli/commands/daemon/stop.d.ts +2 -0
  27. package/dist/cli/commands/daemon/stop.d.ts.map +1 -0
  28. package/dist/cli/commands/daemon/stop.js +73 -0
  29. package/dist/cli/commands/daemon/stop.js.map +1 -0
  30. package/dist/cli/commands/init/claude-hooks.d.ts +1 -1
  31. package/dist/cli/commands/init/claude-hooks.d.ts.map +1 -1
  32. package/dist/cli/commands/init/claude-hooks.js +10 -4
  33. package/dist/cli/commands/init/claude-hooks.js.map +1 -1
  34. package/dist/cli/commands/init/index.d.ts.map +1 -1
  35. package/dist/cli/commands/init/index.js +5 -1
  36. package/dist/cli/commands/init/index.js.map +1 -1
  37. package/dist/cli/commands/init/policy.d.ts.map +1 -1
  38. package/dist/cli/commands/init/policy.js +21 -0
  39. package/dist/cli/commands/init/policy.js.map +1 -1
  40. package/dist/cli/commands/init/types.d.ts +16 -0
  41. package/dist/cli/commands/init/types.d.ts.map +1 -1
  42. package/dist/cli/index.js +9 -0
  43. package/dist/cli/index.js.map +1 -1
  44. package/dist/config/daemon-loader.d.ts +16 -0
  45. package/dist/config/daemon-loader.d.ts.map +1 -0
  46. package/dist/config/daemon-loader.js +76 -0
  47. package/dist/config/daemon-loader.js.map +1 -0
  48. package/dist/config/gateway-config.d.ts.map +1 -1
  49. package/dist/config/gateway-config.js +6 -0
  50. package/dist/config/gateway-config.js.map +1 -1
  51. package/dist/config/policy-loader.d.ts +27 -0
  52. package/dist/config/policy-loader.d.ts.map +1 -1
  53. package/dist/config/policy-loader.js +103 -10
  54. package/dist/config/policy-loader.js.map +1 -1
  55. package/dist/gateway/circuit-breaker.d.ts +60 -0
  56. package/dist/gateway/circuit-breaker.d.ts.map +1 -0
  57. package/dist/gateway/circuit-breaker.js +104 -0
  58. package/dist/gateway/circuit-breaker.js.map +1 -0
  59. package/dist/gateway/collision-detector.d.ts +31 -0
  60. package/dist/gateway/collision-detector.d.ts.map +1 -0
  61. package/dist/gateway/collision-detector.js +53 -0
  62. package/dist/gateway/collision-detector.js.map +1 -0
  63. package/dist/gateway/middleware/blocked-paths.js +2 -2
  64. package/dist/gateway/middleware/blocked-paths.js.map +1 -1
  65. package/dist/gateway/middleware/circuit-breaker.d.ts +12 -0
  66. package/dist/gateway/middleware/circuit-breaker.d.ts.map +1 -0
  67. package/dist/gateway/middleware/circuit-breaker.js +44 -0
  68. package/dist/gateway/middleware/circuit-breaker.js.map +1 -0
  69. package/dist/gateway/middleware/injection.d.ts +23 -0
  70. package/dist/gateway/middleware/injection.d.ts.map +1 -0
  71. package/dist/gateway/middleware/injection.js +129 -0
  72. package/dist/gateway/middleware/injection.js.map +1 -0
  73. package/dist/gateway/middleware/policy.js +2 -2
  74. package/dist/gateway/middleware/policy.js.map +1 -1
  75. package/dist/gateway/middleware/rate-limit.d.ts +13 -0
  76. package/dist/gateway/middleware/rate-limit.d.ts.map +1 -0
  77. package/dist/gateway/middleware/rate-limit.js +32 -0
  78. package/dist/gateway/middleware/rate-limit.js.map +1 -0
  79. package/dist/gateway/middleware/redact.d.ts.map +1 -1
  80. package/dist/gateway/middleware/redact.js +7 -0
  81. package/dist/gateway/middleware/redact.js.map +1 -1
  82. package/dist/gateway/middleware/result-size-cap.d.ts +14 -0
  83. package/dist/gateway/middleware/result-size-cap.d.ts.map +1 -0
  84. package/dist/gateway/middleware/result-size-cap.js +49 -0
  85. package/dist/gateway/middleware/result-size-cap.js.map +1 -0
  86. package/dist/gateway/native-tools.js +1 -1
  87. package/dist/gateway/native-tools.js.map +1 -1
  88. package/dist/gateway/rate-limiter.d.ts +47 -0
  89. package/dist/gateway/rate-limiter.d.ts.map +1 -0
  90. package/dist/gateway/rate-limiter.js +89 -0
  91. package/dist/gateway/rate-limiter.js.map +1 -0
  92. package/dist/gateway/server.d.ts.map +1 -1
  93. package/dist/gateway/server.js +27 -1
  94. package/dist/gateway/server.js.map +1 -1
  95. package/dist/gateway/tool-proxy.js +1 -1
  96. package/dist/gateway/tool-proxy.js.map +1 -1
  97. package/dist/types/daemon.d.ts +45 -0
  98. package/dist/types/daemon.d.ts.map +1 -0
  99. package/dist/types/daemon.js +2 -0
  100. package/dist/types/daemon.js.map +1 -0
  101. package/dist/types/gateway.d.ts +9 -0
  102. package/dist/types/gateway.d.ts.map +1 -1
  103. package/dist/types/policy.d.ts +1 -0
  104. package/dist/types/policy.d.ts.map +1 -1
  105. package/hooks/_lib/discord.sh +75 -0
  106. package/hooks/blocked-paths-enforcer.sh +0 -1
  107. package/hooks/changeset-security-gate.sh +143 -0
  108. package/hooks/commit-review-gate.sh +12 -4
  109. package/hooks/import-guard.sh +14 -0
  110. package/hooks/network-exfil-guard.sh +20 -2
  111. package/hooks/pr-issue-link-gate.sh +65 -0
  112. package/hooks/push-review-gate.sh +17 -2
  113. package/hooks/rate-limit-guard.sh +26 -2
  114. package/hooks/reagent-notify.sh +65 -0
  115. package/hooks/security-disclosure-gate.sh +146 -0
  116. package/husky/pre-push.sh +84 -0
  117. package/package.json +10 -2
  118. package/profiles/bst-internal.json +12 -2
  119. package/profiles/client-engagement.json +12 -2
@@ -0,0 +1,197 @@
1
+ Fetch a pull request diff, run code-reviewer analysis, translate findings to owner voice, and post a single batched inline GitHub review.
2
+
3
+ ## Usage
4
+
5
+ ```
6
+ /review-pr <PR#> [--tier standard|senior|chief] [--task T-NNN]
7
+ ```
8
+
9
+ **Arguments:**
10
+
11
+ - `<PR#>` — pull request number (required)
12
+ - `--tier` — review depth: `standard` (default), `senior`, or `chief`
13
+ - `--task` — optional JSONL task ID to mark `completed` after the review posts (e.g. `--task T-047`)
14
+
15
+ ---
16
+
17
+ ## Step 1 — Check prerequisites
18
+
19
+ Before anything else:
20
+
21
+ 1. Read `.reagent/policy.yaml` — confirm autonomy level is L1 or higher
22
+ 2. Check for `.reagent/HALT` — if present, stop immediately
23
+ 3. Verify `gh` CLI is available: `gh --version`
24
+ 4. Confirm caller is in a git repo with a GitHub remote: `gh repo view --json nameWithOwner`
25
+
26
+ Extract `owner/repo` for use in API calls.
27
+
28
+ ---
29
+
30
+ ## Step 2 — Fetch PR context
31
+
32
+ Run these in parallel:
33
+
34
+ ```bash
35
+ gh pr view <PR#> --json title,body,headRefName,baseRefName,state,commits
36
+ gh pr diff <PR#>
37
+ gh pr view <PR#> --json commits --jq '.commits[-1].oid'
38
+ ```
39
+
40
+ Store:
41
+
42
+ - `COMMIT_SHA` — the latest commit OID (use in the review payload)
43
+ - `PR_TITLE` — for context
44
+ - `PR_DIFF` — the full diff text (pass to code-reviewer)
45
+
46
+ If the PR is merged or closed, warn the user: "PR #N is already closed — review will post but won't block a merge."
47
+
48
+ If `gh pr diff` returns an empty diff, stop and report: "Empty diff — nothing to review."
49
+
50
+ ---
51
+
52
+ ## Step 3 — Run code-reviewer analysis
53
+
54
+ Invoke the `code-reviewer` agent with the diff and the specified tier.
55
+
56
+ **Pass this context to code-reviewer:**
57
+
58
+ ```
59
+ Tier: <standard|senior|chief>
60
+
61
+ Review the following git diff and produce structured findings as a JSON array.
62
+ Each finding must include:
63
+ - file: string (file path from diff header)
64
+ - line: number (line number in the NEW file)
65
+ - start_line?: number (for multi-line spans, the start line)
66
+ - severity: "high" | "medium" | "low"
67
+ - issue: string (the specific problem — no hedging)
68
+ - suggestion_code?: string (the corrected code, if applicable)
69
+
70
+ Output ONLY the JSON array. No prose. No markdown wrapper. Example:
71
+ [
72
+ {
73
+ "file": "src/gateway/middleware/chain.ts",
74
+ "line": 42,
75
+ "severity": "high",
76
+ "issue": "Non-null assertion will throw if upstream returns undefined",
77
+ "suggestion_code": "const result = upstream ?? defaultValue;"
78
+ }
79
+ ]
80
+
81
+ If there are no findings, output: []
82
+
83
+ DIFF:
84
+ <paste full diff here>
85
+ ```
86
+
87
+ Capture the JSON array output as `FINDINGS`.
88
+
89
+ If `FINDINGS` is `[]` or empty, set `FINDINGS = []` and proceed — the voice reviewer will write a clean summary.
90
+
91
+ ---
92
+
93
+ ## Step 4 — Run pr-voice-reviewer
94
+
95
+ Invoke the `pr-voice-reviewer` agent with `FINDINGS` and `COMMIT_SHA`.
96
+
97
+ **Pass this context:**
98
+
99
+ ```
100
+ Commit SHA: <COMMIT_SHA>
101
+
102
+ Translate the following code-reviewer findings into a GitHub review payload
103
+ written in the project owner's voice. Follow the pr-voice-reviewer agent
104
+ instructions exactly.
105
+
106
+ Findings:
107
+ <FINDINGS as JSON>
108
+ ```
109
+
110
+ Capture the full JSON payload as `REVIEW_PAYLOAD`.
111
+
112
+ Validate the payload has:
113
+
114
+ - `commit_id` matching `COMMIT_SHA`
115
+ - `body` (non-empty string)
116
+ - `event` one of: `REQUEST_CHANGES`, `COMMENT`, `APPROVE`
117
+ - `comments` array (may be empty if findings were empty)
118
+
119
+ ---
120
+
121
+ ## Step 5 — Post batched review
122
+
123
+ Post the review in a single API call:
124
+
125
+ ```bash
126
+ gh api repos/{owner}/{repo}/pulls/<PR#>/reviews \
127
+ --method POST \
128
+ --input - <<'PAYLOAD'
129
+ <REVIEW_PAYLOAD as JSON>
130
+ PAYLOAD
131
+ ```
132
+
133
+ On success (HTTP 200/201):
134
+
135
+ - Report: "Review posted — <event> on PR #N (<N> inline comments)"
136
+ - Print the review URL from the response (`html_url`)
137
+
138
+ On failure:
139
+
140
+ - Print the full error response
141
+ - Do NOT retry automatically — report to user and stop
142
+
143
+ ---
144
+
145
+ ## Step 6 — Close task (if --task was provided)
146
+
147
+ If `--task T-NNN` was passed, call `task_update` to mark it resolved:
148
+
149
+ ```
150
+ task_update({
151
+ id: "<T-NNN>",
152
+ status: "completed",
153
+ commit_ref: "<COMMIT_SHA>",
154
+ description: "Code review posted — <N> findings on PR #<PR#>. See <html_url>"
155
+ })
156
+ ```
157
+
158
+ If `task_update` fails (task not found, MCP unavailable), warn the user but do not fail the overall command — the review already posted.
159
+
160
+ ---
161
+
162
+ ## Step 7 — Report summary
163
+
164
+ Output a clean summary:
165
+
166
+ ```
167
+ PR #<N>: <title>
168
+ Tier: <standard|senior|chief>
169
+ Findings: <count> (<high> high, <medium> medium, <low> low)
170
+ Event: REQUEST_CHANGES | COMMENT | APPROVE
171
+ Review: <html_url>
172
+ Task: T-NNN → completed (or "no task linked")
173
+ ```
174
+
175
+ ---
176
+
177
+ ## Error handling
178
+
179
+ | Situation | Action |
180
+ | ---------------------------------- | ------------------------------------------------------------------ |
181
+ | PR not found | Stop — "PR #N not found. Check the number and repo." |
182
+ | HALT file present | Stop — "Agent operations frozen. Check .reagent/HALT." |
183
+ | Empty diff | Stop — "Empty diff — nothing to review." |
184
+ | code-reviewer returns invalid JSON | Stop — "code-reviewer output was not valid JSON. Raw output: ..." |
185
+ | GitHub API error | Stop — print full error, do not retry |
186
+ | Already reviewed this commit | Warn but continue — GitHub allows multiple reviews per commit |
187
+ | task_update fails | Warn but continue — review already posted; close the task manually |
188
+ | --task references unknown task ID | Warn but continue — skip the update, don't block the review |
189
+
190
+ ---
191
+
192
+ ## Notes
193
+
194
+ - GitHub suggestion syntax in comment bodies renders as an "Apply suggestion" button in the PR UI. The pr-voice-reviewer agent handles this formatting.
195
+ - Multi-line comments require both `start_line` and `line` in the comments array. The `start_line` must be less than `line`. If they're equal, omit `start_line`.
196
+ - The review posts as the authenticated `gh` user — make sure `gh auth status` shows the correct account before running.
197
+ - For large diffs (>500 lines), the code-reviewer may miss context across files. Consider running `--tier senior` or `--tier chief` for better coverage.
@@ -1 +1 @@
1
- {"version":3,"file":"gap-detector.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/catalyze/gap-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAO,WAAW,EAAE,MAAM,YAAY,CAAC;AAgXlE;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,aAAa,GAAG,WAAW,CA0C/D"}
1
+ {"version":3,"file":"gap-detector.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/catalyze/gap-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAO,WAAW,EAAE,MAAM,YAAY,CAAC;AA8WlE;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,aAAa,GAAG,WAAW,CA0C/D"}
@@ -68,8 +68,6 @@ function detectAstroGaps(analysis) {
68
68
  });
69
69
  }
70
70
  // Gate: astro check
71
- const scripts = analysis.targetDir ? {} : {};
72
- void scripts; // Placeholder — real scripts are read during stack analysis
73
71
  gaps.push({
74
72
  id: nextId(),
75
73
  severity: 'critical',
@@ -353,7 +351,7 @@ export function detectGaps(analysis) {
353
351
  gaps,
354
352
  totalRecommendedHooks: BASE_HOOKS.length,
355
353
  installedHookCount: analysis.installedHooks.length,
356
- totalRecommendedGates: 5, // Base estimate — varies by project type
354
+ totalRecommendedGates: gaps.filter((g) => g.category === 'gate').length,
357
355
  };
358
356
  }
359
357
  //# sourceMappingURL=gap-detector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gap-detector.js","sourceRoot":"","sources":["../../../../src/cli/commands/catalyze/gap-detector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gap-detector.js","sourceRoot":"","sources":["../../../../src/cli/commands/catalyze/gap-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Entry point for `reagent daemon <subcommand> [options]`.
3
+ */
4
+ export declare function runDaemon(args: string[]): void;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/daemon/index.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA0B9C"}
@@ -0,0 +1,59 @@
1
+ import { runDaemonStart } from './start.js';
2
+ import { runDaemonStop } from './stop.js';
3
+ import { runDaemonStatus } from './status.js';
4
+ import { runDaemonRestart } from './restart.js';
5
+ /**
6
+ * Entry point for `reagent daemon <subcommand> [options]`.
7
+ */
8
+ export function runDaemon(args) {
9
+ const [sub, ...rest] = args;
10
+ if (!sub || sub === 'help' || sub === '--help' || sub === '-h') {
11
+ printDaemonHelp();
12
+ return;
13
+ }
14
+ switch (sub) {
15
+ case 'start':
16
+ runDaemonStart(rest);
17
+ break;
18
+ case 'stop':
19
+ runDaemonStop(rest);
20
+ break;
21
+ case 'status':
22
+ runDaemonStatus(rest);
23
+ break;
24
+ case 'restart':
25
+ runDaemonRestart(rest);
26
+ break;
27
+ default:
28
+ console.error(`\nUnknown daemon subcommand: ${sub}`);
29
+ printDaemonHelp();
30
+ process.exit(1);
31
+ }
32
+ }
33
+ function printDaemonHelp() {
34
+ console.log(`
35
+ reagent daemon — persistent HTTP/SSE multi-project MCP gateway
36
+
37
+ Usage:
38
+ reagent daemon <subcommand> [options]
39
+
40
+ Subcommands:
41
+ start Start the daemon in the background
42
+ stop Stop the running daemon
43
+ status Show daemon health and active sessions
44
+ restart Gracefully restart the daemon
45
+
46
+ Options for start:
47
+ --port <port> Override the listen port (default: 7777)
48
+ --bind <addr> Override the bind address (default: 127.0.0.1)
49
+ --foreground Run in foreground instead of backgrounding
50
+
51
+ Examples:
52
+ reagent daemon start
53
+ reagent daemon start --port 8888
54
+ reagent daemon status
55
+ reagent daemon stop
56
+ reagent daemon restart
57
+ `);
58
+ }
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/daemon/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAE5B,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC/D,eAAe,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IAED,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,OAAO;YACV,cAAc,CAAC,IAAI,CAAC,CAAC;YACrB,MAAM;QACR,KAAK,MAAM;YACT,aAAa,CAAC,IAAI,CAAC,CAAC;YACpB,MAAM;QACR,KAAK,QAAQ;YACX,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,MAAM;QACR,KAAK,SAAS;YACZ,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACvB,MAAM;QACR;YACE,OAAO,CAAC,KAAK,CAAC,gCAAgC,GAAG,EAAE,CAAC,CAAC;YACrD,eAAe,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;CAuBb,CAAC,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Graceful restart: stop the running daemon (SIGTERM + poll for exit),
3
+ * then start a fresh instance once the process has actually exited.
4
+ *
5
+ * runDaemonStop accepts an onDone callback that fires only after the daemon
6
+ * process is confirmed dead, preventing the new instance from racing the old
7
+ * one for the port binding.
8
+ */
9
+ export declare function runDaemonRestart(args: string[]): void;
10
+ //# sourceMappingURL=restart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restart.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/daemon/restart.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAQrD"}
@@ -0,0 +1,20 @@
1
+ import { runDaemonStop } from './stop.js';
2
+ import { runDaemonStart } from './start.js';
3
+ /**
4
+ * Graceful restart: stop the running daemon (SIGTERM + poll for exit),
5
+ * then start a fresh instance once the process has actually exited.
6
+ *
7
+ * runDaemonStop accepts an onDone callback that fires only after the daemon
8
+ * process is confirmed dead, preventing the new instance from racing the old
9
+ * one for the port binding.
10
+ */
11
+ export function runDaemonRestart(args) {
12
+ console.log('\nRestarting reagent daemon...');
13
+ runDaemonStop([], () => {
14
+ // Brief pause so the OS can release the port binding before re-launch.
15
+ setTimeout(() => {
16
+ runDaemonStart(args);
17
+ }, 200);
18
+ });
19
+ }
20
+ //# sourceMappingURL=restart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restart.js","sourceRoot":"","sources":["../../../../src/cli/commands/daemon/restart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAc;IAC7C,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC9C,aAAa,CAAC,EAAE,EAAE,GAAG,EAAE;QACrB,uEAAuE;QACvE,UAAU,CAAC,GAAG,EAAE;YACd,cAAc,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runDaemonStart(args: string[]): void;
2
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/daemon/start.ts"],"names":[],"mappings":"AAiFA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA4FnD"}
@@ -0,0 +1,143 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import os from 'node:os';
4
+ import { spawn } from 'node:child_process';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { parseFlag } from '../../utils.js';
7
+ import { loadDaemonConfig } from '../../../config/daemon-loader.js';
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = path.dirname(__filename);
10
+ /** Path to the PID file written when the daemon starts. */
11
+ function getPidFilePath() {
12
+ return path.join(os.homedir(), '.reagent', 'daemon.pid');
13
+ }
14
+ /** Resolve the compiled Rust daemon binary path relative to the package root. */
15
+ function resolveDaemonBinary() {
16
+ // Walk up from dist/cli/commands/daemon/ to find the package root, then
17
+ // look for the platform binary in bin/reagent-daemon-<platform>
18
+ const pkgRoot = path.join(__dirname, '..', '..', '..', '..');
19
+ const platform = process.platform;
20
+ const arch = process.arch;
21
+ // Map Node.js platform/arch to the binary name convention used by the
22
+ // Rust build and npm optional dependency packages
23
+ const platformMap = {
24
+ 'darwin-arm64': 'reagent-daemon-darwin-arm64',
25
+ 'darwin-x64': 'reagent-daemon-darwin-x64',
26
+ 'linux-x64': 'reagent-daemon-linux-x64',
27
+ };
28
+ const key = `${platform}-${arch}`;
29
+ const binaryName = platformMap[key] ?? 'reagent-daemon';
30
+ // Check platform-specific optional package first (npm distribution)
31
+ const optionalPkgBin = path.join(pkgRoot, 'node_modules', `@bookedsolid/${binaryName}`, 'bin', binaryName);
32
+ if (fs.existsSync(optionalPkgBin)) {
33
+ return optionalPkgBin;
34
+ }
35
+ // Fall back to local build output (development)
36
+ const localBin = path.join(pkgRoot, 'daemon', 'target', 'release', 'reagent-daemon');
37
+ if (fs.existsSync(localBin)) {
38
+ return localBin;
39
+ }
40
+ throw new Error(`reagent daemon binary not found for platform ${key}.\n` +
41
+ ` Looked for: ${optionalPkgBin}\n` +
42
+ ` : ${localBin}\n` +
43
+ ` Run \`cargo build --release\` inside daemon/ to build locally, or ensure the\n` +
44
+ ` @bookedsolid/${binaryName} optional package is installed.`);
45
+ }
46
+ /** Read the existing PID file and check if the process is alive. */
47
+ function getRunningPid() {
48
+ const pidPath = getPidFilePath();
49
+ if (!fs.existsSync(pidPath))
50
+ return null;
51
+ const raw = fs.readFileSync(pidPath, 'utf8').trim();
52
+ const pid = parseInt(raw, 10);
53
+ if (isNaN(pid))
54
+ return null;
55
+ // Send signal 0 to check if the process exists without affecting it
56
+ try {
57
+ process.kill(pid, 0);
58
+ return pid;
59
+ }
60
+ catch {
61
+ // Process not found — stale PID file
62
+ return null;
63
+ }
64
+ }
65
+ export function runDaemonStart(args) {
66
+ const foreground = args.includes('--foreground');
67
+ const portOverride = parseFlag(args, '--port');
68
+ const bindOverride = parseFlag(args, '--bind');
69
+ // Check if already running
70
+ const existingPid = getRunningPid();
71
+ if (existingPid !== null) {
72
+ console.log(`\nreagent daemon is already running (PID ${existingPid})`);
73
+ console.log(` Run \`reagent daemon status\` to inspect it.`);
74
+ console.log(` Run \`reagent daemon restart\` to restart it.\n`);
75
+ return;
76
+ }
77
+ // Load config (falls back to defaults if ~/.reagent/daemon.yaml absent)
78
+ let config;
79
+ try {
80
+ config = loadDaemonConfig();
81
+ }
82
+ catch (err) {
83
+ console.error(`[reagent] Failed to load daemon config: ${err instanceof Error ? err.message : err}`);
84
+ process.exit(1);
85
+ }
86
+ const port = portOverride ? parseInt(portOverride, 10) : config.port;
87
+ const bind = bindOverride ?? config.bind;
88
+ if (isNaN(port) || port < 1 || port > 65535) {
89
+ console.error(`[reagent] Invalid port: ${portOverride}`);
90
+ process.exit(1);
91
+ }
92
+ // Resolve binary
93
+ let binaryPath;
94
+ try {
95
+ binaryPath = resolveDaemonBinary();
96
+ }
97
+ catch (err) {
98
+ console.error(`[reagent] ${err instanceof Error ? err.message : err}`);
99
+ process.exit(1);
100
+ }
101
+ const env = {
102
+ ...process.env,
103
+ RUST_LOG: config.log_level,
104
+ REAGENT_DAEMON_PORT: String(port),
105
+ REAGENT_DAEMON_BIND: bind,
106
+ REAGENT_DAEMON_SESSION_TTL: String(config.session_ttl_minutes),
107
+ };
108
+ if (foreground) {
109
+ console.log(`\nStarting reagent daemon on ${bind}:${port} (foreground)`);
110
+ console.log(` Binary: ${binaryPath}\n`);
111
+ const child = spawn(binaryPath, [], { env, stdio: 'inherit' });
112
+ child.on('exit', (code) => {
113
+ process.exit(code ?? 0);
114
+ });
115
+ return;
116
+ }
117
+ // Background mode: detach child process and write PID file
118
+ const logDir = path.join(os.homedir(), '.reagent');
119
+ if (!fs.existsSync(logDir)) {
120
+ fs.mkdirSync(logDir, { recursive: true });
121
+ }
122
+ const logFile = path.join(logDir, 'daemon.log');
123
+ const logFd = fs.openSync(logFile, 'a');
124
+ const child = spawn(binaryPath, [], {
125
+ env,
126
+ stdio: ['ignore', logFd, logFd],
127
+ detached: true,
128
+ });
129
+ child.unref();
130
+ if (child.pid === undefined) {
131
+ console.error('[reagent] Failed to obtain daemon PID after spawn — daemon may not be running');
132
+ process.exit(1);
133
+ }
134
+ const pidPath = getPidFilePath();
135
+ fs.writeFileSync(pidPath, String(child.pid), 'utf8');
136
+ console.log(`\nreagent daemon started`);
137
+ console.log(` PID: ${child.pid}`);
138
+ console.log(` Address: http://${bind}:${port}`);
139
+ console.log(` Log: ${logFile}`);
140
+ console.log(` PID file: ${pidPath}`);
141
+ console.log(`\n Run \`reagent daemon status\` to confirm it is healthy.\n`);
142
+ }
143
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../../src/cli/commands/daemon/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runDaemonStatus(_args: string[]): Promise<void>;
2
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/daemon/status.ts"],"names":[],"mappings":"AAmBA,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmEpE"}
@@ -0,0 +1,90 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import os from 'node:os';
4
+ import { loadDaemonConfig } from '../../../config/daemon-loader.js';
5
+ /** Path to the PID file written by `reagent daemon start`. */
6
+ function getPidFilePath() {
7
+ return path.join(os.homedir(), '.reagent', 'daemon.pid');
8
+ }
9
+ async function fetchJson(url) {
10
+ const res = await fetch(url);
11
+ if (!res.ok) {
12
+ throw new Error(`HTTP ${res.status} from ${url}`);
13
+ }
14
+ return res.json();
15
+ }
16
+ export async function runDaemonStatus(_args) {
17
+ const pidPath = getPidFilePath();
18
+ // Check PID file
19
+ let pid = null;
20
+ if (fs.existsSync(pidPath)) {
21
+ const raw = fs.readFileSync(pidPath, 'utf8').trim();
22
+ const parsed = parseInt(raw, 10);
23
+ if (!isNaN(parsed)) {
24
+ // Verify the process is alive
25
+ try {
26
+ process.kill(parsed, 0);
27
+ pid = parsed;
28
+ }
29
+ catch {
30
+ // Stale PID
31
+ }
32
+ }
33
+ }
34
+ const config = loadDaemonConfig();
35
+ const baseUrl = `http://${config.bind}:${config.port}`;
36
+ console.log(`\nreagent daemon status`);
37
+ console.log(` Address: ${baseUrl}`);
38
+ if (pid !== null) {
39
+ console.log(` PID: ${pid} (running)`);
40
+ }
41
+ else {
42
+ console.log(` PID: not running`);
43
+ }
44
+ // Try to hit /health
45
+ let health = null;
46
+ try {
47
+ health = await fetchJson(`${baseUrl}/health`);
48
+ console.log(` Status: ${health.status}`);
49
+ console.log(` Version: ${health.version}`);
50
+ console.log(` Uptime: ${formatUptime(health.uptime_seconds)}`);
51
+ console.log(` Sessions: ${health.sessions}`);
52
+ }
53
+ catch {
54
+ console.log(` Status: unreachable (daemon may not be running or still starting)`);
55
+ console.log('');
56
+ return;
57
+ }
58
+ // Fetch sessions if any are active
59
+ if (health.sessions > 0) {
60
+ try {
61
+ const sessionsResp = await fetchJson(`${baseUrl}/sessions`);
62
+ console.log(`\n Active sessions:`);
63
+ for (const session of sessionsResp.sessions) {
64
+ const elapsed = session.last_activity_elapsed_secs;
65
+ const elapsedStr = elapsed < 60
66
+ ? `${elapsed}s ago`
67
+ : elapsed < 3600
68
+ ? `${Math.floor(elapsed / 60)}m ago`
69
+ : `${Math.floor(elapsed / 3600)}h ago`;
70
+ console.log(` [${session.session_id.slice(0, 8)}] ${session.project_root}`);
71
+ console.log(` Last activity: ${elapsedStr}`);
72
+ }
73
+ }
74
+ catch {
75
+ // Non-fatal — health already printed session count
76
+ }
77
+ }
78
+ console.log('');
79
+ }
80
+ function formatUptime(seconds) {
81
+ const h = Math.floor(seconds / 3600);
82
+ const m = Math.floor((seconds % 3600) / 60);
83
+ const s = seconds % 60;
84
+ if (h > 0)
85
+ return `${h}h ${m}m ${s}s`;
86
+ if (m > 0)
87
+ return `${m}m ${s}s`;
88
+ return `${s}s`;
89
+ }
90
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/cli/commands/daemon/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runDaemonStop(_args: string[], onDone?: () => void): void;
2
+ //# sourceMappingURL=stop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/daemon/stop.ts"],"names":[],"mappings":"AASA,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI,CA4ExE"}