@productbrain/cli 0.1.0-beta.7 → 0.1.0-beta.9

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 (166) hide show
  1. package/README.md +84 -1
  2. package/dist/__tests__/capture.test.d.ts +2 -0
  3. package/dist/__tests__/capture.test.d.ts.map +1 -0
  4. package/dist/__tests__/capture.test.js +86 -0
  5. package/dist/__tests__/capture.test.js.map +1 -0
  6. package/dist/__tests__/constellation.test.d.ts +2 -0
  7. package/dist/__tests__/constellation.test.d.ts.map +1 -0
  8. package/dist/__tests__/constellation.test.js +260 -0
  9. package/dist/__tests__/constellation.test.js.map +1 -0
  10. package/dist/__tests__/fields.test.d.ts +2 -0
  11. package/dist/__tests__/fields.test.d.ts.map +1 -0
  12. package/dist/__tests__/fields.test.js +238 -0
  13. package/dist/__tests__/fields.test.js.map +1 -0
  14. package/dist/__tests__/handshake.test.d.ts +2 -0
  15. package/dist/__tests__/handshake.test.d.ts.map +1 -0
  16. package/dist/__tests__/handshake.test.js +187 -0
  17. package/dist/__tests__/handshake.test.js.map +1 -0
  18. package/dist/__tests__/relate.test.d.ts +2 -0
  19. package/dist/__tests__/relate.test.d.ts.map +1 -0
  20. package/dist/__tests__/relate.test.js +79 -0
  21. package/dist/__tests__/relate.test.js.map +1 -0
  22. package/dist/__tests__/repo-detect.test.d.ts +2 -0
  23. package/dist/__tests__/repo-detect.test.d.ts.map +1 -0
  24. package/dist/__tests__/repo-detect.test.js +119 -0
  25. package/dist/__tests__/repo-detect.test.js.map +1 -0
  26. package/dist/__tests__/runner.test.d.ts +2 -0
  27. package/dist/__tests__/runner.test.d.ts.map +1 -0
  28. package/dist/__tests__/runner.test.js +215 -0
  29. package/dist/__tests__/runner.test.js.map +1 -0
  30. package/dist/__tests__/session-touch.test.d.ts +2 -0
  31. package/dist/__tests__/session-touch.test.d.ts.map +1 -0
  32. package/dist/__tests__/session-touch.test.js +134 -0
  33. package/dist/__tests__/session-touch.test.js.map +1 -0
  34. package/dist/__tests__/session.test.d.ts +2 -0
  35. package/dist/__tests__/session.test.d.ts.map +1 -0
  36. package/dist/__tests__/session.test.js +52 -0
  37. package/dist/__tests__/session.test.js.map +1 -0
  38. package/dist/__tests__/strip.test.d.ts +2 -0
  39. package/dist/__tests__/strip.test.d.ts.map +1 -0
  40. package/dist/__tests__/strip.test.js +136 -0
  41. package/dist/__tests__/strip.test.js.map +1 -0
  42. package/dist/__tests__/update.test.d.ts +2 -0
  43. package/dist/__tests__/update.test.d.ts.map +1 -0
  44. package/dist/__tests__/update.test.js +148 -0
  45. package/dist/__tests__/update.test.js.map +1 -0
  46. package/dist/commands/capture.d.ts +21 -0
  47. package/dist/commands/capture.d.ts.map +1 -0
  48. package/dist/commands/capture.js +100 -0
  49. package/dist/commands/capture.js.map +1 -0
  50. package/dist/commands/constellation.d.ts +11 -0
  51. package/dist/commands/constellation.d.ts.map +1 -0
  52. package/dist/commands/constellation.js +28 -0
  53. package/dist/commands/constellation.js.map +1 -0
  54. package/dist/commands/context.d.ts +2 -1
  55. package/dist/commands/context.d.ts.map +1 -1
  56. package/dist/commands/context.js +15 -9
  57. package/dist/commands/context.js.map +1 -1
  58. package/dist/commands/fields.d.ts +9 -0
  59. package/dist/commands/fields.d.ts.map +1 -0
  60. package/dist/commands/fields.js +26 -0
  61. package/dist/commands/fields.js.map +1 -0
  62. package/dist/commands/get.d.ts +8 -1
  63. package/dist/commands/get.d.ts.map +1 -1
  64. package/dist/commands/get.js +51 -6
  65. package/dist/commands/get.js.map +1 -1
  66. package/dist/commands/handshake.d.ts +18 -0
  67. package/dist/commands/handshake.d.ts.map +1 -0
  68. package/dist/commands/handshake.js +378 -0
  69. package/dist/commands/handshake.js.map +1 -0
  70. package/dist/commands/ingest.d.ts +1 -0
  71. package/dist/commands/ingest.d.ts.map +1 -1
  72. package/dist/commands/ingest.js +25 -8
  73. package/dist/commands/ingest.js.map +1 -1
  74. package/dist/commands/orient.d.ts +1 -0
  75. package/dist/commands/orient.d.ts.map +1 -1
  76. package/dist/commands/orient.js +13 -8
  77. package/dist/commands/orient.js.map +1 -1
  78. package/dist/commands/relate.d.ts +15 -0
  79. package/dist/commands/relate.d.ts.map +1 -0
  80. package/dist/commands/relate.js +72 -0
  81. package/dist/commands/relate.js.map +1 -0
  82. package/dist/commands/search.d.ts +1 -0
  83. package/dist/commands/search.d.ts.map +1 -1
  84. package/dist/commands/search.js +5 -3
  85. package/dist/commands/search.js.map +1 -1
  86. package/dist/commands/session.d.ts +20 -0
  87. package/dist/commands/session.d.ts.map +1 -0
  88. package/dist/commands/session.js +134 -0
  89. package/dist/commands/session.js.map +1 -0
  90. package/dist/commands/update.d.ts +16 -0
  91. package/dist/commands/update.d.ts.map +1 -0
  92. package/dist/commands/update.js +89 -0
  93. package/dist/commands/update.js.map +1 -0
  94. package/dist/formatters/capture.d.ts +30 -0
  95. package/dist/formatters/capture.d.ts.map +1 -0
  96. package/dist/formatters/capture.js +58 -0
  97. package/dist/formatters/capture.js.map +1 -0
  98. package/dist/formatters/constellation.d.ts +34 -0
  99. package/dist/formatters/constellation.d.ts.map +1 -0
  100. package/dist/formatters/constellation.js +38 -0
  101. package/dist/formatters/constellation.js.map +1 -0
  102. package/dist/formatters/fields.d.ts +32 -0
  103. package/dist/formatters/fields.d.ts.map +1 -0
  104. package/dist/formatters/fields.js +49 -0
  105. package/dist/formatters/fields.js.map +1 -0
  106. package/dist/formatters/handshake.d.ts +17 -0
  107. package/dist/formatters/handshake.d.ts.map +1 -0
  108. package/dist/formatters/handshake.js +51 -0
  109. package/dist/formatters/handshake.js.map +1 -0
  110. package/dist/formatters/relate.d.ts +11 -0
  111. package/dist/formatters/relate.d.ts.map +1 -0
  112. package/dist/formatters/relate.js +10 -0
  113. package/dist/formatters/relate.js.map +1 -0
  114. package/dist/formatters/session.d.ts +11 -0
  115. package/dist/formatters/session.d.ts.map +1 -0
  116. package/dist/formatters/session.js +51 -0
  117. package/dist/formatters/session.js.map +1 -0
  118. package/dist/formatters/update.d.ts +17 -0
  119. package/dist/formatters/update.d.ts.map +1 -0
  120. package/dist/formatters/update.js +43 -0
  121. package/dist/formatters/update.js.map +1 -0
  122. package/dist/generators/adapters.d.ts +10 -0
  123. package/dist/generators/adapters.d.ts.map +1 -0
  124. package/dist/generators/adapters.js +102 -0
  125. package/dist/generators/adapters.js.map +1 -0
  126. package/dist/generators/briefing-md.d.ts +8 -0
  127. package/dist/generators/briefing-md.d.ts.map +1 -0
  128. package/dist/generators/briefing-md.js +51 -0
  129. package/dist/generators/briefing-md.js.map +1 -0
  130. package/dist/generators/context-md.d.ts +8 -0
  131. package/dist/generators/context-md.d.ts.map +1 -0
  132. package/dist/generators/context-md.js +123 -0
  133. package/dist/generators/context-md.js.map +1 -0
  134. package/dist/generators/portable-knowledge.d.ts +72 -0
  135. package/dist/generators/portable-knowledge.d.ts.map +1 -0
  136. package/dist/generators/portable-knowledge.js +246 -0
  137. package/dist/generators/portable-knowledge.js.map +1 -0
  138. package/dist/generators/portable-knowledge.test.d.ts +2 -0
  139. package/dist/generators/portable-knowledge.test.d.ts.map +1 -0
  140. package/dist/generators/portable-knowledge.test.js +399 -0
  141. package/dist/generators/portable-knowledge.test.js.map +1 -0
  142. package/dist/index.d.ts +3 -2
  143. package/dist/index.d.ts.map +1 -1
  144. package/dist/index.js +231 -6
  145. package/dist/index.js.map +1 -1
  146. package/dist/lib/client.d.ts +19 -0
  147. package/dist/lib/client.d.ts.map +1 -1
  148. package/dist/lib/client.js +102 -8
  149. package/dist/lib/client.js.map +1 -1
  150. package/dist/lib/repo-detect.d.ts +14 -0
  151. package/dist/lib/repo-detect.d.ts.map +1 -0
  152. package/dist/lib/repo-detect.js +58 -0
  153. package/dist/lib/repo-detect.js.map +1 -0
  154. package/dist/lib/runner.d.ts +31 -0
  155. package/dist/lib/runner.d.ts.map +1 -0
  156. package/dist/lib/runner.js +65 -0
  157. package/dist/lib/runner.js.map +1 -0
  158. package/dist/lib/session.d.ts +17 -0
  159. package/dist/lib/session.d.ts.map +1 -0
  160. package/dist/lib/session.js +43 -0
  161. package/dist/lib/session.js.map +1 -0
  162. package/dist/lib/strip.d.ts +11 -0
  163. package/dist/lib/strip.d.ts.map +1 -0
  164. package/dist/lib/strip.js +26 -0
  165. package/dist/lib/strip.js.map +1 -0
  166. package/package.json +6 -3
