@revfleet/hscli 0.8.12 → 0.9.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 (153) hide show
  1. package/CHANGELOG.md +166 -1
  2. package/README.md +220 -10
  3. package/dist/cli.js +27 -3
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/agent/contracts.d.ts +3 -0
  6. package/dist/commands/agent/contracts.js +139 -0
  7. package/dist/commands/agent/contracts.js.map +1 -0
  8. package/dist/commands/agent/index.d.ts +3 -0
  9. package/dist/commands/agent/index.js +188 -0
  10. package/dist/commands/agent/index.js.map +1 -0
  11. package/dist/commands/agent/recipes.d.ts +13 -0
  12. package/dist/commands/agent/recipes.js +108 -0
  13. package/dist/commands/agent/recipes.js.map +1 -0
  14. package/dist/commands/agent/runner.d.ts +16 -0
  15. package/dist/commands/agent/runner.js +165 -0
  16. package/dist/commands/agent/runner.js.map +1 -0
  17. package/dist/commands/auth/index.js +64 -7
  18. package/dist/commands/auth/index.js.map +1 -1
  19. package/dist/commands/automation/index.js +30 -0
  20. package/dist/commands/automation/index.js.map +1 -1
  21. package/dist/commands/backup/index.d.ts +12 -0
  22. package/dist/commands/backup/index.js +459 -0
  23. package/dist/commands/backup/index.js.map +1 -0
  24. package/dist/commands/cms/content-ops.js +1 -1
  25. package/dist/commands/cms/content-ops.js.map +1 -1
  26. package/dist/commands/communication-preferences/index.js +207 -7
  27. package/dist/commands/communication-preferences/index.js.map +1 -1
  28. package/dist/commands/content-permissions/index.d.ts +22 -0
  29. package/dist/commands/content-permissions/index.js +141 -0
  30. package/dist/commands/content-permissions/index.js.map +1 -0
  31. package/dist/commands/context/index.d.ts +3 -0
  32. package/dist/commands/context/index.js +182 -0
  33. package/dist/commands/context/index.js.map +1 -0
  34. package/dist/commands/crm/associations.js +38 -0
  35. package/dist/commands/crm/associations.js.map +1 -1
  36. package/dist/commands/crm/custom-objects.js +39 -2
  37. package/dist/commands/crm/custom-objects.js.map +1 -1
  38. package/dist/commands/crm/dated.js +3 -3
  39. package/dist/commands/crm/dated.js.map +1 -1
  40. package/dist/commands/crm/migration.js +210 -2
  41. package/dist/commands/crm/migration.js.map +1 -1
  42. package/dist/commands/crm/properties.js +2 -1
  43. package/dist/commands/crm/properties.js.map +1 -1
  44. package/dist/commands/crm/property-batch.d.ts +1 -0
  45. package/dist/commands/crm/property-batch.js +44 -5
  46. package/dist/commands/crm/property-batch.js.map +1 -1
  47. package/dist/commands/crm/shared.js +21 -2
  48. package/dist/commands/crm/shared.js.map +1 -1
  49. package/dist/commands/crm/sync.js +1 -1
  50. package/dist/commands/crm/sync.js.map +1 -1
  51. package/dist/commands/doctor/index.js +193 -0
  52. package/dist/commands/doctor/index.js.map +1 -1
  53. package/dist/commands/email-tracking/index.d.ts +16 -0
  54. package/dist/commands/email-tracking/index.js +314 -0
  55. package/dist/commands/email-tracking/index.js.map +1 -0
  56. package/dist/commands/extensions/index.js +1 -1
  57. package/dist/commands/extensions/index.js.map +1 -1
  58. package/dist/commands/forms/index.js +15 -2
  59. package/dist/commands/forms/index.js.map +1 -1
  60. package/dist/commands/forms/legacy-v2.d.ts +7 -2
  61. package/dist/commands/forms/legacy-v2.js +103 -7
  62. package/dist/commands/forms/legacy-v2.js.map +1 -1
  63. package/dist/commands/guide/index.d.ts +1 -1
  64. package/dist/commands/guide/index.js +37 -4
  65. package/dist/commands/guide/index.js.map +1 -1
  66. package/dist/commands/internal/catalog.d.ts +1 -0
  67. package/dist/commands/internal/catalog.js +2 -0
  68. package/dist/commands/internal/catalog.js.map +1 -0
  69. package/dist/commands/internal/index.d.ts +26 -0
  70. package/dist/commands/internal/index.js +823 -0
  71. package/dist/commands/internal/index.js.map +1 -0
  72. package/dist/commands/internal-session.d.ts +15 -0
  73. package/dist/commands/internal-session.js +152 -0
  74. package/dist/commands/internal-session.js.map +1 -0
  75. package/dist/commands/lists/index.js +1 -1
  76. package/dist/commands/lists/index.js.map +1 -1
  77. package/dist/commands/marketing/email-audit.d.ts +32 -0
  78. package/dist/commands/marketing/email-audit.js +121 -0
  79. package/dist/commands/marketing/email-audit.js.map +1 -0
  80. package/dist/commands/marketing/index.js +2 -0
  81. package/dist/commands/marketing/index.js.map +1 -1
  82. package/dist/commands/mcp.js +5 -3
  83. package/dist/commands/mcp.js.map +1 -1
  84. package/dist/commands/playbooks/index.d.ts +3 -0
  85. package/dist/commands/playbooks/index.js +228 -0
  86. package/dist/commands/playbooks/index.js.map +1 -0
  87. package/dist/commands/portals/index.d.ts +3 -0
  88. package/dist/commands/portals/index.js +132 -0
  89. package/dist/commands/portals/index.js.map +1 -0
  90. package/dist/commands/reports/index.d.ts +3 -0
  91. package/dist/commands/reports/index.js +479 -0
  92. package/dist/commands/reports/index.js.map +1 -0
  93. package/dist/commands/sales-content/index.d.ts +13 -0
  94. package/dist/commands/sales-content/index.js +59 -0
  95. package/dist/commands/sales-content/index.js.map +1 -0
  96. package/dist/commands/sales-templates/index.d.ts +3 -0
  97. package/dist/commands/sales-templates/index.js +88 -0
  98. package/dist/commands/sales-templates/index.js.map +1 -0
  99. package/dist/commands/seed/cms.js +28 -45
  100. package/dist/commands/seed/cms.js.map +1 -1
  101. package/dist/commands/sequences/index.d.ts +18 -0
  102. package/dist/commands/sequences/index.js +263 -0
  103. package/dist/commands/sequences/index.js.map +1 -0
  104. package/dist/commands/settings/index.js +450 -102
  105. package/dist/commands/settings/index.js.map +1 -1
  106. package/dist/commands/settings/site-settings.d.ts +3 -0
  107. package/dist/commands/settings/site-settings.js +106 -0
  108. package/dist/commands/settings/site-settings.js.map +1 -0
  109. package/dist/commands/ui/index.js +14 -4
  110. package/dist/commands/ui/index.js.map +1 -1
  111. package/dist/commands/workflows/index.js +2 -0
  112. package/dist/commands/workflows/index.js.map +1 -1
  113. package/dist/commands/workflows/preflight.d.ts +23 -0
  114. package/dist/commands/workflows/preflight.js +295 -0
  115. package/dist/commands/workflows/preflight.js.map +1 -0
  116. package/dist/core/action-contract.d.ts +43 -0
  117. package/dist/core/action-contract.js +207 -0
  118. package/dist/core/action-contract.js.map +1 -0
  119. package/dist/core/auth.d.ts +6 -0
  120. package/dist/core/auth.js +85 -0
  121. package/dist/core/auth.js.map +1 -1
  122. package/dist/core/http.d.ts +8 -0
  123. package/dist/core/http.js +37 -5
  124. package/dist/core/http.js.map +1 -1
  125. package/dist/core/id-maps.d.ts +27 -0
  126. package/dist/core/id-maps.js +204 -0
  127. package/dist/core/id-maps.js.map +1 -0
  128. package/dist/core/output.d.ts +2 -1
  129. package/dist/core/output.js +34 -0
  130. package/dist/core/output.js.map +1 -1
  131. package/dist/mcp/profiles.d.ts +14 -0
  132. package/dist/mcp/profiles.js +68 -0
  133. package/dist/mcp/profiles.js.map +1 -0
  134. package/dist/mcp/server.d.ts +5 -3
  135. package/dist/mcp/server.js +22 -5
  136. package/dist/mcp/server.js.map +1 -1
  137. package/docs/CAPABILITY_LIBRARY.md +29 -8
  138. package/docs/COMMAND_TREE.md +96 -17
  139. package/docs/COMPARISON.md +8 -5
  140. package/docs/COOKBOOK.md +124 -5
  141. package/docs/INTERNAL-ENDPOINTS-DISCOVERY.md +813 -0
  142. package/docs/INTERNAL-ENDPOINTS.md +371 -0
  143. package/docs/INTERNAL_ENDPOINTS.md +243 -0
  144. package/docs/MARKETING_SETUP.md +21 -1
  145. package/docs/MCP.md +28 -89
  146. package/docs/MCP_TOOL_CATALOG.md +192 -0
  147. package/docs/MIGRATION_ADAPTERS.md +115 -0
  148. package/docs/PORTAL_BACKUP.md +212 -0
  149. package/docs/PUBLISHING.md +1 -1
  150. package/docs/SALES_CONTENT_INTERNAL_PUNCH_LIST.md +504 -0
  151. package/docs/TUTORIALS/secure-agent-writes.md +49 -0
  152. package/docs/WHY_HOW_WHAT.md +10 -4
  153. package/package.json +4 -2
