@indemn/cli 1.6.0 → 1.7.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 (311) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/.claude-plugin/plugin.json +9 -4
  3. package/.github/workflows/ci.yml +10 -0
  4. package/.github/workflows/publish.yml +2 -2
  5. package/.mcp.json +1 -4
  6. package/CONTRIBUTING.md +3 -1
  7. package/README.md +69 -176
  8. package/dist/cli/agents.d.ts.map +1 -1
  9. package/dist/cli/agents.js +226 -18
  10. package/dist/cli/agents.js.map +1 -1
  11. package/dist/cli/analytics.d.ts +3 -0
  12. package/dist/cli/analytics.d.ts.map +1 -0
  13. package/dist/cli/analytics.js +133 -0
  14. package/dist/cli/analytics.js.map +1 -0
  15. package/dist/cli/auth.d.ts.map +1 -1
  16. package/dist/cli/auth.js +62 -17
  17. package/dist/cli/auth.js.map +1 -1
  18. package/dist/cli/billing.d.ts +3 -0
  19. package/dist/cli/billing.d.ts.map +1 -0
  20. package/dist/cli/billing.js +23 -0
  21. package/dist/cli/billing.js.map +1 -0
  22. package/dist/cli/campaigns.d.ts +3 -0
  23. package/dist/cli/campaigns.d.ts.map +1 -0
  24. package/dist/cli/campaigns.js +34 -0
  25. package/dist/cli/campaigns.js.map +1 -0
  26. package/dist/cli/chat.d.ts.map +1 -1
  27. package/dist/cli/chat.js +69 -102
  28. package/dist/cli/chat.js.map +1 -1
  29. package/dist/cli/config.d.ts.map +1 -1
  30. package/dist/cli/config.js +71 -27
  31. package/dist/cli/config.js.map +1 -1
  32. package/dist/cli/conversations.d.ts +3 -0
  33. package/dist/cli/conversations.d.ts.map +1 -0
  34. package/dist/cli/conversations.js +129 -0
  35. package/dist/cli/conversations.js.map +1 -0
  36. package/dist/cli/distribution.d.ts +3 -0
  37. package/dist/cli/distribution.d.ts.map +1 -0
  38. package/dist/cli/distribution.js +122 -0
  39. package/dist/cli/distribution.js.map +1 -0
  40. package/dist/cli/eval.d.ts.map +1 -1
  41. package/dist/cli/eval.js +315 -71
  42. package/dist/cli/eval.js.map +1 -1
  43. package/dist/cli/functions.d.ts.map +1 -1
  44. package/dist/cli/functions.js +109 -38
  45. package/dist/cli/functions.js.map +1 -1
  46. package/dist/cli/index.js +63 -54
  47. package/dist/cli/index.js.map +1 -1
  48. package/dist/cli/init.d.ts +27 -0
  49. package/dist/cli/init.d.ts.map +1 -0
  50. package/dist/cli/init.js +152 -0
  51. package/dist/cli/init.js.map +1 -0
  52. package/dist/cli/kb.d.ts.map +1 -1
  53. package/dist/cli/kb.js +141 -15
  54. package/dist/cli/kb.js.map +1 -1
  55. package/dist/cli/link.d.ts +21 -0
  56. package/dist/cli/link.d.ts.map +1 -0
  57. package/dist/cli/link.js +112 -0
  58. package/dist/cli/link.js.map +1 -0
  59. package/dist/cli/org.d.ts.map +1 -1
  60. package/dist/cli/org.js +79 -67
  61. package/dist/cli/org.js.map +1 -1
  62. package/dist/cli/platform.d.ts +3 -0
  63. package/dist/cli/platform.d.ts.map +1 -0
  64. package/dist/cli/platform.js +133 -0
  65. package/dist/cli/platform.js.map +1 -0
  66. package/dist/cli/tickets.d.ts +3 -0
  67. package/dist/cli/tickets.d.ts.map +1 -0
  68. package/dist/cli/tickets.js +125 -0
  69. package/dist/cli/tickets.js.map +1 -0
  70. package/dist/cli/utils/output.d.ts +15 -9
  71. package/dist/cli/utils/output.d.ts.map +1 -1
  72. package/dist/cli/utils/output.js +53 -46
  73. package/dist/cli/utils/output.js.map +1 -1
  74. package/dist/cli/voice.d.ts +3 -0
  75. package/dist/cli/voice.d.ts.map +1 -0
  76. package/dist/cli/voice.js +206 -0
  77. package/dist/cli/voice.js.map +1 -0
  78. package/dist/core/diff.d.ts +16 -0
  79. package/dist/core/diff.d.ts.map +1 -0
  80. package/dist/core/diff.js +57 -0
  81. package/dist/core/diff.js.map +1 -0
  82. package/dist/core/org-resolver.d.ts +37 -0
  83. package/dist/core/org-resolver.d.ts.map +1 -0
  84. package/dist/core/org-resolver.js +73 -0
  85. package/dist/core/org-resolver.js.map +1 -0
  86. package/dist/core/runtime.d.ts +36 -0
  87. package/dist/core/runtime.d.ts.map +1 -0
  88. package/dist/core/runtime.js +62 -0
  89. package/dist/core/runtime.js.map +1 -0
  90. package/dist/core/scope.d.ts +33 -0
  91. package/dist/core/scope.d.ts.map +1 -0
  92. package/dist/core/scope.js +37 -0
  93. package/dist/core/scope.js.map +1 -0
  94. package/dist/mcp/registry.d.ts +67 -0
  95. package/dist/mcp/registry.d.ts.map +1 -0
  96. package/dist/mcp/registry.js +195 -0
  97. package/dist/mcp/registry.js.map +1 -0
  98. package/dist/mcp/server.d.ts +9 -0
  99. package/dist/mcp/server.d.ts.map +1 -1
  100. package/dist/mcp/server.js +87 -2
  101. package/dist/mcp/server.js.map +1 -1
  102. package/dist/mcp/tool-meta.d.ts +21 -0
  103. package/dist/mcp/tool-meta.d.ts.map +1 -0
  104. package/dist/mcp/tool-meta.js +203 -0
  105. package/dist/mcp/tool-meta.js.map +1 -0
  106. package/dist/mcp/tools.d.ts +2 -1
  107. package/dist/mcp/tools.d.ts.map +1 -1
  108. package/dist/mcp/tools.js +1462 -215
  109. package/dist/mcp/tools.js.map +1 -1
  110. package/dist/sdk/agent-bundle.d.ts +99 -0
  111. package/dist/sdk/agent-bundle.d.ts.map +1 -0
  112. package/dist/sdk/agent-bundle.js +211 -0
  113. package/dist/sdk/agent-bundle.js.map +1 -0
  114. package/dist/sdk/agents.d.ts +54 -1
  115. package/dist/sdk/agents.d.ts.map +1 -1
  116. package/dist/sdk/agents.js +59 -5
  117. package/dist/sdk/agents.js.map +1 -1
  118. package/dist/sdk/analytics.d.ts +158 -0
  119. package/dist/sdk/analytics.d.ts.map +1 -0
  120. package/dist/sdk/analytics.js +185 -0
  121. package/dist/sdk/analytics.js.map +1 -0
  122. package/dist/sdk/auth.d.ts +34 -12
  123. package/dist/sdk/auth.d.ts.map +1 -1
  124. package/dist/sdk/auth.js +60 -77
  125. package/dist/sdk/auth.js.map +1 -1
  126. package/dist/sdk/billing.d.ts +25 -0
  127. package/dist/sdk/billing.d.ts.map +1 -0
  128. package/dist/sdk/billing.js +61 -0
  129. package/dist/sdk/billing.js.map +1 -0
  130. package/dist/sdk/campaigns.d.ts +35 -0
  131. package/dist/sdk/campaigns.d.ts.map +1 -0
  132. package/dist/sdk/campaigns.js +59 -0
  133. package/dist/sdk/campaigns.js.map +1 -0
  134. package/dist/sdk/chat.d.ts +25 -2
  135. package/dist/sdk/chat.d.ts.map +1 -1
  136. package/dist/sdk/chat.js +37 -10
  137. package/dist/sdk/chat.js.map +1 -1
  138. package/dist/sdk/client.d.ts +93 -5
  139. package/dist/sdk/client.d.ts.map +1 -1
  140. package/dist/sdk/client.js +362 -100
  141. package/dist/sdk/client.js.map +1 -1
  142. package/dist/sdk/config-change.d.ts +74 -0
  143. package/dist/sdk/config-change.d.ts.map +1 -0
  144. package/dist/sdk/config-change.js +117 -0
  145. package/dist/sdk/config-change.js.map +1 -0
  146. package/dist/sdk/config.d.ts.map +1 -1
  147. package/dist/sdk/config.js +2 -1
  148. package/dist/sdk/config.js.map +1 -1
  149. package/dist/sdk/conversations.d.ts +101 -0
  150. package/dist/sdk/conversations.d.ts.map +1 -0
  151. package/dist/sdk/conversations.js +155 -0
  152. package/dist/sdk/conversations.js.map +1 -0
  153. package/dist/sdk/credentials.d.ts +25 -0
  154. package/dist/sdk/credentials.d.ts.map +1 -0
  155. package/dist/sdk/credentials.js +44 -0
  156. package/dist/sdk/credentials.js.map +1 -0
  157. package/dist/sdk/distribution.d.ts +94 -0
  158. package/dist/sdk/distribution.d.ts.map +1 -0
  159. package/dist/sdk/distribution.js +100 -0
  160. package/dist/sdk/distribution.js.map +1 -0
  161. package/dist/sdk/eval.d.ts +81 -0
  162. package/dist/sdk/eval.d.ts.map +1 -1
  163. package/dist/sdk/eval.js +117 -0
  164. package/dist/sdk/eval.js.map +1 -1
  165. package/dist/sdk/functions.d.ts +14 -1
  166. package/dist/sdk/functions.d.ts.map +1 -1
  167. package/dist/sdk/functions.js +48 -5
  168. package/dist/sdk/functions.js.map +1 -1
  169. package/dist/sdk/index.d.ts +2 -0
  170. package/dist/sdk/index.d.ts.map +1 -1
  171. package/dist/sdk/index.js +2 -0
  172. package/dist/sdk/index.js.map +1 -1
  173. package/dist/sdk/jarvis-chat.d.ts +28 -0
  174. package/dist/sdk/jarvis-chat.d.ts.map +1 -0
  175. package/dist/sdk/jarvis-chat.js +117 -0
  176. package/dist/sdk/jarvis-chat.js.map +1 -0
  177. package/dist/sdk/kb.d.ts +69 -1
  178. package/dist/sdk/kb.d.ts.map +1 -1
  179. package/dist/sdk/kb.js +111 -24
  180. package/dist/sdk/kb.js.map +1 -1
  181. package/dist/sdk/orgs.d.ts +13 -0
  182. package/dist/sdk/orgs.d.ts.map +1 -0
  183. package/dist/sdk/orgs.js +59 -0
  184. package/dist/sdk/orgs.js.map +1 -0
  185. package/dist/sdk/platform.d.ts +62 -0
  186. package/dist/sdk/platform.d.ts.map +1 -0
  187. package/dist/sdk/platform.js +95 -0
  188. package/dist/sdk/platform.js.map +1 -0
  189. package/dist/sdk/session.d.ts +25 -0
  190. package/dist/sdk/session.d.ts.map +1 -0
  191. package/dist/sdk/session.js +69 -0
  192. package/dist/sdk/session.js.map +1 -0
  193. package/dist/sdk/skills.d.ts +46 -0
  194. package/dist/sdk/skills.d.ts.map +1 -0
  195. package/dist/sdk/skills.js +203 -0
  196. package/dist/sdk/skills.js.map +1 -0
  197. package/dist/sdk/test-chat.d.ts +52 -0
  198. package/dist/sdk/test-chat.d.ts.map +1 -0
  199. package/dist/sdk/test-chat.js +134 -0
  200. package/dist/sdk/test-chat.js.map +1 -0
  201. package/dist/sdk/tickets.d.ts +98 -0
  202. package/dist/sdk/tickets.d.ts.map +1 -0
  203. package/dist/sdk/tickets.js +91 -0
  204. package/dist/sdk/tickets.js.map +1 -0
  205. package/dist/sdk/types.d.ts +91 -6
  206. package/dist/sdk/types.d.ts.map +1 -1
  207. package/dist/sdk/voice.d.ts +147 -0
  208. package/dist/sdk/voice.d.ts.map +1 -0
  209. package/dist/sdk/voice.js +236 -0
  210. package/dist/sdk/voice.js.map +1 -0
  211. package/package.json +22 -3
  212. package/scripts/check-skills.mjs +25 -0
  213. package/skills/agent-builder/SKILL.md +89 -252
  214. package/skills/evaluations/SKILL.md +23 -234
  215. package/skills/evaluations/references/analysis.md +95 -0
  216. package/skills/evaluations/references/cli-reference.md +28 -0
  217. package/skills/evaluations/references/json-formats.md +100 -0
  218. package/src/cli/agents.ts +202 -22
  219. package/src/cli/analytics.ts +138 -0
  220. package/src/cli/auth.ts +56 -18
  221. package/src/cli/billing.ts +25 -0
  222. package/src/cli/campaigns.ts +33 -0
  223. package/src/cli/chat.ts +66 -115
  224. package/src/cli/config.ts +65 -31
  225. package/src/cli/conversations.ts +133 -0
  226. package/src/cli/distribution.ts +116 -0
  227. package/src/cli/eval.ts +254 -70
  228. package/src/cli/functions.ts +105 -39
  229. package/src/cli/index.ts +58 -55
  230. package/src/cli/init.ts +154 -0
  231. package/src/cli/kb.ts +120 -17
  232. package/src/cli/link.ts +117 -0
  233. package/src/cli/org.ts +81 -75
  234. package/src/cli/platform.ts +128 -0
  235. package/src/cli/tickets.ts +130 -0
  236. package/src/cli/utils/output.ts +51 -42
  237. package/src/cli/voice.ts +204 -0
  238. package/src/core/diff.ts +52 -0
  239. package/src/core/org-resolver.ts +113 -0
  240. package/src/core/runtime.ts +73 -0
  241. package/src/core/scope.ts +64 -0
  242. package/src/mcp/registry.ts +236 -0
  243. package/src/mcp/server.ts +84 -2
  244. package/src/mcp/tool-meta.ts +241 -0
  245. package/src/mcp/tools.ts +1529 -265
  246. package/src/sdk/agent-bundle.ts +245 -0
  247. package/src/sdk/agents.ts +74 -5
  248. package/src/sdk/analytics.ts +220 -0
  249. package/src/sdk/auth.ts +87 -107
  250. package/src/sdk/billing.ts +59 -0
  251. package/src/sdk/campaigns.ts +60 -0
  252. package/src/sdk/chat.ts +44 -10
  253. package/src/sdk/client.ts +373 -102
  254. package/src/sdk/config-change.ts +148 -0
  255. package/src/sdk/config.ts +2 -1
  256. package/src/sdk/conversations.ts +199 -0
  257. package/src/sdk/credentials.ts +53 -0
  258. package/src/sdk/distribution.ts +132 -0
  259. package/src/sdk/eval.ts +140 -0
  260. package/src/sdk/functions.ts +52 -6
  261. package/src/sdk/index.ts +2 -0
  262. package/src/sdk/jarvis-chat.ts +112 -0
  263. package/src/sdk/kb.ts +116 -29
  264. package/src/sdk/orgs.ts +62 -0
  265. package/src/sdk/platform.ts +115 -0
  266. package/src/sdk/session.ts +90 -0
  267. package/src/sdk/skills.ts +188 -0
  268. package/src/sdk/test-chat.ts +151 -0
  269. package/src/sdk/tickets.ts +120 -0
  270. package/src/sdk/types.ts +88 -6
  271. package/src/sdk/voice.ts +262 -0
  272. package/test/cli/entry.test.ts +34 -0
  273. package/test/cli/init.test.ts +66 -0
  274. package/test/cli/link.test.ts +57 -0
  275. package/test/core/org-resolver.test.ts +92 -0
  276. package/test/core/runtime.test.ts +30 -0
  277. package/test/core/scope.test.ts +93 -0
  278. package/test/harness.test.ts +24 -0
  279. package/test/helpers/config-home.ts +22 -0
  280. package/test/helpers/fake-middleware.ts +56 -0
  281. package/test/helpers/fetch-recorder.ts +75 -0
  282. package/test/helpers/jwt.ts +9 -0
  283. package/test/helpers/mcp-pair.ts +38 -0
  284. package/test/mcp/__snapshots__/tools-snapshot.test.ts.snap +145 -0
  285. package/test/mcp/askers.test.ts +60 -0
  286. package/test/mcp/elicit-timeout.test.ts +29 -0
  287. package/test/mcp/registry.test.ts +169 -0
  288. package/test/mcp/shaping.test.ts +41 -0
  289. package/test/mcp/tools-snapshot.test.ts +42 -0
  290. package/test/sdk/agents.test.ts +232 -0
  291. package/test/sdk/analytics.test.ts +89 -0
  292. package/test/sdk/auth.test.ts +70 -0
  293. package/test/sdk/billing.test.ts +47 -0
  294. package/test/sdk/campaigns.test.ts +43 -0
  295. package/test/sdk/client.test.ts +80 -0
  296. package/test/sdk/config-change.test.ts +142 -0
  297. package/test/sdk/conversations.test.ts +80 -0
  298. package/test/sdk/credentials.test.ts +33 -0
  299. package/test/sdk/distribution.test.ts +55 -0
  300. package/test/sdk/eval.test.ts +155 -0
  301. package/test/sdk/kb-upload.test.ts +50 -0
  302. package/test/sdk/kb.test.ts +95 -0
  303. package/test/sdk/orgs.test.ts +48 -0
  304. package/test/sdk/platform.test.ts +89 -0
  305. package/test/sdk/renewal.test.ts +115 -0
  306. package/test/sdk/session.test.ts +60 -0
  307. package/test/sdk/skills.test.ts +235 -0
  308. package/test/sdk/test-chat.test.ts +112 -0
  309. package/test/sdk/tickets.test.ts +42 -0
  310. package/test/sdk/voice.test.ts +147 -0
  311. package/vitest.config.ts +11 -0