package/dist/index.js CHANGED
@@ -1,19 +1,44 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * Product Brain CLI — read-only Chain knowledge in the terminal.
4
- * BET-108 Slice 0: pb orient
3
+ * Product Brain CLI — Chain knowledge + write-back in the terminal.
4
+ * Read: BET-108. Write: pb session + pb capture (TEN-27, INS-80).
5
+ * BET-181 Slice 0: global --json / --pretty flags for agent-native output (DEC-299).
5
6
  */
6
7
  import { Command } from 'commander';
8
+ import { setOutputMode } from './lib/runner.js';
7
9
  import { runContext } from './commands/context.js';
8
- import { runGet } from './commands/get.js';
10
+ import { runGet, runGetMany } from './commands/get.js';
9
11
  import { runLogin } from './commands/login.js';
10
12
  import { runOrient } from './commands/orient.js';
11
13
  import { runSearch } from './commands/search.js';
14
+ import { runHandshake, runHandshakeInit } from './commands/handshake.js';
15
+ import { runSessionStart, runSessionClose, runSessionId } from './commands/session.js';
16
+ import { runCapture } from './commands/capture.js';
17
+ import { runUpdate } from './commands/update.js';
18
+ import { runRelate, runUnrelate } from './commands/relate.js';
19
+ import { runIngest } from './commands/ingest.js';
20
+ import { runFields } from './commands/fields.js';
21
+ import { runConstellation } from './commands/constellation.js';
12
22
  const program = new Command();
