@sanoma-ai/workflows 0.9.0 → 0.10.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 (205) hide show
  1. package/README.md +169 -52
  2. package/dist/apply-steps.js +5 -2
  3. package/dist/apply-steps.js.map +1 -1
  4. package/dist/apply.d.ts +3 -0
  5. package/dist/apply.js +35 -21
  6. package/dist/apply.js.map +1 -1
  7. package/dist/approvals.d.ts +1 -0
  8. package/dist/approvals.js +6 -1
  9. package/dist/approvals.js.map +1 -1
  10. package/dist/apps.d.ts +7 -24
  11. package/dist/apps.js +51 -67
  12. package/dist/apps.js.map +1 -1
  13. package/dist/ast.d.ts +9 -7
  14. package/dist/ast.js +2 -0
  15. package/dist/ast.js.map +1 -1
  16. package/dist/authentication.d.ts +24 -0
  17. package/dist/authentication.js +68 -0
  18. package/dist/authentication.js.map +1 -0
  19. package/dist/call-workflow.d.ts +5 -0
  20. package/dist/call-workflow.js +4 -3
  21. package/dist/call-workflow.js.map +1 -1
  22. package/dist/call.d.ts +3 -2
  23. package/dist/call.js +34 -7
  24. package/dist/call.js.map +1 -1
  25. package/dist/cedar.js +14 -1
  26. package/dist/cedar.js.map +1 -1
  27. package/dist/change-steps.js +7 -5
  28. package/dist/change-steps.js.map +1 -1
  29. package/dist/change.d.ts +7 -0
  30. package/dist/change.js +7 -0
  31. package/dist/change.js.map +1 -1
  32. package/dist/client.d.ts +10 -6
  33. package/dist/client.js +96 -43
  34. package/dist/client.js.map +1 -1
  35. package/dist/collection.d.ts +7 -0
  36. package/dist/collection.js +5 -2
  37. package/dist/collection.js.map +1 -1
  38. package/dist/config.d.ts +14 -3
  39. package/dist/config.js +55 -14
  40. package/dist/config.js.map +1 -1
  41. package/dist/connection.d.ts +168 -0
  42. package/dist/connection.js +327 -0
  43. package/dist/connection.js.map +1 -0
  44. package/dist/credentials.d.ts +7 -53
  45. package/dist/credentials.js +84 -247
  46. package/dist/credentials.js.map +1 -1
  47. package/dist/cucumber.d.ts +4 -2
  48. package/dist/cucumber.js +8 -3
  49. package/dist/cucumber.js.map +1 -1
  50. package/dist/db.js +21 -2
  51. package/dist/db.js.map +1 -1
  52. package/dist/define.d.ts +9 -2
  53. package/dist/define.js.map +1 -1
  54. package/dist/definitions.d.ts +20 -0
  55. package/dist/definitions.js +16 -0
  56. package/dist/definitions.js.map +1 -0
  57. package/dist/deployment-key.d.ts +2 -0
  58. package/dist/deployment-key.js +22 -0
  59. package/dist/deployment-key.js.map +1 -0
  60. package/dist/describe.d.ts +9 -177
  61. package/dist/describe.js +71 -34
  62. package/dist/describe.js.map +1 -1
  63. package/dist/description.d.ts +532 -0
  64. package/dist/description.js +381 -0
  65. package/dist/description.js.map +1 -0
  66. package/dist/direct.js +3 -0
  67. package/dist/direct.js.map +1 -1
  68. package/dist/drift.d.ts +1 -1
  69. package/dist/drift.js +1 -1
  70. package/dist/drift.js.map +1 -1
  71. package/dist/env.d.ts +2 -0
  72. package/dist/env.js +2 -2
  73. package/dist/env.js.map +1 -1
  74. package/dist/index.d.ts +10 -2
  75. package/dist/index.js +10 -2
  76. package/dist/index.js.map +1 -1
  77. package/dist/ledger.d.ts +2 -0
  78. package/dist/ledger.js +1 -1
  79. package/dist/ledger.js.map +1 -1
  80. package/dist/lint.d.ts +0 -9
  81. package/dist/lint.js +1 -16
  82. package/dist/lint.js.map +1 -1
  83. package/dist/load.d.ts +74 -0
  84. package/dist/load.js +357 -0
  85. package/dist/load.js.map +1 -0
  86. package/dist/lockfile.d.ts +2 -0
  87. package/dist/lockfile.js +8 -3
  88. package/dist/lockfile.js.map +1 -1
  89. package/dist/op.d.ts +10 -1
  90. package/dist/op.js +1 -1
  91. package/dist/op.js.map +1 -1
  92. package/dist/outline.js +13 -4
  93. package/dist/outline.js.map +1 -1
  94. package/dist/paths.d.ts +18 -0
  95. package/dist/paths.js +21 -3
  96. package/dist/paths.js.map +1 -1
  97. package/dist/plugin.d.ts +0 -11
  98. package/dist/plugin.js +3 -18
  99. package/dist/plugin.js.map +1 -1
  100. package/dist/policy.d.ts +2 -0
  101. package/dist/policy.js.map +1 -1
  102. package/dist/resource.d.ts +27 -4
  103. package/dist/resource.js +49 -4
  104. package/dist/resource.js.map +1 -1
  105. package/dist/resources.d.ts +33 -76
  106. package/dist/resources.js +219 -227
  107. package/dist/resources.js.map +1 -1
  108. package/dist/run.d.ts +2 -0
  109. package/dist/run.js.map +1 -1
  110. package/dist/sandbox.d.ts +1 -1
  111. package/dist/sandbox.js +7 -3
  112. package/dist/sandbox.js.map +1 -1
  113. package/dist/scenario.d.ts +7 -0
  114. package/dist/scenario.js +33 -3
  115. package/dist/scenario.js.map +1 -1
  116. package/dist/scenarios.js +7 -1
  117. package/dist/scenarios.js.map +1 -1
  118. package/dist/schema.js +8 -0
  119. package/dist/schema.js.map +1 -1
  120. package/dist/secret-store-check.d.ts +11 -0
  121. package/dist/secret-store-check.js +76 -0
  122. package/dist/secret-store-check.js.map +1 -0
  123. package/dist/secret-store.d.ts +106 -0
  124. package/dist/secret-store.js +228 -0
  125. package/dist/secret-store.js.map +1 -0
  126. package/dist/shared.d.ts +17 -11
  127. package/dist/shared.js +34 -7
  128. package/dist/shared.js.map +1 -1
  129. package/dist/sites.d.ts +4 -93
  130. package/dist/sites.js +61 -84
  131. package/dist/sites.js.map +1 -1
  132. package/dist/source.d.ts +6 -0
  133. package/dist/source.js +13 -0
  134. package/dist/source.js.map +1 -1
  135. package/dist/steps.d.ts +3 -1
  136. package/dist/steps.js.map +1 -1
  137. package/dist/version.d.ts +2 -1
  138. package/dist/version.js +2 -1
  139. package/dist/version.js.map +1 -1
  140. package/dist/wakeup-driver.js +15 -6
  141. package/dist/wakeup-driver.js.map +1 -1
  142. package/dist/worker.js +12 -8
  143. package/dist/worker.js.map +1 -1
  144. package/dist/writer.d.ts +53 -14
  145. package/dist/writer.js +113 -43
  146. package/dist/writer.js.map +1 -1
  147. package/oxlint.json +0 -5
  148. package/package.json +6 -2
  149. package/src/apply-steps.ts +5 -2
  150. package/src/apply.ts +70 -29
  151. package/src/approvals.ts +7 -1
  152. package/src/apps.ts +54 -85
  153. package/src/ast.ts +6 -6
  154. package/src/authentication.ts +74 -0
  155. package/src/call-workflow.ts +5 -4
  156. package/src/call.ts +53 -9
  157. package/src/cedar.ts +14 -1
  158. package/src/change-steps.ts +7 -4
  159. package/src/change.ts +10 -0
  160. package/src/client.ts +108 -41
  161. package/src/collection.ts +10 -2
  162. package/src/config.ts +72 -13
  163. package/src/connection.ts +446 -0
  164. package/src/credentials.ts +94 -281
  165. package/src/cucumber.ts +16 -3
  166. package/src/db.ts +21 -2
  167. package/src/define.ts +7 -2
  168. package/src/definitions.ts +31 -0
  169. package/src/deployment-key.ts +23 -0
  170. package/src/describe.ts +102 -230
  171. package/src/description.ts +426 -0
  172. package/src/direct.ts +3 -0
  173. package/src/drift.ts +10 -2
  174. package/src/env.ts +4 -2
  175. package/src/index.ts +42 -1
  176. package/src/ledger.ts +3 -1
  177. package/src/lint.ts +1 -16
  178. package/src/load.ts +437 -0
  179. package/src/lockfile.ts +10 -3
  180. package/src/op.ts +10 -1
  181. package/src/outline.ts +18 -5
  182. package/src/paths.ts +24 -2
  183. package/src/plugin.ts +3 -24
  184. package/src/policy.ts +2 -0
  185. package/src/resource.ts +67 -6
  186. package/src/resources.ts +246 -301
  187. package/src/run.ts +2 -0
  188. package/src/sandbox.ts +11 -3
  189. package/src/scenario.ts +45 -3
  190. package/src/scenarios.ts +7 -1
  191. package/src/schema.ts +10 -0
  192. package/src/secret-store-check.ts +93 -0
  193. package/src/secret-store.ts +314 -0
  194. package/src/shared.ts +35 -10
  195. package/src/sites.ts +70 -180
  196. package/src/source.ts +14 -0
  197. package/src/steps.ts +3 -1
  198. package/src/version.ts +2 -1
  199. package/src/wakeup-driver.ts +22 -6
  200. package/src/worker.ts +12 -8
  201. package/src/writer.ts +145 -56
  202. package/dist/datafile.d.ts +0 -97
  203. package/dist/datafile.js +0 -479
  204. package/dist/datafile.js.map +0 -1
  205. package/src/datafile.ts +0 -601
