@trydreamstate/cli 1.3.2 → 1.3.3

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 (75) hide show
  1. package/README.md +29 -16
  2. package/agent-plugin/.claude-plugin/plugin.json +1 -1
  3. package/agent-plugin/.codex-plugin/plugin.json +1 -1
  4. package/agent-plugin/hooks/approve-readonly.sh +15 -0
  5. package/agent-plugin/hooks/hooks.json +17 -0
  6. package/agent-plugin/skills/crm/SKILL.md +2 -2
  7. package/agent-plugin/skills/diagnostics/SKILL.md +1 -1
  8. package/agent-plugin/skills/dreamstate/SKILL.md +13 -5
  9. package/agent-plugin/skills/first-win/SKILL.md +2 -2
  10. package/agent-plugin/skills/inbox-replies/SKILL.md +1 -1
  11. package/agent-plugin/skills/knowledge/SKILL.md +1 -1
  12. package/agent-plugin/skills/linkedin-posts/SKILL.md +1 -1
  13. package/agent-plugin/skills/linkedin-warm-signals/SKILL.md +2 -2
  14. package/agent-plugin/skills/list-building/SKILL.md +4 -4
  15. package/agent-plugin/skills/outreach/SKILL.md +1 -1
  16. package/agent-plugin/skills/outreach/steps-and-timing.md +1 -1
  17. package/agent-plugin/skills/plays/SKILL.md +2 -2
  18. package/agent-plugin/skills/reddit-posts/SKILL.md +1 -1
  19. package/agent-plugin/skills/skill-authoring/SKILL.md +1 -1
  20. package/agent-plugin/skills/social/SKILL.md +2 -2
  21. package/agent-plugin/skills/visibility/SKILL.md +2 -2
  22. package/agent-plugin/skills/workflows/SKILL.md +3 -3
  23. package/agent-plugin/skills/worksheet-tidy/SKILL.md +1 -1
  24. package/agent-plugin/skills/writing/SKILL.md +1 -1
  25. package/agent-plugin/skills/x-posts/SKILL.md +1 -1
  26. package/dist/agentGuidance.generated.json +35 -0
  27. package/dist/client.d.ts +31 -2
  28. package/dist/client.d.ts.map +1 -1
  29. package/dist/client.js +115 -33
  30. package/dist/commandTable.d.ts +26 -0
  31. package/dist/commandTable.d.ts.map +1 -0
  32. package/dist/commandTable.js +54 -0
  33. package/dist/commands/sequences.d.ts +1 -1
  34. package/dist/commands/sequences.d.ts.map +1 -1
  35. package/dist/commands/sequences.js +37 -36
  36. package/dist/commands/shared.d.ts +4 -26
  37. package/dist/commands/shared.d.ts.map +1 -1
  38. package/dist/commands/shared.js +129 -127
  39. package/dist/commands/workflows.d.ts +1 -1
  40. package/dist/commands/workflows.d.ts.map +1 -1
  41. package/dist/commands/workflows.js +35 -41
  42. package/dist/errors.d.ts +78 -0
  43. package/dist/errors.d.ts.map +1 -0
  44. package/dist/errors.js +117 -0
  45. package/dist/gatedRun.d.ts +81 -0
  46. package/dist/gatedRun.d.ts.map +1 -0
  47. package/dist/gatedRun.js +370 -0
  48. package/dist/idempotency.d.ts +38 -0
  49. package/dist/idempotency.d.ts.map +1 -0
  50. package/dist/idempotency.js +106 -0
  51. package/dist/index.d.ts +21 -35
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +372 -366
  54. package/dist/runWait.d.ts +2 -1
  55. package/dist/runWait.d.ts.map +1 -1
  56. package/dist/runWait.js +3 -1
  57. package/dist/schemaCoercion.d.ts +20 -0
  58. package/dist/schemaCoercion.d.ts.map +1 -0
  59. package/dist/schemaCoercion.js +123 -0
  60. package/dist/skillInstaller.d.ts +40 -0
  61. package/dist/skillInstaller.d.ts.map +1 -1
  62. package/dist/skillInstaller.js +108 -9
  63. package/dist/tableFilePreview.d.ts +14 -0
  64. package/dist/tableFilePreview.d.ts.map +1 -1
  65. package/dist/tableFilePreview.js +19 -8
  66. package/dist/tableFileReader.d.ts +26 -0
  67. package/dist/tableFileReader.d.ts.map +1 -0
  68. package/dist/tableFileReader.js +108 -0
  69. package/dist/tablesImport.d.ts +57 -0
  70. package/dist/tablesImport.d.ts.map +1 -0
  71. package/dist/tablesImport.js +263 -0
  72. package/dist/turnCache.d.ts +14 -1
  73. package/dist/turnCache.d.ts.map +1 -1
  74. package/dist/turnCache.js +25 -8
  75. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,EAAE,MAA2C,CAAC;AAEtE,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,+FAA+F;IAC/F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED,eAAO,MAAM,0BAA0B,QAAS,CAAC;AACjD,eAAO,MAAM,+BAA+B,QAAS,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,cAAc,GAAG,eAAe,CAAC;IAC7C,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAYD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,YAAY,GAAG,SAAS,GAAG,MAAM,CAAC;IACzC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,yBAAyB,EAAE,MAAM,CAAC;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,wBAAwB,GAChC;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAahF,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,oGAAoG;IACpG,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;gBAGxB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;QACP,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,MAAM,CAAC,EAAE,OAAO,CAAC;KACb;CAaT;AASD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAoB1E;AAqED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GACrF,OAAO,CAAC,mBAAmB,CAAC,CAK9B;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,wBAAwB,CAAC,CAKnC;AAkDD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAA4B;gBAElD,OAAO,EAAE,uBAAuB;IAQ5C,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAG7B,4FAA4F;IAC5F,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAGnC,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAG7B,SAAS,CAAC,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAGhE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAG9E,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAGzC,UAAU,CAAC,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAGjE,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAGtE,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAGjC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAGhF,SAAS,CAAC,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAGhE,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOpF,aAAa,CACX,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,iBAAiB,EACvB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,GAC7B,OAAO,CAAC,OAAO,CAAC;IAYnB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAGpC,QAAQ,CAAC,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAG/D,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAY/F,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAG/E,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YASjF,OAAO;CAwHtB"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js CHANGED
