@kindgi/cli 0.1.8-rc.0 → 0.1.9-rc.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 (265) hide show
  1. package/README.md +59 -2
  2. package/dist/api-address.d.ts +104 -12
  3. package/dist/api-address.d.ts.map +1 -1
  4. package/dist/api-address.js +169 -30
  5. package/dist/api-address.js.map +1 -1
  6. package/dist/cli.js +12 -2
  7. package/dist/cli.js.map +1 -1
  8. package/dist/commands/approvals.d.ts.map +1 -1
  9. package/dist/commands/approvals.js +15 -3
  10. package/dist/commands/approvals.js.map +1 -1
  11. package/dist/commands/auth.d.ts.map +1 -1
  12. package/dist/commands/auth.js +27 -0
  13. package/dist/commands/auth.js.map +1 -1
  14. package/dist/commands/build.d.ts +18 -0
  15. package/dist/commands/build.d.ts.map +1 -1
  16. package/dist/commands/build.js +118 -13
  17. package/dist/commands/build.js.map +1 -1
  18. package/dist/commands/conversations.d.ts.map +1 -1
  19. package/dist/commands/conversations.js +13 -3
  20. package/dist/commands/conversations.js.map +1 -1
  21. package/dist/commands/deploy.d.ts.map +1 -1
  22. package/dist/commands/deploy.js +235 -53
  23. package/dist/commands/deploy.js.map +1 -1
  24. package/dist/commands/deployments.d.ts +3 -0
  25. package/dist/commands/deployments.d.ts.map +1 -0
  26. package/dist/commands/deployments.js +196 -0
  27. package/dist/commands/deployments.js.map +1 -0
  28. package/dist/commands/doctor.d.ts +1 -5
  29. package/dist/commands/doctor.d.ts.map +1 -1
  30. package/dist/commands/doctor.js +42 -22
  31. package/dist/commands/doctor.js.map +1 -1
  32. package/dist/commands/egress.d.ts +9 -0
  33. package/dist/commands/egress.d.ts.map +1 -0
  34. package/dist/commands/egress.js +40 -0
  35. package/dist/commands/egress.js.map +1 -0
  36. package/dist/commands/env-scoped.d.ts +5 -0
  37. package/dist/commands/env-scoped.d.ts.map +1 -1
  38. package/dist/commands/env-scoped.js +64 -19
  39. package/dist/commands/env-scoped.js.map +1 -1
  40. package/dist/commands/env.d.ts.map +1 -1
  41. package/dist/commands/env.js +91 -30
  42. package/dist/commands/env.js.map +1 -1
  43. package/dist/commands/environments.d.ts +6 -0
  44. package/dist/commands/environments.d.ts.map +1 -0
  45. package/dist/commands/environments.js +166 -0
  46. package/dist/commands/environments.js.map +1 -0
  47. package/dist/commands/exports.d.ts.map +1 -1
  48. package/dist/commands/exports.js +118 -3
  49. package/dist/commands/exports.js.map +1 -1
  50. package/dist/commands/feedback.d.ts +1 -2
  51. package/dist/commands/feedback.d.ts.map +1 -1
  52. package/dist/commands/feedback.js +55 -24
  53. package/dist/commands/feedback.js.map +1 -1
  54. package/dist/commands/helpers.d.ts +6 -0
  55. package/dist/commands/helpers.d.ts.map +1 -1
  56. package/dist/commands/helpers.js +8 -0
  57. package/dist/commands/helpers.js.map +1 -1
  58. package/dist/commands/index.d.ts.map +1 -1
  59. package/dist/commands/index.js +12 -0
  60. package/dist/commands/index.js.map +1 -1
  61. package/dist/commands/license.d.ts +3 -0
  62. package/dist/commands/license.d.ts.map +1 -1
  63. package/dist/commands/license.js +1 -1
  64. package/dist/commands/license.js.map +1 -1
  65. package/dist/commands/people.d.ts.map +1 -1
  66. package/dist/commands/people.js +105 -10
  67. package/dist/commands/people.js.map +1 -1
  68. package/dist/commands/projects.d.ts.map +1 -1
  69. package/dist/commands/projects.js +133 -11
  70. package/dist/commands/projects.js.map +1 -1
  71. package/dist/commands/promote.d.ts +38 -0
  72. package/dist/commands/promote.d.ts.map +1 -0
  73. package/dist/commands/promote.js +371 -0
  74. package/dist/commands/promote.js.map +1 -0
  75. package/dist/commands/proposals.d.ts.map +1 -1
  76. package/dist/commands/proposals.js +2 -1
  77. package/dist/commands/proposals.js.map +1 -1
  78. package/dist/commands/providers.d.ts.map +1 -1
  79. package/dist/commands/providers.js +29 -5
  80. package/dist/commands/providers.js.map +1 -1
  81. package/dist/commands/schedules.d.ts.map +1 -1
  82. package/dist/commands/schedules.js +30 -2
  83. package/dist/commands/schedules.js.map +1 -1
  84. package/dist/commands/secrets.d.ts.map +1 -1
  85. package/dist/commands/secrets.js +65 -40
  86. package/dist/commands/secrets.js.map +1 -1
  87. package/dist/commands/sign-in.d.ts +3 -0
  88. package/dist/commands/sign-in.d.ts.map +1 -0
  89. package/dist/commands/sign-in.js +61 -0
  90. package/dist/commands/sign-in.js.map +1 -0
  91. package/dist/commands/sites.d.ts +3 -0
  92. package/dist/commands/sites.d.ts.map +1 -0
  93. package/dist/commands/sites.js +244 -0
  94. package/dist/commands/sites.js.map +1 -0
  95. package/dist/commands/tools.d.ts.map +1 -1
  96. package/dist/commands/tools.js +2 -2
  97. package/dist/commands/tools.js.map +1 -1
  98. package/dist/commands/types.d.ts +11 -0
  99. package/dist/commands/types.d.ts.map +1 -1
  100. package/dist/commands/webhooks.d.ts.map +1 -1
  101. package/dist/commands/webhooks.js +38 -2
  102. package/dist/commands/webhooks.js.map +1 -1
  103. package/dist/config.d.ts +13 -0
  104. package/dist/config.d.ts.map +1 -1
  105. package/dist/config.js +20 -7
  106. package/dist/config.js.map +1 -1
  107. package/dist/context.d.ts +38 -2
  108. package/dist/context.d.ts.map +1 -1
  109. package/dist/context.js +12 -1
  110. package/dist/context.js.map +1 -1
  111. package/dist/deploy/defaults.d.ts.map +1 -1
  112. package/dist/deploy/defaults.js +7 -1
  113. package/dist/deploy/defaults.js.map +1 -1
  114. package/dist/deploy/pack-service-text.d.ts +29 -0
  115. package/dist/deploy/pack-service-text.d.ts.map +1 -0
  116. package/dist/deploy/pack-service-text.js +72 -0
  117. package/dist/deploy/pack-service-text.js.map +1 -0
  118. package/dist/deploy/post.d.ts +17 -4
  119. package/dist/deploy/post.d.ts.map +1 -1
  120. package/dist/deploy/post.js +177 -60
  121. package/dist/deploy/post.js.map +1 -1
  122. package/dist/deploy/promotion-path.d.ts +44 -0
  123. package/dist/deploy/promotion-path.d.ts.map +1 -0
  124. package/dist/deploy/promotion-path.js +86 -0
  125. package/dist/deploy/promotion-path.js.map +1 -0
  126. package/dist/deploy/response.d.ts +3 -0
  127. package/dist/deploy/response.d.ts.map +1 -1
  128. package/dist/deploy/response.js +66 -12
  129. package/dist/deploy/response.js.map +1 -1
  130. package/dist/deploy/runners.d.ts +99 -5
  131. package/dist/deploy/runners.d.ts.map +1 -1
  132. package/dist/dev/java-builder.d.ts.map +1 -1
  133. package/dist/dev/java-builder.js +19 -3
  134. package/dist/dev/java-builder.js.map +1 -1
  135. package/dist/dev/python-builder.d.ts.map +1 -1
  136. package/dist/dev/python-builder.js +18 -3
  137. package/dist/dev/python-builder.js.map +1 -1
  138. package/dist/dev/runtime-container.d.ts +28 -3
  139. package/dist/dev/runtime-container.d.ts.map +1 -1
  140. package/dist/dev/runtime-container.js +103 -36
  141. package/dist/dev/runtime-container.js.map +1 -1
  142. package/dist/dev/runtime-image.d.ts +1 -1
  143. package/dist/dev/runtime-image.js +1 -1
  144. package/dist/dev/scala-builder.d.ts.map +1 -1
  145. package/dist/dev/scala-builder.js +55 -21
  146. package/dist/dev/scala-builder.js.map +1 -1
  147. package/dist/dev/shared-watch.d.ts +30 -0
  148. package/dist/dev/shared-watch.d.ts.map +1 -1
  149. package/dist/dev/shared-watch.js +46 -1
  150. package/dist/dev/shared-watch.js.map +1 -1
  151. package/dist/env/pack-env-hint.d.ts +52 -0
  152. package/dist/env/pack-env-hint.d.ts.map +1 -0
  153. package/dist/env/pack-env-hint.js +57 -0
  154. package/dist/env/pack-env-hint.js.map +1 -0
  155. package/dist/env/pack-env-plan.d.ts +2 -0
  156. package/dist/env/pack-env-plan.d.ts.map +1 -1
  157. package/dist/env/pack-env-plan.js +2 -1
  158. package/dist/env/pack-env-plan.js.map +1 -1
  159. package/dist/env-projects.d.ts +23 -0
  160. package/dist/env-projects.d.ts.map +1 -0
  161. package/dist/env-projects.js +28 -0
  162. package/dist/env-projects.js.map +1 -0
  163. package/dist/exports/create.d.ts +71 -0
  164. package/dist/exports/create.d.ts.map +1 -0
  165. package/dist/exports/create.js +576 -0
  166. package/dist/exports/create.js.map +1 -0
  167. package/dist/exports/plan.d.ts +69 -0
  168. package/dist/exports/plan.d.ts.map +1 -0
  169. package/dist/exports/plan.js +496 -0
  170. package/dist/exports/plan.js.map +1 -0
  171. package/dist/exports/reader.d.ts +48 -0
  172. package/dist/exports/reader.d.ts.map +1 -0
  173. package/dist/exports/reader.js +181 -0
  174. package/dist/exports/reader.js.map +1 -0
  175. package/dist/feedback/entries.d.ts +53 -0
  176. package/dist/feedback/entries.d.ts.map +1 -0
  177. package/dist/feedback/entries.js +173 -0
  178. package/dist/feedback/entries.js.map +1 -0
  179. package/dist/feedback/intake.d.ts +37 -0
  180. package/dist/feedback/intake.d.ts.map +1 -0
  181. package/dist/feedback/intake.js +101 -0
  182. package/dist/feedback/intake.js.map +1 -0
  183. package/dist/feedback/protocol.d.ts +111 -0
  184. package/dist/feedback/protocol.d.ts.map +1 -0
  185. package/dist/feedback/protocol.js +143 -0
  186. package/dist/feedback/protocol.js.map +1 -0
  187. package/dist/feedback/redact.d.ts +34 -0
  188. package/dist/feedback/redact.d.ts.map +1 -0
  189. package/dist/feedback/redact.js +258 -0
  190. package/dist/feedback/redact.js.map +1 -0
  191. package/dist/feedback/report.d.ts +51 -0
  192. package/dist/feedback/report.d.ts.map +1 -0
  193. package/dist/feedback/report.js +122 -0
  194. package/dist/feedback/report.js.map +1 -0
  195. package/dist/feedback/run.d.ts +21 -0
  196. package/dist/feedback/run.d.ts.map +1 -0
  197. package/dist/feedback/run.js +578 -0
  198. package/dist/feedback/run.js.map +1 -0
  199. package/dist/feedback/store.d.ts +24 -0
  200. package/dist/feedback/store.d.ts.map +1 -0
  201. package/dist/feedback/store.js +117 -0
  202. package/dist/feedback/store.js.map +1 -0
  203. package/dist/main.d.ts +6 -0
  204. package/dist/main.d.ts.map +1 -1
  205. package/dist/main.js +86 -5
  206. package/dist/main.js.map +1 -1
  207. package/dist/node-version.d.ts +13 -0
  208. package/dist/node-version.d.ts.map +1 -0
  209. package/dist/node-version.js +37 -0
  210. package/dist/node-version.js.map +1 -0
  211. package/dist/parse.d.ts +8 -2
  212. package/dist/parse.d.ts.map +1 -1
  213. package/dist/parse.js +7 -2
  214. package/dist/parse.js.map +1 -1
  215. package/dist/project-ref.d.ts +44 -0
  216. package/dist/project-ref.d.ts.map +1 -0
  217. package/dist/project-ref.js +69 -0
  218. package/dist/project-ref.js.map +1 -0
  219. package/dist/sdk-skills/kindgi-authoring-agents/SKILL.md +15 -2
  220. package/dist/sdk-skills/kindgi-authoring-flows/SKILL.md +1 -1
  221. package/dist/sdk-skills/kindgi-authoring-guardrails/SKILL.md +44 -7
  222. package/dist/sdk-skills/kindgi-authoring-mcp-servers/SKILL.md +11 -2
  223. package/dist/sdk-skills/kindgi-authoring-providers/SKILL.md +60 -13
  224. package/dist/sdk-skills/kindgi-authoring-tools/SKILL.md +19 -2
  225. package/dist/sdk-skills/kindgi-framework-feedback/SKILL.md +82 -3
  226. package/dist/sdk-skills/kindgi-getting-started/SKILL.md +1 -1
  227. package/dist/sdk-skills/kindgi-java-authoring-agents/SKILL.md +17 -3
  228. package/dist/sdk-skills/kindgi-java-authoring-flows/SKILL.md +1 -1
  229. package/dist/sdk-skills/kindgi-java-authoring-guardrails/SKILL.md +43 -6
  230. package/dist/sdk-skills/kindgi-java-authoring-tools/SKILL.md +19 -2
  231. package/dist/sdk-skills/kindgi-java-getting-started/SKILL.md +1 -1
  232. package/dist/sdk-skills/kindgi-python-authoring-agents/SKILL.md +17 -3
  233. package/dist/sdk-skills/kindgi-python-authoring-flows/SKILL.md +1 -1
  234. package/dist/sdk-skills/kindgi-python-authoring-guardrails/SKILL.md +49 -13
  235. package/dist/sdk-skills/kindgi-python-authoring-tools/SKILL.md +27 -3
  236. package/dist/sdk-skills/kindgi-python-getting-started/SKILL.md +1 -1
  237. package/dist/sdk-skills/kindgi-scala-authoring-agents/SKILL.md +17 -3
  238. package/dist/sdk-skills/kindgi-scala-authoring-flows/SKILL.md +1 -1
  239. package/dist/sdk-skills/kindgi-scala-authoring-guardrails/SKILL.md +43 -6
  240. package/dist/sdk-skills/kindgi-scala-authoring-tools/SKILL.md +19 -2
  241. package/dist/sdk-skills/kindgi-scala-getting-started/SKILL.md +1 -1
  242. package/dist/sdk-skills/kindgi-using/SKILL.md +1 -1
  243. package/dist/slug.d.ts +18 -0
  244. package/dist/slug.d.ts.map +1 -0
  245. package/dist/slug.js +29 -0
  246. package/dist/slug.js.map +1 -0
  247. package/dist/templates/drupal/AGENTS.md +2 -0
  248. package/dist/templates/java/AGENTS.md +2 -0
  249. package/dist/templates/minimal/AGENTS.md +2 -0
  250. package/dist/templates/python/AGENTS.md +2 -0
  251. package/dist/templates/sample/AGENTS.md +2 -0
  252. package/dist/templates/scala/AGENTS.md +2 -0
  253. package/dist/templates/woocommerce/AGENTS.md +11 -4
  254. package/dist/templates/woocommerce/README.md.tmpl +47 -4
  255. package/dist/templates/woocommerce/agents/store-agent/index.test.ts.tmpl +13 -0
  256. package/dist/templates/woocommerce/agents/store-agent/index.ts.tmpl +11 -1
  257. package/dist/templates/woocommerce/tools/publish-product/index.ts.tmpl +7 -1
  258. package/dist/templates/woocommerce/tools/refund/index.ts.tmpl +7 -2
  259. package/dist/templates/woocommerce/tools/refund-large/index.ts.tmpl +8 -2
  260. package/dist/templates/woocommerce/tools/set-price/index.ts.tmpl +6 -0
  261. package/dist/value-target.d.ts +139 -0
  262. package/dist/value-target.d.ts.map +1 -0
  263. package/dist/value-target.js +231 -0
  264. package/dist/value-target.js.map +1 -0
  265. package/package.json +13 -13