@@ -0,0 +1,57 @@
1
+ /** Line diff by longest common subsequence. Very large inputs fall back to "all removed, all added". */
2
+ export function lineDiff(before, after) {
3
+ const a = before.split('\n');
4
+ const b = after.split('\n');
5
+ if (a.length * b.length > 4_000_000) {
6
+ return [...a.map((text) => ({ op: '-', text })), ...b.map((text) => ({ op: '+', text }))];
7
+ }
8
+ const lcs = Array.from({ length: a.length + 1 }, () => new Array(b.length + 1).fill(0));
9
+ for (let i = a.length - 1; i >= 0; i--) {
10
+ for (let j = b.length - 1; j >= 0; j--) {
11
+ lcs[i][j] = a[i] === b[j] ? lcs[i + 1][j + 1] + 1 : Math.max(lcs[i + 1][j], lcs[i][j + 1]);
12
+ }
13
+ }
14
+ const out = [];
15
+ let i = 0;
16
+ let j = 0;
17
+ while (i < a.length && j < b.length) {
18
+ if (a[i] === b[j]) {
19
+ out.push({ op: ' ', text: a[i] });
20
+ i++;
21
+ j++;
22
+ }
23
+ else if (lcs[i + 1][j] >= lcs[i][j + 1])
24
+ out.push({ op: '-', text: a[i++] });
25
+ else
26
+ out.push({ op: '+', text: b[j++] });
27
+ }
28
+ while (i < a.length)
29
+ out.push({ op: '-', text: a[i++] });
30
+ while (j < b.length)
31
+ out.push({ op: '+', text: b[j++] });
32
+ return out;
33
+ }
34
+ export function diffStats(diff) {
35
+ return { added: diff.filter((d) => d.op === '+').length, removed: diff.filter((d) => d.op === '-').length };
36
+ }
37
+ /** Changed lines with `context` unchanged lines around them, as unified-style text. */
38
+ export function formatDiff(diff, opts = {}) {
39
+ const context = opts.context ?? 2;
40
+ const keep = new Set();
41
+ diff.forEach((d, i) => {
42
+ if (d.op !== ' ')
43
+ for (let k = Math.max(0, i - context); k <= Math.min(diff.length - 1, i + context); k++)
44
+ keep.add(k);
45
+ });
46
+ const lines = [];
47
+ let last = -1;
48
+ for (const i of [...keep].sort((x, y) => x - y)) {
49
+ if (last >= 0 && i > last + 1)
50
+ lines.push('…');
51
+ lines.push(`${diff[i].op} ${diff[i].text}`);
52
+ last = i;
53
+ }
54
+ const max = opts.maxLines ?? Infinity;
55
+ return lines.length > max ? [...lines.slice(0, max), `… ${lines.length - max} more line(s)`].join('\n') : lines.join('\n');
56
+ }
57
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/core/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { Environment } from '../sdk/types.js';
2
+ /** Where `indemn link` pins a project folder to one org and its agents. */
3
+ export declare const LINK_RELATIVE_PATH: string;
4
+ export interface OrgChoice {
5
+ id: string;
6
+ name?: string;
7
+ }
8
+ export interface LinkFile {
9
+ org_id: string;
10
+ org_name?: string;
11
+ environment: Environment;
12
+ agents: string[];
13
+ /** Absolute path of the file, for messages. */
14
+ path: string;
15
+ }
16
+ export type OrgSource = 'flag' | 'env' | 'link' | 'single' | 'asked';
17
+ export interface ResolvedOrg {
18
+ id: string;
19
+ source: OrgSource;
20
+ link: LinkFile | null;
21
+ }
22
+ /** Walk up from `startDir` to the filesystem root looking for `.indemn/project.json`. */
23
+ export declare function findLinkFile(startDir?: string): LinkFile | null;
24
+ /**
25
+ * Decide which org a command acts on. The saved config never decides.
26
+ * Order: the --org flag (or an MCP tool's org_id), INDEMN_ORG_ID from a host,
27
+ * the linked folder, the only org the user belongs to, otherwise ask.
28
+ */
29
+ export declare function resolveOrg(input: {
30
+ flag?: string;
31
+ envOrg?: string;
32
+ link: LinkFile | null;
33
+ environment: Environment;
34
+ memberships: () => Promise<OrgChoice[]>;
35
+ ask?: (choices: OrgChoice[]) => Promise<string | undefined>;
36
+ }): Promise<ResolvedOrg>;
37
+ //# sourceMappingURL=org-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-resolver.d.ts","sourceRoot":"","sources":["../../src/core/org-resolver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGnD,2EAA2E;AAC3E,eAAO,MAAM,kBAAkB,QAAkC,CAAC;AAElE,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAErE,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;CACvB;AAED,yFAAyF;AACzF,wBAAgB,YAAY,CAAC,QAAQ,GAAE,MAAsB,GAAG,QAAQ,GAAG,IAAI,CA0B9E;AAMD;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACxC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CAC7D,GAAG,OAAO,CAAC,WAAW,CAAC,CAqCvB"}
@@ -0,0 +1,73 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { dirname, join, resolve } from 'node:path';
3
+ import { CliError, EXIT, NeedsInputError } from './runtime.js';
4
+ /** Where `indemn link` pins a project folder to one org and its agents. */
5
+ export const LINK_RELATIVE_PATH = join('.indemn', 'project.json');
6
+ /** Walk up from `startDir` to the filesystem root looking for `.indemn/project.json`. */
7
+ export function findLinkFile(startDir = process.cwd()) {
8
+ let dir = resolve(startDir);
9
+ for (;;) {
10
+ const candidate = join(dir, LINK_RELATIVE_PATH);
11
+ if (existsSync(candidate)) {
12
+ let raw;
13
+ try {
14
+ raw = JSON.parse(readFileSync(candidate, 'utf8'));
15
+ }
16
+ catch {
17
+ throw new CliError(`Cannot read ${candidate}. Fix the file or run \`indemn unlink\` in ${dir}.`);
18
+ }
19
+ if (!raw.org_id || (raw.environment !== 'dev' && raw.environment !== 'production')) {
20
+ throw new CliError(`${candidate} has no org_id or environment. Run \`indemn link\` again in ${dir}.`);
21
+ }
22
+ return {
23
+ org_id: raw.org_id,
24
+ org_name: raw.org_name,
25
+ environment: raw.environment,
26
+ agents: Array.isArray(raw.agents) ? raw.agents.map(String) : [],
27
+ path: candidate,
28
+ };
29
+ }
30
+ const parent = dirname(dir);
31
+ if (parent === dir)
32
+ return null;
33
+ dir = parent;
34
+ }
35
+ }
36
+ function label(o) {
37
+ return o.name ? `${o.name}` : o.id;
38
+ }
39
+ /**
40
+ * Decide which org a command acts on. The saved config never decides.
41
+ * Order: the --org flag (or an MCP tool's org_id), INDEMN_ORG_ID from a host,
42
+ * the linked folder, the only org the user belongs to, otherwise ask.
43
+ */
44
+ export async function resolveOrg(input) {
45
+ const { link } = input;
46
+ if (link && link.environment !== input.environment) {
47
+ throw new CliError(`This folder is linked to ${link.environment} (${link.path}) but you are logged in to ${input.environment}. ` +
48
+ 'Log in to the matching platform or run `indemn unlink`.');
49
+ }
50
+ const explicit = input.flag || input.envOrg;
51
+ if (explicit) {
52
+ if (link && link.org_id !== explicit) {
53
+ throw new CliError(`This folder is linked to org ${link.org_name ?? link.org_id} (${link.path}); ` +
54
+ `refusing to act on ${explicit}. Remove --org, or run \`indemn unlink\` first.`, EXIT.NEEDS_INPUT);
55
+ }
56
+ return { id: explicit, source: input.flag ? 'flag' : 'env', link };
57
+ }
58
+ if (link)
59
+ return { id: link.org_id, source: 'link', link };
60
+ const orgs = await input.memberships();
61
+ if (orgs.length === 0) {
62
+ throw new CliError('You are not a member of any organization on this platform. Ask an admin to add you.');
63
+ }
64
+ if (orgs.length === 1)
65
+ return { id: orgs[0].id, source: 'single', link: null };
66
+ if (input.ask) {
67
+ const chosen = await input.ask(orgs);
68
+ if (chosen && orgs.some((o) => o.id === chosen))
69
+ return { id: chosen, source: 'asked', link: null };
70
+ }
71
+ throw new NeedsInputError(`You belong to ${orgs.length} organizations. Choose one with --org <id>, or pin this folder with \`indemn link --org <id>\`.`, orgs.map((o) => ({ id: o.id, label: label(o) })));
72
+ }
73
+ //# sourceMappingURL=org-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-resolver.js","sourceRoot":"","sources":["../../src/core/org-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /** Process exit codes. Scripts and agents branch on these. */
2
+ export declare const EXIT: {
3
+ readonly OK: 0;
4
+ readonly ERROR: 1;
5
+ /** A choice is needed (for example which org) or the command was used wrongly. */
6
+ readonly NEEDS_INPUT: 2;
7
+ /** Not logged in, or the session expired and could not be renewed. */
8
+ readonly AUTH: 3;
9
+ };
10
+ export declare class CliError extends Error {
11
+ readonly exitCode: number;
12
+ readonly details?: unknown | undefined;
13
+ constructor(message: string, exitCode?: number, details?: unknown | undefined);
14
+ }
15
+ export interface Choice {
16
+ id: string;
17
+ label: string;
18
+ }
19
+ export declare class NeedsInputError extends CliError {
20
+ readonly choices: Choice[];
21
+ constructor(message: string, choices?: Choice[]);
22
+ }
23
+ export declare class SessionExpiredError extends CliError {
24
+ constructor(message?: string);
25
+ }
26
+ /**
27
+ * True when nobody can answer a prompt: an AI agent (Claude Code sets
28
+ * CLAUDECODE=1), CI, an explicit opt-out, or stdin that is not a terminal.
29
+ */
30
+ export declare function isNonInteractive(env?: NodeJS.ProcessEnv, stdinIsTTY?: boolean): boolean;
31
+ export declare function isDebug(env?: NodeJS.ProcessEnv): boolean;
32
+ /** The package version, read from package.json (src/core and dist/core are both two levels down). */
33
+ export declare function cliVersion(): string;
34
+ /** How long a question to a person (through an MCP host) may stay open. The MCP default of 60 s is too short to read a diff. */
35
+ export declare const PERSON_TIMEOUT_MS: number;
36
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/core/runtime.ts"],"names":[],"mappings":"AAEA,8DAA8D;AAC9D,eAAO,MAAM,IAAI;;;IAGf,kFAAkF;;IAElF,sEAAsE;;CAE9D,CAAC;AAEX,qBAAa,QAAS,SAAQ,KAAK;aAGf,QAAQ,EAAE,MAAM;aAChB,OAAO,CAAC,EAAE,OAAO;gBAFjC,OAAO,EAAE,MAAM,EACC,QAAQ,GAAE,MAAmB,EAC7B,OAAO,CAAC,EAAE,OAAO,YAAA;CAKpC;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,eAAgB,SAAQ,QAAQ;aACE,OAAO,EAAE,MAAM,EAAE;gBAAlD,OAAO,EAAE,MAAM,EAAkB,OAAO,GAAE,MAAM,EAAO;CAIpE;AAED,qBAAa,mBAAoB,SAAQ,QAAQ;gBACnC,OAAO,SAAqD;CAIzE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,UAAU,GAAE,OAAsC,GACjD,OAAO,CAKT;AAED,wBAAgB,OAAO,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAErE;AAID,qGAAqG;AACrG,wBAAgB,UAAU,IAAI,MAAM,CAMnC;AAED,gIAAgI;AAChI,eAAO,MAAM,iBAAiB,QAAc,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { createRequire } from 'node:module';
2
+ /** Process exit codes. Scripts and agents branch on these. */
3
+ export const EXIT = {
4
+ OK: 0,
5
+ ERROR: 1,
6
+ /** A choice is needed (for example which org) or the command was used wrongly. */
7
+ NEEDS_INPUT: 2,
8
+ /** Not logged in, or the session expired and could not be renewed. */
9
+ AUTH: 3,
10
+ };
11
+ export class CliError extends Error {
12
+ exitCode;
13
+ details;
14
+ constructor(message, exitCode = EXIT.ERROR, details) {
15
+ super(message);
16
+ this.exitCode = exitCode;
17
+ this.details = details;
18
+ this.name = 'CliError';
19
+ }
20
+ }
21
+ export class NeedsInputError extends CliError {
22
+ choices;
23
+ constructor(message, choices = []) {
24
+ super(message, EXIT.NEEDS_INPUT, { choices });
25
+ this.choices = choices;
26
+ this.name = 'NeedsInputError';
27
+ }
28
+ }
29
+ export class SessionExpiredError extends CliError {
30
+ constructor(message = 'Session expired. Run `indemn login`, then retry.') {
31
+ super(message, EXIT.AUTH);
32
+ this.name = 'SessionExpiredError';
33
+ }
34
+ }
35
+ /**
36
+ * True when nobody can answer a prompt: an AI agent (Claude Code sets
37
+ * CLAUDECODE=1), CI, an explicit opt-out, or stdin that is not a terminal.
38
+ */
39
+ export function isNonInteractive(env = process.env, stdinIsTTY = Boolean(process.stdin.isTTY)) {
40
+ if (env.CLAUDECODE === '1')
41
+ return true;
42
+ if (env.CI && env.CI !== 'false' && env.CI !== '0')
43
+ return true;
44
+ if (env.INDEMN_NON_INTERACTIVE === '1')
45
+ return true;
46
+ return !stdinIsTTY;
47
+ }
48
+ export function isDebug(env = process.env) {
49
+ return env.INDEMN_DEBUG === '1';
50
+ }
51
+ let cachedVersion;
52
+ /** The package version, read from package.json (src/core and dist/core are both two levels down). */
53
+ export function cliVersion() {
54
+ if (!cachedVersion) {
55
+ const require = createRequire(import.meta.url);
56
+ cachedVersion = require('../../package.json').version;
57
+ }
58
+ return cachedVersion;
59
+ }
60
+ /** How long a question to a person (through an MCP host) may stay open. The MCP default of 60 s is too short to read a diff. */
61
+ export const PERSON_TIMEOUT_MS = 10 * 60_000;
62
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/core/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,8DAA8D;AAC9D,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,EAAE,EAAE,CAAC;IACL,KAAK,EAAE,CAAC;IACR,kFAAkF;IAClF,WAAW,EAAE,CAAC;IACd,sEAAsE;IACtE,IAAI,EAAE,CAAC;CACC,CAAC;AAEX,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGf;IACA;IAHlB,YACE,OAAe,EACC,WAAmB,IAAI,CAAC,KAAK,EAC7B,OAAiB;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,aAAQ,GAAR,QAAQ,CAAqB;QAC7B,YAAO,GAAP,OAAO,CAAU;QAGjC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAOD,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IACE;IAA7C,YAAY,OAAe,EAAkB,UAAoB,EAAE;QACjE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QADH,YAAO,GAAP,OAAO,CAAe;QAEjE,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,QAAQ;IAC/C,YAAY,OAAO,GAAG,kDAAkD;QACtE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAyB,OAAO,CAAC,GAAG,EACpC,aAAsB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;IAElD,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,OAAO,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAChE,IAAI,GAAG,CAAC,sBAAsB,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACpD,OAAO,CAAC,UAAU,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC1D,OAAO,GAAG,CAAC,YAAY,KAAK,GAAG,CAAC;AAClC,CAAC;AAED,IAAI,aAAiC,CAAC;AAEtC,qGAAqG;AACrG,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,aAAa,GAAI,OAAO,CAAC,oBAAoB,CAAyB,CAAC,OAAO,CAAC;IACjF,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,gIAAgI;AAChI,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,GAAG,MAAM,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { Environment } from '../sdk/types.js';
2
+ import type { OrgChoice, OrgSource } from './org-resolver.js';
3
+ export declare function runWithOrg<T>(orgId: string | undefined, fn: () => Promise<T>): Promise<T>;
4
+ export declare function scopedOrg(): string | undefined;
5
+ export declare function setOrgFlag(flag?: string): void;
6
+ export declare function getOrgFlag(): string | undefined;
7
+ /** How to ask the person something: a terminal prompt, an MCP elicitation, or nothing. */
8
+ export interface FormField {
9
+ key: string;
10
+ title: string;
11
+ description?: string;
12
+ required?: boolean;
13
+ }
14
+ export interface Askers {
15
+ chooseOrg?: (choices: OrgChoice[]) => Promise<string | undefined>;
16
+ mfaCode?: () => Promise<string>;
17
+ /** Ask for several text fields at once; undefined when declined or nobody can answer. */
18
+ form?: (message: string, fields: FormField[]) => Promise<Record<string, string> | undefined>;
19
+ }
20
+ export declare function setAskers(a: Askers): void;
21
+ export declare function getAskers(): Askers;
22
+ export interface ResolvedOrgEvent {
23
+ id: string;
24
+ name?: string;
25
+ source: OrgSource;
26
+ environment: Environment;
27
+ }
28
+ type Listener = (org: ResolvedOrgEvent) => void;
29
+ /** Called once per client when its org is decided; the CLI prints its banner here. */
30
+ export declare function onOrgResolved(fn: Listener): void;
31
+ export declare function emitOrgResolved(org: ResolvedOrgEvent): void;
32
+ export {};
33
+ //# sourceMappingURL=scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/core/scope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAQ9D,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAEzF;AAED,wBAAgB,SAAS,IAAI,MAAM,GAAG,SAAS,CAE9C;AAID,wBAAgB,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAE9C;AACD,wBAAgB,UAAU,IAAI,MAAM,GAAG,SAAS,CAE/C;AAED,0FAA0F;AAC1F,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,MAAM;IACrB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAClE,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,yFAAyF;IACzF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC;CAC9F;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAEzC;AACD,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;CAC1B;AACD,KAAK,QAAQ,GAAG,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAEhD,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAEhD;AACD,wBAAgB,eAAe,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAE3D"}
@@ -0,0 +1,37 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+ /**
3
+ * The org one MCP tool call acts on. Each call runs inside its own scope, so
4
+ * two concurrent calls for different orgs never see each other's org.
5
+ */
6
+ const orgScope = new AsyncLocalStorage();
7
+ export function runWithOrg(orgId, fn) {
8
+ return orgId ? orgScope.run({ orgId }, fn) : fn();
9
+ }
10
+ export function scopedOrg() {
11
+ return orgScope.getStore()?.orgId;
12
+ }
13
+ /** The terminal `--org` flag, process-wide for one CLI command. */
14
+ let orgFlag;
15
+ export function setOrgFlag(flag) {
16
+ orgFlag = flag || undefined;
17
+ }
18
+ export function getOrgFlag() {
19
+ return orgFlag;
20
+ }
21
+ let askers = {};
22
+ export function setAskers(a) {
23
+ askers = a;
24
+ }
25
+ export function getAskers() {
26
+ return askers;
27
+ }
28
+ const listeners = [];
29
+ /** Called once per client when its org is decided; the CLI prints its banner here. */
30
+ export function onOrgResolved(fn) {
31
+ listeners.push(fn);
32
+ }
33
+ export function emitOrgResolved(org) {
34
+ for (const fn of listeners)
35
+ fn(org);
36
+ }
37
+ //# sourceMappingURL=scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/core/scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAIrD;;;GAGG;AACH,MAAM,QAAQ,GAAG,IAAI,iBAAiB,EAAqB,CAAC;AAE5D,MAAM,UAAU,UAAU,CAAI,KAAyB,EAAE,EAAoB;IAC3E,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC;AACpC,CAAC;AAED,mEAAmE;AACnE,IAAI,OAA2B,CAAC;AAChC,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,OAAO,GAAG,IAAI,IAAI,SAAS,CAAC;AAC9B,CAAC;AACD,MAAM,UAAU,UAAU;IACxB,OAAO,OAAO,CAAC;AACjB,CAAC;AAgBD,IAAI,MAAM,GAAW,EAAE,CAAC;AACxB,MAAM,UAAU,SAAS,CAAC,CAAS;IACjC,MAAM,GAAG,CAAC,CAAC;AACb,CAAC;AACD,MAAM,UAAU,SAAS;IACvB,OAAO,MAAM,CAAC;AAChB,CAAC;AASD,MAAM,SAAS,GAAe,EAAE,CAAC;AACjC,sFAAsF;AACtF,MAAM,UAAU,aAAa,CAAC,EAAY;IACxC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACrB,CAAC;AACD,MAAM,UAAU,eAAe,CAAC,GAAqB;IACnD,KAAK,MAAM,EAAE,IAAI,SAAS;QAAE,EAAE,CAAC,GAAG,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { z } from 'zod/v3';
2
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import { type CallToolResult } from '@modelcontextprotocol/sdk/types.js';
4
+ import type { Environment } from '../sdk/types.js';
5
+ import { type ToolMeta } from './tool-meta.js';
6
+ /** Where a tool result came from. Every successful result carries it. */
7
+ export interface ResultContext {
8
+ org_id?: string;
9
+ org_name?: string;
10
+ environment: Environment;
11
+ /** The person approved this call in the host's approval form (the model cannot see that form). */
12
+ approved_by_person?: boolean;
13
+ }
14
+ type Shape = Record<string, z.ZodTypeAny>;
15
+ type Args = Record<string, unknown>;
16
+ /** `confirmedByPerson` is true when the host asked the person and they agreed. */
17
+ type Handler = (args: any, meta: {
18
+ confirmedByPerson: boolean;
19
+ }) => Promise<CallToolResult>;
20
+ /**
21
+ * Handlers return `success(data)`, a JSON text block. Rewrap it as
22
+ * `{ context, data }` so the caller always sees which org and platform
23
+ * answered. Error results and non-JSON text pass through untouched.
24
+ */
25
+ /** About 20k tokens: Claude Code refuses tool results over 25k tokens. */
26
+ export declare const MAX_RESULT_CHARS = 80000;
27
+ /**
28
+ * Ask before a destructive call. With elicitation the host asks the person
29
+ * directly and a `confirm` argument is ignored, so an agent cannot confirm
30
+ * for itself. Without elicitation `confirm: true` proceeds; anything else
31
+ * returns a dry run and the call is not made.
32
+ */
33
+ /** Approval forms show a few short lines: a long prompt diff would push the Proceed box off the screen. */
34
+ export declare function fitForm(text: string, maxLines?: number, maxLine?: number): string;
35
+ export declare function guardDestructive(server: McpServer, toolName: string, args: Args, preview: string, formText?: string): Promise<{
36
+ proceed: true;
37
+ byPerson: boolean;
38
+ } | {
39
+ proceed: false;
40
+ result: CallToolResult;
41
+ }>;
42
+ export declare function createRegistry(server: McpServer, opts: {
43
+ context: () => Promise<ResultContext> | ResultContext;
44
+ meta?: Record<string, ToolMeta>;
45
+ /** Decide the org for one call from its org_id argument (else link, only org, or ask). */
46
+ resolveOrg?: (explicit?: string) => Promise<{
47
+ id: string;
48
+ name?: string;
49
+ }>;
50
+ /**
51
+ * Names for the ids of a call (agent, knowledge base, org…), shown in approvals instead of the ids,
52
+ * and the ids that name nothing (no card is shown for those).
53
+ */
54
+ displayNames?: (args: Args, orgId?: string) => Promise<{
55
+ names: Record<string, string>;
56
+ missing?: string[];
57
+ }>;
58
+ }): {
59
+ tool(name: string, description: string, shape: Shape, handler: Handler, extra?: {
60
+ preview?: (args: Args) => Promise<string>;
61
+ guardWhen?: (args: Args) => Promise<boolean>;
62
+ }): void;
63
+ names(): string[];
64
+ };
65
+ export type Registry = ReturnType<typeof createRegistry>;
66
+ export {};
67
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/mcp/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGnD,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1D,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;IACzB,kGAAkG;IAClG,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;AAC1C,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACpC,kFAAkF;AAClF,KAAK,OAAO,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE;IAAE,iBAAiB,EAAE,OAAO,CAAA;CAAE,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;AAM5F;;;;GAIG;AACH,0EAA0E;AAC1E,eAAO,MAAM,gBAAgB,QAAS,CAAC;AA8CvC;;;;;GAKG;AACH,2GAA2G;AAC3G,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAI,EAAE,OAAO,SAAM,GAAG,MAAM,CAMzE;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,MAAgB,GACzB,OAAO,CAAC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,CAAC,CAgC5F;AAUD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE;IACJ,OAAO,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAAC;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChC,0FAA0F;IAC1F,UAAU,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3E;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CAC/G;eAMY,MAAM,eAAe,MAAM,SAAS,KAAK,WAAW,OAAO,UAAS;QAAE,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,GAAQ,IAAI;aAsE7K,MAAM,EAAE;EAIpB;AAED,MAAM,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC"}