13
23
  program
14
24
  .name('pb')
15
- .description('Product Brain — read-only CLI for Chain knowledge')
16
- .version('0.1.0');
25
+ .description('Product Brain — Chain knowledge + write-back CLI')
26
+ .version('0.2.0')
27
+ // Global output mode flags (DEC-299, BET-181)
28
+ .option('--json', 'Output machine-readable JSON (overrides TTY auto-detection)')
29
+ .option('--pretty', 'Force human-readable output even when piped');
30
+ // Apply global output mode BEFORE subcommand actions run
31
+ program.hook('preAction', (thisCommand) => {
32
+ const globalOpts = program.opts();
33
+ if (globalOpts.json) {
34
+ setOutputMode('json');
35
+ }
36
+ else if (globalOpts.pretty) {
37
+ setOutputMode('pretty');
38
+ }
39
+ // else: 'auto' (default) — TTY detection handles it
40
+ void thisCommand;
41
+ });
17
42
  program
18
43
  .command('get <entry-id>')
19
44
  .description('Display full entry by ID (data, relations, last 10 history events)')
@@ -30,9 +55,21 @@ program
30
55
  process.exit(1);
31
56
  }
32
57
  });
58
+ program
59
+ .command('get-many <entry-ids...>')
60
+ .description('Fetch multiple entries in parallel (space-separated IDs)')
61
+ .action(async (entryIds) => {
62
+ try {
63
+ await runGetMany({ entryIds: entryIds.map((id) => id.trim()).filter(Boolean) });
64
+ }
65
+ catch (err) {
66
+ console.error(err instanceof Error ? err.message : String(err));
67
+ process.exit(1);
68
+ }
69
+ });
33
70
  program
34
71
  .command('context <entry-id>')
35
- .description('Gather and display constellation context (pipe-friendly markdown when stdout is not a TTY)')
72
+ .description('Gather and display constellation context (pipe-friendly: JSON when piped, human text in terminal)')
36
73
  .action(async (entryId) => {
37
74
  if (!entryId?.trim()) {
38
75
  program.commands.find((c) => c.name() === 'context')?.help();
@@ -76,6 +113,26 @@ program
76
113
  process.exit(1);
77
114
  }
78
115
  });
116
+ program
117
+ .command('handshake')
118
+ .description('Generate context files for AI developer tools (CLAUDE.md, .cursor/rules/, .github/copilot-instructions.md)')
119
+ .option('--force', 'Overwrite adapter files even if they exist without auto-generated marker')
120
+ .option('--dry-run', 'Show what would be generated without writing files')
121
+ .option('--init', 'Set up Claude Code integration: team hooks + personal trust level')
122
+ .option('--level <level>', 'With --init: trust level (guide|work|silent|full-trust). Without --init: content tier (beginner|intermediate|expert)')
123
+ .action(async (opts) => {
124
+ try {
125
+ if (opts.init) {
126
+ await runHandshakeInit({ level: opts.level, dryRun: opts.dryRun });
127
+ return;
128
+ }
129
+ await runHandshake({ force: opts.force, dryRun: opts.dryRun, level: opts.level });
130
+ }
131
+ catch (err) {
132
+ console.error(err instanceof Error ? err.message : String(err));
133
+ process.exit(1);
134
+ }
135
+ });
79
136
  program
80
137
  .command('login')
81
138
  .description('Save your API key to ~/.config/productbrain/.env (works from any directory)')
@@ -88,5 +145,173 @@ program
88
145
  process.exit(1);
89
146
  }
90
147
  });