@@ -1,15 +1,25 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DreamstateClient = exports.CliError = exports.TOOL_AND_RUN_REQUEST_TIMEOUT_MS = exports.DEFAULT_REQUEST_TIMEOUT_MS = exports.CLI_VERSION = void 0;
3
+ exports.DreamstateClient = exports.CliError = exports.TOOL_AND_RUN_REQUEST_TIMEOUT_MS = exports.DEFAULT_REQUEST_TIMEOUT_MS = exports.CLI_UPDATE_COMMAND = exports.CLI_VERSION = void 0;
4
+ exports.readServerReleaseInfo = readServerReleaseInfo;
5
+ exports.describeVersionSkew = describeVersionSkew;
4
6
  exports.readToolEnvelopeTraceId = readToolEnvelopeTraceId;
5
7
  exports.requestDeviceAuthorization = requestDeviceAuthorization;
6
8
  exports.claimDeviceAuthorization = claimDeviceAuthorization;
7
- const node_crypto_1 = require("node:crypto");
9
+ const idempotency_1 = require("./idempotency");
10
+ const errors_1 = require("./errors");
8
11
  exports.CLI_VERSION = require('../package.json').version;
12
+ /** Command that updates the CLI. One constant so every surface prints the same one. */
13
+ exports.CLI_UPDATE_COMMAND = 'npm install -g @trydreamstate/cli@latest';
9
14
  exports.DEFAULT_REQUEST_TIMEOUT_MS = 15_000;
10
15
  exports.TOOL_AND_RUN_REQUEST_TIMEOUT_MS = 60_000;