@@ -1 +1 @@
1
- {"version":3,"file":"writer.js","sourceRoot":"","sources":["../src/writer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../src/writer.ts"],"names":[],"mappings":"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"}
package/oxlint.json CHANGED
@@ -107,11 +107,6 @@
107
107
  }
108
108
  ]
109
109
  }
110
- },
111
- {
112
- "files": ["resources/**", "apps/*/resources/**"],
113
- "jsPlugins": ["./dist/plugin.js"],
114
- "rules": { "sanoma/data-file": "error" }
115
110
  }
116
111
  ]
117
112
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanoma-ai/workflows",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
4
4
  "description": "Business processes as TypeScript functions, run durably on DBOS",
5
5
  "keywords": [
6
6
  "approvals",
@@ -43,6 +43,10 @@
43
43
  "types": "./dist/describe.d.ts",
44
44
  "default": "./dist/describe.js"
45
45
  },
46
+ "./description": {
47
+ "types": "./dist/description.d.ts",
48
+ "default": "./dist/description.js"
49
+ },
46
50
  "./fake": {
47
51
  "types": "./dist/fake.d.ts",
48
52
  "default": "./dist/fake.js"
@@ -93,7 +97,7 @@
93
97
  },
94
98
  "devDependencies": {
95
99
  "@types/pg": "^8.23.1",
96
- "msw": "^3.0.2",
100
+ "msw": "^3.0.3",
97
101
  "srvx": "^0.11.22",
98
102
  "zod": "^4.6.5"
99
103
  },