@@ -0,0 +1,576 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+ /**
4
+ * `kindgi exports create`: everything the workspace holds, read through
5
+ * the API, written as files in one folder.
6
+ *
7
+ * - Each kind in `EXPORT_PLAN` becomes `<kind>.jsonl`, written to
8
+ * `<kind>.jsonl.partial` and renamed when its last record is in, so a
9
+ * file that's there is whole.
10
+ * - `manifest.json` says, after every kind, what was exported, from where,
11
+ * and each kind's outcome: `ok` (its file and record count), `skipped`
12
+ * (and why) or `failed` (the error). A kind that fails doesn't stop the
13
+ * others. `--resume` reads it and skips the kinds already `ok`.
14
+ * - Then the signed exports, under `signed/`: each decided approval's audit
15
+ * bundle, each run's provenance, and the compliance evidence, each a
16
+ * `POST` the server records as an `export-signed` audit event.
17
+ */
18
+ import { randomUUID } from 'node:crypto';
19
+ import { createReadStream, createWriteStream } from 'node:fs';
20
+ import { chmod, mkdir, readFile, readdir, rename, rm, writeFile } from 'node:fs/promises';
21
+ import { join } from 'node:path';
22
+ import { createInterface } from 'node:readline';
23
+ import { pipeline } from 'node:stream/promises';
24
+ import { EXPORT_PLAN } from './plan.js';
25
+ import { ReadError, fillRoute } from './reader.js';
26
+ export const MANIFEST_FILE = 'manifest.json';
27
+ /** The export holds the whole workspace, so only its owner may read it. */
28
+ const FOLDER_MODE = 0o700;
29
+ const FILE_MODE = 0o600;
30
+ /** What an export never holds, in the manifest's words. */
31
+ export const NEVER_EXPORTED = [
32
+ "Secret values: the API never answers them. secrets.jsonl and secret-versions.jsonl hold each secret's name, scope and versions.",
33
+ "Pack images: build them again from the packs' sources.",
34
+ "Pack and run logs: the server's logging keeps them, not the workspace's API.",
35
+ ];
36
+ /** The signed exports, by the name the manifest gives them. */
37
+ export const SIGNED = {
38
+ approvals: 'signed/approvals',
39
+ provenance: 'signed/provenance',
40
+ evidence: 'signed/compliance-evidence',
41
+ };
42
+ /** The approval statuses an audit bundle is made for: a decided approval's. */
43
+ const DECIDED = new Set(['approved', 'rejected', 'escalated', 'expired', 'withdrawn']);
44
+ /** Export the workspace; the manifest, as written last. */
45
+ export async function createExport(input) {
46
+ const now = input.now ?? (() => new Date());
47
+ const progress = input.progress ?? (() => undefined);
48
+ const earlier = await prepareFolder(input);
49
+ const started = now().toISOString();
50
+ // The tenant's state as each read found it: at the start, and at the end.
51
+ const states = [await tenantState(input.reader)];
52
+ const kinds = { ...(earlier?.kinds ?? {}) };
53
+ const manifest = (finishedAt) => ({
54
+ cliVersion: input.cliVersion,
55
+ server: input.server,
56
+ tenant: { id: input.tenantId, ...lastState(states) },
57
+ startedAt: earlier?.startedAt ?? started,
58
+ ...(finishedAt !== undefined && { finishedAt }),
59
+ consistency: consistencyOf(states, earlier),
60
+ kinds,
61
+ neverExported: NEVER_EXPORTED,
62
+ });
63
+ const save = (finishedAt) => writeAtomically(join(input.out, MANIFEST_FILE), `${JSON.stringify(manifest(finishedAt), null, 2)}\n`);
64
+ const ctx = { ...input, now, kinds };
65
+ const steps = [
66
+ ...EXPORT_PLAN.map((kind) => ({
67
+ name: kind.name,
68
+ writes: [
69
+ `${kind.name}.jsonl`,
70
+ `${kind.name}.jsonl.partial`,
71
+ ...(kind.bytes === undefined ? [] : [kind.bytes.dir]),
72
+ ],
73
+ run: () => exportKind(ctx, kind),
74
+ })),
75
+ { name: SIGNED.approvals, writes: [SIGNED.approvals], run: () => signApprovals(ctx) },
76
+ { name: SIGNED.provenance, writes: [SIGNED.provenance], run: () => signProvenance(ctx) },
77
+ {
78
+ name: SIGNED.evidence,
79
+ writes: [`${SIGNED.evidence}.json`, `${SIGNED.evidence}.json.partial`],
80
+ run: () => signEvidence(ctx),
81
+ },
82
+ ];
83
+ const stopped = () => input.stopSignal?.aborted === true;
84
+ await save();
85
+ // A kind is `ok` only when what it's read from was, so keeping the `ok`
86
+ // ones never leaves a kind read from data this run read again.
87
+ for (const { name, writes, run } of steps) {
88
+ if (stopped())
89
+ break;
90
+ if (kinds[name]?.status === 'ok')
91
+ continue;
92
+ // Each kind is whole or absent: what a run that stopped part way left
93
+ // of it goes before it's read, and what this read wrote goes unless
94
+ // it's `ok`.
95
+ await clear(input.out, writes);
96
+ const outcome = await run();
97
+ if (outcome.status !== 'ok')
98
+ await clear(input.out, writes);
99
+ // Stopped part way: the kind is left for --resume, not marked failed.
100
+ if (stopped() && outcome.status === 'failed')
101
+ break;
102
+ kinds[name] = outcome;
103
+ progress(progressLine(name, outcome));
104
+ await save();
105
+ }
106
+ const finished = stopped() ? undefined : now().toISOString();
107
+ // A tenant closing or suspended at the start may be active again now.
108
+ if (finished !== undefined)
109
+ states.push(await tenantState(input.reader));
110
+ await save(finished);
111
+ return manifest(finished);
112
+ }
113
+ /** The kinds a kind is read from: its parent, or, read at each env and scope, what lists them. */
114
+ function needsOf(kind) {
115
+ if (kind.parent !== undefined)
116
+ return [kind.parent.kind];
117
+ if (kind.envScoped === true)
118
+ return ['environments', 'orgs', 'projects'];
119
+ return [];
120
+ }
121
+ /** Check `out`: new or empty, or, with `--resume`, an export of this tenant on this server. Its manifest, when resuming. */
122
+ async function prepareFolder(input) {
123
+ let entries;
124
+ try {
125
+ entries = await readdir(input.out);
126
+ }
127
+ catch (err) {
128
+ if (err.code !== 'ENOENT')
129
+ throw err;
130
+ entries = [];
131
+ }
132
+ if (!input.resume) {
133
+ if (entries.length > 0) {
134
+ throw new Error(`${input.out} isn't empty. Name a new or empty folder with --out, or pass --resume to finish the export that's there.`);
135
+ }
136
+ await mkdir(input.out, { recursive: true, mode: FOLDER_MODE });
137
+ // A folder that was there keeps its mode through `mkdir`.
138
+ await chmod(input.out, FOLDER_MODE);
139
+ return undefined;
140
+ }
141
+ let earlier;
142
+ try {
143
+ earlier = JSON.parse(await readFile(join(input.out, MANIFEST_FILE), 'utf8'));
144
+ }
145
+ catch (err) {
146
+ if (err.code === 'ENOENT') {
147
+ throw new Error(`${input.out} has no ${MANIFEST_FILE}, so there's no export there to resume. Leave out --resume to start one in a new or empty folder.`);
148
+ }
149
+ throw new Error(`${join(input.out, MANIFEST_FILE)} isn't an export's manifest: ${err.message}`);
150
+ }
151
+ if (earlier.server !== input.server || earlier.tenant?.id !== input.tenantId) {
152
+ throw new Error(`${input.out} holds an export of tenant ${earlier.tenant?.id} from ${earlier.server}, not of tenant ${input.tenantId} from ${input.server}. Resume it against that server and tenant, or start a new export in a new or empty folder.`);
153
+ }
154
+ await chmod(input.out, FOLDER_MODE);
155
+ return earlier;
156
+ }
157
+ async function tenantState(reader) {
158
+ try {
159
+ const tenant = (await reader.one('/v1/tenant'));
160
+ return typeof tenant.state === 'string' ? tenant.state : undefined;
161
+ }
162
+ catch {
163
+ // The tenant kind says what went wrong.
164
+ return undefined;
165
+ }
166
+ }
167
+ /** The state the last read found, for the manifest. */
168
+ function lastState(states) {
169
+ const state = states.findLast((s) => s !== undefined);
170
+ return state === undefined ? {} : { state };
171
+ }
172
+ const CHANGING = "Records can change while the export reads them, so the files are each kind as it stood when it was read (its `at`), not one moment's snapshot.";
173
+ /**
174
+ * How far the files agree. A closing or suspended tenant changes only by
175
+ * deletes, revocations and erasures, so its files agree, when it was
176
+ * closing or suspended through every run of the export: at each run's start
177
+ * and end (an earlier run's manifest says whether it was).
178
+ */
179
+ function consistencyOf(states, earlier) {
180
+ const frozen = (s) => s === 'closing' || s === 'suspended';
181
+ const frozenBefore = earlier === undefined || (frozen(earlier.tenant?.state) && earlier.consistency !== CHANGING);
182
+ if (states.every((s) => frozen(s)) && frozenBefore) {
183
+ return `The tenant is ${states.at(-1)}: nothing in it changes but deletes, revocations and erasures, so the files agree with each other, but for one of those made while the export ran.`;
184
+ }
185
+ return CHANGING;
186
+ }
187
+ function progressLine(name, outcome) {
188
+ switch (outcome.status) {
189
+ case 'ok': {
190
+ const gone = outcome.gone === undefined ? '' : `, ${outcome.gone} gone before they could be read`;
191
+ return `${name}: ${outcome.records} ${outcome.records === 1 ? 'record' : 'records'}${gone}\n`;
192
+ }
193
+ case 'skipped':
194
+ return `${name}: skipped, ${outcome.reason}\n`;
195
+ case 'failed':
196
+ return `${name}: failed, ${outcome.error}\n`;
197
+ }
198
+ }
199
+ /** One kind: its file written whole, or what stopped it. */
200
+ async function exportKind(ctx, kind) {
201
+ const unmet = unmetNeed(ctx, kind);
202
+ if (unmet !== undefined)
203
+ return { status: 'skipped', reason: unmet };
204
+ const file = `${kind.name}.jsonl`;
205
+ const partial = join(ctx.out, `${file}.partial`);
206
+ const tally = { records: 0, gone: 0 };
207
+ const sink = await openLines(partial);
208
+ try {
209
+ for await (const line of linesOf(ctx, kind, tally)) {
210
+ await sink.write(line);
211
+ tally.records++;
212
+ }
213
+ await sink.close();
214
+ if (kind.bytes !== undefined)
215
+ await writeBytes(ctx, kind, partial, tally);
216
+ await rename(partial, join(ctx.out, file));
217
+ }
218
+ catch (err) {
219
+ await sink.close().catch(() => undefined);
220
+ const notServed = notServedBy(err, kind, tally.records);
221
+ if (notServed !== undefined)
222
+ return { status: 'skipped', reason: notServed.message };
223
+ return { status: 'failed', error: err.message };
224
+ }
225
+ return ok(ctx, file, tally);
226
+ }
227
+ /** A route of a kind's (a child's, an item's, its bytes') that this server doesn't serve. */
228
+ class NotServed extends Error {
229
+ constructor(route, status) {
230
+ super(`this server doesn't serve ${route} (${status})`);
231
+ this.name = 'NotServed';
232
+ }
233
+ }
234
+ /**
235
+ * Why a kind is skipped as not served, if it is: a route under it isn't
236
+ * served, or its own route isn't. A top-level route that answers `404`
237
+ * before any record isn't served either: what it lists can't be gone.
238
+ */
239
+ function notServedBy(err, kind, records) {
240
+ if (err instanceof NotServed)
241
+ return err;
242
+ if (!(err instanceof ReadError) || kind.parent !== undefined)
243
+ return undefined;
244
+ if (isNotServed(err) || (records === 0 && err.status === 404)) {
245
+ return new NotServed(kind.route, err.status);
246
+ }
247
+ return undefined;
248
+ }
249
+ /** A route this server doesn't serve: one it doesn't mount (`404 route-not-found`), or `501`. */
250
+ function isNotServed(err) {
251
+ return (err instanceof ReadError &&
252
+ (err.status === 501 || (err.status === 404 && err.code === 'route-not-found')));
253
+ }
254
+ /** Stops the kind as not served when `route` isn't. */
255
+ function throwIfNotServed(err, route) {
256
+ if (isNotServed(err))
257
+ throw new NotServed(route, err.status);
258
+ }
259
+ /** What a kind writes, removed: its files, and its folders with what's in them. */
260
+ async function clear(out, writes) {
261
+ for (const path of writes)
262
+ await rm(join(out, path), { recursive: true, force: true });
263
+ }
264
+ function ok(ctx, file, tally) {
265
+ return {
266
+ status: 'ok',
267
+ file,
268
+ records: tally.records,
269
+ at: ctx.now().toISOString(),
270
+ ...(tally.gone > 0 && { gone: tally.gone }),
271
+ ...((tally.withoutMessages ?? 0) > 0 && { withoutMessages: tally.withoutMessages }),
272
+ };
273
+ }
274
+ /** Why a kind can't be read now, if it can't. */
275
+ function unmetNeed(ctx, kind) {
276
+ if (kind.admin === true && !ctx.admin)
277
+ return 'it needs a tenant admin';
278
+ const missing = needsOf(kind).filter((name) => ctx.kinds[name]?.status !== 'ok');
279
+ if (missing.length === 0)
280
+ return undefined;
281
+ return `it's read for each record of ${missing.join(', ')}, which ${missing.length === 1 ? "wasn't" : "weren't"} exported`;
282
+ }
283
+ /** Each line of a kind's file, as JSON text. */
284
+ function linesOf(ctx, kind, tally) {
285
+ return kind.parent === undefined
286
+ ? topLines(ctx, kind, tally)
287
+ : childLines(ctx, kind, kind.parent, tally);
288
+ }
289
+ /** A child kind's lines: for each parent record, its children, each with its parent. */
290
+ async function* childLines(ctx, kind, parent, tally) {
291
+ for await (const record of recordsOf(ctx, parent.kind)) {
292
+ const params = fieldsOf(record, parent.params, parent.kind);
293
+ const query = {
294
+ ...kind.query,
295
+ ...(kind.envScoped === true ? envScopeOf(record, parent.kind) : {}),
296
+ };
297
+ try {
298
+ for await (const item of read(ctx.reader, kind, fillRoute(kind.route, params), query)) {
299
+ yield `${JSON.stringify({ parent: params, item })}\n`;
300
+ }
301
+ }
302
+ catch (err) {
303
+ throwIfNotServed(err, kind.route);
304
+ if (!isGone(err))
305
+ throw err;
306
+ tally.gone++;
307
+ }
308
+ }
309
+ }
310
+ /** A top-level kind's lines: each record listed, at each env and scope if it has them, or each item's own record. */
311
+ async function* topLines(ctx, kind, tally) {
312
+ const query = kind.query ?? {};
313
+ const queries = kind.envScoped === true ? await envScopes(ctx, query) : [query];
314
+ for (const q of queries) {
315
+ for await (const listed of read(ctx.reader, kind, kind.route, q)) {
316
+ const record = kind.item === undefined ? listed : await fullRecord(ctx, kind, kind.item, listed);
317
+ if (record === GONE) {
318
+ tally.gone++;
319
+ continue;
320
+ }
321
+ yield `${JSON.stringify(record)}\n`;
322
+ }
323
+ }
324
+ }
325
+ const GONE = Symbol('gone');
326
+ /** A listed record's own route's answer, or `GONE` when it was deleted since it was listed. */
327
+ async function fullRecord(ctx, kind, item, listed) {
328
+ const params = fieldsOf(listed, item.params, kind.name);
329
+ try {
330
+ return await ctx.reader.one(fillRoute(item.route, params));
331
+ }
332
+ catch (err) {
333
+ throwIfNotServed(err, item.route);
334
+ if (!isGone(err))
335
+ throw err;
336
+ return GONE;
337
+ }
338
+ }
339
+ /**
340
+ * A `404` for a record that was listed: deleted between the two reads.
341
+ * Asked after `throwIfNotServed`, since a route the server doesn't mount
342
+ * answers `404` too.
343
+ */
344
+ function isGone(err) {
345
+ return err instanceof ReadError && err.status === 404;
346
+ }
347
+ /** A route's records, as its paging reads them. */
348
+ async function* read(reader, kind, path, query) {
349
+ switch (kind.paging) {
350
+ case 'cursor':
351
+ yield* reader.pages(path, query);
352
+ return;
353
+ case 'whole':
354
+ yield* await reader.whole(path, query);
355
+ return;
356
+ case 'one':
357
+ yield await reader.one(path, query);
358
+ return;
359
+ }
360
+ }
361
+ /** The records in an exported kind's file: each line, or its `item` for a child kind. */
362
+ async function* recordsOf(ctx, name) {
363
+ const wrapped = EXPORT_PLAN.find((k) => k.name === name)?.parent !== undefined;
364
+ const lines = createInterface({
365
+ input: createReadStream(join(ctx.out, `${name}.jsonl`)),
366
+ crlfDelay: Number.POSITIVE_INFINITY,
367
+ });
368
+ for await (const line of lines) {
369
+ if (line === '')
370
+ continue;
371
+ const value = JSON.parse(line);
372
+ yield wrapped ? value.item : value;
373
+ }
374
+ }
375
+ /** The values a route's path takes, from a record's fields. */
376
+ function fieldsOf(record, params, from) {
377
+ const out = {};
378
+ for (const [param, field] of Object.entries(params)) {
379
+ const value = record[field];
380
+ if (typeof value !== 'string' && typeof value !== 'number') {
381
+ throw new Error(`A record in ${from}.jsonl has no ${field}, which ${param} takes.`);
382
+ }
383
+ out[param] = String(value);
384
+ }
385
+ return out;
386
+ }
387
+ /** Each env name at each scope: the tenant, each org, each project. */
388
+ async function envScopes(ctx, query) {
389
+ const scopes = [{ scopeKind: 'tenant' }];
390
+ for await (const org of recordsOf(ctx, 'orgs'))
391
+ scopes.push({ scopeKind: 'org', scopeId: String(org.id) });
392
+ for await (const project of recordsOf(ctx, 'projects'))
393
+ scopes.push({ scopeKind: 'project', scopeId: String(project.id) });
394
+ const out = [];
395
+ for await (const env of recordsOf(ctx, 'environments')) {
396
+ for (const scope of scopes)
397
+ out.push({ ...query, envName: String(env.envName), ...scope });
398
+ }
399
+ return out;
400
+ }
401
+ /** The env and scope a record was read at, for reading its children there. */
402
+ function envScopeOf(record, from) {
403
+ const scope = record.scope;
404
+ const envName = record.envName;
405
+ if (typeof envName !== 'string' || typeof scope?.kind !== 'string') {
406
+ throw new Error(`A record in ${from}.jsonl has no envName or scope to read its children at.`);
407
+ }
408
+ const id = scope.kind === 'org' ? scope.orgId : scope.kind === 'project' ? scope.projectId : undefined;
409
+ return { envName, scopeKind: scope.kind, ...(typeof id === 'string' && { scopeId: id }) };
410
+ }
411
+ /** A name the server gave, safe as a file name in the export's folder. */
412
+ function safeName(id, what) {
413
+ if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(id)) {
414
+ throw new Error(`${what} ${JSON.stringify(id)} isn't a safe file name, so it can't be written.`);
415
+ }
416
+ return id;
417
+ }
418
+ /** Each listed record's bytes, to `<dir>/<id>`. */
419
+ async function writeBytes(ctx, kind, listed, tally) {
420
+ const bytes = kind.bytes;
421
+ const dir = join(ctx.out, bytes.dir);
422
+ await mkdir(dir, { recursive: true, mode: FOLDER_MODE });
423
+ const lines = createInterface({
424
+ input: createReadStream(listed),
425
+ crlfDelay: Number.POSITIVE_INFINITY,
426
+ });
427
+ for await (const line of lines) {
428
+ if (line === '')
429
+ continue;
430
+ const params = fieldsOf(JSON.parse(line), bytes.params, kind.name);
431
+ const name = safeName(Object.values(params)[0], `An ${kind.name} id`);
432
+ const target = join(dir, name);
433
+ try {
434
+ await pipeline(await ctx.reader.bytes(fillRoute(bytes.route, params)), createWriteStream(`${target}.partial`, { mode: FILE_MODE }));
435
+ }
436
+ catch (err) {
437
+ await rm(`${target}.partial`, { force: true });
438
+ throwIfNotServed(err, bytes.route);
439
+ if (!isGone(err))
440
+ throw err;
441
+ tally.gone++;
442
+ continue;
443
+ }
444
+ await rename(`${target}.partial`, target);
445
+ }
446
+ }
447
+ /** Why the signed exports can't be made, if they can't. */
448
+ function signedUnmet(ctx, from) {
449
+ if (!ctx.signed)
450
+ return '--no-signed';
451
+ const keys = ctx.kinds['export-signing-keys'];
452
+ if (keys?.status !== 'ok')
453
+ return "export-signing-keys wasn't exported, so it isn't known whether this server signs exports";
454
+ if (keys.records === 0)
455
+ return "this server doesn't sign exports (it lists no export signing keys)";
456
+ if (ctx.kinds[from]?.status !== 'ok')
457
+ return `it's made for each record of ${from}, which wasn't exported`;
458
+ return undefined;
459
+ }
460
+ async function signApprovals(ctx) {
461
+ return signEach(ctx, {
462
+ from: 'approvals',
463
+ dir: SIGNED.approvals,
464
+ route: '/v1/approvals/{approvalId}/audit-bundle',
465
+ param: 'approvalId',
466
+ idOf: (record) => typeof record.status === 'string' &&
467
+ DECIDED.has(record.status) &&
468
+ typeof record.id === 'string'
469
+ ? record.id
470
+ : undefined,
471
+ });
472
+ }
473
+ async function signProvenance(ctx) {
474
+ return signEach(ctx, {
475
+ from: 'provenance',
476
+ dir: SIGNED.provenance,
477
+ route: '/v1/provenance/{runId}/export',
478
+ param: 'runId',
479
+ idOf: (record) => (typeof record.runId === 'string' ? record.runId : undefined),
480
+ });
481
+ }
482
+ /** One signed export for each record `each.idOf` picks; the folder whole, or absent. */
483
+ async function signEach(ctx, each) {
484
+ const unmet = signedUnmet(ctx, each.from);
485
+ if (unmet !== undefined)
486
+ return { status: 'skipped', reason: unmet };
487
+ const tally = { records: 0, gone: 0, withoutMessages: 0 };
488
+ try {
489
+ await mkdir(join(ctx.out, each.dir), { recursive: true, mode: FOLDER_MODE });
490
+ for await (const record of recordsOf(ctx, each.from)) {
491
+ const id = each.idOf(record);
492
+ if (id === undefined)
493
+ continue;
494
+ const file = join(ctx.out, each.dir, `${safeName(id, `A ${each.from} id`)}.json`);
495
+ const signed = await signOne(ctx, each, fillRoute(each.route, { [each.param]: id }), tally);
496
+ if (signed === GONE) {
497
+ tally.gone++;
498
+ continue;
499
+ }
500
+ await writeAtomically(file, `${JSON.stringify(signed, null, 2)}\n`);
501
+ tally.records++;
502
+ }
503
+ }
504
+ catch (err) {
505
+ if (err instanceof NotServed)
506
+ return { status: 'skipped', reason: err.message };
507
+ return { status: 'failed', error: err.message };
508
+ }
509
+ return ok(ctx, each.dir, tally);
510
+ }
511
+ /**
512
+ * One record's signed export, with its messages, or without them when the
513
+ * server says it's too large (`413`); `GONE` when the record was deleted
514
+ * since it was listed.
515
+ */
516
+ async function signOne(ctx, each, path, tally) {
517
+ try {
518
+ return await ctx.reader.post(path, { includeMessages: true }, randomUUID());
519
+ }
520
+ catch (err) {
521
+ throwIfNotServed(err, each.route);
522
+ if (isGone(err))
523
+ return GONE;
524
+ if (!(err instanceof ReadError && err.status === 413))
525
+ throw err;
526
+ const signed = await ctx.reader.post(path, { includeMessages: false }, randomUUID());
527
+ tally.withoutMessages++;
528
+ return signed;
529
+ }
530
+ }
531
+ async function signEvidence(ctx) {
532
+ const unmet = signedUnmet(ctx, 'compliance-evidence');
533
+ if (unmet !== undefined)
534
+ return { status: 'skipped', reason: unmet };
535
+ const file = `${SIGNED.evidence}.json`;
536
+ const route = '/v1/compliance/evidence/export';
537
+ try {
538
+ const signed = await ctx.reader.post(route, {}, randomUUID());
539
+ await mkdir(join(ctx.out, 'signed'), { recursive: true, mode: FOLDER_MODE });
540
+ await writeAtomically(join(ctx.out, file), `${JSON.stringify(signed, null, 2)}\n`);
541
+ }
542
+ catch (err) {
543
+ if (isNotServed(err)) {
544
+ return { status: 'skipped', reason: new NotServed(route, err.status).message };
545
+ }
546
+ return { status: 'failed', error: err.message };
547
+ }
548
+ return ok(ctx, file, { records: 1, gone: 0 });
549
+ }
550
+ async function writeAtomically(file, text) {
551
+ await writeFile(`${file}.partial`, text, { mode: FILE_MODE });
552
+ await rename(`${file}.partial`, file);
553
+ }
554
+ /** A file written line by line, waiting when the disk is behind. */
555
+ async function openLines(file) {
556
+ const stream = createWriteStream(file, { mode: FILE_MODE });
557
+ await new Promise((resolve, reject) => {
558
+ stream.once('open', () => resolve());
559
+ stream.once('error', reject);
560
+ });
561
+ let closed = false;
562
+ return {
563
+ write: (line) => new Promise((resolve, reject) => {
564
+ stream.write(line, (err) => (err ? reject(err) : resolve()));
565
+ }),
566
+ close: () => {
567
+ if (closed)
568
+ return Promise.resolve();
569
+ closed = true;
570
+ return new Promise((resolve, reject) => {
571
+ stream.end((err) => (err ? reject(err) : resolve()));
572
+ });
573
+ },
574
+ };
575
+ }
576
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/exports/create.ts"],"names":[],"mappings":"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"}