11
- /** Server workspace refusals rewritten so the message says what to run next. */
12
- const WORKSPACE_ERROR_MESSAGES = {
16
+ /**
17
+ * Next steps for server workspace refusals. The server's message is forwarded
18
+ * unchanged; the CLI's own guidance travels beside it as details.cli_hint, so
19
+ * an agent reading either surface sees the same message and a script can tell
20
+ * what the server said from what the CLI added.
21
+ */
22
+ const WORKSPACE_ERROR_HINTS = {
13
23
  workspace_required: 'No workspace is selected. Run dreamstate workspaces list, then dreamstate workspaces use <workspace> (or pass --workspace <id|slug>).',
14
24
  workspace_forbidden: 'You are not a member of that workspace. Run dreamstate workspaces list to see the workspaces you can use, then dreamstate workspaces use <workspace>.',
15
25
  workspace_scoped_credential: 'This key is bound to one workspace. Run dreamstate login for a user session that can switch, or remove --workspace and DREAMSTATE_WORKSPACE.',
@@ -24,6 +34,8 @@ class CliError extends Error {
24
34
  /** The server's retry decision and repair, forwarded unchanged so the CLI never re-derives them. */
25
35
  retryable;
26
36
  repair;
37
+ /** The server's own envelope meta (trace_id, server_version, ...), kept whole so a refusal prints what the server said. */
38
+ meta;
27
39
  constructor(message, code, status, options = {}) {
28
40
  super(message);
29
41
  this.name = 'CliError';
@@ -41,9 +53,48 @@ class CliError extends Error {
41
53
  this.retryable = options.retryable;
42
54
  if (options.repair !== undefined)
43
55
  this.repair = options.repair;
56
+ else if (code in errors_1.CLI_LOCAL_ERROR_REPAIRS)
57
+ this.repair = errors_1.CLI_LOCAL_ERROR_REPAIRS[code];
58
+ if (options.meta !== undefined)
59
+ this.meta = options.meta;
44
60
  }
45
61
  }
46
62
  exports.CliError = CliError;
63
+ function metaRecord(payload) {
64
+ const meta = payload && typeof payload === 'object' ? payload.meta : undefined;
65
+ return meta && typeof meta === 'object' && !Array.isArray(meta) ? meta : undefined;
66
+ }
67
+ function nonEmptyString(value) {
68
+ return typeof value === 'string' && value.trim() ? value.trim() : null;
69
+ }
70
+ /**
71
+ * Release identity from one response, preferring the JSON envelope and falling
72
+ * back to the X-Dreamstate-* headers. Success and error envelopes carry it
73
+ * alike (contract C2), so this runs on both.
74
+ */
75
+ function readServerReleaseInfo(payload, headers) {
76
+ const meta = metaRecord(payload);
77
+ const header = (name) => nonEmptyString(typeof headers?.get === 'function' ? headers.get(name) : null);
78
+ return {
79
+ server_version: nonEmptyString(meta?.server_version) ?? header('X-Dreamstate-Server-Version'),
80
+ minimum_cli_version: nonEmptyString(meta?.minimum_cli_version) ?? header('X-Dreamstate-Minimum-Cli-Version'),
81
+ release_sha: nonEmptyString(meta?.release_sha) ?? header('X-Dreamstate-Release-Sha'),
82
+ };
83
+ }
84
+ function describeVersionSkew(info, cliVersion = exports.CLI_VERSION) {
85
+ if (info.minimum_cli_version && isVersionGreater(info.minimum_cli_version, cliVersion))
86
+ return 'cli_below_minimum';
87
+ if (info.server_version && isVersionGreater(info.server_version, cliVersion))
88
+ return 'cli_behind_server';
89
+ return info.server_version || info.minimum_cli_version ? 'compatible' : 'unknown';
90
+ }
91
+ function updateRequiredError(minimum, cliVersion, status, details, meta) {
92
+ return new CliError(`CLI ${minimum} or newer is required (this is ${cliVersion}). Run: ${exports.CLI_UPDATE_COMMAND}`, 'cli_update_required', status, {
93
+ details: { ...details, minimum_cli_version: minimum, cli_version: cliVersion, update_command: exports.CLI_UPDATE_COMMAND },
94
+ retryable: false,
95
+ ...(meta ? { meta } : {}),
96
+ });
97
+ }
47
98
  function isApiErrorBody(value) {
48
99
  const error = value && typeof value === 'object' ? value.error : null;
49
100
  if (!error || typeof error !== 'object')
@@ -182,6 +233,11 @@ class DreamstateClient {
182
233
  workspace;
183
234
  requestTimeoutMs;
184
235
  onVersionWarning;
236
+ releaseInfo = { server_version: null, minimum_cli_version: null, release_sha: null };
237
+ /** Release identity from the most recent response, success or error. */
238
+ get serverInfo() {
239
+ return { ...this.releaseInfo };
240
+ }
185
241
  constructor(options) {
186
242
  this.apiKey = options.apiKey;
187
243
  this.baseUrl = options.baseUrl.replace(/\/+$/, '');
@@ -240,25 +296,26 @@ class DreamstateClient {
240
296
  listRuns(query = {}) {
241
297
  return this.request(`/runs${queryString(query)}`, {}, exports.TOOL_AND_RUN_REQUEST_TIMEOUT_MS);
242
298
  }
243
- resumeRun(id, body, idempotencyKey) {
244
- const key = idempotencyKey ?? (0, node_crypto_1.randomUUID)();
245
- return this.request(`/runs/${encodeURIComponent(id)}/resume`, {
246
- method: 'POST',
247
- body: JSON.stringify(body),
248
- headers: { 'Idempotency-Key': key },
249
- }, exports.TOOL_AND_RUN_REQUEST_TIMEOUT_MS);
250
- }
251
299
  getRunEvents(id, query = {}) {
252
300
  return this.request(`/runs/${encodeURIComponent(id)}/events${queryString(query)}`);
253
301
  }
254
302
  cancelRun(id, body, idempotencyKey) {
255
- const key = idempotencyKey ?? (0, node_crypto_1.randomUUID)();
303
+ // A re-run of the same cancel presents the same key, so a cancel whose reply was
304
+ // lost replays instead of racing the run's own state version.
305
+ const key = idempotencyKey ?? (0, idempotency_1.deterministicIdempotencyKey)({ scope: 'runs.cancel', workspace: this.workspace, body: { run_id: id, ...body } });
256
306
  return this.request(`/runs/${encodeURIComponent(id)}/cancel`, {
257
307
  method: 'POST',
258
308
  body: JSON.stringify(body),
259
- ...(key ? { headers: { 'Idempotency-Key': key } } : {}),
309
+ headers: { 'Idempotency-Key': key },
260
310
  });
261
311
  }
312
+ noteServerInfo(info) {
313
+ this.releaseInfo = {
314
+ server_version: info.server_version ?? this.releaseInfo.server_version,
315
+ minimum_cli_version: info.minimum_cli_version ?? this.releaseInfo.minimum_cli_version,
316
+ release_sha: info.release_sha ?? this.releaseInfo.release_sha,
317
+ };
318
+ }
262
319
  async request(path, init = {}, defaultTimeoutMs = exports.DEFAULT_REQUEST_TIMEOUT_MS, allowIncompatibleCli = false) {
263
320
  const requestTimeoutMs = this.requestTimeoutMs ?? defaultTimeoutMs;
264
321
  let response;
@@ -283,9 +340,9 @@ class DreamstateClient {
283
340
  }
284
341
  catch (error) {
285
342
  if (controller.signal.aborted) {
286
- throw new CliError(`Request timed out after ${requestTimeoutMs}ms`, 'request_timeout', 0, { idempotencyKey });
343
+ throw new CliError(errors_1.CLI_LOCAL_ERROR_CODES.request_timeout, 'request_timeout', 0, { idempotencyKey, repair: errors_1.CLI_LOCAL_ERROR_REPAIRS.request_timeout });
287
344
  }
288
- throw new CliError(`Request failed: ${error instanceof Error ? error.message : String(error)}`, 'network_error', 0);
345
+ throw new CliError(`Request failed: ${error instanceof Error ? error.message : String(error)}`, 'network_error', 0, { repair: errors_1.CLI_LOCAL_ERROR_REPAIRS.network_error });
289
346
  }
290
347
  finally {
291
348
  clearTimeout(timeout);
@@ -295,8 +352,12 @@ class DreamstateClient {
295
352
  payload = await response.json();
296
353
  }
297
354
  catch {
298
- throw new CliError(`Dreamstate API returned invalid JSON (HTTP ${response.status})`, 'invalid_response', response.status);
355
+ this.noteServerInfo(readServerReleaseInfo(undefined, response.headers));
356
+ throw new CliError(`Dreamstate API returned invalid JSON (HTTP ${response.status})`, 'invalid_response', response.status, { idempotencyKey, repair: errors_1.CLI_LOCAL_ERROR_REPAIRS.invalid_response });
299
357
  }
358
+ const info = readServerReleaseInfo(payload, response.headers);
359
+ this.noteServerInfo(info);
360
+ const meta = metaRecord(payload);
300
361
  if (isApiErrorBody(payload)) {
301
362
  const retryAfterValue = retryAfter(response, payload);
302
363
  if (!retriedRateLimit &&
@@ -307,8 +368,31 @@ class DreamstateClient {
307
368
  await waitForRetryAfter(retryAfterValue);
308
369
  continue;
309
370
  }
310
- throw new CliError(WORKSPACE_ERROR_MESSAGES[payload.error.code] ?? payload.error.message, payload.error.code, response.status, {
311
- details: payload.error.details,
371
+ if (payload.error.code === 'cli_update_required') {
372
+ // The server refused before executing anything (contract C3). Its own
373
+ // message is kept; the update command rides beside it.
374
+ const minimum = info.minimum_cli_version ?? '';
375
+ throw new CliError(payload.error.message, 'cli_update_required', response.status, {
376
+ details: {
377
+ ...(payload.error.details && typeof payload.error.details === 'object' ? payload.error.details : {}),
378
+ ...(minimum ? { minimum_cli_version: minimum } : {}),
379
+ cli_version: exports.CLI_VERSION,
380
+ update_command: exports.CLI_UPDATE_COMMAND,
381
+ },
382
+ retryAfter: retryAfterValue,
383
+ traceId: readToolEnvelopeTraceId(payload),
384
+ idempotencyKey,
385
+ retryable: false,
386
+ ...(payload.error.repair && typeof payload.error.repair === 'object' ? { repair: payload.error.repair } : {}),
387
+ ...(meta ? { meta } : {}),
388
+ });
389
+ }
390
+ const hint = WORKSPACE_ERROR_HINTS[payload.error.code];
391
+ const serverDetails = payload.error.details;
392
+ throw new CliError(payload.error.message, payload.error.code, response.status, {
393
+ ...(hint
394
+ ? { details: { ...(serverDetails && typeof serverDetails === 'object' && !Array.isArray(serverDetails) ? serverDetails : {}), cli_hint: hint } }
395
+ : { details: serverDetails }),
312
396
  retryAfter: retryAfterValue,
313
397
  traceId: readToolEnvelopeTraceId(payload),
314
398
  idempotencyKey,
@@ -318,25 +402,23 @@ class DreamstateClient {
318
402
  ...(payload.error.repair && typeof payload.error.repair === 'object'
319
403
  ? { repair: payload.error.repair }
320
404
  : {}),
405
+ ...(meta ? { meta } : {}),
321
406
  });
322
407
  }
323
408
  if (!response.ok)
324
- throw new CliError(`Dreamstate API request failed (HTTP ${response.status})`, 'request_failed', response.status);
325
- const minimum = payload && typeof payload === 'object'
326
- ? payload.meta?.minimum_cli_version
327
- : undefined;
328
- if (!allowIncompatibleCli &&
329
- typeof minimum === 'string' &&
330
- isVersionGreater(minimum, exports.CLI_VERSION)) {
331
- throw new CliError(`CLI ${minimum} or newer is required. Run: npm install -g @trydreamstate/cli@latest`, 'cli_update_required', 0);
409
+ throw new CliError(`Dreamstate API request failed (HTTP ${response.status})`, 'request_failed', response.status, { idempotencyKey, ...(meta ? { meta } : {}) });
410
+ const minimum = info.minimum_cli_version;
411
+ if (!allowIncompatibleCli && minimum && isVersionGreater(minimum, exports.CLI_VERSION)) {
412
+ // A conforming server refuses first (C3), so reaching here means the
413
+ // request may already have executed. The body is kept in the error so a
414
+ // write's receipt is not lost behind the update notice.
415
+ throw updateRequiredError(minimum, exports.CLI_VERSION, 0, init.method && init.method !== 'GET' ? { response: payload } : undefined, meta);
332
416
  }
333
- const server = payload && typeof payload === 'object'
334
- ? payload.meta?.server_version
335
- : undefined;
336
- if (typeof server === 'string' &&
417
+ const server = info.server_version;
418
+ if (server &&
337
419
  isVersionGreater(server, exports.CLI_VERSION) &&
338
- (typeof minimum !== 'string' || versionAtMost(minimum, exports.CLI_VERSION))) {
339
- this.onVersionWarning?.(`Warning: CLI ${exports.CLI_VERSION} is behind server ${server}. Proceeding; server minimum is ${minimum ?? 'not declared'}.`);
420
+ (!minimum || versionAtMost(minimum, exports.CLI_VERSION))) {
421
+ this.onVersionWarning?.(`Warning: CLI ${exports.CLI_VERSION} is behind server ${server}. Proceeding; server minimum is ${minimum ?? 'not declared'}. Update: ${exports.CLI_UPDATE_COMMAND}`);
340
422
  }
341
423
  return payload;
342
424
  }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * The CLI's own command table, for `dreamstate commands search`.
3
+ *
4
+ * `commands search` used to be an alias of `tools search`: it returned capability
5
+ * records, never a command a person could type. The table here is built from
6
+ * what the CLI really parses, with no second hand-kept list:
7
+ *
8
+ * - every `dreamstate ...` usage line the CLI prints (USAGE in index.ts), and
9
+ * - every sequences / workflows verb (the verb tables in commands/), with the
10
+ * capability each one runs.
11
+ *
12
+ * A capability with no verb is reached through `tools run`, which stays a
13
+ * catalog search (`tools search`); `commands search` reports those separately.
14
+ */
15
+ export interface CliCommandEntry {
16
+ /** What to type, with the verb filled in: `dreamstate sequences publish`. */
17
+ command: string;
18
+ /** The full usage line or verb signature. */
19
+ usage: string;
20
+ summary: string;
21
+ /** The capability a verb runs, when it runs exactly one. */
22
+ capability_id?: string;
23
+ }
24
+ export declare function cliCommandTable(usage: string): CliCommandEntry[];
25
+ export declare function searchCliCommands(term: string, usage: string, limit?: number): CliCommandEntry[];
26
+ //# sourceMappingURL=commandTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commandTable.d.ts","sourceRoot":"","sources":["../src/commandTable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,eAAe;IAC9B,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA6BD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,EAAE,CAWhE;AAMD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,eAAe,EAAE,CAc5F"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cliCommandTable = cliCommandTable;
4
+ exports.searchCliCommands = searchCliCommands;
5
+ function verbUsage(pack, spec) {
6
+ const positionals = (spec.positional ?? []).map(({ name, optional }) => (optional ? `[${name}]` : `<${name}>`)).join(' ');
7
+ return ['dreamstate', pack, spec.verb, positionals, '[--canonical-field value]'].filter(Boolean).join(' ');
8
+ }
9
+ /** Usage lines of the form ` dreamstate <group> ...` printed by `dreamstate --help`. */
10
+ function usageEntries(usage) {
11
+ return usage.split('\n')
12
+ .filter((line) => line.startsWith(' dreamstate '))
13
+ .map((line) => line.trim())
14
+ .filter((line) => !/^dreamstate (sequences|workflows) <verb>/.test(line))
15
+ .map((line) => {
16
+ const words = line.split(/\s+/);
17
+ // `dreamstate tools run <capability_id> ...`: the typed command is the leading words
18
+ // before the first argument placeholder or flag.
19
+ const stop = words.findIndex((word, index) => index > 0 && /^[<\[-]/.test(word));
20
+ const command = (stop === -1 ? words : words.slice(0, stop)).join(' ');
21
+ return { command, usage: line, summary: '' };
22
+ });
23
+ }
24
+ function cliCommandTable(usage) {
25
+ // Required lazily: the verb tables import the CLI entry point's helpers.
26
+ const { SEQUENCE_VERBS } = require('./commands/sequences');
27
+ const { WORKFLOW_VERBS } = require('./commands/workflows');
28
+ const verbs = (pack, specs) => specs.map((spec) => ({
29
+ command: `dreamstate ${pack} ${spec.verb}`,
30
+ usage: verbUsage(pack, spec),
31
+ summary: '',
32
+ capability_id: spec.capabilityId,
33
+ }));
34
+ return [...usageEntries(usage), ...verbs('sequences', SEQUENCE_VERBS), ...verbs('workflows', WORKFLOW_VERBS)];
35
+ }
36
+ function terms(value) {
37
+ return value.toLowerCase().split(/[^a-z0-9_]+/).filter((word) => word.length > 1);
38
+ }
39
+ function searchCliCommands(term, usage, limit = 20) {
40
+ const wanted = terms(term);
41
+ if (wanted.length === 0)
42
+ return [];
43
+ return cliCommandTable(usage)
44
+ .map((entry) => {
45
+ const haystack = new Set(terms(`${entry.command} ${entry.usage} ${entry.summary} ${entry.capability_id ?? ''}`));
46
+ const commandWords = new Set(terms(entry.command));
47
+ const score = wanted.reduce((total, word) => total + (commandWords.has(word) ? 3 : haystack.has(word) ? 1 : 0), 0);
48
+ return { entry, score };
49
+ })
50
+ .filter(({ score }) => score > 0)
51
+ .sort((left, right) => right.score - left.score || left.entry.command.localeCompare(right.entry.command))
52
+ .slice(0, limit)
53
+ .map(({ entry }) => entry);
54
+ }
@@ -3,5 +3,5 @@ import type { CliCommand } from '../index';
3
3
  export declare const SEQUENCE_VERBS: PackVerbSpec[];
4
4
  export declare const SEQUENCES_USAGE: string;
5
5
  export declare const parseSequencesCommand: (argv: string[]) => CliCommand;
6
- export declare function runSequencesCommand(client: Parameters<typeof runPackCommand>[0], command: CliCommand, stdout: NodeJS.WritableStream, sleep?: Parameters<typeof runPackCommand>[3]): Promise<void>;
6
+ export declare function runSequencesCommand(context: Parameters<typeof runPackCommand>[0], command: CliCommand, stdout: NodeJS.WritableStream): Promise<void>;
7
7
  //# sourceMappingURL=sequences.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sequences.d.ts","sourceRoot":"","sources":["../../src/commands/sequences.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,cAAc,EAAe,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAC5G,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,eAAO,MAAM,cAAc,EAAE,YAAY,EA+BxC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,MAAqD,CAAC;AACpF,eAAO,MAAM,qBAAqB,gCAA4E,CAAC;AAC/G,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC,EAC5C,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,MAAM,CAAC,cAAc,EAC7B,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC,GAC3C,OAAO,CAAC,IAAI,CAAC,CAMf"}
1
+ {"version":3,"file":"sequences.d.ts","sourceRoot":"","sources":["../../src/commands/sequences.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,cAAc,EAAe,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAC5G,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAO3C,eAAO,MAAM,cAAc,EAAE,YAAY,EA8BxC,CAAC;AAEF,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,qBAAqB,gCAA4E,CAAC;AAC/G,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1J"}
@@ -3,44 +3,45 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseSequencesCommand = exports.SEQUENCES_USAGE = exports.SEQUENCE_VERBS = void 0;
4
4
  exports.runSequencesCommand = runSequencesCommand;
5
5
  const shared_1 = require("./shared");
6
+ const automation = [{ name: 'id', into: 'automation_id' }];
7
+ const sequence = [{ name: 'id', into: 'sequence_id' }];
8
+ // Route map only. `tools get` owns every remote parameter, type, requirement and
9
+ // description. Positionals are documented CLI aliases for canonical input fields.
6
10
  exports.SEQUENCE_VERBS = [
7
- { verb: 'create-from-worksheet', capabilityId: 'sequence.sequences.create_from_worksheet', summary: 'Create draft sequence from worksheet and enroll rows. Never publishes or sends.', flags: { worksheet: { type: 'string', into: 'worksheet_id' }, view: { type: 'string', into: 'view_id' }, name: { type: 'string', into: 'name' }, steps: { type: 'string', into: 'steps', json: true }, description: { type: 'string', into: 'description' }, timezone: { type: 'string', into: 'timezone' }, 'daily-cap': { type: 'string', into: 'daily_cap', number: true }, senders: { type: 'string', into: 'senders', json: true }, 'enrollment-filter': { type: 'string', into: 'enrollment_filter', json: true }, 'max-new-enrollments-per-day': { type: 'string', into: 'max_new_enrollments_per_day', number: true } }, mutating: true },
8
- { verb: 'list', capabilityId: 'workflow.automations.list', summary: 'List sequences in workspace.', flags: { limit: { type: 'string', into: 'limit' }, cursor: { type: 'string', into: 'cursor' }, lifecycle: { type: 'string', into: 'lifecycle' }, 'include-archived': { type: 'boolean', into: 'include_archived' }, search: { type: 'string', into: 'search' } }, mutating: false },
9
- // Local only: writes a starter document to disk and calls no API, so authoring can
10
- // begin from a file. capabilityId names the verb this scaffold is meant to feed.
11
- { verb: 'init', capabilityId: 'workflow.automations.lint', summary: 'Write a starter sequence document to a local file. Calls no API and changes nothing.', flags: { name: { type: 'string', into: 'name' }, file: { type: 'string', into: 'file' } }, mutating: false },
12
- { verb: 'get', capabilityId: 'workflow.automations.get', summary: 'Get one sequence.', positional: [{ name: 'id', into: 'automation_id' }], mutating: false },
13
- { verb: 'create', capabilityId: 'workflow.automations.compose', summary: 'Create draft sequence. Does not publish or send.', flags: { name: { type: 'string', into: 'name' }, description: { type: 'string', into: 'description' }, timezone: { type: 'string', into: 'timezone' }, enrollment: { type: 'string', into: 'enrollment', json: true }, 'daily-cap': { type: 'string', into: 'daily_cap' }, 'max-new-enrollments-per-day': { type: 'string', into: 'max_new_enrollments_per_day' }, senders: { type: 'string', into: 'senders', json: true }, steps: { type: 'string', into: 'steps', json: true }, 'on-duplicate-name': { type: 'string', into: 'on_duplicate_name' } }, mutating: true },
14
- { verb: 'update', capabilityId: 'workflow.automations.update', summary: 'Update sequence draft settings. Does not publish or send.', positional: [{ name: 'id', into: 'automation_id' }], flags: { patch: { type: 'string', into: 'patch', json: true }, 'expected-version': { type: 'string', into: 'expected_version', number: true } }, mutating: true },
15
- { verb: 'lint', capabilityId: 'workflow.automations.lint', summary: 'Lint sequence draft. Makes no changes.', positional: [{ name: 'id', into: 'automation_id' }], flags: { document: { type: 'string', into: 'document', json: true, document: true } }, mutating: false },
16
- { verb: 'preview', capabilityId: 'workflow.automations.preview', summary: 'Preview saved sequence. Creates no run and sends nothing.', positional: [{ name: 'id', into: 'automation_id' }], mutating: false },
17
- { verb: 'variables', capabilityId: 'workflow.automations.variables_list', summary: 'List template variables available in sequence.', positional: [{ name: 'id', into: 'automation_id' }], flags: { document: { type: 'string', into: 'document', json: true, document: true }, node: { type: 'string', into: 'node_id' }, query: { type: 'string', into: 'query' }, limit: { type: 'string', into: 'limit' } }, mutating: false },
18
- { verb: 'node-catalog', capabilityId: 'workflow.automations.node_catalog', summary: 'List available sequence node types.', flags: { query: { type: 'string', into: 'query' }, family: { type: 'string', into: 'family' }, 'include-blocked': { type: 'boolean', into: 'include_blocked' } }, mutating: false },
19
- { verb: 'node-inspect', capabilityId: 'workflow.automations.node_inspect', summary: 'Inspect sequence node type or saved node.', positional: [{ name: 'id', into: 'automation_id', optional: true }], flags: { node: { type: 'string', into: 'node_id' }, 'node-kind': { type: 'string', into: 'node_kind' }, subtype: { type: 'string', into: 'subtype' }, config: { type: 'string', into: 'config', json: true } }, mutating: false },
20
- { verb: 'node-add', capabilityId: 'workflow.automations.node_add', summary: 'Add node to sequence draft. Does not publish or send.', positional: [{ name: 'id', into: 'automation_id' }], flags: { node: { type: 'string', into: 'node', json: true }, 'after-node': { type: 'string', into: 'after_node_id' }, branch: { type: 'string', into: 'branch' }, 'expected-version': { type: 'string', into: 'expected_version', number: true } }, mutating: true },
21
- { verb: 'node-patch', capabilityId: 'workflow.automations.node_patch', summary: 'Patch sequence node. Does not publish or send.', positional: [{ name: 'id', into: 'automation_id' }], flags: { node: { type: 'string', into: 'node_id' }, fields: { type: 'string', into: 'fields', json: true }, 'expected-version': { type: 'string', into: 'expected_version', number: true } }, mutating: true },
22
- { verb: 'node-remove', capabilityId: 'workflow.automations.node_remove', summary: 'Remove node from sequence draft. Does not publish or send.', positional: [{ name: 'id', into: 'automation_id' }], flags: { node: { type: 'string', into: 'node_id' }, 'expected-version': { type: 'string', into: 'expected_version', number: true } }, mutating: true },
23
- { verb: 'node-move', capabilityId: 'workflow.automations.node_move', summary: 'Move sequence node. Does not publish or send.', positional: [{ name: 'id', into: 'automation_id' }], flags: { node: { type: 'string', into: 'node_id' }, 'after-node': { type: 'string', into: 'after_node_id' }, branch: { type: 'string', into: 'branch' }, 'expected-version': { type: 'string', into: 'expected_version', number: true } }, mutating: true },
24
- { verb: 'field-options', capabilityId: 'workflow.automations.field_options', summary: 'List options for sequence node fields.', positional: [{ name: 'id', into: 'automation_id', optional: true }], flags: { node: { type: 'string', into: 'node_id' }, 'node-kind': { type: 'string', into: 'node_kind' }, subtype: { type: 'string', into: 'subtype' }, 'field-key': { type: 'string', into: 'field_key' }, 'field-keys': { type: 'string', into: 'field_keys', json: true }, query: { type: 'string', into: 'query' }, limit: { type: 'string', into: 'limit' }, cursor: { type: 'string', into: 'cursor' }, 'field-context': { type: 'string', into: 'field_context', json: true } }, mutating: false },
25
- { verb: 'publish', capabilityId: 'sequence.sequences.publish', summary: 'Publish sequence draft. Does not enroll or send.', positional: [{ name: 'id', into: 'sequence_id' }], flags: { 'sequence-version-id': { type: 'string', into: 'sequence_version_id' }, 'latest-draft-version-id': { type: 'string', into: 'latest_draft_version_id' } }, mutating: true },
26
- { verb: 'enroll', capabilityId: 'sequence.sequences.enroll_selection', summary: 'Enroll rows into sequence. Spends no credits and sends nothing; dispatch only happens at launch.', positional: [{ name: 'id', into: 'sequence_id' }], flags: { worksheet: { type: 'string', into: 'worksheet_id' }, view: { type: 'string', into: 'view_id' }, 'enrollment-filter': { type: 'string', into: 'enrollment_filter', json: true }, 'enrollment-priority': { type: 'string', into: 'enrollment_priority', json: true }, 'enrollment-sort': { type: 'string', into: 'enrollment_sort', json: true }, 'max-live-sends': { type: 'string', into: 'max_live_sends' }, 'max-new-enrollments-per-day': { type: 'string', into: 'max_new_enrollments_per_day' } }, mutating: true },
27
- { verb: 'enrollments', capabilityId: 'sequence.sequences.contacts_list', summary: 'List people enrolled in sequence.', positional: [{ name: 'id', into: 'sequence_id' }], flags: { limit: { type: 'string', into: 'limit' }, cursor: { type: 'string', into: 'cursor' } }, mutating: false },
28
- { verb: 'launch', capabilityId: 'sequence.sequences.launch', summary: 'Launch published sequence dispatch.', positional: [{ name: 'id', into: 'sequence_id' }], flags: { 'max-live-sends': { type: 'string', into: 'max_live_sends' } }, mutating: true },
29
- { verb: 'pause', capabilityId: 'sequence.sequences.pause', summary: 'Pause sequence dispatch. Sends no new messages.', positional: [{ name: 'id', into: 'sequence_id' }], mutating: true },
30
- { verb: 'resume', capabilityId: 'sequence.sequences.resume', summary: 'Resume sequence dispatch.', positional: [{ name: 'id', into: 'sequence_id' }], flags: { 'max-live-sends': { type: 'string', into: 'max_live_sends' } }, mutating: true },
31
- { verb: 'stats', capabilityId: 'sequence.sequences.step_counts_get', summary: 'Get sequence step counts.', positional: [{ name: 'id', into: 'sequence_id' }], mutating: false },
32
- { verb: 'analytics', capabilityId: 'sequence.sequences.analytics_get', summary: 'Get sequence analytics.', positional: [{ name: 'id', into: 'sequence_id' }], flags: { 'window-days': { type: 'string', into: 'window_days', number: true } }, mutating: false },
33
- { verb: 'duplicate', capabilityId: 'workflow.automations.duplicate', summary: 'Duplicate sequence as draft. Does not publish or send.', positional: [{ name: 'id', into: 'automation_id' }], flags: { name: { type: 'string', into: 'name' }, 'expected-version': { type: 'string', into: 'expected_version', number: true } }, mutating: true },
34
- { verb: 'archive', capabilityId: 'workflow.automations.archive', summary: 'Archive sequence. Does not delete records or send.', positional: [{ name: 'id', into: 'automation_id' }], flags: { reason: { type: 'string', into: 'reason' }, 'expected-version': { type: 'string', into: 'expected_version', number: true } }, mutating: true },
35
- { verb: 'export', capabilityId: 'workflow.automations.export', summary: 'Export sequence definition. Makes no changes.', positional: [{ name: 'id', into: 'automation_id' }], mutating: false },
36
- { verb: 'import', capabilityId: 'workflow.automations.import', summary: 'Import sequence as draft. Does not publish or send.', flags: { name: { type: 'string', into: 'name' }, document: { type: 'string', into: 'document', json: true, document: true } }, mutating: true },
11
+ { verb: 'create-from-worksheet', capabilityId: 'sequence.sequences.create_from_worksheet' },
12
+ { verb: 'list', capabilityId: 'workflow.automations.list' },
13
+ { verb: 'init', capabilityId: 'workflow.automations.lint', local: 'init' },
14
+ { verb: 'get', capabilityId: 'workflow.automations.get', positional: automation },
15
+ { verb: 'create', capabilityId: 'workflow.automations.compose' },
16
+ { verb: 'update', capabilityId: 'workflow.automations.update', positional: automation },
17
+ { verb: 'lint', capabilityId: 'workflow.automations.lint', positional: automation },
18
+ { verb: 'preview', capabilityId: 'workflow.automations.preview', positional: automation },
19
+ { verb: 'variables', capabilityId: 'workflow.automations.variables_list', positional: automation },
20
+ { verb: 'node-catalog', capabilityId: 'workflow.automations.node_catalog' },
21
+ { verb: 'node-inspect', capabilityId: 'workflow.automations.node_inspect', positional: [{ name: 'id', into: 'automation_id', optional: true }] },
22
+ { verb: 'node-add', capabilityId: 'workflow.automations.node_add', positional: automation },
23
+ { verb: 'node-patch', capabilityId: 'workflow.automations.node_patch', positional: automation },
24
+ { verb: 'node-remove', capabilityId: 'workflow.automations.node_remove', positional: automation },
25
+ { verb: 'node-move', capabilityId: 'workflow.automations.node_move', positional: automation },
26
+ { verb: 'field-options', capabilityId: 'workflow.automations.field_options', positional: [{ name: 'id', into: 'automation_id', optional: true }] },
27
+ { verb: 'publish', capabilityId: 'sequence.sequences.publish', positional: sequence },
28
+ { verb: 'enroll', capabilityId: 'sequence.sequences.enroll_selection', positional: sequence },
29
+ { verb: 'enrollments', capabilityId: 'sequence.sequences.contacts_list', positional: sequence },
30
+ { verb: 'launch', capabilityId: 'sequence.sequences.launch', positional: sequence },
31
+ { verb: 'start', capabilityId: 'sequence.sequences.start', positional: sequence },
32
+ { verb: 'pause', capabilityId: 'sequence.sequences.pause', positional: sequence },
33
+ { verb: 'resume', capabilityId: 'sequence.sequences.resume', positional: sequence },
34
+ { verb: 'stats', capabilityId: 'sequence.sequences.step_counts_get', positional: sequence },
35
+ { verb: 'analytics', capabilityId: 'sequence.sequences.analytics_get', positional: sequence },
36
+ { verb: 'duplicate', capabilityId: 'workflow.automations.duplicate', positional: automation },
37
+ { verb: 'archive', capabilityId: 'workflow.automations.archive', positional: automation },
38
+ { verb: 'export', capabilityId: 'workflow.automations.export', positional: automation },
39
+ { verb: 'import', capabilityId: 'workflow.automations.import' },
37
40
  ];
38
41
  exports.SEQUENCES_USAGE = (0, shared_1.renderPackUsage)('sequences', exports.SEQUENCE_VERBS);
39
42
  exports.parseSequencesCommand = (0, shared_1.buildPackParser)('sequences', 'sequence', exports.SEQUENCE_VERBS, exports.SEQUENCES_USAGE);
40
- async function runSequencesCommand(client, command, stdout, sleep) {
41
- if (command.command === 'pack' && command.verb === 'init') {
42
- (0, shared_1.runPackInit)('sequence', command, stdout);
43
- return;
44
- }
45
- await (0, shared_1.runPackCommand)(client, command, stdout, sleep);
43
+ async function runSequencesCommand(context, command, stdout) {
44
+ if (command.command === 'pack' && command.verb === 'init')
45
+ return (0, shared_1.runPackInit)('sequence', command, stdout);
46
+ await (0, shared_1.runPackCommand)(context, command, stdout);
46
47
  }
@@ -1,9 +1,8 @@
1
- import type { DreamstateClient } from '../client';
2
1
  import { type CliCommand } from '../index';
2
+ import { type GatedRunContext } from '../gatedRun';
3
3
  export interface PackVerbSpec {
4
4
  verb: string;
5
5
  capabilityId: string;
6
- summary: string;
7
6
  /**
8
7
  * `optional: true` marks a positional the verb can do without. node-inspect and
9
8
  * field-options answer two different questions: the contract for a node TYPE, which
@@ -16,29 +15,8 @@ export interface PackVerbSpec {
16
15
  into: string;
17
16
  optional?: boolean;
18
17
  }[];
19
- /**
20
- * `document: true` marks the ONE flag that carries a whole authored document, so
21
- * --file knows where to put a file's contents. Without it --file bound to whichever
22
- * json flag happened to be declared first, which on `sequences create` was
23
- * `enrollment`: a whole sequence document arrived as the enrollment binding and the
24
- * server refused it field by field. Flag order is not a contract, so the document
25
- * flag has to say so itself.
26
- */
27
- /**
28
- * `number: true` marks a flag whose capability param is numeric. Every flag arrives
29
- * from the shell as a string, so `--expected-version 1` was sent as "1" and refused
30
- * with `params.expected_version: expected number; received string`: the optimistic
31
- * concurrency check could not be satisfied from the CLI at all.
32
- */
33
- flags?: Record<string, {
34
- type: 'string' | 'boolean';
35
- into: string;
36
- json?: boolean;
37
- document?: boolean;
38
- number?: boolean;
39
- required?: boolean;
40
- }>;
41
- mutating: boolean;
18
+ /** Local-only route; `init` accepts --name and --file without an API schema. */
19
+ local?: 'init';
42
20
  }
43
21
  export declare function buildPackParser(pack: 'sequences' | 'workflows', kind: 'sequence' | 'workflow', specs: PackVerbSpec[], usage: string): (argv: string[]) => CliCommand;
44
22
  /**
@@ -49,6 +27,6 @@ export declare function buildPackParser(pack: 'sequences' | 'workflows', kind: '
49
27
  */
50
28
  export declare function packScaffold(kind: 'sequence' | 'workflow', name: string): Record<string, unknown>;
51
29
  export declare function runPackInit(kind: 'sequence' | 'workflow', command: CliCommand, stdout: NodeJS.WritableStream): void;
52
- export declare function runPackCommand(client: DreamstateClient, command: CliCommand, stdout: NodeJS.WritableStream, sleep?: (milliseconds: number) => Promise<void>): Promise<void>;
30
+ export declare function runPackCommand(context: GatedRunContext, command: CliCommand, stdout: NodeJS.WritableStream): Promise<void>;
53
31
  export declare function renderPackUsage(pack: string, specs: PackVerbSpec[]): string;
54
32
  //# sourceMappingURL=shared.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAKlD,OAAO,EAA6B,KAAK,UAAU,EAAiC,MAAM,UAAU,CAAC;AAOrG,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IACpD;;;;;;OAMG;IACH,UAAU,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;IAClE;;;;;;;OAOG;IACH;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,QAAQ,GAAC,SAAS,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC7I,QAAQ,EAAE,OAAO,CAAC;CACnB;AAsBD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,WAAW,GAAC,WAAW,EAAE,IAAI,EAAE,UAAU,GAAC,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,MAAM,GAC/F,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,UAAU,CAmHhC;AAGD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA+BjG;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,UAAU,GAAG,UAAU,EAC7B,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,MAAM,CAAC,cAAc,GAC5B,IAAI,CAuBN;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,cAAc,EAAE,KAAK,GAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAiF,GAAG,OAAO,CAAC,IAAI,CAAC,CAuDhQ;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM,CAM3E"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"AAKA,OAAO,EAAc,KAAK,UAAU,EAAiC,MAAM,UAAU,CAAC;AAEtF,OAAO,EAA4B,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAO7E,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IACnC;;;;;;OAMG;IACH,UAAU,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;IAClE,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA4CD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,WAAW,GAAC,WAAW,EAAE,IAAI,EAAE,UAAU,GAAC,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,MAAM,GAC/F,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,UAAU,CA8EhC;AAGD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA+BjG;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,UAAU,GAAG,UAAU,EAC7B,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,MAAM,CAAC,cAAc,GAC5B,IAAI,CAuBN;AAYD,wBAAsB,cAAc,CAClC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,MAAM,CAAC,cAAc,GAC5B,OAAO,CAAC,IAAI,CAAC,CA2Df;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM,CAK3E"}