148
+ // --- Write commands (require active session) ---
149
+ const sessionCmd = program
150
+ .command('session')
151
+ .description('Manage write sessions (DEC-9: sessions required before write access)');
152
+ sessionCmd
153
+ .command('start')
154
+ .description('Start a tracked write session (opens session, refreshes context)')
155
+ .option('--json', 'Output machine-readable JSON (deprecated: use global --json flag)')
156
+ .action(async (opts) => {
157
+ try {
158
+ await runSessionStart({ json: opts.json });
159
+ }
160
+ catch (err) {
161
+ console.error(err instanceof Error ? err.message : String(err));
162
+ process.exit(1);
163
+ }
164
+ });
165
+ sessionCmd
166
+ .command('id')
167
+ .description('Print current session ID to stdout (machine-readable, TEN-707)')
168
+ .action(() => {
169
+ try {
170
+ runSessionId();
171
+ }
172
+ catch (err) {
173
+ console.error(err instanceof Error ? err.message : String(err));
174
+ process.exit(1);
175
+ }
176
+ });
177
+ sessionCmd
178
+ .command('close')
179
+ .description('Close the active session (wrapup, refresh context)')
180
+ .option('--force', 'Clear local session state even if server close fails')
181
+ .action(async (opts) => {
182
+ try {
183
+ await runSessionClose({ force: opts.force });
184
+ }
185
+ catch (err) {
186
+ console.error(err instanceof Error ? err.message : String(err));
187
+ process.exit(1);
188
+ }
189
+ });
190
+ program
191
+ .command('capture [text...]')
192
+ .description('Capture knowledge to the Chain (requires active session)')
193
+ .option('-n, --name <name>', 'Entry name (defaults to capture text)')
194
+ .option('-d, --description <desc>', 'Entry description (defaults to capture text)')
195
+ .option('-c, --collection <slug>', 'Explicit collection (skip auto-classification)')
196
+ .option('-l, --link <entry-id>', 'Link new entry to an existing entry (TEN-705)')
197
+ .option('-t, --type <relation-type>', 'Relation type for --link (default: surfaces_tension_in)')
198
+ .option('--json', 'Output machine-readable JSON (deprecated: use global --json flag)')
199
+ .action(async (textParts = [], opts) => {
200
+ const text = textParts.join(' ').trim();
201
+ if (!text && !opts.name) {
202
+ program.commands.find((c) => c.name() === 'capture')?.help();
203
+ return;
204
+ }
205
+ try {
206
+ await runCapture({
207
+ text: text || opts.name || '',
208
+ name: opts.name,
209
+ description: opts.description,
210
+ collection: opts.collection,
211
+ link: opts.link,
212
+ type: opts.type,
213
+ json: opts.json,
214
+ });
215
+ }
216
+ catch (err) {
217
+ console.error(err instanceof Error ? err.message : String(err));
218
+ process.exit(1);
219
+ }
220
+ });
221
+ // --- Update command (TEN-703) ---
222
+ program
223
+ .command('update <entry-id>')
224
+ .description('Update fields on an existing Chain entry (requires active session)')
225
+ .option('-f, --field <key=value>', 'Set a data field (repeatable)', (val, prev) => [...prev, val], [])
226
+ .option('--name <name>', 'Update entry name')
227
+ .option('--status <status>', 'Update entry status (draft | active | deprecated | archived)')
228
+ .option('--note <text>', 'Change note for history')
229
+ .action(async (entryId, opts) => {
230
+ try {
231
+ await runUpdate({
232
+ entryId,
233
+ field: opts.field,
234
+ name: opts.name,
235
+ status: opts.status,
236
+ note: opts.note,
237
+ });
238
+ }
239
+ catch (err) {
240
+ console.error(err instanceof Error ? err.message : String(err));
241
+ process.exit(1);
242
+ }
243
+ });
244
+ // --- Relate / Unrelate commands (TEN-704) ---
245
+ program
246
+ .command('relate <from-id> <type> <to-id>')
247
+ .description('Add a typed relation between two entries (requires active session)')
248
+ .action(async (fromId, type, toId) => {
249
+ try {
250
+ await runRelate({ fromId, type, toId });
251
+ }
252
+ catch (err) {
253
+ console.error(err instanceof Error ? err.message : String(err));
254
+ process.exit(1);
255
+ }
256
+ });
257
+ program
258
+ .command('unrelate <from-id> <type> <to-id>')
259
+ .description('Remove a typed relation between two entries (requires active session)')
260
+ .action(async (fromId, type, toId) => {
261
+ try {
262
+ await runUnrelate({ fromId, type, toId });
263
+ }
264
+ catch (err) {
265
+ console.error(err instanceof Error ? err.message : String(err));
266
+ process.exit(1);
267
+ }
268
+ });
269
+ // --- Ingest command (BET-81) ---
270
+ program
271
+ .command('ingest <pattern>')
272
+ .description('Bulk ingest documents to Chain as drafts')
273
+ .action(async (pattern) => {
274
+ try {
275
+ await runIngest({ pattern });
276
+ }
277
+ catch (err) {
278
+ console.error(err instanceof Error ? err.message : String(err));
279
+ process.exit(1);
280
+ }
281
+ });
282
+ // --- Fields command (BET-181 Slice 2) ---
283
+ program
284
+ .command('fields <collection>')
285
+ .description('List all field definitions for a collection (schema discovery for agents)')
286
+ .action(async (collection) => {
287
+ if (!collection?.trim()) {
288
+ program.commands.find((c) => c.name() === 'fields')?.help();
289
+ return;
290
+ }
291
+ try {
292
+ await runFields({ collectionSlug: collection.trim() });
293
+ }
294
+ catch (err) {
295
+ console.error(err instanceof Error ? err.message : String(err));
296
+ process.exit(1);
297
+ }
298
+ });
299
+ // --- Constellation command (BET-181 Slice 3) ---
300
+ program
301
+ .command('constellation <entry-id>')
302
+ .description('Compound view: entry + all related entries grouped by relation type (agent-native)')
303
+ .action(async (entryId) => {
304
+ if (!entryId?.trim()) {
305
+ program.commands.find((c) => c.name() === 'constellation')?.help();
306
+ return;
307
+ }
308
+ try {
309
+ await runConstellation({ entryId: entryId.trim() });
310
+ }
311
+ catch (err) {
312
+ console.error(err instanceof Error ? err.message : String(err));
313
+ process.exit(1);
314
+ }
315
+ });
91
316
  program.parse();