@@ -69,11 +69,14 @@ export function applySteps(
69
69
  DBOS.runStep(
70
70
  async (): Promise<Approver | undefined> => {
71
71
  const run = runNow();
72
- for (const { op: id, input } of calls) {
72
+ for (const { op: id, input, connection } of calls) {
73
73
  const op = run.state.ops.get(id)!;
74
74
  // Parsed as the call will be, so the policy sees the same input with its defaults.
75
75
  const parsed = op.input.safeParse(input);
76
- const decision = await decide(run, op, parsed.success ? parsed.data : input);
76
+ const selected = run.sandbox
77
+ ? undefined
78
+ : await run.state.connections?.select(op.vendor, connection, run.actor.id);
79
+ const decision = await decide(run, op, parsed.success ? parsed.data : input, selected);
77
80
  if (decision.kind === "approve") return decision.approver;
78
81
  }
79
82
  return undefined;
package/src/apply.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { ConnectionRef } from "./connection.ts";
1
2
  import { z } from "zod";
2
3
  import { type Approver, defineWorkflow, type WorkflowDefinition } from "./define.ts";
3
4
  import {
@@ -17,7 +18,16 @@ import { isRunControlError } from "./errors.ts";
17
18
  import type { HostOutputs } from "./host.ts";
18
19
  import type { Binding, Bindings, Rebind } from "./lockfile.ts";
19
20
  import type { Op } from "./op.ts";
20
- import { fieldPathOf, holderOf, type PlanAction, type Resource, valueAt } from "./resource.ts";
21
+ import {
22
+ AFTER_CREATE_CALLS,
23
+ AFTER_CREATE_SECONDS,
24
+ afterCreateStuck,
25
+ fieldPathOf,
26
+ holderOf,
27
+ type PlanAction,
28
+ type Resource,
29
+ valueAt,
30
+ } from "./resource.ts";
21
31
  import type { ResourceProblem } from "./resources.ts";
22
32
  import { type APPLY_WORKFLOW, errorMessage } from "./shared.ts";
23
33
  import { SOURCE_RESOLVE } from "./source.ts";
@@ -54,7 +64,7 @@ export type ApplyInput = z.infer<typeof ApplyInput>;
54
64
  * object its identity `found` or the input `given`, ask about a `gone` object or an `orphan`ed
55
65
  * binding (unless `answer`ed), or `none`.
56
66
  */
57
- export type PlanStep = { id: string; vendor: string; type: string } & (
67
+ export type PlanStep = { id: string; vendor: string; type: string; connection?: ConnectionRef } & (
58
68
  | { action: "create"; planned: Record<string, unknown>; unknown: string[] }
59
69
  | { action: "update" | "replace"; binding: string; fields: DriftField[]; replace: string[] }
60
70
  | { action: "bind"; binding: string; source: "found" | "given" }
@@ -105,6 +115,7 @@ export interface ApplyDeclared extends DriftDeclared {
105
115
  export interface PlannedCall {
106
116
  op: string;
107
117
  input: unknown;
118
+ connection?: ConnectionRef;
108
119
  }
109
120
 
110
121
  /** What apply does that is no vendor call, each a step of its own (`apply-steps.ts`). */
@@ -145,11 +156,8 @@ type DeleteOp = Op<string, string, "delete", { id: string }, { id: string; gone:
145
156
  // listed as an import is.
146
157
  type ApplyUse = ImportOp | PlanOp | CreateOp | UpdateOp | DeleteOp | ResolveOp | "approval" | "sleep";
147
158
 
148
- /** How long apply waits between calls of an `afterCreate` operation with `until`, and how many calls it makes. */
149
- const AFTER_CREATE_SECONDS = 5;
150
- const AFTER_CREATE_CALLS = 120;
151
159
  /** An operation as `ctx` gives it, called by its id. */
152
- type Call = (input: unknown) => Promise<unknown>;
160
+ type Call = (input: unknown, options?: { connection?: ConnectionRef }) => Promise<unknown>;
153
161
 
154
162
  /** What a step's resource is called in a problem: its file, and its export. */
155
163
  const problemOf = (id: string, message: string): ResourceProblem => ({
@@ -363,13 +371,24 @@ function writesOf(
363
371
  const made = { id: `new:${at}`, export: exportOf(keyOf(step)) };
364
372
  const after = (types.get(at)?.afterCreate ?? [])
365
373
  .filter((hook) => ops.get(hook.op)?.effect === "write")
366
- .map((hook) => ({ op: hook.op, input: hook.input(made) }));
367
- return [{ op: `${at}.create`, input: { desired: desired.get(step.id) } }, ...after];
374
+ .map((hook) => ({
375
+ op: hook.op,
376
+ input: hook.input(made),
377
+ ...(hook.op.startsWith(`${step.vendor}.`) && step.connection && { connection: step.connection }),
378
+ }));
379
+ return [{ op: `${at}.create`, connection: step.connection, input: { desired: desired.get(step.id) } }, ...after];
368
380
  }
369
- if (run === "delete" && "binding" in step) return [{ op: `${at}.delete`, input: { id: step.binding } }];
381
+ if (run === "delete" && "binding" in step)
382
+ return [{ op: `${at}.delete`, connection: step.connection, input: { id: step.binding } }];
370
383
  if (run !== "update" || (step.action !== "update" && step.action !== "replace")) return [];
371
384
  const expect = { action: step.action, replace: step.replace };
372
- return [{ op: `${at}.update`, input: { id: step.binding, desired: desired.get(step.id), expect } }];
385
+ return [
386
+ {
387
+ op: `${at}.update`,
388
+ connection: step.connection,
389
+ input: { id: step.binding, desired: desired.get(step.id), expect },
390
+ },
391
+ ];
373
392
  });
374
393
  }
375
394
 
@@ -468,7 +487,12 @@ export function applyWorkflow(
468
487
  if (!("id" in by)) found.set(resource.id, by);
469
488
  else {
470
489
  try {
471
- found.set(resource.id, observed(await ctx[resource.vendor]![resource.type]!.import({ id: by.id })));
490
+ found.set(
491
+ resource.id,
492
+ observed(
493
+ await ctx[resource.vendor]![resource.type]!.import({ id: by.id }, { connection: resource.connection }),
494
+ ),
495
+ );
472
496
  } catch (err) {
473
497
  if (isRunControlError(err)) throw err;
474
498
  found.set(resource.id, { error: errorMessage(err) });
@@ -523,7 +547,11 @@ export function applyWorkflow(
523
547
  : decide(resource, result, found.get(resource.id)!, input, desired.get(resource.id)!, types, usable);
524
548
  if (next.ask !== undefined) {
525
549
  try {
526
- const answer = fromPlan(resource, result, await ctx[resource.vendor]![resource.type]!.plan(next.ask));
550
+ const answer = fromPlan(
551
+ resource,
552
+ result,
553
+ await ctx[resource.vendor]![resource.type]!.plan(next.ask, { connection: resource.connection }),
554
+ );
527
555
  if (answer.step) planned.push(answer.step);
528
556
  if (answer.problem) problems.push(answer.problem);
529
557
  } catch (err) {
@@ -541,6 +569,8 @@ export function applyWorkflow(
541
569
  steps: [...planned, ...orphaned.steps],
542
570
  };
543
571
 
572
+ for (const step of plan.steps)
573
+ step.connection = declarations.get(step.id)?.connection ?? locked[keyOf(step)]?.connection;
544
574
  const writes = writesOf(plan, desired, types, ops);
545
575
  const approver = writes.length ? await steps.holds(writes) : undefined;
546
576
  if (approver !== undefined) {
@@ -563,24 +593,31 @@ export function applyWorkflow(
563
593
  let state: State | undefined;
564
594
  try {
565
595
  if (todo === "create") {
566
- const made = await ctx[step.vendor]![step.type]!.create({
567
- desired: desiredOf(declared!, types, bindings, hosts, urls),
568
- });
569
- bindings[key] = { type, id: made.id };
596
+ const made = await ctx[step.vendor]![step.type]!.create(
597
+ {
598
+ desired: desiredOf(declared!, types, bindings, hosts, urls),
599
+ },
600
+ { connection: step.connection },
601
+ );
602
+ bindings[key] = { type, id: made.id, ...(step.connection && { connection: step.connection }) };
570
603
  state = made.state;
571
604
  } else if (todo === "update" && (step.action === "update" || step.action === "replace")) {
572
605
  const expect = { action: step.action, replace: step.replace };
573
- const changed = await ctx[step.vendor]![step.type]!.update({
574
- id: binding,
575
- desired: desiredOf(declared!, types, bindings, hosts, urls),
576
- expect,
577
- });
578
- bindings[key] = { type, id: changed.id };
606
+ const changed = await ctx[step.vendor]![step.type]!.update(
607
+ {
608
+ id: binding,
609
+ desired: desiredOf(declared!, types, bindings, hosts, urls),
610
+ expect,
611
+ },
612
+ { connection: step.connection },
613
+ );
614
+ bindings[key] = { type, id: changed.id, ...(step.connection && { connection: step.connection }) };
579
615
  state = changed.state;
580
616
  } else if (todo === "delete") {
581
- await ctx[step.vendor]![step.type]!.delete({ id: binding });
617
+ await ctx[step.vendor]![step.type]!.delete({ id: binding }, { connection: step.connection });
582
618
  delete bindings[key];
583
- } else if (todo === "bind") bindings[key] = { type, id: binding };
619
+ } else if (todo === "bind")
620
+ bindings[key] = { type, id: binding, ...(step.connection && { connection: step.connection }) };
584
621
  else if (todo === "forget") delete bindings[key];
585
622
  if (state && declared) answersAt(declared, state);
586
623
  const after = bindings[key];
@@ -591,7 +628,8 @@ export function applyWorkflow(
591
628
  }
592
629
  // Bound first, so an object made is kept whatever its `afterCreate` calls do: each by its
593
630
  // id, again every few seconds until its output passes `until`; one that never does fails
594
- // the step, and the rest are not called.
631
+ // the step, and the rest are not called. The loop `callAfterCreate` has, inline: a
632
+ // function defined here may not close over `ctx`.
595
633
  let stuck: string | undefined;
596
634
  for (const hook of todo === "create" ? (spec?.afterCreate ?? []) : []) {
597
635
  if (stuck === undefined) {
@@ -600,6 +638,7 @@ export function applyWorkflow(
600
638
  // With `until`, a failure is one more call that did not pass (a new object's vendor may
601
639
  // not know it yet); without, it fails the step.
602
640
  let output: unknown;
641
+ let failed: unknown;
603
642
  for (
604
643
  let call = 0;
605
644
  call < AFTER_CREATE_CALLS && (call === 0 || (hook.until && !hook.until(output)));
@@ -607,15 +646,17 @@ export function applyWorkflow(
607
646
  ) {
608
647
  if (call > 0) await ctx.sleep({ seconds: AFTER_CREATE_SECONDS });
609
648
  try {
610
- output = await (ctx[vendor]![group] as unknown as Record<string, Call>)[name]!(given);
649
+ output = await (ctx[vendor]![group] as unknown as Record<string, Call>)[name]!(given, {
650
+ connection: vendor === step.vendor ? step.connection : undefined,
651
+ });
652
+ failed = undefined;
611
653
  } catch (err) {
612
654
  if (isRunControlError(err) || !hook.until) throw err;
613
655
  output = undefined;
656
+ failed = err;
614
657
  }
615
658
  }
616
- if (hook.until && !hook.until(output)) {
617
- stuck = `${hook.op} did not pass in ${(AFTER_CREATE_CALLS * AFTER_CREATE_SECONDS) / 60} minutes`;
618
- }
659
+ if (hook.until && !hook.until(output)) stuck = afterCreateStuck(hook.op, failed);
619
660
  }
620
661
  }
621
662
  results.push({
package/src/approvals.ts CHANGED
@@ -82,6 +82,7 @@ export interface HeldCall {
82
82
  op: string;
83
83
  seq?: number;
84
84
  input: unknown;
85
+ connection?: string;
85
86
  reasons?: string[] | undefined;
86
87
  }
87
88
 
@@ -109,7 +110,12 @@ export async function awaitApproval(
109
110
  ...(req.details === undefined ? {} : { details: req.details }),
110
111
  requestedBy: held ? "policy" : "workflow",
111
112
  covers,
112
- ...(held && { op: held.op, ...heldOf(held), input: held.input }),
113
+ ...(held && {
114
+ op: held.op,
115
+ ...heldOf(held),
116
+ input: held.input,
117
+ ...(held.connection && { connection: held.connection }),
118
+ }),
113
119
  status: "pending",
114
120
  requestedAt: 0,
115
121
  refused: [],
package/src/apps.ts CHANGED
@@ -1,9 +1,12 @@
1
1
  import { existsSync, readdirSync } from "node:fs";
2
- import { dirname, join, relative, resolve, sep } from "node:path";
3
- import { childrenOf, type LintProblem, type Node, readSource } from "./ast.ts";
4
- import { keyName } from "./datafile.ts";
5
- import { stringValue, unwrap } from "./outline.ts";
6
- import { APPS_DIR, filesUnder, inside, isDirectory, RELATIVE } from "./paths.ts";
2
+ import { dirname, join, resolve } from "node:path";
3
+ import { z } from "zod";
4
+ import { childrenOf, type Node, readSource } from "./ast.ts";
5
+ import type { AppEntry } from "./description.ts";
6
+ import { exportsOf, type Loaded, loadModules } from "./load.ts";
7
+ import { stringValue } from "./outline.ts";
8
+ import { APPS_DIR, filesUnder, inside, isDirectory, RELATIVE, relPath } from "./paths.ts";
9
+ import type { ResourceProblem } from "./resources.ts";
7
10
  import { APP_NAME } from "./shared.ts";
8
11
 
9
12
  // A company's apps: each folder of `apps/` holds the kinds the root does (workflows, resources,
@@ -11,108 +14,74 @@ import { APP_NAME } from "./shared.ts";
11
14
  // made here. What a folder declares is named with the folder (`qualified`): never written, read
12
15
  // from where the declaration's file is (`appOfFile`).
13
16
 
14
- /** An app: a folder of `apps/`, by its name, and the source repository its `app.ts` names. */
15
- export interface AppEntry {
16
- /** The folder's name, which prefixes what it declares (`crm.contacts`) and is the app's title. */
17
- name: string;
18
- /** The folder, relative to the root, with `/`: `apps/crm`. */
19
- dir: string;
20
- /** `defineApp({ source })` in its `app.ts`: the repository it was taken from; absent for the company's own app. */
21
- source?: string;
22
- }
23
-
24
- /** What `app.ts` declares: the source repository's URL, when the app was taken from one. */
25
- export interface AppDefinition {
26
- source?: string;
27
- }
28
-
29
- /**
30
- * Declares an app in its folder's `app.ts`, read without running it: `defineApp({ source:
31
- * "https://github.com/acme/crm" })`, the repository it was taken from; `defineApp({})` for an app
32
- * the company made itself.
33
- */
34
- export function defineApp(definition: AppDefinition): AppDefinition {
35
- return Object.freeze({ ...definition });
36
- }
17
+ export type { AppEntry };
37
18
 
38
19
  /** What is wrong with a company's apps, at a file relative to the root. */
39
- export type AppProblem = LintProblem & { file: string };
20
+ export type AppProblem = ResourceProblem & { file: string };
40
21
 
41
22
  /** The apps under `root` (`appsAt`), without what is wrong with them. */
42
23
  export const readApps = (root: string | undefined): AppEntry[] => appsAt(root).apps;
43
24
 
44
25
  /**
45
26
  * The apps under `root`: each folder of `apps/` whose name is an `APP_NAME`, sorted, with what is
46
- * wrong in its `app.ts` and each folder refused for its name as `problems`. `app.ts` is read
47
- * with oxc, never run: its default export must be `defineApp({ … })`, from `sanoma`, written out,
48
- * and `source` a string.
27
+ * wrong in its `app.ts` and each folder refused for its name as `problems`. Each `app.ts` is
28
+ * loaded (`loadModules`, `defineApp` served from `sanoma`): its default export is
29
+ * `defineApp({ source })`, `source` a string when given.
49
30
  */
50
31
  export function appsAt(root: string | undefined): { apps: AppEntry[]; problems: AppProblem[] } {
51
- const dir = root === undefined ? undefined : join(root, APPS_DIR);
52
- if (dir === undefined || !isDirectory(dir)) return { apps: [], problems: [] };
32
+ if (root === undefined) return { apps: [], problems: [] };
33
+ const dir = join(root, APPS_DIR);
34
+ if (!isDirectory(dir)) return { apps: [], problems: [] };
53
35
  const apps: AppEntry[] = [];
54
36
  const problems: AppProblem[] = [];
55
37
  const folders = readdirSync(dir, { withFileTypes: true })
56
38
  .filter((d) => d.isDirectory())
57
39
  .map((d) => d.name)
58
40
  .toSorted();
59
- for (const name of folders) {
41
+ const named = folders.filter((folder) => APP_NAME.test(folder));
42
+ for (const name of folders.filter((folder) => !APP_NAME.test(folder))) {
60
43
  const at = `${APPS_DIR}/${name}`;
61
- if (!APP_NAME.test(name)) {
62
- problems.push({
63
- file: at,
64
- line: 1,
65
- column: 1,
66
- message: `${at} is not an app: an app's folder name is a lowercase letter, then lowercase letters and digits`,
67
- });
68
- continue;
69
- }
70
- const read = appOptionsOf(join(dir, name, "app.ts"));
71
- problems.push(...read.problems.map((p) => ({ file: `${at}/app.ts`, ...p })));
72
- apps.push({ name, dir: at, ...(read.source !== undefined && { source: read.source }) });
44
+ problems.push({
45
+ file: at,
46
+ line: 1,
47
+ column: 1,
48
+ message: `${at} is not an app: an app's folder name is a lowercase letter, then lowercase letters and digits`,
49
+ });
50
+ }
51
+ const files = named.map((name) => join(dir, name, "app.ts")).filter((path) => existsSync(path));
52
+ const loaded = files.length ? loadModules(root, files, []) : new Map<string, Loaded>();
53
+ for (const name of named) {
54
+ const file = `${APPS_DIR}/${name}/app.ts`;
55
+ const read = appDefinitionOf(file, loaded);
56
+ problems.push(...read.problems);
57
+ apps.push({
58
+ name,
59
+ dir: `${APPS_DIR}/${name}`,
60
+ ...(read.source !== undefined && { source: read.source }),
61
+ ...(loaded.has(file) && { at: { file, export: "default" } }),
62
+ });
73
63
  }
64
+ problems.sort((a, b) => a.file.localeCompare(b.file));
74
65
  return { apps, problems };
75
66
  }
76
67
 
77
- /** Where `defineApp` comes from in `app.ts`. */
78
- const APP_SOURCES: ReadonlySet<string> = new Set(["sanoma", "@sanoma-ai/workflows"]);
68
+ /** What `app.ts`'s default export, `defineApp({ … })`, may say. */
69
+ const AppDefinitionSchema = z.strictObject({ source: z.string().optional() });
79
70
 
80
- /** `app.ts`'s `source`, read without running it, and what is wrong there; nothing for no file. */
81
- function appOptionsOf(path: string): { source?: string; problems: LintProblem[] } {
82
- if (!existsSync(path)) return { problems: [] };
83
- const file = readSource(path);
84
- if (typeof file === "string") return { problems: [{ line: 1, column: 1, message: file }] };
85
- const problems: LintProblem[] = [...file.problems];
86
- const problem = (at: Node, message: string) => problems.push({ ...file.at(at.start), message });
87
- const unread =
88
- 'app.ts is read without running it: its default export is `defineApp({ source })` from "sanoma", written out';
89
- const exported = file.program.body.find((s: Node) => s.type === "ExportDefaultDeclaration");
90
- const call = unwrap(exported?.declaration);
91
- const callee = unwrap(call?.callee);
92
- const options = unwrap(call?.arguments?.[0]);
93
- const defineApps = new Set<string>();
94
- for (const statement of file.program.body) {
95
- if (statement.type !== "ImportDeclaration" || !APP_SOURCES.has(statement.source.value)) continue;
96
- for (const s of statement.specifiers) {
97
- if (s.type === "ImportSpecifier" && keyName(s.imported) === "defineApp") defineApps.add(s.local.name);
98
- }
99
- }
100
- const written =
101
- call?.type === "CallExpression" &&
102
- callee?.type === "Identifier" &&
103
- defineApps.has(callee.name) &&
104
- (options === undefined || options.type === "ObjectExpression");
105
- if (!written) {
106
- problem(exported ?? file.program, unread);
107
- return { problems };
71
+ /** `app.ts`'s `source`, as loading it gave, and what is wrong there; nothing for no file. */
72
+ function appDefinitionOf(file: string, answer: Map<string, Loaded>): { source?: string; problems: AppProblem[] } {
73
+ // A helper it imports threw: said at the helper.
74
+ const loaded = exportsOf(answer, file);
75
+ if (loaded === undefined) return { problems: [] };
76
+ if ("problem" in loaded) return { problems: [loaded.problem] };
77
+ const value = loaded.exports.find(([name]) => name === "default")?.[1];
78
+ const parsed = AppDefinitionSchema.safeParse(value);
79
+ if (!parsed.success) {
80
+ const why = z.prettifyError(parsed.error).replaceAll(/\s*\n\s*/g, " ");
81
+ const message = `its default export is \`defineApp({ source })\` from "sanoma", \`source\` a string: ${why}`;
82
+ return { problems: [{ file, export: "default", message }] };
108
83
  }
109
- const property = options?.properties.findLast(
110
- (p: Node) => p.type === "Property" && !p.computed && keyName(p.key) === "source",
111
- );
112
- const source = property && stringValue(property.value);
113
- if (property && source === undefined)
114
- problem(property, "`source` is read without running app.ts: write it as a string");
115
- return { ...(source !== undefined && { source }), problems };
84
+ return { ...(parsed.data.source !== undefined && { source: parsed.data.source }), problems: [] };
116
85
  }
117
86
 
118
87
  /** A source file under an app: `.ts` or `.tsx`, but a declaration. */
@@ -131,7 +100,7 @@ export function crossAppImports(root: string | undefined, apps: readonly AppEntr
131
100
  for (const path of filesUnder(own, isSource)) {
132
101
  const file = readSource(path);
133
102
  if (typeof file === "string") continue;
134
- const rel = relative(root, path).split(sep).join("/");
103
+ const rel = relPath(root, path);
135
104
  const visit = (node: Node) => {
136
105
  if (!node) return;
137
106
  const specifier =
package/src/ast.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { readFileSync } from "node:fs";
2
2
  import { parseSync, visitorKeys } from "oxc-parser";
3
+ import type { LintProblem } from "./description.ts";
3
4
  import { errorMessage } from "./shared.ts";
4
5
 
5
6
  // What the lints, the outline and the data-file reader share: one way to parse a file, walk it
@@ -30,6 +31,10 @@ const CODE_KEYS = new Map(
30
31
  Object.entries(visitorKeys).map(([type, keys]) => [type, keys.filter((key) => !TYPE_KEYS.has(key))]),
31
32
  );
32
33
 
34
+ /** A property's name: an identifier's, or a literal's as a string; undefined for any other key. */
35
+ export const keyName = (key: Node): string | undefined =>
36
+ key.type === "Identifier" ? key.name : key.type === "Literal" ? String(key.value) : undefined;
37
+
33
38
  /** A node's children in source order, by oxc-parser's `visitorKeys`, without its types. A hole in a list is `null`. */
34
39
  export const childrenOf = (node: Node): Node[] => (CODE_KEYS.get(node.type) ?? []).flatMap((key) => node[key] ?? []);
35
40
 
@@ -68,12 +73,7 @@ export function offsetOf(lineStarts: readonly number[], line: number, column: nu
68
73
  return offset < next - 1 ? offset : undefined;
69
74
  }
70
75
 
71
- /** Something wrong in a file, at a line and column from 1. */
72
- export interface LintProblem {
73
- line: number;
74
- column: number;
75
- message: string;
76
- }
76
+ export type { LintProblem };
77
77
 
78
78
  /** A file parsed, its syntax errors as problems, and offsets as lines and columns from 1. */
79
79
  export function parsed(source: string, filename: string) {
@@ -0,0 +1,74 @@
1
+ import type { z } from "zod";
2
+ import { SecretStoreError, type SecretStoreCapabilities } from "./secret-store.ts";
3
+
4
+ /** Credential schemas and lifecycle are owned by authentication, never by the store provider. */
5
+ export type Authentication<S extends z.ZodType = z.ZodType> =
6
+ | {
7
+ kind: "api-key" | "fields" | "oauth2" | "signed";
8
+ version: number;
9
+ schema: S;
10
+ storage: { writable: boolean; maxBytes: number; conditionalWrites: boolean };
11
+ }
12
+ | { kind: "workload-identity"; storage?: never; version?: never; schema?: never };
13
+
14
+ export function defineAuthentication<S extends z.ZodType>(definition: Authentication<S>): Authentication<S> {
15
+ if (definition.kind === "workload-identity") {
16
+ if (definition.storage !== undefined || definition.schema !== undefined || definition.version !== undefined)
17
+ throw new SecretStoreError("invalid_configuration");
18
+ return Object.freeze({ kind: "workload-identity" });
19
+ }
20
+ if (
21
+ !["api-key", "fields", "oauth2", "signed"].includes(definition.kind) ||
22
+ !Number.isSafeInteger(definition.version) ||
23
+ definition.version < 1 ||
24
+ typeof definition.schema?.safeParse !== "function" ||
25
+ !definition.storage ||
26
+ !Number.isSafeInteger(definition.storage.maxBytes) ||
27
+ definition.storage.maxBytes < 1 ||
28
+ typeof definition.storage.writable !== "boolean" ||
29
+ typeof definition.storage.conditionalWrites !== "boolean"
30
+ ) {
31
+ throw new SecretStoreError("invalid_configuration");
32
+ }
33
+ return Object.freeze({ ...definition, storage: Object.freeze({ ...definition.storage }) });
34
+ }
35
+
36
+ /** Compatibility check before consent, including externally renewed (read-only) OAuth bundles. */
37
+ export function checkAuthenticationStore(
38
+ auth: Authentication,
39
+ store: SecretStoreCapabilities,
40
+ management: "sanoma" | "external",
41
+ ): void {
42
+ if (auth.kind === "workload-identity") return;
43
+ if (auth.storage.maxBytes > store.maxBytes) throw new SecretStoreError("too_large");
44
+ if (auth.storage.writable && (management === "external" || !store.writable)) throw new SecretStoreError("read_only");
45
+ if (auth.storage.conditionalWrites && store.conditionalWrites === "none") throw new SecretStoreError("unsupported");
46
+ }
47
+
48
+ /** Serialized only at the trusted store boundary, never returned by an operation to a workflow. */
49
+ export function encodeCredentials<S extends z.ZodType>(auth: Authentication<S>, value: z.input<S>): string {
50
+ if (auth.kind === "workload-identity") throw new SecretStoreError("unsupported");
51
+ try {
52
+ const parsed = auth.schema.safeParse(value);
53
+ if (!parsed.success) throw new SecretStoreError("invalid_value");
54
+ const encoded = JSON.stringify({ version: auth.version, value: parsed.data });
55
+ if (Buffer.byteLength(encoded) > auth.storage.maxBytes) throw new SecretStoreError("too_large");
56
+ return encoded;
57
+ } catch (error) {
58
+ if (error instanceof SecretStoreError) throw new SecretStoreError(error.code);
59
+ throw new SecretStoreError("invalid_value");
60
+ }
61
+ }
62
+
63
+ export function decodeCredentials<S extends z.ZodType>(auth: Authentication<S>, encoded: string): z.output<S> {
64
+ if (auth.kind === "workload-identity") throw new SecretStoreError("unsupported");
65
+ try {
66
+ if (Buffer.byteLength(encoded) > auth.storage.maxBytes) throw new SecretStoreError("too_large");
67
+ const bundle = JSON.parse(encoded);
68
+ if (bundle?.version !== auth.version) throw new SecretStoreError("invalid_value");
69
+ return auth.schema.parse(bundle.value);
70
+ } catch (error) {
71
+ if (error instanceof SecretStoreError) throw new SecretStoreError(error.code);
72
+ throw new SecretStoreError("invalid_value");
73
+ }
74
+ }