@@ -0,0 +1,295 @@
1
+ import { findPipelineStageTarget, isStandardObjectTypeId, loadMigrationIdMaps, stringifyId, } from "../../core/id-maps.js";
2
+ import { CliError, printResult } from "../../core/output.js";
3
+ import { parseJsonPayload } from "../crm/shared.js";
4
+ const EMPTY_MAPS = {
5
+ subscriptionTypes: {},
6
+ businessUnits: {},
7
+ emails: {},
8
+ lists: {},
9
+ campaigns: {},
10
+ workflows: {},
11
+ users: {},
12
+ owners: {},
13
+ sequences: {},
14
+ customObjects: {},
15
+ associations: {},
16
+ pipelines: {},
17
+ };
18
+ const UNKNOWN_ID_KEY = /(?:^|[_-])(?:id|ids)$|(?:Id|Ids)$/;
19
+ const SAFE_ID_KEYS = new Set([
20
+ "id",
21
+ "guid",
22
+ "actionId",
23
+ "actionTypeId",
24
+ "portalId",
25
+ "revisionId",
26
+ "createdAt",
27
+ "updatedAt",
28
+ ]);
29
+ export function registerWorkflowPreflight(workflows, getCtx) {
30
+ workflows
31
+ .command("preflight")
32
+ .description("Check a workflow export for source-portal IDs before replay")
33
+ .requiredOption("--data <payload>", "Workflow JSON payload, array, or { results|workflows }")
34
+ .option("--id-map-dir <dir>", "Directory containing migration id-map JSON files")
35
+ .option("--strict", "Exit non-zero when broken references are found")
36
+ .action(async (opts) => {
37
+ const ctx = getCtx();
38
+ const result = preflightWorkflowsPayload(parseJsonPayload(opts.data), opts.idMapDir);
39
+ if (opts.strict && !result.ok) {
40
+ throw new CliError("WORKFLOW_PREFLIGHT_BROKEN_REFS", `Workflow preflight found ${result.brokenRefCount} unresolved source references`, undefined, result);
41
+ }
42
+ printResult(ctx, result);
43
+ });
44
+ }
45
+ export function preflightWorkflowsPayload(input, idMapDir) {
46
+ const maps = idMapDir ? loadMigrationIdMaps(idMapDir) : EMPTY_MAPS;
47
+ const workflows = normalizeWorkflows(input);
48
+ const checked = workflows.map((workflow, index) => inspectWorkflow(workflow, maps, index));
49
+ const brokenRefCount = checked.reduce((sum, workflow) => sum + workflow.brokenRefs.length, 0);
50
+ const warningCount = checked.reduce((sum, workflow) => sum + workflow.warnings.length, 0);
51
+ return {
52
+ ok: brokenRefCount === 0,
53
+ total: checked.length,
54
+ brokenRefCount,
55
+ warningCount,
56
+ workflows: checked,
57
+ };
58
+ }
59
+ function inspectWorkflow(workflow, maps, index) {
60
+ const brokenRefs = [];
61
+ const warnings = [];
62
+ const seenPaths = new Set();
63
+ const actions = records(workflow.actions);
64
+ actions.forEach((action, actionIndex) => {
65
+ const basePath = `workflows[${index}].actions[${actionIndex}]`;
66
+ inspectKnownRefs(action, basePath, maps, brokenRefs, seenPaths);
67
+ inspectPropertyValueRefs(action, basePath, maps, brokenRefs, seenPaths);
68
+ inspectUnknownIdFields(action, basePath, brokenRefs, seenPaths);
69
+ });
70
+ const enrollmentCriteria = record(workflow.enrollmentCriteria);
71
+ if (enrollmentCriteria) {
72
+ inspectKnownRefs(enrollmentCriteria, `workflows[${index}].enrollmentCriteria`, maps, brokenRefs, seenPaths);
73
+ inspectPropertyValueRefs(enrollmentCriteria, `workflows[${index}].enrollmentCriteria`, maps, brokenRefs, seenPaths);
74
+ }
75
+ const suppressionListIds = Array.isArray(workflow.suppressionListIds) ? workflow.suppressionListIds : [];
76
+ suppressionListIds.forEach((source, listIndex) => {
77
+ checkMapped(maps.lists, source, "suppressionList", `workflows[${index}].suppressionListIds[${listIndex}]`, brokenRefs, seenPaths);
78
+ });
79
+ return {
80
+ id: stringifyId(workflow.id),
81
+ name: typeof workflow.name === "string" ? workflow.name : undefined,
82
+ brokenRefs,
83
+ warnings,
84
+ };
85
+ }
86
+ function inspectKnownRefs(value, path, maps, brokenRefs, seenPaths) {
87
+ if (Array.isArray(value)) {
88
+ value.forEach((item, index) => inspectKnownRefs(item, `${path}[${index}]`, maps, brokenRefs, seenPaths));
89
+ return;
90
+ }
91
+ const node = record(value);
92
+ if (!node)
93
+ return;
94
+ for (const [key, raw] of Object.entries(node)) {
95
+ const keyPath = `${path}.${key}`;
96
+ if (raw === undefined || raw === null)
97
+ continue;
98
+ if (["content_id", "email_content_id", "emailContentId", "emailId"].includes(key)) {
99
+ checkMapped(maps.emails, raw, "marketingEmail", keyPath, brokenRefs, seenPaths);
100
+ }
101
+ else if (["subscriptionId", "subscriptionTypeId", "subscription_type_id"].includes(key)) {
102
+ checkMapped(maps.subscriptionTypes, raw, "subscriptionType", keyPath, brokenRefs, seenPaths);
103
+ }
104
+ else if (["listId", "list_id", "staticListId"].includes(key)) {
105
+ checkMapped(maps.lists, raw, "list", keyPath, brokenRefs, seenPaths);
106
+ }
107
+ else if (["campaignId", "campaign_id"].includes(key)) {
108
+ checkMapped(maps.campaigns, raw, "campaign", keyPath, brokenRefs, seenPaths);
109
+ }
110
+ else if (["flow_id", "workflowId", "workflow_id"].includes(key)) {
111
+ checkMapped(maps.workflows, raw, "workflow", keyPath, brokenRefs, seenPaths);
112
+ }
113
+ else if (["userId", "user_id"].includes(key)) {
114
+ checkAnyMapped([maps.users, maps.owners], raw, "user", keyPath, brokenRefs, seenPaths);
115
+ }
116
+ else if (["sequenceId", "sequence_id"].includes(key)) {
117
+ checkMapped(maps.sequences, raw, "sequence", keyPath, brokenRefs, seenPaths);
118
+ }
119
+ else if (["object_type_id", "objectTypeId", "fromObjectType", "toObjectType"].includes(key)) {
120
+ checkCustomObjectMapped(maps.customObjects, raw, keyPath, brokenRefs, seenPaths);
121
+ }
122
+ else if (["labelToApply", "associationTypeId", "association_label_id"].includes(key)) {
123
+ checkMapped(maps.associations, raw, "associationLabel", keyPath, brokenRefs, seenPaths);
124
+ }
125
+ else if (["pipelineId", "pipeline_id"].includes(key)) {
126
+ checkPipelineMapped(maps, raw, keyPath, brokenRefs, seenPaths);
127
+ }
128
+ else if (["stageId", "stage_id"].includes(key)) {
129
+ checkStageMapped(maps, raw, keyPath, brokenRefs, seenPaths);
130
+ }
131
+ inspectKnownRefs(raw, keyPath, maps, brokenRefs, seenPaths);
132
+ }
133
+ }
134
+ function inspectPropertyValueRefs(value, path, maps, brokenRefs, seenPaths) {
135
+ if (Array.isArray(value)) {
136
+ value.forEach((item, index) => inspectPropertyValueRefs(item, `${path}[${index}]`, maps, brokenRefs, seenPaths));
137
+ return;
138
+ }
139
+ const node = record(value);
140
+ if (!node)
141
+ return;
142
+ const propertyName = stringField(node, "propertyName")
143
+ ?? stringField(node, "targetProperty")
144
+ ?? stringField(node, "property")
145
+ ?? stringField(node, "name");
146
+ const rawValue = node.staticValue ?? node.value ?? node.values;
147
+ if (propertyName && rawValue !== undefined) {
148
+ const normalized = propertyName.toLowerCase();
149
+ if (normalized === "pipeline" || normalized === "hs_pipeline") {
150
+ checkPipelineMapped(maps, rawValue, `${path}.value`, brokenRefs, seenPaths);
151
+ }
152
+ if (normalized === "dealstage" || normalized === "hs_pipeline_stage" || normalized === "ticketstage") {
153
+ checkStageMapped(maps, rawValue, `${path}.value`, brokenRefs, seenPaths);
154
+ }
155
+ }
156
+ for (const [key, raw] of Object.entries(node)) {
157
+ inspectPropertyValueRefs(raw, `${path}.${key}`, maps, brokenRefs, seenPaths);
158
+ }
159
+ }
160
+ function inspectUnknownIdFields(value, path, brokenRefs, seenPaths) {
161
+ if (Array.isArray(value)) {
162
+ value.forEach((item, index) => inspectUnknownIdFields(item, `${path}[${index}]`, brokenRefs, seenPaths));
163
+ return;
164
+ }
165
+ const node = record(value);
166
+ if (!node)
167
+ return;
168
+ for (const [key, raw] of Object.entries(node)) {
169
+ const keyPath = `${path}.${key}`;
170
+ if (!seenPaths.has(keyPath) && UNKNOWN_ID_KEY.test(key) && !SAFE_ID_KEYS.has(key) && hasIdLikeValue(raw)) {
171
+ seenPaths.add(keyPath);
172
+ brokenRefs.push({
173
+ path: keyPath,
174
+ kind: "unknown-id-field",
175
+ source: raw,
176
+ message: `Potential source ID field '${key}' has no explicit workflow remapper`,
177
+ });
178
+ }
179
+ inspectUnknownIdFields(raw, keyPath, brokenRefs, seenPaths);
180
+ }
181
+ }
182
+ function checkMapped(map, source, kind, path, brokenRefs, seenPaths) {
183
+ const values = idValues(source);
184
+ if (values.length === 0)
185
+ return;
186
+ seenPaths.add(path);
187
+ values.forEach((value, index) => {
188
+ if (map[value] !== undefined)
189
+ return;
190
+ brokenRefs.push({
191
+ path: values.length > 1 ? `${path}[${index}]` : path,
192
+ kind,
193
+ source: value,
194
+ message: `No target ${kind} mapping found for source ID ${value}`,
195
+ });
196
+ });
197
+ }
198
+ function checkAnyMapped(maps, source, kind, path, brokenRefs, seenPaths) {
199
+ const values = idValues(source);
200
+ if (values.length === 0)
201
+ return;
202
+ seenPaths.add(path);
203
+ values.forEach((value, index) => {
204
+ if (maps.some((map) => map[value] !== undefined))
205
+ return;
206
+ brokenRefs.push({
207
+ path: values.length > 1 ? `${path}[${index}]` : path,
208
+ kind,
209
+ source: value,
210
+ message: `No target ${kind} mapping found for source ID ${value}`,
211
+ });
212
+ });
213
+ }
214
+ function checkCustomObjectMapped(map, source, path, brokenRefs, seenPaths) {
215
+ const value = stringifyId(source);
216
+ if (!value || isStandardObjectTypeId(value))
217
+ return;
218
+ checkMapped(map, value, "customObject", path, brokenRefs, seenPaths);
219
+ }
220
+ function checkPipelineMapped(maps, source, path, brokenRefs, seenPaths) {
221
+ const values = idValues(source);
222
+ if (values.length === 0)
223
+ return;
224
+ seenPaths.add(path);
225
+ values.forEach((value, index) => {
226
+ const found = Object.keys(maps.pipelines).includes(value);
227
+ if (found)
228
+ return;
229
+ brokenRefs.push({
230
+ path: values.length > 1 ? `${path}[${index}]` : path,
231
+ kind: "pipeline",
232
+ source: value,
233
+ message: `No target pipeline mapping found for source ID ${value}`,
234
+ });
235
+ });
236
+ }
237
+ function checkStageMapped(maps, source, path, brokenRefs, seenPaths) {
238
+ const values = idValues(source);
239
+ if (values.length === 0)
240
+ return;
241
+ seenPaths.add(path);
242
+ values.forEach((value, index) => {
243
+ if (findPipelineStageTarget(maps.pipelines, value) !== undefined)
244
+ return;
245
+ brokenRefs.push({
246
+ path: values.length > 1 ? `${path}[${index}]` : path,
247
+ kind: "pipelineStage",
248
+ source: value,
249
+ message: `No target pipeline-stage mapping found for source ID ${value}`,
250
+ });
251
+ });
252
+ }
253
+ function normalizeWorkflows(input) {
254
+ if (Array.isArray(input))
255
+ return input.filter(record);
256
+ const root = record(input);
257
+ if (!root)
258
+ return [];
259
+ for (const key of ["results", "workflows", "flows"]) {
260
+ const candidate = root[key];
261
+ if (Array.isArray(candidate))
262
+ return candidate.filter(record);
263
+ }
264
+ return [root];
265
+ }
266
+ function idValues(raw) {
267
+ if (Array.isArray(raw))
268
+ return raw.map(stringifyId).filter((value) => value !== undefined);
269
+ const value = stringifyId(raw);
270
+ return value ? [value] : [];
271
+ }
272
+ function hasIdLikeValue(raw) {
273
+ if (Array.isArray(raw))
274
+ return raw.some(hasIdLikeValue);
275
+ return stringifyId(raw) !== undefined;
276
+ }
277
+ function records(raw) {
278
+ if (!Array.isArray(raw))
279
+ return [];
280
+ return raw.filter(record);
281
+ }
282
+ function record(raw) {
283
+ if (raw && typeof raw === "object" && !Array.isArray(raw)) {
284
+ return raw;
285
+ }
286
+ return undefined;
287
+ }
288
+ function stringField(record, key) {
289
+ const value = record[key];
290
+ if (typeof value !== "string")
291
+ return undefined;
292
+ const trimmed = value.trim();
293
+ return trimmed ? trimmed : undefined;
294
+ }
295
+ //# sourceMappingURL=preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../../src/commands/workflows/preflight.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ export declare const ACTION_CONTRACT_SCHEMA: "hscli.action-contract/v1";
2
+ export interface ActionContractCommand {
3
+ argv: string[];
4
+ verifyArgv?: string[];
5
+ description?: string;
6
+ }
7
+ export interface ActionContractOperation {
8
+ summary: string;
9
+ commands: ActionContractCommand[];
10
+ }
11
+ export interface ActionContractLimits {
12
+ maxCommands?: number;
13
+ maxRecords?: number;
14
+ }
15
+ export interface ActionContractDraft {
16
+ profile: string;
17
+ portalId: string;
18
+ createdAt?: string;
19
+ expiresAt: string;
20
+ changeTicket?: string;
21
+ operation: ActionContractOperation;
22
+ limits?: ActionContractLimits;
23
+ }
24
+ export interface ActionContract extends ActionContractDraft {
25
+ schema: typeof ACTION_CONTRACT_SCHEMA;
26
+ id: string;
27
+ createdAt: string;
28
+ digest: string;
29
+ }
30
+ export interface ActionContractVerificationContext {
31
+ profile: string;
32
+ portalId?: string;
33
+ changeTicket?: string;
34
+ now?: Date;
35
+ }
36
+ export declare function readActionContractFile(path: string): unknown;
37
+ export declare function sealActionContract(input: unknown, now?: Date): ActionContract;
38
+ export declare function verifyActionContract(input: unknown, context: ActionContractVerificationContext): {
39
+ contract: ActionContract;
40
+ digest: string;
41
+ valid: true;
42
+ portalCheck: "matched" | "unavailable";
43
+ };
@@ -0,0 +1,207 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFileSync } from "node:fs";
3
+ import { CliError, redactSensitive } from "./output.js";
4
+ export const ACTION_CONTRACT_SCHEMA = "hscli.action-contract/v1";
5
+ const FORBIDDEN_ROOT_COMMANDS = new Set(["agent", "auth", "help", "home", "internal", "mcp", "ui"]);
6
+ const FORBIDDEN_GLOBAL_ARGS = new Set([
7
+ "--api-base-url",
8
+ "--change-ticket",
9
+ "--dry-run",
10
+ "--force",
11
+ "--hublet",
12
+ "--policy-file",
13
+ "--profile",
14
+ "--telemetry-file",
15
+ ]);
16
+ export function readActionContractFile(path) {
17
+ try {
18
+ return JSON.parse(readFileSync(path, "utf8"));
19
+ }
20
+ catch (error) {
21
+ throw new CliError("ACTION_CONTRACT_FILE_INVALID", `Unable to read action contract '${path}': ${error instanceof Error ? error.message : String(error)}`);
22
+ }
23
+ }
24
+ export function sealActionContract(input, now = new Date()) {
25
+ const draft = parseDraft(input, now);
26
+ const unsigned = {
27
+ schema: ACTION_CONTRACT_SCHEMA,
28
+ ...draft,
29
+ };
30
+ rejectSensitiveData(unsigned);
31
+ const digest = digestValue(unsigned);
32
+ return {
33
+ ...unsigned,
34
+ id: `act_${digest.slice(0, 20)}`,
35
+ digest,
36
+ };
37
+ }
38
+ export function verifyActionContract(input, context) {
39
+ const contract = parseContract(input);
40
+ rejectSensitiveData(contract);
41
+ const { digest, id, ...unsigned } = contract;
42
+ const expectedDigest = digestValue(unsigned);
43
+ if (digest !== expectedDigest || id !== `act_${expectedDigest.slice(0, 20)}`) {
44
+ throw new CliError("ACTION_CONTRACT_DIGEST_MISMATCH", "Action contract digest or ID does not match its payload.");
45
+ }
46
+ if (contract.profile !== context.profile) {
47
+ throw new CliError("ACTION_CONTRACT_PROFILE_MISMATCH", `Contract profile '${contract.profile}' does not match active profile '${context.profile}'.`);
48
+ }
49
+ if (context.portalId && contract.portalId !== context.portalId) {
50
+ throw new CliError("ACTION_CONTRACT_PORTAL_MISMATCH", `Contract portal '${contract.portalId}' does not match active portal '${context.portalId}'.`);
51
+ }
52
+ if (context.changeTicket && contract.changeTicket !== context.changeTicket) {
53
+ throw new CliError("ACTION_CONTRACT_CHANGE_TICKET_MISMATCH", `Contract change ticket '${contract.changeTicket ?? "none"}' does not match active ticket '${context.changeTicket}'.`);
54
+ }
55
+ const now = context.now ?? new Date();
56
+ if (Date.parse(contract.expiresAt) <= now.getTime()) {
57
+ throw new CliError("ACTION_CONTRACT_EXPIRED", `Action contract expired at ${contract.expiresAt}.`);
58
+ }
59
+ return {
60
+ contract,
61
+ digest,
62
+ valid: true,
63
+ portalCheck: context.portalId ? "matched" : "unavailable",
64
+ };
65
+ }
66
+ function parseDraft(input, now) {
67
+ const value = requireRecord(input, "Action contract draft must be a JSON object.");
68
+ const profile = requireString(value.profile, "profile");
69
+ const portalId = requireString(value.portalId, "portalId");
70
+ const createdAt = normalizeTimestamp(value.createdAt ?? now.toISOString(), "createdAt");
71
+ const expiresAt = normalizeTimestamp(value.expiresAt, "expiresAt");
72
+ if (Date.parse(expiresAt) <= Date.parse(createdAt)) {
73
+ throw new CliError("ACTION_CONTRACT_TIME_INVALID", "expiresAt must be later than createdAt.");
74
+ }
75
+ const operation = parseOperation(value.operation);
76
+ const limits = parseLimits(value.limits);
77
+ const maxCommands = limits?.maxCommands ?? 25;
78
+ if (operation.commands.length > maxCommands) {
79
+ throw new CliError("ACTION_CONTRACT_COMMAND_LIMIT", `Contract contains ${operation.commands.length} commands; limit is ${maxCommands}.`);
80
+ }
81
+ return {
82
+ profile,
83
+ portalId,
84
+ createdAt,
85
+ expiresAt,
86
+ operation,
87
+ ...(value.changeTicket === undefined ? {} : { changeTicket: requireString(value.changeTicket, "changeTicket") }),
88
+ ...(limits ? { limits } : {}),
89
+ };
90
+ }
91
+ function parseContract(input) {
92
+ const value = requireRecord(input, "Action contract must be a JSON object.");
93
+ if (value.schema !== ACTION_CONTRACT_SCHEMA) {
94
+ throw new CliError("ACTION_CONTRACT_SCHEMA_UNSUPPORTED", `Expected schema '${ACTION_CONTRACT_SCHEMA}'.`);
95
+ }
96
+ const draft = parseDraft(value, new Date());
97
+ return {
98
+ schema: ACTION_CONTRACT_SCHEMA,
99
+ id: requireString(value.id, "id"),
100
+ digest: requireString(value.digest, "digest"),
101
+ ...draft,
102
+ };
103
+ }
104
+ function parseOperation(input) {
105
+ const value = requireRecord(input, "operation must be an object.");
106
+ const summary = requireString(value.summary, "operation.summary");
107
+ if (!Array.isArray(value.commands) || value.commands.length === 0) {
108
+ throw new CliError("ACTION_CONTRACT_OPERATION_INVALID", "operation.commands must contain at least one command.");
109
+ }
110
+ return {
111
+ summary,
112
+ commands: value.commands.map((command, index) => parseCommand(command, index)),
113
+ };
114
+ }
115
+ function parseCommand(input, index) {
116
+ const value = requireRecord(input, `operation.commands[${index}] must be an object.`);
117
+ const argv = parseArgv(value.argv, `operation.commands[${index}].argv`);
118
+ validateContractArgv(argv);
119
+ const verifyArgv = value.verifyArgv === undefined
120
+ ? undefined
121
+ : parseArgv(value.verifyArgv, `operation.commands[${index}].verifyArgv`);
122
+ if (verifyArgv)
123
+ validateContractArgv(verifyArgv);
124
+ return {
125
+ argv,
126
+ ...(verifyArgv ? { verifyArgv } : {}),
127
+ ...(value.description === undefined ? {} : { description: requireString(value.description, `operation.commands[${index}].description`) }),
128
+ };
129
+ }
130
+ function validateContractArgv(argv) {
131
+ const root = argv[0];
132
+ if (FORBIDDEN_ROOT_COMMANDS.has(root)) {
133
+ throw new CliError("ACTION_CONTRACT_COMMAND_FORBIDDEN", `Root command '${root}' is not allowed in action contracts.`);
134
+ }
135
+ for (const arg of argv) {
136
+ if (FORBIDDEN_GLOBAL_ARGS.has(arg)) {
137
+ throw new CliError("ACTION_CONTRACT_GLOBAL_ARG_FORBIDDEN", `Global argument '${arg}' must be supplied by the contract runner.`);
138
+ }
139
+ }
140
+ }
141
+ function parseArgv(input, field) {
142
+ if (!Array.isArray(input) || input.length === 0 || input.some((arg) => typeof arg !== "string" || !arg.trim())) {
143
+ throw new CliError("ACTION_CONTRACT_ARGV_INVALID", `${field} must be a non-empty array of non-empty strings.`);
144
+ }
145
+ const argv = input.map((arg) => String(arg));
146
+ if (argv.some((arg) => /[\0\r\n]/.test(arg))) {
147
+ throw new CliError("ACTION_CONTRACT_ARGV_INVALID", `${field} cannot contain NUL or line-break characters.`);
148
+ }
149
+ return argv;
150
+ }
151
+ function parseLimits(input) {
152
+ if (input === undefined)
153
+ return undefined;
154
+ const value = requireRecord(input, "limits must be an object.");
155
+ const output = {};
156
+ for (const field of ["maxCommands", "maxRecords"]) {
157
+ if (value[field] === undefined)
158
+ continue;
159
+ const parsed = Number(value[field]);
160
+ if (!Number.isSafeInteger(parsed) || parsed <= 0) {
161
+ throw new CliError("ACTION_CONTRACT_LIMIT_INVALID", `limits.${field} must be a positive integer.`);
162
+ }
163
+ output[field] = parsed;
164
+ }
165
+ return output;
166
+ }
167
+ function requireRecord(input, message) {
168
+ if (!input || typeof input !== "object" || Array.isArray(input)) {
169
+ throw new CliError("ACTION_CONTRACT_INVALID", message);
170
+ }
171
+ return input;
172
+ }
173
+ function requireString(input, field) {
174
+ if (typeof input !== "string" || !input.trim()) {
175
+ throw new CliError("ACTION_CONTRACT_INVALID", `${field} must be a non-empty string.`);
176
+ }
177
+ return input.trim();
178
+ }
179
+ function normalizeTimestamp(input, field) {
180
+ const value = requireString(input, field);
181
+ const timestamp = Date.parse(value);
182
+ if (!Number.isFinite(timestamp)) {
183
+ throw new CliError("ACTION_CONTRACT_TIME_INVALID", `${field} must be an ISO-8601 timestamp.`);
184
+ }
185
+ return new Date(timestamp).toISOString();
186
+ }
187
+ function rejectSensitiveData(input) {
188
+ if (canonicalize(input) !== canonicalize(redactSensitive(input))) {
189
+ throw new CliError("ACTION_CONTRACT_SENSITIVE_DATA", "Action contracts cannot contain credentials or sensitive values.");
190
+ }
191
+ }
192
+ function digestValue(input) {
193
+ return createHash("sha256").update(canonicalize(input)).digest("hex");
194
+ }
195
+ function canonicalize(input) {
196
+ if (Array.isArray(input))
197
+ return `[${input.map((item) => canonicalize(item)).join(",")}]`;
198
+ if (input && typeof input === "object") {
199
+ const record = input;
200
+ return `{${Object.keys(record)
201
+ .sort()
202
+ .map((key) => `${JSON.stringify(key)}:${canonicalize(record[key])}`)
203
+ .join(",")}}`;
204
+ }
205
+ return JSON.stringify(input);
206
+ }
207
+ //# sourceMappingURL=action-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-contract.js","sourceRoot":"","sources":["../../src/core/action-contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,CAAC,MAAM,sBAAsB,GAAG,0BAAmC,CAAC;AA0C1E,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AACpG,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,gBAAgB;IAChB,iBAAiB;IACjB,WAAW;IACX,SAAS;IACT,UAAU;IACV,eAAe;IACf,WAAW;IACX,kBAAkB;CACnB,CAAC,CAAC;AAEH,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAY,CAAC;IAC3D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,QAAQ,CAChB,8BAA8B,EAC9B,mCAAmC,IAAI,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACtG,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE;IACjE,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG;QACf,MAAM,EAAE,sBAAsB;QAC9B,GAAG,KAAK;KACT,CAAC;IACF,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACrC,OAAO;QACL,GAAG,QAAQ;QACX,EAAE,EAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;QAChC,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,KAAc,EACd,OAA0C;IAE1C,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACtC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC9B,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,QAAQ,CAAC;IAC7C,MAAM,cAAc,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,MAAM,KAAK,cAAc,IAAI,EAAE,KAAK,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7E,MAAM,IAAI,QAAQ,CAAC,iCAAiC,EAAE,0DAA0D,CAAC,CAAC;IACpH,CAAC;IACD,IAAI,QAAQ,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC;QACzC,MAAM,IAAI,QAAQ,CAChB,kCAAkC,EAClC,qBAAqB,QAAQ,CAAC,OAAO,oCAAoC,OAAO,CAAC,OAAO,IAAI,CAC7F,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC/D,MAAM,IAAI,QAAQ,CAChB,iCAAiC,EACjC,oBAAoB,QAAQ,CAAC,QAAQ,mCAAmC,OAAO,CAAC,QAAQ,IAAI,CAC7F,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC;QAC3E,MAAM,IAAI,QAAQ,CAChB,wCAAwC,EACxC,2BAA2B,QAAQ,CAAC,YAAY,IAAI,MAAM,mCAAmC,OAAO,CAAC,YAAY,IAAI,CACtH,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IACtC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;QACpD,MAAM,IAAI,QAAQ,CAAC,yBAAyB,EAAE,8BAA8B,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC;IACrG,CAAC;IACD,OAAO;QACL,QAAQ;QACR,MAAM;QACN,KAAK,EAAE,IAAI;QACX,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa;KAC1D,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAAc,EAAE,GAAS;IAC3C,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,8CAA8C,CAAC,CAAC;IACnF,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,SAAS,IAAI,GAAG,CAAC,WAAW,EAAE,EAAE,WAAW,CAAC,CAAC;IACxF,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACnE,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,QAAQ,CAAC,8BAA8B,EAAE,yCAAyC,CAAC,CAAC;IAChG,CAAC;IACD,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,MAAM,EAAE,WAAW,IAAI,EAAE,CAAC;IAC9C,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;QAC5C,MAAM,IAAI,QAAQ,CAChB,+BAA+B,EAC/B,qBAAqB,SAAS,CAAC,QAAQ,CAAC,MAAM,uBAAuB,WAAW,GAAG,CACpF,CAAC;IACJ,CAAC;IACD,OAAO;QACL,OAAO;QACP,QAAQ;QACR,SAAS;QACT,SAAS;QACT,SAAS;QACT,GAAG,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC,KAAK,CAAC,YAAY,EAAE,cAAc,CAAC,EAAE,CAAC;QAChH,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9B,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,wCAAwC,CAAC,CAAC;IAC7E,IAAI,KAAK,CAAC,MAAM,KAAK,sBAAsB,EAAE,CAAC;QAC5C,MAAM,IAAI,QAAQ,CAAC,oCAAoC,EAAE,oBAAoB,sBAAsB,IAAI,CAAC,CAAC;IAC3G,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IAC5C,OAAO;QACL,MAAM,EAAE,sBAAsB;QAC9B,EAAE,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC;QACjC,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC;QAC7C,GAAG,KAAK;KACT,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,8BAA8B,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAClE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,QAAQ,CAAC,mCAAmC,EAAE,uDAAuD,CAAC,CAAC;IACnH,CAAC;IACD,OAAO;QACL,OAAO;QACP,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KAC/E,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAc,EAAE,KAAa;IACjD,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,sBAAsB,KAAK,sBAAsB,CAAC,CAAC;IACtF,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,sBAAsB,KAAK,QAAQ,CAAC,CAAC;IACxE,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC3B,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,KAAK,SAAS;QAC/C,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,sBAAsB,KAAK,cAAc,CAAC,CAAC;IAC3E,IAAI,UAAU;QAAE,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACjD,OAAO;QACL,IAAI;QACJ,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,aAAa,CAAC,KAAK,CAAC,WAAW,EAAE,sBAAsB,KAAK,eAAe,CAAC,EAAE,CAAC;KAC1I,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAc;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,IAAI,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,QAAQ,CAAC,mCAAmC,EAAE,iBAAiB,IAAI,uCAAuC,CAAC,CAAC;IACxH,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,QAAQ,CAAC,sCAAsC,EAAE,oBAAoB,GAAG,4CAA4C,CAAC,CAAC;QAClI,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,KAAc,EAAE,KAAa;IAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/G,MAAM,IAAI,QAAQ,CAAC,8BAA8B,EAAE,GAAG,KAAK,kDAAkD,CAAC,CAAC;IACjH,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,QAAQ,CAAC,8BAA8B,EAAE,GAAG,KAAK,+CAA+C,CAAC,CAAC;IAC9G,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,2BAA2B,CAAC,CAAC;IAChE,MAAM,MAAM,GAAyB,EAAE,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,CAAC,aAAa,EAAE,YAAY,CAAU,EAAE,CAAC;QAC3D,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS;YAAE,SAAS;QACzC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,QAAQ,CAAC,+BAA+B,EAAE,UAAU,KAAK,8BAA8B,CAAC,CAAC;QACrG,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;IACzB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,KAAc,EAAE,OAAe;IACpD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,QAAQ,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,KAAgC,CAAC;AAC1C,CAAC;AAED,SAAS,aAAa,CAAC,KAAc,EAAE,KAAa;IAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC/C,MAAM,IAAI,QAAQ,CAAC,yBAAyB,EAAE,GAAG,KAAK,8BAA8B,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc,EAAE,KAAa;IACvD,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,QAAQ,CAAC,8BAA8B,EAAE,GAAG,KAAK,iCAAiC,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,IAAI,YAAY,CAAC,KAAK,CAAC,KAAK,YAAY,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,QAAQ,CAAC,gCAAgC,EAAE,kEAAkE,CAAC,CAAC;IAC3H,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAC1F,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;aAC3B,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;aACnE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC"}
@@ -1,8 +1,12 @@
1
1
  export interface AuthProfile {
2
2
  token: string;
3
+ authMode?: "private-app" | "oauth";
3
4
  refreshToken?: string;
4
5
  expiresAt?: string;
5
6
  scopes?: string[];
7
+ userId?: string;
8
+ oauthClientId?: string;
9
+ oauthClientSecretEnv?: string;
6
10
  portalId?: string;
7
11
  uiDomain?: string;
8
12
  dataHostingLocation?: string;
@@ -33,6 +37,8 @@ export declare function getHscliHomeDir(): string;
33
37
  export declare function saveToken(profile: string, token: string): void;
34
38
  export declare function saveProfile(profile: string, data: AuthProfile): void;
35
39
  export declare function getToken(profile: string): string;
40
+ export declare function resolveAuthMode(profile: AuthProfile): "private-app" | "oauth";
41
+ export declare function getValidAccessToken(profileName: string): Promise<string>;
36
42
  export declare function removeToken(profile: string): boolean;
37
43
  export declare function hasProfile(profile: string): boolean;
38
44
  export declare function listProfiles(): string[];