@indemn/cli 1.6.0 → 1.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +3 -3
- package/.claude-plugin/plugin.json +9 -4
- package/.github/workflows/ci.yml +10 -0
- package/.github/workflows/publish.yml +2 -2
- package/.mcp.json +1 -4
- package/CONTRIBUTING.md +3 -1
- package/README.md +69 -176
- package/dist/cli/agents.d.ts.map +1 -1
- package/dist/cli/agents.js +226 -18
- package/dist/cli/agents.js.map +1 -1
- package/dist/cli/analytics.d.ts +3 -0
- package/dist/cli/analytics.d.ts.map +1 -0
- package/dist/cli/analytics.js +133 -0
- package/dist/cli/analytics.js.map +1 -0
- package/dist/cli/auth.d.ts.map +1 -1
- package/dist/cli/auth.js +62 -17
- package/dist/cli/auth.js.map +1 -1
- package/dist/cli/billing.d.ts +3 -0
- package/dist/cli/billing.d.ts.map +1 -0
- package/dist/cli/billing.js +23 -0
- package/dist/cli/billing.js.map +1 -0
- package/dist/cli/campaigns.d.ts +3 -0
- package/dist/cli/campaigns.d.ts.map +1 -0
- package/dist/cli/campaigns.js +34 -0
- package/dist/cli/campaigns.js.map +1 -0
- package/dist/cli/chat.d.ts.map +1 -1
- package/dist/cli/chat.js +69 -102
- package/dist/cli/chat.js.map +1 -1
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +71 -27
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/conversations.d.ts +3 -0
- package/dist/cli/conversations.d.ts.map +1 -0
- package/dist/cli/conversations.js +129 -0
- package/dist/cli/conversations.js.map +1 -0
- package/dist/cli/distribution.d.ts +3 -0
- package/dist/cli/distribution.d.ts.map +1 -0
- package/dist/cli/distribution.js +122 -0
- package/dist/cli/distribution.js.map +1 -0
- package/dist/cli/eval.d.ts.map +1 -1
- package/dist/cli/eval.js +315 -71
- package/dist/cli/eval.js.map +1 -1
- package/dist/cli/functions.d.ts.map +1 -1
- package/dist/cli/functions.js +109 -38
- package/dist/cli/functions.js.map +1 -1
- package/dist/cli/index.js +63 -54
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts +27 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +152 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/kb.d.ts.map +1 -1
- package/dist/cli/kb.js +141 -15
- package/dist/cli/kb.js.map +1 -1
- package/dist/cli/link.d.ts +21 -0
- package/dist/cli/link.d.ts.map +1 -0
- package/dist/cli/link.js +112 -0
- package/dist/cli/link.js.map +1 -0
- package/dist/cli/org.d.ts.map +1 -1
- package/dist/cli/org.js +79 -67
- package/dist/cli/org.js.map +1 -1
- package/dist/cli/platform.d.ts +3 -0
- package/dist/cli/platform.d.ts.map +1 -0
- package/dist/cli/platform.js +133 -0
- package/dist/cli/platform.js.map +1 -0
- package/dist/cli/tickets.d.ts +3 -0
- package/dist/cli/tickets.d.ts.map +1 -0
- package/dist/cli/tickets.js +125 -0
- package/dist/cli/tickets.js.map +1 -0
- package/dist/cli/utils/output.d.ts +15 -9
- package/dist/cli/utils/output.d.ts.map +1 -1
- package/dist/cli/utils/output.js +53 -46
- package/dist/cli/utils/output.js.map +1 -1
- package/dist/cli/voice.d.ts +3 -0
- package/dist/cli/voice.d.ts.map +1 -0
- package/dist/cli/voice.js +206 -0
- package/dist/cli/voice.js.map +1 -0
- package/dist/core/diff.d.ts +16 -0
- package/dist/core/diff.d.ts.map +1 -0
- package/dist/core/diff.js +57 -0
- package/dist/core/diff.js.map +1 -0
- package/dist/core/org-resolver.d.ts +37 -0
- package/dist/core/org-resolver.d.ts.map +1 -0
- package/dist/core/org-resolver.js +73 -0
- package/dist/core/org-resolver.js.map +1 -0
- package/dist/core/runtime.d.ts +36 -0
- package/dist/core/runtime.d.ts.map +1 -0
- package/dist/core/runtime.js +62 -0
- package/dist/core/runtime.js.map +1 -0
- package/dist/core/scope.d.ts +33 -0
- package/dist/core/scope.d.ts.map +1 -0
- package/dist/core/scope.js +37 -0
- package/dist/core/scope.js.map +1 -0
- package/dist/mcp/registry.d.ts +67 -0
- package/dist/mcp/registry.d.ts.map +1 -0
- package/dist/mcp/registry.js +195 -0
- package/dist/mcp/registry.js.map +1 -0
- package/dist/mcp/server.d.ts +9 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +87 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tool-meta.d.ts +21 -0
- package/dist/mcp/tool-meta.d.ts.map +1 -0
- package/dist/mcp/tool-meta.js +203 -0
- package/dist/mcp/tool-meta.js.map +1 -0
- package/dist/mcp/tools.d.ts +2 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +1462 -215
- package/dist/mcp/tools.js.map +1 -1
- package/dist/sdk/agent-bundle.d.ts +99 -0
- package/dist/sdk/agent-bundle.d.ts.map +1 -0
- package/dist/sdk/agent-bundle.js +211 -0
- package/dist/sdk/agent-bundle.js.map +1 -0
- package/dist/sdk/agents.d.ts +54 -1
- package/dist/sdk/agents.d.ts.map +1 -1
- package/dist/sdk/agents.js +59 -5
- package/dist/sdk/agents.js.map +1 -1
- package/dist/sdk/analytics.d.ts +158 -0
- package/dist/sdk/analytics.d.ts.map +1 -0
- package/dist/sdk/analytics.js +185 -0
- package/dist/sdk/analytics.js.map +1 -0
- package/dist/sdk/auth.d.ts +34 -12
- package/dist/sdk/auth.d.ts.map +1 -1
- package/dist/sdk/auth.js +62 -79
- package/dist/sdk/auth.js.map +1 -1
- package/dist/sdk/billing.d.ts +25 -0
- package/dist/sdk/billing.d.ts.map +1 -0
- package/dist/sdk/billing.js +61 -0
- package/dist/sdk/billing.js.map +1 -0
- package/dist/sdk/campaigns.d.ts +35 -0
- package/dist/sdk/campaigns.d.ts.map +1 -0
- package/dist/sdk/campaigns.js +59 -0
- package/dist/sdk/campaigns.js.map +1 -0
- package/dist/sdk/chat.d.ts +25 -2
- package/dist/sdk/chat.d.ts.map +1 -1
- package/dist/sdk/chat.js +37 -10
- package/dist/sdk/chat.js.map +1 -1
- package/dist/sdk/client.d.ts +93 -5
- package/dist/sdk/client.d.ts.map +1 -1
- package/dist/sdk/client.js +362 -100
- package/dist/sdk/client.js.map +1 -1
- package/dist/sdk/config-change.d.ts +74 -0
- package/dist/sdk/config-change.d.ts.map +1 -0
- package/dist/sdk/config-change.js +117 -0
- package/dist/sdk/config-change.js.map +1 -0
- package/dist/sdk/config.d.ts.map +1 -1
- package/dist/sdk/config.js +2 -1
- package/dist/sdk/config.js.map +1 -1
- package/dist/sdk/conversations.d.ts +101 -0
- package/dist/sdk/conversations.d.ts.map +1 -0
- package/dist/sdk/conversations.js +155 -0
- package/dist/sdk/conversations.js.map +1 -0
- package/dist/sdk/credentials.d.ts +25 -0
- package/dist/sdk/credentials.d.ts.map +1 -0
- package/dist/sdk/credentials.js +44 -0
- package/dist/sdk/credentials.js.map +1 -0
- package/dist/sdk/distribution.d.ts +94 -0
- package/dist/sdk/distribution.d.ts.map +1 -0
- package/dist/sdk/distribution.js +100 -0
- package/dist/sdk/distribution.js.map +1 -0
- package/dist/sdk/eval.d.ts +81 -0
- package/dist/sdk/eval.d.ts.map +1 -1
- package/dist/sdk/eval.js +117 -0
- package/dist/sdk/eval.js.map +1 -1
- package/dist/sdk/functions.d.ts +14 -1
- package/dist/sdk/functions.d.ts.map +1 -1
- package/dist/sdk/functions.js +48 -5
- package/dist/sdk/functions.js.map +1 -1
- package/dist/sdk/index.d.ts +2 -0
- package/dist/sdk/index.d.ts.map +1 -1
- package/dist/sdk/index.js +2 -0
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/jarvis-chat.d.ts +28 -0
- package/dist/sdk/jarvis-chat.d.ts.map +1 -0
- package/dist/sdk/jarvis-chat.js +117 -0
- package/dist/sdk/jarvis-chat.js.map +1 -0
- package/dist/sdk/kb.d.ts +69 -1
- package/dist/sdk/kb.d.ts.map +1 -1
- package/dist/sdk/kb.js +111 -24
- package/dist/sdk/kb.js.map +1 -1
- package/dist/sdk/orgs.d.ts +13 -0
- package/dist/sdk/orgs.d.ts.map +1 -0
- package/dist/sdk/orgs.js +59 -0
- package/dist/sdk/orgs.js.map +1 -0
- package/dist/sdk/platform.d.ts +62 -0
- package/dist/sdk/platform.d.ts.map +1 -0
- package/dist/sdk/platform.js +95 -0
- package/dist/sdk/platform.js.map +1 -0
- package/dist/sdk/session.d.ts +25 -0
- package/dist/sdk/session.d.ts.map +1 -0
- package/dist/sdk/session.js +69 -0
- package/dist/sdk/session.js.map +1 -0
- package/dist/sdk/skills.d.ts +46 -0
- package/dist/sdk/skills.d.ts.map +1 -0
- package/dist/sdk/skills.js +203 -0
- package/dist/sdk/skills.js.map +1 -0
- package/dist/sdk/test-chat.d.ts +52 -0
- package/dist/sdk/test-chat.d.ts.map +1 -0
- package/dist/sdk/test-chat.js +134 -0
- package/dist/sdk/test-chat.js.map +1 -0
- package/dist/sdk/tickets.d.ts +98 -0
- package/dist/sdk/tickets.d.ts.map +1 -0
- package/dist/sdk/tickets.js +91 -0
- package/dist/sdk/tickets.js.map +1 -0
- package/dist/sdk/types.d.ts +91 -6
- package/dist/sdk/types.d.ts.map +1 -1
- package/dist/sdk/voice.d.ts +147 -0
- package/dist/sdk/voice.d.ts.map +1 -0
- package/dist/sdk/voice.js +236 -0
- package/dist/sdk/voice.js.map +1 -0
- package/package.json +21 -4
- package/scripts/check-skills.mjs +25 -0
- package/skills/agent-builder/SKILL.md +89 -252
- package/skills/evaluations/SKILL.md +23 -234
- package/skills/evaluations/references/analysis.md +95 -0
- package/skills/evaluations/references/cli-reference.md +28 -0
- package/skills/evaluations/references/json-formats.md +100 -0
- package/src/cli/agents.ts +202 -22
- package/src/cli/analytics.ts +138 -0
- package/src/cli/auth.ts +56 -18
- package/src/cli/billing.ts +25 -0
- package/src/cli/campaigns.ts +33 -0
- package/src/cli/chat.ts +66 -115
- package/src/cli/config.ts +65 -31
- package/src/cli/conversations.ts +133 -0
- package/src/cli/distribution.ts +116 -0
- package/src/cli/eval.ts +254 -70
- package/src/cli/functions.ts +105 -39
- package/src/cli/index.ts +58 -55
- package/src/cli/init.ts +154 -0
- package/src/cli/kb.ts +120 -17
- package/src/cli/link.ts +117 -0
- package/src/cli/org.ts +81 -75
- package/src/cli/platform.ts +128 -0
- package/src/cli/tickets.ts +130 -0
- package/src/cli/utils/output.ts +51 -42
- package/src/cli/voice.ts +204 -0
- package/src/core/diff.ts +52 -0
- package/src/core/org-resolver.ts +113 -0
- package/src/core/runtime.ts +73 -0
- package/src/core/scope.ts +64 -0
- package/src/mcp/registry.ts +236 -0
- package/src/mcp/server.ts +84 -2
- package/src/mcp/tool-meta.ts +241 -0
- package/src/mcp/tools.ts +1529 -265
- package/src/sdk/agent-bundle.ts +245 -0
- package/src/sdk/agents.ts +74 -5
- package/src/sdk/analytics.ts +220 -0
- package/src/sdk/auth.ts +89 -109
- package/src/sdk/billing.ts +59 -0
- package/src/sdk/campaigns.ts +60 -0
- package/src/sdk/chat.ts +44 -10
- package/src/sdk/client.ts +373 -102
- package/src/sdk/config-change.ts +148 -0
- package/src/sdk/config.ts +2 -1
- package/src/sdk/conversations.ts +199 -0
- package/src/sdk/credentials.ts +53 -0
- package/src/sdk/distribution.ts +132 -0
- package/src/sdk/eval.ts +140 -0
- package/src/sdk/functions.ts +52 -6
- package/src/sdk/index.ts +2 -0
- package/src/sdk/jarvis-chat.ts +112 -0
- package/src/sdk/kb.ts +116 -29
- package/src/sdk/orgs.ts +62 -0
- package/src/sdk/platform.ts +115 -0
- package/src/sdk/session.ts +90 -0
- package/src/sdk/skills.ts +188 -0
- package/src/sdk/test-chat.ts +151 -0
- package/src/sdk/tickets.ts +120 -0
- package/src/sdk/types.ts +88 -6
- package/src/sdk/voice.ts +262 -0
- package/test/cli/entry.test.ts +34 -0
- package/test/cli/init.test.ts +66 -0
- package/test/cli/link.test.ts +57 -0
- package/test/core/org-resolver.test.ts +92 -0
- package/test/core/runtime.test.ts +30 -0
- package/test/core/scope.test.ts +93 -0
- package/test/harness.test.ts +24 -0
- package/test/helpers/config-home.ts +22 -0
- package/test/helpers/fake-middleware.ts +56 -0
- package/test/helpers/fetch-recorder.ts +75 -0
- package/test/helpers/jwt.ts +9 -0
- package/test/helpers/mcp-pair.ts +38 -0
- package/test/mcp/__snapshots__/tools-snapshot.test.ts.snap +145 -0
- package/test/mcp/askers.test.ts +60 -0
- package/test/mcp/elicit-timeout.test.ts +29 -0
- package/test/mcp/registry.test.ts +169 -0
- package/test/mcp/shaping.test.ts +41 -0
- package/test/mcp/tools-snapshot.test.ts +42 -0
- package/test/sdk/agents.test.ts +232 -0
- package/test/sdk/analytics.test.ts +89 -0
- package/test/sdk/auth.test.ts +70 -0
- package/test/sdk/billing.test.ts +47 -0
- package/test/sdk/campaigns.test.ts +43 -0
- package/test/sdk/client.test.ts +80 -0
- package/test/sdk/config-change.test.ts +142 -0
- package/test/sdk/conversations.test.ts +80 -0
- package/test/sdk/credentials.test.ts +33 -0
- package/test/sdk/distribution.test.ts +55 -0
- package/test/sdk/eval.test.ts +155 -0
- package/test/sdk/kb-upload.test.ts +50 -0
- package/test/sdk/kb.test.ts +95 -0
- package/test/sdk/orgs.test.ts +48 -0
- package/test/sdk/platform.test.ts +89 -0
- package/test/sdk/renewal.test.ts +115 -0
- package/test/sdk/session.test.ts +60 -0
- package/test/sdk/skills.test.ts +235 -0
- package/test/sdk/test-chat.test.ts +112 -0
- package/test/sdk/tickets.test.ts +42 -0
- package/test/sdk/voice.test.ts +147 -0
- 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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"}
|
package/dist/sdk/auth.d.ts
CHANGED
|
@@ -1,18 +1,40 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
|
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
|
-
}
|
|
37
|
+
}
|
|
38
|
+
/** Who and where, without any secret. */
|
|
39
|
+
export declare function whoami(): WhoAmI | null;
|
|
18
40
|
//# sourceMappingURL=auth.d.ts.map
|
package/dist/sdk/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/sdk/auth.ts"],"names":[],"mappings":"
|
|
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
|
-
import { initializeApp, getApp } from 'firebase/app';
|
|
2
|
-
import { getAuth, signInWithEmailAndPassword } from 'firebase/auth';
|
|
3
|
-
import { IndemnClient } from './client.js';
|
|
1
|
+
import { initializeApp, getApp } from '@firebase/app';
|
|
2
|
+
import { getAuth, signInWithEmailAndPassword } from '@firebase/auth';
|
|
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
|
-
|
|
25
|
-
|
|
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(
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
|
|
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
|
|
106
|
-
|
|
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
|
-
|
|
110
|
-
|
|
111
|
-
userId: config
|
|
112
|
-
|
|
113
|
-
|
|
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
|
package/dist/sdk/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/sdk/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,
|
|
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"}
|