@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,185 @@
1
+ import { CliError, EXIT } from '../core/runtime.js';
2
+ function day(d) {
3
+ return d.toISOString().slice(0, 10);
4
+ }
5
+ /** YYYY-MM-DD range, default the last 30 days; copilot refuses spans over 365 days. */
6
+ export function rangeQuery(r, opts = { withChannel: true, withAgent: true }) {
7
+ const to = r.to ?? day(new Date());
8
+ const from = r.from ?? day(new Date(Date.parse(to) - 30 * 86_400_000));
9
+ const span = (Date.parse(to) - Date.parse(from)) / 86_400_000;
10
+ if (Number.isNaN(span) || span < 0)
11
+ throw new CliError('Dates must be YYYY-MM-DD with from before to.', EXIT.NEEDS_INPUT);
12
+ if (span > 365)
13
+ throw new CliError('Analytics cover at most 365 days.', EXIT.NEEDS_INPUT);
14
+ const q = { date_from: from, date_to: to };
15
+ if (opts.withChannel !== false)
16
+ q.channel = r.channel ?? 'all';
17
+ if (opts.withAgent !== false && r.agentId)
18
+ q.agent_id = r.agentId;
19
+ return q;
20
+ }
21
+ /** The numbers the dashboard's analytics pages show. Test conversations are excluded by copilot. */
22
+ export class AnalyticsSDK {
23
+ client;
24
+ constructor(client) {
25
+ this.client = client;
26
+ }
27
+ get(kind, range = {}) {
28
+ const opts = {
29
+ withChannel: !['model-performance/bots', 'agent-volume'].includes(kind),
30
+ withAgent: !['model-performance/bots', 'agent-volume'].includes(kind),
31
+ };
32
+ return this.client.copilotGet(`/organization/:org_id/analytics/${kind}`, rangeQuery(range, opts));
33
+ }
34
+ /** Conversations behind a number, for example all with a given outcome (1-based pages, at most 200 rows). */
35
+ conversations(range) {
36
+ const q = rangeQuery(range);
37
+ if (range.dimension)
38
+ q.dimension = range.dimension;
39
+ if (range.value)
40
+ q.value = range.value;
41
+ if (range.search)
42
+ q.search = range.search;
43
+ q.page = String(range.page ?? 1);
44
+ q.page_size = String(Math.min(range.pageSize ?? 50, 200));
45
+ return this.client.copilotGet('/organization/:org_id/analytics/conversations/list', q);
46
+ }
47
+ charts() {
48
+ return this.client.copilotGet('/organization/:org_id/custom-charts');
49
+ }
50
+ chart(id, range = {}) {
51
+ return this.client.copilotGet(`/organization/:org_id/custom-charts/${id}/data`, rangeQuery(range));
52
+ }
53
+ }
54
+ /**
55
+ * Org settings the dashboard lets members change: timezone, business hours,
56
+ * holidays. Handoff settings are read-only over the API. The route that
57
+ * deletes the whole configuration is deliberately never called.
58
+ */
59
+ export class OrgSettingsSDK {
60
+ client;
61
+ constructor(client) {
62
+ this.client = client;
63
+ }
64
+ get() {
65
+ return this.client.copilotGet('/organization/:org_id/configurations');
66
+ }
67
+ /** Whether the org is inside business hours now. */
68
+ availability() {
69
+ return this.client.copilotGet('/organization/:org_id/configurations/availability');
70
+ }
71
+ async setTimezone(timezone) {
72
+ try {
73
+ new Intl.DateTimeFormat('en', { timeZone: timezone });
74
+ }
75
+ catch {
76
+ throw new CliError(`"${timezone}" is not a time zone name, for example America/New_York.`, EXIT.NEEDS_INPUT);
77
+ }
78
+ return this.client.copilotRequestRaw('PATCH', '/organization/:org_id/configurations', { timezone });
79
+ }
80
+ async setBusinessHours(hours) {
81
+ for (const d of hours.businessHours ?? []) {
82
+ if (!Number.isInteger(d.day) || d.day < 0 || d.day > 6)
83
+ throw new CliError('Each business-hours day must be 0 (Sunday) to 6.', EXIT.NEEDS_INPUT);
84
+ }
85
+ return this.client.copilotRequestRaw('PATCH', '/organization/:org_id/configurations/business-hours', hours);
86
+ }
87
+ async addHolidays(holidays) {
88
+ if (!holidays.length)
89
+ throw new CliError('Give at least one holiday.', EXIT.NEEDS_INPUT);
90
+ return this.client.copilotRequestRaw('PATCH', '/organization/:org_id/configurations/holidays', { holidays });
91
+ }
92
+ removeHolidays(dates) {
93
+ return this.client.copilotRequestRaw('DELETE', '/organization/:org_id/configurations/holidays', { holidays: dates.map((date) => ({ date })) });
94
+ }
95
+ /** Indemn-only feature switches; copilot refuses anyone without an @indemn.ai login. */
96
+ setAdminSettings(settings) {
97
+ return this.client.copilotRequestRaw('PATCH', '/organization/:org_id/configurations/admin-settings', settings);
98
+ }
99
+ /** An Admin-tab change checked as the page checks it; reads the saved disclosure only when the change touches it. */
100
+ async planAdmin(input) {
101
+ const touchesDisclosure = input.web_ai_disclosure !== undefined || input.web_ai_disclosure_text !== undefined;
102
+ return planAdminSettings(input, touchesDisclosure ? await this.get() : {});
103
+ }
104
+ }
105
+ /** The switches on the dashboard's Settings → Admin tab (org-settings.tsx), by the name the MCP tool takes. */
106
+ export const ADMIN_SWITCHES = {
107
+ conversation_summaries: { key: 'summaryEnabled', label: 'AI Conversation Summaries' },
108
+ canned_responses: { key: 'cannedResponsesEnabled', label: 'Canned Responses' },
109
+ indemn_branding: { key: 'displayBranding', label: 'Show Indemn Branding' },
110
+ underwriting_portal: { key: 'enableUnderwritingPortal', label: 'Underwriting Portal (Intake Manager)' },
111
+ smart_inbox: { key: 'enableSmartInbox', label: 'Smart Inbox' },
112
+ solutions: { key: 'enableSolutions', label: 'Solutions' },
113
+ tickets: { key: 'enableTickets', label: 'Tickets' },
114
+ agent_testing: { key: 'enableAgentTesting', label: 'Agent Testing Mode' },
115
+ composer_dictation: { key: 'enableComposerDictation', label: 'Composer Dictation' },
116
+ web_ai_disclosure: { key: 'showAiDisclosureWeb', label: 'Show Web AI Disclosure' },
117
+ };
118
+ /** The conversation timers, in minutes here; copilot stores days and refuses less than these minimums (orgConfig.js). */
119
+ export const ADMIN_TIMERS = {
120
+ ongoing_to_ended_minutes: { key: 'unassignedInactiveDays', label: 'Ongoing → Ended', min: 1 },
121
+ ended_to_resolved_minutes: { key: 'endedToResolvedDays', label: 'Ended → Resolved', min: 10 },
122
+ resolved_to_archived_minutes: { key: 'resolvedToArchivedDays', label: 'Resolved → Archived', min: 1 },
123
+ };
124
+ function duration(minutes) {
125
+ const [n, unit] = minutes % 1440 === 0 ? [minutes / 1440, 'day'] : minutes % 60 === 0 ? [minutes / 60, 'hour'] : [minutes, 'minute'];
126
+ return `${n} ${unit}${n === 1 ? '' : 's'}`;
127
+ }
128
+ /** Refuses what the Admin tab refuses: nothing to change, a timer under its minimum, a disclosure shown without text. */
129
+ export function planAdminSettings(input, saved = {}) {
130
+ const body = {};
131
+ const changes = [];
132
+ for (const [name, s] of Object.entries(ADMIN_SWITCHES)) {
133
+ if (typeof input[name] !== 'boolean')
134
+ continue;
135
+ body[s.key] = input[name];
136
+ changes.push(`turn ${input[name] ? 'on' : 'off'} ${s.label}`);
137
+ }
138
+ // Blank text counts as not given: models fill optional text with "", which must not wipe a saved name or text.
139
+ const name = typeof input.underwriting_portal_name === 'string' ? input.underwriting_portal_name.trim() : '';
140
+ if (name) {
141
+ body.underwritingPortalName = name;
142
+ changes.push(`name the Intake Manager item "${name}"`);
143
+ }
144
+ const disclosure = typeof input.web_ai_disclosure_text === 'string' ? input.web_ai_disclosure_text.trim() : '';
145
+ if (disclosure) {
146
+ body.aiDisclosureWeb = disclosure;
147
+ changes.push(`set the web AI disclosure text to "${disclosure}"`);
148
+ }
149
+ for (const [name, t] of Object.entries(ADMIN_TIMERS)) {
150
+ const minutes = input[name];
151
+ if (typeof minutes !== 'number')
152
+ continue;
153
+ if (minutes !== 0 && (!Number.isFinite(minutes) || minutes < t.min)) {
154
+ throw new CliError(`${t.label} must be at least ${t.min} minute${t.min === 1 ? '' : 's'}, or 0 for the default.`, EXIT.NEEDS_INPUT);
155
+ }
156
+ body[t.key] = minutes === 0 ? null : minutes / 1440;
157
+ changes.push(minutes === 0 ? `set ${t.label} back to the default` : `set ${t.label} to ${duration(minutes)}`);
158
+ }
159
+ if (!changes.length)
160
+ throw new CliError('Give at least one Admin setting to change.', EXIT.NEEDS_INPUT);
161
+ const shown = (body.showAiDisclosureWeb ?? saved.showAiDisclosureWeb) === true;
162
+ const text = body.aiDisclosureWeb ?? saved.aiDisclosureWeb;
163
+ if (shown && !(typeof text === 'string' && text.trim())) {
164
+ throw new CliError('The web AI disclosure needs its text: give web_ai_disclosure_text.', EXIT.NEEDS_INPUT);
165
+ }
166
+ return { body, changes };
167
+ }
168
+ /** Who changed what in the org. copilot returns the full history; filtering happens here. */
169
+ export class AuditSDK {
170
+ client;
171
+ constructor(client) {
172
+ this.client = client;
173
+ }
174
+ async list(filter = {}) {
175
+ const all = await this.client.copilotGet('/organization/:org_id/audit-logs');
176
+ const since = filter.since ? Date.parse(filter.since) : undefined;
177
+ return (all ?? [])
178
+ .filter((e) => (since === undefined || Date.parse(String(e.createdAt)) >= since))
179
+ .filter((e) => !filter.action || e.action === filter.action || e.event_type === filter.action)
180
+ .filter((e) => !filter.resourceType || e.resource_type === filter.resourceType)
181
+ .filter((e) => !filter.user || String(e.id_user) === filter.user)
182
+ .slice(0, filter.limit ?? 50);
183
+ }
184
+ }
185
+ //# sourceMappingURL=analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/sdk/analytics.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,40 @@
1
- import type { Environment, EnvironmentHosts } from './types.js';
2
- export declare function login(email: string, password: string, env?: Environment, opts?: {
3
- mfaCodePrompt?: () => Promise<string>;
4
- }): Promise<{
5
- apiKey: string;
6
- orgId: string;
1
+ import type { Credential } from './credentials.js';
2
+ import type { Environment, EnvironmentHosts, OrgSummary } from './types.js';
3
+ export declare const FIREBASE_CONFIGS: Record<Environment, Record<string, string>>;
4
+ export type FirebaseSignIn = (email: string, password: string, env: Environment) => Promise<{
5
+ idToken: string;
6
+ refreshToken: string;
7
+ }>;
8
+ export interface LoginResult {
7
9
  userId: string;
10
+ email: string;
8
11
  environment: Environment;
12
+ orgs: OrgSummary[];
13
+ expiresAt?: string;
14
+ }
15
+ /**
16
+ * Log in and keep the copilot session token, the same one the dashboard uses.
17
+ * No API key is created. The Firebase refresh token is kept so the session
18
+ * can renew itself.
19
+ */
20
+ export declare function login(email: string, password: string, env?: Environment, opts?: {
21
+ mfaCodePrompt?: () => Promise<string>;
22
+ firebaseSignIn?: FirebaseSignIn;
23
+ }): Promise<LoginResult>;
24
+ /** Revoke the session on the server, then forget it locally. */
25
+ export declare function logout(): Promise<{
26
+ revoked: boolean;
9
27
  }>;
10
- export declare function logout(): void;
11
- export declare function whoami(): {
12
- apiKey: string;
13
- orgId: string;
14
- userId: string;
28
+ export interface WhoAmI {
15
29
  environment: Environment;
30
+ email?: string;
31
+ userId?: string;
32
+ credential: 'session' | 'api_key';
33
+ source: Credential['source'];
34
+ sessionExpiresAt?: string;
35
+ orgs: OrgSummary[];
16
36
  hosts: EnvironmentHosts;
17
- } | null;
37
+ }
38
+ /** Who and where, without any secret. */
39
+ export declare function whoami(): WhoAmI | null;
18
40
  //# sourceMappingURL=auth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/sdk/auth.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAuBhE,wBAAsB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,WAAmB,EAAE,IAAI,CAAC,EAAE;IAC5F,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CACvC,GAAG,OAAO,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,WAAW,CAAC;CAC1B,CAAC,CA8FD;AAED,wBAAgB,MAAM,IAAI,IAAI,CAE7B;AAED,wBAAgB,MAAM,IAAI;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,gBAAgB,CAAC;CACzB,GAAG,IAAI,CAUP"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/sdk/auth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI5E,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiBxE,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAWvI,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,WAAW,CAAC;IACzB,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAsB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,WAAmB,EAAE,IAAI,CAAC,EAAE;IAC5F,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC,GAAG,OAAO,CAAC,WAAW,CAAC,CA2BvB;AAED,gEAAgE;AAChE,wBAAsB,MAAM,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAc5D;AAED,MAAM,WAAW,MAAM;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,SAAS,GAAG,SAAS,CAAC;IAClC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED,yCAAyC;AACzC,wBAAgB,MAAM,IAAI,MAAM,GAAG,IAAI,CAgBtC"}
package/dist/sdk/auth.js CHANGED
@@ -1,9 +1,10 @@
1
1
  import { initializeApp, getApp } from 'firebase/app';
2
2
  import { getAuth, signInWithEmailAndPassword } from 'firebase/auth';
3
- import { IndemnClient } from './client.js';
3
+ import { DEFAULT_HOSTS, IndemnClient } from './client.js';
4
+ import { exchangeIdToken, toStoredSession } from './session.js';
4
5
  // Firebase client configs per environment — public configuration (not secrets),
5
6
  // bundled the same way the Copilot Dashboard bundles them via envsubst
6
- const FIREBASE_CONFIGS = {
7
+ export const FIREBASE_CONFIGS = {
7
8
  dev: {
8
9
  apiKey: 'AIzaSyB8bA3w8oaMbyMxYA7lyQy_OvrPcPfW7x8',
9
10
  authDomain: 'agent-449107.firebaseapp.com',
@@ -21,96 +22,78 @@ const FIREBASE_CONFIGS = {
21
22
  appId: '1:334963688118:web:21670b3a97547d4b231c17',
22
23
  },
23
24
  };
24
- export async function login(email, password, env = 'dev', opts) {
25
- // Step 1: Firebase client SDK auth (environment-specific config, separate app per env)
26
- const firebaseConfig = FIREBASE_CONFIGS[env];
25
+ /** Email and password sign-in with the Firebase web SDK, as the dashboard does. */
26
+ const firebaseSignIn = async (email, password, env) => {
27
27
  const appName = `indemn-cli-${env}`;
28
28
  let app;
29
29
  try {
30
30
  app = getApp(appName);
31
31
  }
32
32
  catch {
33
- app = initializeApp(firebaseConfig, appName);
34
- }
35
- const auth = getAuth(app);
36
- const userCredential = await signInWithEmailAndPassword(auth, email, password);
37
- const idToken = await userCredential.user.getIdToken();
38
- // Step 2: Exchange Firebase ID token for Copilot Server JWT
39
- const client = new IndemnClient({ environment: env });
40
- const signinResponse = await client.copilotPostUnauth('/auth/firebase/signin', { idToken });
41
- let jwt;
42
- let userId;
43
- if (signinResponse.requiresMfa) {
44
- // MFA required — prompt for code and verify
45
- if (!opts?.mfaCodePrompt) {
46
- throw new Error('MFA is required but no code prompt handler was provided.');
47
- }
48
- const code = await opts.mfaCodePrompt();
49
- const mfaResponse = await client.copilotPostUnauth('/auth/firebase/mfa/verify', {
50
- sessionId: signinResponse.mfaSessionId,
51
- code,
52
- });
53
- jwt = mfaResponse.token.replace(/^JWT\s+/i, '');
54
- userId = mfaResponse.user._id;
33
+ app = initializeApp(FIREBASE_CONFIGS[env], appName);
55
34
  }
56
- else {
57
- // No MFA — direct JWT
58
- jwt = signinResponse.token.replace(/^JWT\s+/i, '');
59
- userId = signinResponse.user._id;
60
- }
61
- // Step 3: Generate persistent API key using the JWT
62
- const apiKeyResponse = await client.copilotPostUnauth('/auth/api-keys', { name: `indemn-cli-${Date.now()}` }, {
63
- 'Authorization': `jwt ${jwt}`,
35
+ const credential = await signInWithEmailAndPassword(getAuth(app), email, password);
36
+ return { idToken: await credential.user.getIdToken(), refreshToken: credential.user.refreshToken };
37
+ };
38
+ /**
39
+ * Log in and keep the copilot session token, the same one the dashboard uses.
40
+ * No API key is created. The Firebase refresh token is kept so the session
41
+ * can renew itself.
42
+ */
43
+ export async function login(email, password, env = 'dev', opts) {
44
+ const { idToken, refreshToken } = await (opts?.firebaseSignIn ?? firebaseSignIn)(email, password, env);
45
+ const unauth = new IndemnClient({ environment: env });
46
+ const session = await exchangeIdToken((path, body, headers) => unauth.copilotPostUnauth(path, body, headers), idToken, opts?.mfaCodePrompt);
47
+ // Which orgs this person belongs to, asked with the new session itself.
48
+ const authed = new IndemnClient({ environment: env, token: session.token });
49
+ const res = await authed.copilotGet('/organization');
50
+ const orgs = (res.userOrganizations ?? []).map((o) => ({ id: String(o._id), name: o.name }));
51
+ const stored = toStoredSession(session.token, refreshToken);
52
+ IndemnClient.clearConfig();
53
+ IndemnClient.saveConfig({
54
+ environment: env,
55
+ user_id: session.userId,
56
+ email: session.email ?? email,
57
+ session: stored,
58
+ orgs,
59
+ hosts: DEFAULT_HOSTS,
64
60
  });
65
- if (!apiKeyResponse.org_id) {
66
- throw new Error('Login succeeded but no organization found. Contact your admin to be added to an organization.');
67
- }
68
- // Step 3.5: Fetch the org name so the banner can display it without a lookup on every command.
69
- let orgName;
70
- try {
71
- const orgRes = await fetch(`${client.getHosts().copilot}/organization/${apiKeyResponse.org_id}`, {
72
- headers: {
73
- 'Authorization': `Bearer ${apiKeyResponse.key}`,
74
- 'Content-Type': 'application/json',
75
- },
76
- });
77
- if (orgRes.ok) {
78
- const data = await orgRes.json();
79
- orgName = data.organization?.name;
61
+ return { userId: session.userId, email: session.email ?? email, environment: env, orgs, expiresAt: stored.expires_at };
62
+ }
63
+ /** Revoke the session on the server, then forget it locally. */
64
+ export async function logout() {
65
+ const config = IndemnClient.loadConfig();
66
+ let revoked = false;
67
+ if (config?.session?.token) {
68
+ try {
69
+ const client = new IndemnClient({ environment: config.environment });
70
+ await client.copilotPostUnauth('/auth/firebase/logout', undefined, { Authorization: `JWT ${config.session.token}` });
71
+ revoked = true;
72
+ }
73
+ catch {
74
+ // Offline or already expired: still forget it locally.
80
75
  }
81
76
  }
82
- catch {
83
- // Non-fatal — banner falls back to org ID if name unavailable
84
- }
85
- const config = {
86
- api_key: apiKeyResponse.key,
87
- org_id: apiKeyResponse.org_id,
88
- org_name: orgName,
89
- user_id: userId,
90
- environment: env,
91
- };
92
- // Step 4: Save to config file
93
- IndemnClient.saveConfig(config);
94
- return {
95
- apiKey: config.api_key,
96
- orgId: config.org_id,
97
- userId: config.user_id,
98
- environment: env,
99
- };
100
- }
101
- export function logout() {
102
77
  IndemnClient.clearConfig();
78
+ return { revoked };
103
79
  }
80
+ /** Who and where, without any secret. */
104
81
  export function whoami() {
105
- const config = IndemnClient.loadConfig();
106
- if (!config || !config.api_key)
82
+ const client = new IndemnClient();
83
+ const cred = client.getCredential();
84
+ if (!cred)
107
85
  return null;
86
+ const config = IndemnClient.loadConfig();
87
+ const fromConfig = cred.source === 'config';
108
88
  return {
109
- apiKey: config.api_key.substring(0, 12) + '...',
110
- orgId: config.org_id,
111
- userId: config.user_id,
112
- environment: config.environment,
113
- hosts: config.hosts[config.environment],
89
+ environment: client.getEnvironment(),
90
+ email: fromConfig ? config?.email : undefined,
91
+ userId: fromConfig ? config?.user_id : undefined,
92
+ credential: cred.kind === 'token' ? 'session' : 'api_key',
93
+ source: cred.source,
94
+ sessionExpiresAt: fromConfig && cred.kind === 'token' ? config?.session?.expires_at : undefined,
95
+ orgs: fromConfig ? config?.orgs ?? [] : [],
96
+ hosts: client.getHosts(),
114
97
  };
115
98
  }
116
99
  //# sourceMappingURL=auth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/sdk/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/sdk/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { IndemnClient } from './client.js';
2
+ /**
3
+ * Billing, READ-ONLY by design: every call here is a GET. The CLI never
4
+ * changes a plan, pays, pauses, cancels, posts meters or edits prices; those
5
+ * stay in the dashboard. (A test fails if this file gains a write.)
6
+ */
7
+ export declare class BillingSDK {
8
+ private client;
9
+ constructor(client: IndemnClient);
10
+ /** The org's subscription, or null when it has none (copilot answers 500 then) or never pays (infinite plan). */
11
+ status(): Promise<Record<string, unknown> | null>;
12
+ private subscriptionId;
13
+ /** Invoices, newest first (empty when there are none; copilot answers 500 then). */
14
+ invoices(): Promise<unknown[]>;
15
+ /** Open invoices with their payment links. */
16
+ unpaid(): Promise<unknown[]>;
17
+ /** Usage so far this period and the projected cost per meter. */
18
+ usageForecast(): Promise<unknown>;
19
+ /** The org's own plans and the public plan list. */
20
+ plans(): Promise<{
21
+ org_plans: unknown[];
22
+ public_plans: unknown[];
23
+ }>;
24
+ }
25
+ //# sourceMappingURL=billing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing.d.ts","sourceRoot":"","sources":["../../src/sdk/billing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;;;GAIG;AACH,qBAAa,UAAU;IACT,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,YAAY;IAExC,iHAAiH;IAC3G,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;YAUzC,cAAc;IAK5B,oFAAoF;IAC9E,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAYpC,8CAA8C;IACxC,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAOlC,iEAAiE;IACjE,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAIjC,oDAAoD;IAC9C,KAAK,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QAAC,YAAY,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC;CAK1E"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Billing, READ-ONLY by design: every call here is a GET. The CLI never
3
+ * changes a plan, pays, pauses, cancels, posts meters or edits prices; those
4
+ * stay in the dashboard. (A test fails if this file gains a write.)
5
+ */
6
+ export class BillingSDK {
7
+ client;
8
+ constructor(client) {
9
+ this.client = client;
10
+ }
11
+ /** The org's subscription, or null when it has none (copilot answers 500 then) or never pays (infinite plan). */
12
+ async status() {
13
+ try {
14
+ const res = await this.client.copilotGet('/organization/:org_id/billing-subscription');
15
+ return res;
16
+ }
17
+ catch (err) {
18
+ if (err instanceof Error && /\(500\)|infinite subscription|Subscription does not exist/i.test(err.message))
19
+ return null;
20
+ throw err;
21
+ }
22
+ }
23
+ async subscriptionId() {
24
+ const sub = await this.status();
25
+ return sub && sub._id ? String(sub._id) : null;
26
+ }
27
+ /** Invoices, newest first (empty when there are none; copilot answers 500 then). */
28
+ async invoices() {
29
+ const sid = await this.subscriptionId();
30
+ if (!sid)
31
+ return [];
32
+ try {
33
+ const res = await this.client.copilotGet(`/invoice/organization/:org_id/subscription/${sid}`);
34
+ return res.invoices ?? [];
35
+ }
36
+ catch (err) {
37
+ if (err instanceof Error && /\(500\)|Could not fetch invoices/i.test(err.message))
38
+ return [];
39
+ throw err;
40
+ }
41
+ }
42
+ /** Open invoices with their payment links. */
43
+ async unpaid() {
44
+ const sid = await this.subscriptionId();
45
+ if (!sid)
46
+ return [];
47
+ const res = await this.client.copilotGet(`/invoice/organization/:org_id/subscription/${sid}/unpaid`);
48
+ return res.unpaidInvoices ?? [];
49
+ }
50
+ /** Usage so far this period and the projected cost per meter. */
51
+ usageForecast() {
52
+ return this.client.copilotGet('/invoice/organization/:org_id/usage-forecast');
53
+ }
54
+ /** The org's own plans and the public plan list. */
55
+ async plans() {
56
+ const org = await this.client.copilotGet('/organization/:org_id/customer-plans').catch(() => ({ plans: [] }));
57
+ const pub = await this.client.copilotGet('/subscription-plans').catch(() => []);
58
+ return { org_plans: org.plans ?? [], public_plans: Array.isArray(pub) ? pub : [] };
59
+ }
60
+ }
61
+ //# sourceMappingURL=billing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/sdk/billing.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,UAAU;IACD;IAApB,YAAoB,MAAoB;QAApB,WAAM,GAAN,MAAM,CAAc;IAAG,CAAC;IAE5C,iHAAiH;IACjH,KAAK,CAAC,MAAM;QACV,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAA0B,4CAA4C,CAAC,CAAC;YAChH,OAAO,GAAG,CAAC;QACb,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,KAAK,IAAI,4DAA4D,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC;YACxH,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,OAAO,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjD,CAAC;IAED,oFAAoF;IACpF,KAAK,CAAC,QAAQ;QACZ,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QACxC,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAA2B,8CAA8C,GAAG,EAAE,CAAC,CAAC;YACxH,OAAO,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC5B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,KAAK,IAAI,mCAAmC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;gBAAE,OAAO,EAAE,CAAC;YAC7F,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,KAAK,CAAC,MAAM;QACV,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QACxC,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAiC,8CAA8C,GAAG,SAAS,CAAC,CAAC;QACrI,OAAO,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;IAClC,CAAC;IAED,iEAAiE;IACjE,aAAa;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,8CAA8C,CAAC,CAAC;IAChF,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,KAAK;QACT,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAwB,sCAAsC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACrI,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAY,qBAAqB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3F,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACrF,CAAC;CACF"}
@@ -0,0 +1,35 @@
1
+ import type { IndemnClient } from './client.js';
2
+ /**
3
+ * Campaigns, READ-ONLY by design, through copilot's proxy to the campaigns
4
+ * service. The CLI never publishes a campaign, sends a communication or
5
+ * triggers a book sync; those act on real customers.
6
+ */
7
+ export declare class CampaignsSDK {
8
+ private client;
9
+ constructor(client: IndemnClient);
10
+ private read;
11
+ list(filter?: {
12
+ status?: string;
13
+ solutionId?: string;
14
+ limit?: number;
15
+ skip?: number;
16
+ }): Promise<{
17
+ total?: number;
18
+ items?: unknown[];
19
+ }>;
20
+ get(id: string): Promise<unknown>;
21
+ /** Enrollment counts, forecast of the next days, or upcoming touchpoints of a campaign. */
22
+ detail(id: string, what: 'counts' | 'forecast' | 'next-touchpoints' | 'versions', days?: number): Promise<unknown>;
23
+ templates(filter?: {
24
+ channel?: string;
25
+ solutionId?: string;
26
+ limit?: number;
27
+ }): Promise<{
28
+ total?: number;
29
+ items?: unknown[];
30
+ }>;
31
+ /** A template; with versions: true, its versions (where subject and body live). */
32
+ template(id: string, versions?: boolean): Promise<unknown>;
33
+ templateSkills(solutionId?: string): Promise<unknown>;
34
+ }
35
+ //# sourceMappingURL=campaigns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"campaigns.d.ts","sourceRoot":"","sources":["../../src/sdk/campaigns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAehD;;;;GAIG;AACH,qBAAa,YAAY;IACX,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,YAAY;YAE1B,IAAI;IAKlB,IAAI,CAAC,MAAM,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC;IAO1I,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIjC,2FAA2F;IAC3F,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,kBAAkB,GAAG,UAAU,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlH,SAAS,CAAC,MAAM,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC;IAOjI,mFAAmF;IACnF,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAIxD,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAGtD"}