92
317
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,kDAAkD,CAAC;KAC/D,OAAO,CAAC,OAAO,CAAC;IACjB,8CAA8C;KAC7C,MAAM,CAAC,QAAQ,EAAE,6DAA6D,CAAC;KAC/E,MAAM,CAAC,UAAU,EAAE,6CAA6C,CAAC,CAAC;AAErE,yDAAyD;AACzD,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,EAAE;IACxC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAA0C,CAAC;IAC1E,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;QACpB,aAAa,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;SAAM,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QAC7B,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;IACD,oDAAoD;IACpD,KAAK,WAAW,CAAC;AACnB,CAAC,CAAC,CAAC;AAEH,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,oEAAoE,CAAC;KACjF,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;IAChC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;QACzD,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,yBAAyB,CAAC;KAClC,WAAW,CAAC,0DAA0D,CAAC;KACvE,MAAM,CAAC,KAAK,EAAE,QAAkB,EAAE,EAAE;IACnC,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAClF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,oBAAoB,CAAC;KAC7B,WAAW,CAAC,mGAAmG,CAAC;KAChH,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;IAChC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;QAC7D,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,KAAK,EAAE,aAAuB,EAAE,EAAE,EAAE;IAC1C,MAAM,KAAK,GAAG,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC;QAC5D,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,qGAAqG,CAAC;KAClH,MAAM,CAAC,aAAa,EAAE,+DAA+D,CAAC;KACtF,MAAM,CAAC,KAAK,EAAE,IAAyB,EAAE,EAAE;IAC1C,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,4GAA4G,CAAC;KACzH,MAAM,CAAC,SAAS,EAAE,0EAA0E,CAAC;KAC7F,MAAM,CAAC,WAAW,EAAE,oDAAoD,CAAC;KACzE,MAAM,CAAC,QAAQ,EAAE,mEAAmE,CAAC;KACrF,MAAM,CAAC,iBAAiB,EAAE,sHAAsH,CAAC;KACjJ,MAAM,CAAC,KAAK,EAAE,IAA2E,EAAE,EAAE;IAC5F,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,gBAAgB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QACD,MAAM,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACpF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,6EAA6E,CAAC;KAC1F,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,QAAQ,EAAE,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,kDAAkD;AAElD,MAAM,UAAU,GAAG,OAAO;KACvB,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,sEAAsE,CAAC,CAAC;AAEvF,UAAU;KACP,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,kEAAkE,CAAC;KAC/E,MAAM,CAAC,QAAQ,EAAE,mEAAmE,CAAC;KACrF,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;IACzC,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,UAAU;KACP,OAAO,CAAC,IAAI,CAAC;KACb,WAAW,CAAC,gEAAgE,CAAC;KAC7E,MAAM,CAAC,GAAG,EAAE;IACX,IAAI,CAAC;QACH,YAAY,EAAE,CAAC;IACjB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,UAAU;KACP,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,oDAAoD,CAAC;KACjE,MAAM,CAAC,SAAS,EAAE,sDAAsD,CAAC;KACzE,MAAM,CAAC,KAAK,EAAE,IAAyB,EAAE,EAAE;IAC1C,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,0DAA0D,CAAC;KACvE,MAAM,CAAC,mBAAmB,EAAE,uCAAuC,CAAC;KACpE,MAAM,CAAC,0BAA0B,EAAE,8CAA8C,CAAC;KAClF,MAAM,CAAC,yBAAyB,EAAE,gDAAgD,CAAC;KACnF,MAAM,CAAC,uBAAuB,EAAE,+CAA+C,CAAC;KAChF,MAAM,CAAC,4BAA4B,EAAE,yDAAyD,CAAC;KAC/F,MAAM,CAAC,QAAQ,EAAE,mEAAmE,CAAC;KACrF,MAAM,CAAC,KAAK,EAAE,YAAsB,EAAE,EAAE,IAAgH,EAAE,EAAE;IAC3J,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;QAC7D,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,UAAU,CAAC;YACf,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE;YAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,mCAAmC;AAEnC,OAAO;KACJ,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,oEAAoE,CAAC;KACjF,MAAM,CAAC,yBAAyB,EAAE,+BAA+B,EAAE,CAAC,GAAW,EAAE,IAAc,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,EAAc,CAAC;KACnI,MAAM,CAAC,eAAe,EAAE,mBAAmB,CAAC;KAC5C,MAAM,CAAC,mBAAmB,EAAE,8DAA8D,CAAC;KAC3F,MAAM,CAAC,eAAe,EAAE,yBAAyB,CAAC;KAClD,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,IAAyE,EAAE,EAAE;IAC3G,IAAI,CAAC;QACH,MAAM,SAAS,CAAC;YACd,OAAO;YACP,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,+CAA+C;AAE/C,OAAO;KACJ,OAAO,CAAC,iCAAiC,CAAC;KAC1C,WAAW,CAAC,oEAAoE,CAAC;KACjF,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAY,EAAE,IAAY,EAAE,EAAE;IAC3D,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,mCAAmC,CAAC;KAC5C,WAAW,CAAC,uEAAuE,CAAC;KACpF,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAY,EAAE,IAAY,EAAE,EAAE;IAC3D,IAAI,CAAC;QACH,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,kCAAkC;AAElC,OAAO;KACJ,OAAO,CAAC,kBAAkB,CAAC;KAC3B,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;IAChC,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,2CAA2C;AAE3C,OAAO;KACJ,OAAO,CAAC,qBAAqB,CAAC;KAC9B,WAAW,CAAC,2EAA2E,CAAC;KACxF,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,EAAE;IACnC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC;QACxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC;QAC5D,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,EAAE,cAAc,EAAE,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,kDAAkD;AAElD,OAAO;KACJ,OAAO,CAAC,0BAA0B,CAAC;KACnC,WAAW,CAAC,oFAAoF,CAAC;KACjG,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;IAChC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC;QACnE,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,gBAAgB,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -1,5 +1,24 @@
1
1
  /**
2
2
  * MCP HTTP client — POST to Convex gateway with Bearer auth.
3
+ *
4
+ * TEN-729: Detects sandbox-blocked fetch (Claude Code, Cursor, etc.) and
5
+ * provides an actionable error instead of the opaque "fetch failed".
6
+ *
7
+ * Sandbox proxy support: Node.js fetch (undici) ignores proxy env vars by
8
+ * default. We detect HTTPS_PROXY and configure a ProxyAgent so pb works in
9
+ * sandboxed environments (Claude Code, Cursor) without requiring
10
+ * NODE_OPTIONS="--use-env-proxy".
3
11
  */
4
12
  export declare function mcpCall<T = unknown>(fn: string, args?: Record<string, unknown>): Promise<T>;
13
+ /**
14
+ * mcpCall variant that injects X-Agent-Session-Id header for write operations.
15
+ * All write commands (update, relate, unrelate, capture) should use this.
16
+ *
17
+ * After a successful write, fires a non-blocking `agent.touchSession` call to
18
+ * renew the session TTL — mirroring MCP server behavior (DEC-299, BET-181 Slice 1).
19
+ * The touch is fire-and-forget: it does not block the write response, and errors
20
+ * are silently swallowed. No touch is attempted if no session is active or if
21
+ * the write itself fails.
22
+ */
23
+ export declare function mcpCallWithSession<T = unknown>(fn: string, args?: Record<string, unknown>): Promise<T>;
5
24
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,wBAAsB,OAAO,CAAC,CAAC,GAAG,OAAO,EACvC,EAAE,EAAE,MAAM,EACV,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,CAAC,CAAC,CAiBZ"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA0CH,wBAAsB,OAAO,CAAC,CAAC,GAAG,OAAO,EACvC,EAAE,EAAE,MAAM,EACV,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,CAAC,CAAC,CAsBZ;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,GAAG,OAAO,EAClD,EAAE,EAAE,MAAM,EACV,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,CAAC,CAAC,CAoCZ"}
@@ -1,21 +1,115 @@
1
1
  /**
2
2
  * MCP HTTP client — POST to Convex gateway with Bearer auth.
3
+ *
4
+ * TEN-729: Detects sandbox-blocked fetch (Claude Code, Cursor, etc.) and
5
+ * provides an actionable error instead of the opaque "fetch failed".
6
+ *
7
+ * Sandbox proxy support: Node.js fetch (undici) ignores proxy env vars by
8
+ * default. We detect HTTPS_PROXY and configure a ProxyAgent so pb works in
9
+ * sandboxed environments (Claude Code, Cursor) without requiring
10
+ * NODE_OPTIONS="--use-env-proxy".
3
11
  */
4
12
  import { getConfig } from './config.js';
13
+ import { readSession } from './session.js';
14
+ // Configure proxy at module load — runs once, before any fetch call.
15
+ // Node.js fetch (undici) ignores HTTPS_PROXY env vars. We detect the proxy
16
+ // and install a ProxyAgent as the global dispatcher so all fetch() calls
17
+ // route through the sandbox proxy automatically.
18
+ try {
19
+ const _proxy = process.env.https_proxy || process.env.HTTPS_PROXY;
20
+ if (_proxy) {
21
+ const { ProxyAgent, setGlobalDispatcher } = await import('undici');
22
+ setGlobalDispatcher(new ProxyAgent(_proxy));
23
+ }
24
+ }
25
+ catch {
26
+ // undici unavailable or proxy config failed — rethrowWithGuidance handles it.
27
+ }
28
+ /** Detect a sandbox/network-blocked fetch and re-throw with guidance. */
29
+ function rethrowWithGuidance(err, siteUrl) {
30
+ const msg = err instanceof Error ? err.message : String(err);
31
+ if (msg === 'fetch failed' || msg.includes('ECONNREFUSED') || msg.includes('ENOTFOUND')) {
32
+ const host = new URL(siteUrl).hostname;
33
+ const proxy = process.env.https_proxy || process.env.HTTPS_PROXY;
34
+ // When a proxy is set, the sandbox is routing traffic through it.
35
+ // Node.js fetch (undici) does NOT respect proxy env vars by default.
36
+ // The fix is --use-env-proxy (Node 22.14+), not adding the host to the allowlist.
37
+ const proxyHint = proxy
38
+ ? `A proxy is configured (${proxy}) but Node.js fetch() is not using it.\n` +
39
+ `Fix: set NODE_OPTIONS="--use-env-proxy" in your environment,\n` +
40
+ ` or re-run with: NODE_OPTIONS="--use-env-proxy" pb <command>\n`
41
+ : `If you are running inside an AI code editor sandbox (Claude Code, Cursor, etc.),\n` +
42
+ `the sandbox may be blocking outbound connections.\n\n` +
43
+ `Fix: add "${host}" to your sandbox network allowlist.\n` +
44
+ ` • Claude Code: run /sandbox → add network host\n` +
45
+ ` • Or re-run: pb handshake --init (configures sandbox automatically)\n`;
46
+ throw new Error(`Could not reach ${host}.\n\n${proxyHint}`);
47
+ }
48
+ throw err;
49
+ }
5
50
  export async function mcpCall(fn, args = {}) {
6
51
  const { apiKey, siteUrl } = getConfig();
7
- const res = await fetch(`${siteUrl}/api/mcp`, {
8
- method: 'POST',
9
- headers: {
10
- 'Content-Type': 'application/json',
11
- Authorization: `Bearer ${apiKey}`,
12
- },
13
- body: JSON.stringify({ fn, args }),
14
- });
52
+ let res;
53
+ try {
54
+ res = await fetch(`${siteUrl}/api/mcp`, {
55
+ method: 'POST',
56
+ headers: {
57
+ 'Content-Type': 'application/json',
58
+ Authorization: `Bearer ${apiKey}`,
59
+ },
60
+ body: JSON.stringify({ fn, args }),
61
+ });
62
+ }
63
+ catch (err) {
64
+ rethrowWithGuidance(err, siteUrl);
65
+ }
66
+ const json = (await res.json());
67
+ if (!res.ok || json.error) {
68
+ throw new Error(json.error ?? res.statusText);
69
+ }
70
+ return json.data;
71
+ }
72
+ /**
73
+ * mcpCall variant that injects X-Agent-Session-Id header for write operations.
74
+ * All write commands (update, relate, unrelate, capture) should use this.
75
+ *
76
+ * After a successful write, fires a non-blocking `agent.touchSession` call to
77
+ * renew the session TTL — mirroring MCP server behavior (DEC-299, BET-181 Slice 1).
78
+ * The touch is fire-and-forget: it does not block the write response, and errors
79
+ * are silently swallowed. No touch is attempted if no session is active or if
80
+ * the write itself fails.
81
+ */
82
+ export async function mcpCallWithSession(fn, args = {}) {
83
+ const { apiKey, siteUrl } = getConfig();
84
+ const session = readSession();
85
+ const headers = {
86
+ 'Content-Type': 'application/json',
87
+ Authorization: `Bearer ${apiKey}`,
88
+ };
89
+ if (session?.sessionId) {
90
+ headers['X-Agent-Session-Id'] = session.sessionId;
91
+ }
92
+ let res;
93
+ try {
94
+ res = await fetch(`${siteUrl}/api/mcp`, {
95
+ method: 'POST',
96
+ headers,
97
+ body: JSON.stringify({ fn, args }),
98
+ });
99
+ }
100
+ catch (err) {
101
+ rethrowWithGuidance(err, siteUrl);
102
+ }
15
103
  const json = (await res.json());
16
104
  if (!res.ok || json.error) {
17
105
  throw new Error(json.error ?? res.statusText);
18
106
  }
107
+ // Fire-and-forget session touch — best-effort, never blocks the write response.
108
+ // Only touch when a session is active. Uses mcpCall (not mcpCallWithSession) to
109
+ // avoid recursion.
110
+ if (session?.sessionId) {
111
+ mcpCall('agent.touchSession', { sessionId: session.sessionId }).catch(() => { });
112
+ }
19
113
  return json.data;
20
114
  }
21
115
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,EAAU,EACV,OAAgC,EAAE;IAElC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,CAAC;IAExC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,UAAU,EAAE;QAC5C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,MAAM,EAAE;SAClC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;KACnC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAiC,CAAC;IAChE,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,IAAI,CAAC,IAAS,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Local repo detection — reads filesystem signals to build a RepoContext.
3
+ * No API calls. Pure filesystem inspection.
4
+ */
5
+ export interface RepoContext {
6
+ name: string | null;
7
+ description: string | null;
8
+ gitRemote: string | null;
9
+ repoSlug: string | null;
10
+ detectedStack: string[];
11
+ isMonorepo: boolean;
12
+ }
13
+ export declare function detectRepo(cwd?: string): RepoContext;
14
+ //# sourceMappingURL=repo-detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-detect.d.ts","sourceRoot":"","sources":["../../src/lib/repo-detect.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,UAAU,CAAC,GAAG,SAAgB,GAAG,WAAW,CAiD3D"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Local repo detection — reads filesystem signals to build a RepoContext.
3
+ * No API calls. Pure filesystem inspection.
4
+ */
5
+ import { existsSync, readFileSync } from 'fs';
6
+ import { resolve, basename } from 'path';
7
+ import { execSync } from 'child_process';
8
+ export function detectRepo(cwd = process.cwd()) {
9
+ const ctx = {
10
+ name: null,
11
+ description: null,
12
+ gitRemote: null,
13
+ repoSlug: null,
14
+ detectedStack: [],
15
+ isMonorepo: false,
16
+ };
17
+ // package.json
18
+ const pkgPath = resolve(cwd, 'package.json');
19
+ if (existsSync(pkgPath)) {
20
+ try {
21
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
22
+ ctx.name = pkg.name?.replace(/^@[^/]+\//, '') ?? null;
23
+ ctx.description = pkg.description ?? null;
24
+ if (pkg.workspaces)
25
+ ctx.isMonorepo = true;
26
+ }
27
+ catch { /* ignore parse errors */ }
28
+ }
29
+ // git remote
30
+ try {
31
+ const remote = execSync('git remote get-url origin', { cwd, encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
32
+ ctx.gitRemote = remote;
33
+ // Extract owner/repo from SSH or HTTPS URL
34
+ const m = remote.match(/[:/]([^/]+\/[^/.]+?)(?:\.git)?$/);
35
+ if (m)
36
+ ctx.repoSlug = m[1];
37
+ }
38
+ catch { /* not a git repo or no remote */ }
39
+ // Stack detection
40
+ const checks = [
41
+ ['sveltekit', ['svelte.config.js', 'svelte.config.ts']],
42
+ ['convex', ['convex']],
43
+ ['typescript', ['tsconfig.json']],
44
+ ['nextjs', ['next.config.js', 'next.config.ts', 'next.config.mjs']],
45
+ ['vite', ['vite.config.ts', 'vite.config.js']],
46
+ ['react', ['src/App.tsx', 'src/App.jsx']],
47
+ ];
48
+ for (const [tech, paths] of checks) {
49
+ if (paths.some((p) => existsSync(resolve(cwd, p)))) {
50
+ ctx.detectedStack.push(tech);
51
+ }
52
+ }
53
+ // Fallback name from directory
54
+ if (!ctx.name)
55
+ ctx.name = basename(cwd);
56
+ return ctx;
57
+ }
58
+ //# sourceMappingURL=repo-detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-detect.js","sourceRoot":"","sources":["../../src/lib/repo-detect.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAWzC,MAAM,UAAU,UAAU,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAC5C,MAAM,GAAG,GAAgB;QACvB,IAAI,EAAE,IAAI;QACV,WAAW,EAAE,IAAI;QACjB,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,IAAI;QACd,aAAa,EAAE,EAAE;QACjB,UAAU,EAAE,KAAK;KAClB,CAAC;IAEF,eAAe;IACf,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC7C,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;YACtD,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC;YACtD,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC;YAC1C,IAAI,GAAG,CAAC,UAAU;gBAAE,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC,CAAC,yBAAyB,CAAC,CAAC;IACvC,CAAC;IAED,aAAa;IACb,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,2BAA2B,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACxH,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC;QACvB,2CAA2C;QAC3C,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAC1D,IAAI,CAAC;YAAE,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC,CAAC,iCAAiC,CAAC,CAAC;IAE7C,kBAAkB;IAClB,MAAM,MAAM,GAA8B;QACxC,CAAC,WAAW,EAAE,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;QACvD,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC;QACtB,CAAC,YAAY,EAAE,CAAC,eAAe,CAAC,CAAC;QACjC,CAAC,QAAQ,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,CAAC;QACnE,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;QAC9C,CAAC,OAAO,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;KAC1C,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,IAAI,CAAC,GAAG,CAAC,IAAI;QAAE,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAExC,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * runCliCommand — shared command runner for the Product Brain CLI.
3
+ *
4
+ * Owns:
5
+ * (a) TTY detection via process.stdout.isTTY
6
+ * (b) JSON vs human output branching
7
+ * (c) stripConvexInternals() application in JSON mode
8
+ * (d) --json and --pretty explicit overrides that take precedence over auto-detection
9
+ * (e) Error handling: JSON error object in JSON mode, formatted message in TTY mode
10
+ *
11
+ * Chain: DEC-299 (JSON-default), STD-65 (agent responses: structured, parseable, minimal)
12
+ */
13
+ export declare function setOutputMode(mode: 'auto' | 'json' | 'pretty'): void;
14
+ export declare function getOutputMode(): 'auto' | 'json' | 'pretty';
15
+ /** Returns true if the current output mode resolves to JSON. */
16
+ export declare function isJsonMode(): boolean;
17
+ export interface RunCliCommandOptions<T> {
18
+ /** The async function that performs the MCP call and returns data. */
19
+ fn: () => Promise<T>;
20
+ /** Formats data for human-readable TTY output. */
21
+ formatPretty: (data: T) => string;
22
+ }
23
+ /**
24
+ * Execute a CLI command with unified output handling.
25
+ *
26
+ * - JSON mode: strip Convex internals, JSON.stringify to stdout
27
+ * - Pretty mode: call formatPretty callback, print result
28
+ * - Errors: JSON error object in JSON mode, plain message in pretty mode
29
+ */
30
+ export declare function runCliCommand<T>(options: RunCliCommandOptions<T>): Promise<void>;
31
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/lib/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAUH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,CAEpE;AAED,wBAAgB,aAAa,IAAI,MAAM,GAAG,MAAM,GAAG,QAAQ,CAE1D;AAED,gEAAgE;AAChE,wBAAgB,UAAU,IAAI,OAAO,CAKpC;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,sEAAsE;IACtE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IACrB,kDAAkD;IAClD,YAAY,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;CACnC;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBtF"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * runCliCommand — shared command runner for the Product Brain CLI.
3
+ *
4
+ * Owns:
5
+ * (a) TTY detection via process.stdout.isTTY
6
+ * (b) JSON vs human output branching
7
+ * (c) stripConvexInternals() application in JSON mode
8
+ * (d) --json and --pretty explicit overrides that take precedence over auto-detection
9
+ * (e) Error handling: JSON error object in JSON mode, formatted message in TTY mode
10
+ *
11
+ * Chain: DEC-299 (JSON-default), STD-65 (agent responses: structured, parseable, minimal)
12
+ */
13
+ import { stripConvexInternals } from './strip.js';
14
+ /**
15
+ * Global output mode — set by the CLI entry point when --json or --pretty flags are parsed.
16
+ * 'auto' = detect via TTY; 'json' = force JSON; 'pretty' = force human.
17
+ */
18
+ let outputMode = 'auto';
19
+ export function setOutputMode(mode) {
20
+ outputMode = mode;
21
+ }
22
+ export function getOutputMode() {
23
+ return outputMode;
24
+ }
25
+ /** Returns true if the current output mode resolves to JSON. */
26
+ export function isJsonMode() {
27
+ if (outputMode === 'json')
28
+ return true;
29
+ if (outputMode === 'pretty')
30
+ return false;
31
+ // auto: non-TTY (piped) → JSON, TTY → human
32
+ return !process.stdout.isTTY;
33
+ }
34
+ /**
35
+ * Execute a CLI command with unified output handling.
36
+ *
37
+ * - JSON mode: strip Convex internals, JSON.stringify to stdout
38
+ * - Pretty mode: call formatPretty callback, print result
39
+ * - Errors: JSON error object in JSON mode, plain message in pretty mode
40
+ */
41
+ export async function runCliCommand(options) {
42
+ const json = isJsonMode();
43
+ try {
44
+ const data = await options.fn();
45
+ if (json) {
46
+ const stripped = stripConvexInternals(data);
47
+ process.stdout.write(JSON.stringify(stripped) + '\n');
48
+ }
49
+ else {
50
+ const formatted = options.formatPretty(data);
51
+ process.stdout.write(formatted + '\n');
52
+ }
53
+ }
54
+ catch (err) {
55
+ const message = err instanceof Error ? err.message : String(err);
56
+ if (json) {
57
+ process.stderr.write(JSON.stringify({ error: message }) + '\n');
58
+ }
59
+ else {
60
+ process.stderr.write(message + '\n');
61
+ }
62
+ process.exit(1);
63
+ }
64
+ }
65
+ //# sourceMappingURL=runner.js.map