@chatlychat/cli 0.1.3 → 0.1.5

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 (73) hide show
  1. package/dist/commands/ai.d.ts +4 -0
  2. package/dist/commands/ai.d.ts.map +1 -0
  3. package/dist/commands/ai.js +149 -0
  4. package/dist/commands/ai.js.map +1 -0
  5. package/dist/commands/common.d.ts +79 -0
  6. package/dist/commands/common.d.ts.map +1 -0
  7. package/dist/commands/common.js +194 -0
  8. package/dist/commands/common.js.map +1 -0
  9. package/dist/commands/config.d.ts +40 -0
  10. package/dist/commands/config.d.ts.map +1 -0
  11. package/dist/commands/config.js +336 -0
  12. package/dist/commands/config.js.map +1 -0
  13. package/dist/commands/insights.d.ts +5 -0
  14. package/dist/commands/insights.d.ts.map +1 -0
  15. package/dist/commands/insights.js +277 -0
  16. package/dist/commands/insights.js.map +1 -0
  17. package/dist/commands/integrations.d.ts +15 -0
  18. package/dist/commands/integrations.d.ts.map +1 -0
  19. package/dist/commands/integrations.js +256 -0
  20. package/dist/commands/integrations.js.map +1 -0
  21. package/dist/commands/resources.d.ts +19 -7
  22. package/dist/commands/resources.d.ts.map +1 -1
  23. package/dist/commands/resources.js +100 -191
  24. package/dist/commands/resources.js.map +1 -1
  25. package/dist/commands/workspace-as-code.d.ts +27 -0
  26. package/dist/commands/workspace-as-code.d.ts.map +1 -0
  27. package/dist/commands/workspace-as-code.js +377 -0
  28. package/dist/commands/workspace-as-code.js.map +1 -0
  29. package/dist/help.d.ts +25 -1
  30. package/dist/help.d.ts.map +1 -1
  31. package/dist/help.js +104 -8
  32. package/dist/help.js.map +1 -1
  33. package/dist/run.d.ts +17 -0
  34. package/dist/run.d.ts.map +1 -1
  35. package/dist/run.js +88 -41
  36. package/dist/run.js.map +1 -1
  37. package/dist/wac/__tests__/wac-fixtures.d.ts +20 -0
  38. package/dist/wac/__tests__/wac-fixtures.d.ts.map +1 -0
  39. package/dist/wac/__tests__/wac-fixtures.js +38 -0
  40. package/dist/wac/__tests__/wac-fixtures.js.map +1 -0
  41. package/dist/wac/apply.d.ts +113 -0
  42. package/dist/wac/apply.d.ts.map +1 -0
  43. package/dist/wac/apply.js +265 -0
  44. package/dist/wac/apply.js.map +1 -0
  45. package/dist/wac/diff.d.ts +137 -0
  46. package/dist/wac/diff.d.ts.map +1 -0
  47. package/dist/wac/diff.js +413 -0
  48. package/dist/wac/diff.js.map +1 -0
  49. package/dist/wac/document.d.ts +110 -0
  50. package/dist/wac/document.d.ts.map +1 -0
  51. package/dist/wac/document.js +429 -0
  52. package/dist/wac/document.js.map +1 -0
  53. package/dist/wac/render.d.ts +52 -0
  54. package/dist/wac/render.d.ts.map +1 -0
  55. package/dist/wac/render.js +156 -0
  56. package/dist/wac/render.js.map +1 -0
  57. package/dist/wac/resource-def.d.ts +116 -0
  58. package/dist/wac/resource-def.d.ts.map +1 -0
  59. package/dist/wac/resource-def.js +44 -0
  60. package/dist/wac/resource-def.js.map +1 -0
  61. package/dist/wac/resources.d.ts +104 -0
  62. package/dist/wac/resources.d.ts.map +1 -0
  63. package/dist/wac/resources.js +541 -0
  64. package/dist/wac/resources.js.map +1 -0
  65. package/dist/wac/values.d.ts +16 -0
  66. package/dist/wac/values.d.ts.map +1 -0
  67. package/dist/wac/values.js +53 -0
  68. package/dist/wac/values.js.map +1 -0
  69. package/package.json +3 -2
  70. package/dist/cli.spec.d.ts +0 -2
  71. package/dist/cli.spec.d.ts.map +0 -1
  72. package/dist/cli.spec.js +0 -226
  73. package/dist/cli.spec.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/wac/apply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * The diff. Pure: a document plus the live rows in, a plan out.
3
+ *
4
+ * No transport, no filesystem, no clock, nothing injected. That is not
5
+ * fastidiousness — it is what lets the spec drive this with literal objects,
6
+ * and it is half the proof that `chatly plan` writes nothing: the function
7
+ * that decides what WOULD change has no way to change anything. The other
8
+ * half is a recording transport asserting zero non-GET requests, in
9
+ * `wac.spec.ts`.
10
+ *
11
+ * ═══ WHAT A DIFF MUST NOT DO ══════════════════════════════════════════════
12
+ *
13
+ * Report a change that is not one. A plan that says "3 to change" against a
14
+ * workspace nobody has touched is a plan people stop reading, and then
15
+ * `apply` gets run blind — which is the failure this whole feature exists to
16
+ * prevent. Four rules come out of that:
17
+ *
18
+ * 1. ONLY the fields the document declares are compared. A server field the
19
+ * file says nothing about is unmanaged and is never mentioned. So a
20
+ * document can describe four fields of a bot and leave the other twenty
21
+ * to the dashboard, which is how a team actually works.
22
+ *
23
+ * 2. A field that cannot be READ BACK is never compared. Two kinds, both
24
+ * handled: the ones declared `opaque` (a customer card's `headers` are
25
+ * write-only by design — the read shape returns `headerNames`, names and
26
+ * never values, because that is where the bearer token is), and the ones
27
+ * the server hands back as the literal `__redacted__`, detected at
28
+ * runtime so a field nobody told this file about still cannot produce a
29
+ * phantom change. Each is reported once, as a note, saying it is
30
+ * unknowable rather than unchanged.
31
+ *
32
+ * 3. `undefined` and absent are one state. JSON has no `undefined`, so a key
33
+ * the server omits and a key it sends as `undefined` are the same thing,
34
+ * and only `null` is a value.
35
+ *
36
+ * 4. The live row is PROJECTED into the document's vocabulary first. A bot's
37
+ * `webhookUrl` comes back under `externalAgent`; an email template's
38
+ * customised copy comes back under `override`. Comparing against the
39
+ * un-projected row reports a change on every run, for ever. See
40
+ * `resources.ts`.
41
+ *
42
+ * ═══ AND WHAT IT MUST DO ══════════════════════════════════════════════════
43
+ *
44
+ * Refuse to guess. Two live rows with one natural key, a reference to a bot
45
+ * that neither exists nor is being created, a changed field no route can
46
+ * write — each produces a `blocked` item that `apply` will not touch, with
47
+ * the reason on the line. The alternative in every case is picking one and
48
+ * being wrong silently, which is how the wrong resource gets overwritten.
49
+ */
50
+ import { type Action, type ResourceDef, type UpdateRoute } from './resources.js';
51
+ import type { DocumentRow, WacDocument } from './document.js';
52
+ export { isRedacted, REDACTED, sameValue } from './values.js';
53
+ export interface FieldChange {
54
+ readonly name: string;
55
+ /** Absent on a create. */
56
+ readonly from?: unknown;
57
+ readonly to: unknown;
58
+ /** The route that would write it. Undefined means nothing can. */
59
+ readonly route: UpdateRoute | undefined;
60
+ }
61
+ export interface PlanItem {
62
+ readonly type: string;
63
+ readonly label: string;
64
+ /** As written in the document, or as the server spells it for an orphan. */
65
+ readonly key: string;
66
+ readonly action: Action;
67
+ /** The server's id, for an update or a prune. */
68
+ readonly liveId: string | undefined;
69
+ readonly changes: ReadonlyArray<FieldChange>;
70
+ /** True of this row but not a change: unreadable fields, full replaces. */
71
+ readonly notes: ReadonlyArray<string>;
72
+ /** Set on `blocked`: why apply will not try. */
73
+ readonly reason: string | undefined;
74
+ readonly row: DocumentRow | undefined;
75
+ /** Wire field → id, for references already resolvable at plan time. */
76
+ readonly resolved: Readonly<Record<string, string>>;
77
+ /** `type/key` for each reference, so apply can skip a failed dependency. */
78
+ readonly dependsOn: ReadonlyArray<string>;
79
+ }
80
+ export interface Plan {
81
+ readonly items: ReadonlyArray<PlanItem>;
82
+ /** File-level observations: an unknown field, a list at its cap. */
83
+ readonly warnings: ReadonlyArray<string>;
84
+ /** Types whose live list may be incomplete, so `--prune` is refused. */
85
+ readonly pruneUnsafe: ReadonlyArray<string>;
86
+ }
87
+ export interface LiveSection {
88
+ /** Every row the list route returned, exactly as it came. */
89
+ readonly rows: ReadonlyArray<Record<string, unknown>>;
90
+ /** The route caps its answer and the answer came back at the cap. */
91
+ readonly possiblyTruncated?: boolean;
92
+ }
93
+ /**
94
+ * Build the plan.
95
+ *
96
+ * `live` holds only the types the document mentions. A type the file says
97
+ * nothing about is not read, not diffed and not reported: an unmanaged
98
+ * resource is not drift, and reporting it as such would make every plan a
99
+ * wall of noise about the dashboard.
100
+ */
101
+ export interface PlanOptions {
102
+ /**
103
+ * Treat every unreadable field as changed.
104
+ *
105
+ * `--write-only`. By default a field that cannot be read back is reported
106
+ * as unknowable and left alone, because a diff that says "changed" on every
107
+ * run is a diff nobody reads. This is the escape: you rotated the card's
108
+ * `Authorization` header in the file and need it pushed, and no diff can
109
+ * ever tell you that for you.
110
+ */
111
+ readonly writeOnly?: boolean;
112
+ }
113
+ export declare function buildPlan(doc: WacDocument, live: ReadonlyMap<string, LiveSection>, opts?: PlanOptions): Plan;
114
+ /**
115
+ * A field the document declares that NO live row carries.
116
+ *
117
+ * This is what stands in for a per-resource field allow-list, and it is
118
+ * better evidence than one: the vocabulary comes from the server on every
119
+ * run, so it cannot drift out of step with an API that shipped a field
120
+ * yesterday. CLAUDE.md's `helpProfile` / `profile` bug — a key zod strips,
121
+ * answering 200 while doing nothing — is exactly what it catches, and
122
+ * `unwritable` in `resources.ts` catches the mirror case (a field the server
123
+ * returns and no write path accepts).
124
+ *
125
+ * Two limits, both reported rather than hidden:
126
+ *
127
+ * - With no live rows there is nothing to compare against, so a brand-new
128
+ * workspace gets no warnings at all.
129
+ * - A legitimately optional field nobody in this workspace has set produces
130
+ * a false positive. That is why it is a warning and not a refusal: being
131
+ * wrong costs one line of output, where refusing wrongly costs a config
132
+ * file that cannot be applied.
133
+ */
134
+ export declare function vocabularyWarnings(def: ResourceDef, rows: ReadonlyArray<DocumentRow>, liveRows: ReadonlyArray<Record<string, unknown>>): ReadonlyArray<string>;
135
+ /** Counts for the summary line. */
136
+ export declare function tally(plan: Plan): Record<Action, number>;
137
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/wac/diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,OAAO,EAKL,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,WAAW,EACjB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE9D,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE9D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,kEAAkE;IAClE,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,CAAC;CACzC;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,4EAA4E;IAC5E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,iDAAiD;IACjD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IAC7C,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACtC,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,CAAC;IACtC,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,4EAA4E;IAC5E,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IACxC,oEAAoE;IACpE,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,wEAAwE;IACxE,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,WAAW;IAC1B,6DAA6D;IAC7D,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,qEAAqE;IACrE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CACtC;AAuCD;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;;;OAQG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,SAAS,CACvB,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,EACtC,IAAI,GAAE,WAAgB,GACrB,IAAI,CA4DN;AAoTD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,aAAa,CAAC,WAAW,CAAC,EAChC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAC/C,aAAa,CAAC,MAAM,CAAC,CAgCvB;AAED,mCAAmC;AACnC,wBAAgB,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAYxD"}
@@ -0,0 +1,413 @@
1
+ /**
2
+ * The diff. Pure: a document plus the live rows in, a plan out.
3
+ *
4
+ * No transport, no filesystem, no clock, nothing injected. That is not
5
+ * fastidiousness — it is what lets the spec drive this with literal objects,
6
+ * and it is half the proof that `chatly plan` writes nothing: the function
7
+ * that decides what WOULD change has no way to change anything. The other
8
+ * half is a recording transport asserting zero non-GET requests, in
9
+ * `wac.spec.ts`.
10
+ *
11
+ * ═══ WHAT A DIFF MUST NOT DO ══════════════════════════════════════════════
12
+ *
13
+ * Report a change that is not one. A plan that says "3 to change" against a
14
+ * workspace nobody has touched is a plan people stop reading, and then
15
+ * `apply` gets run blind — which is the failure this whole feature exists to
16
+ * prevent. Four rules come out of that:
17
+ *
18
+ * 1. ONLY the fields the document declares are compared. A server field the
19
+ * file says nothing about is unmanaged and is never mentioned. So a
20
+ * document can describe four fields of a bot and leave the other twenty
21
+ * to the dashboard, which is how a team actually works.
22
+ *
23
+ * 2. A field that cannot be READ BACK is never compared. Two kinds, both
24
+ * handled: the ones declared `opaque` (a customer card's `headers` are
25
+ * write-only by design — the read shape returns `headerNames`, names and
26
+ * never values, because that is where the bearer token is), and the ones
27
+ * the server hands back as the literal `__redacted__`, detected at
28
+ * runtime so a field nobody told this file about still cannot produce a
29
+ * phantom change. Each is reported once, as a note, saying it is
30
+ * unknowable rather than unchanged.
31
+ *
32
+ * 3. `undefined` and absent are one state. JSON has no `undefined`, so a key
33
+ * the server omits and a key it sends as `undefined` are the same thing,
34
+ * and only `null` is a value.
35
+ *
36
+ * 4. The live row is PROJECTED into the document's vocabulary first. A bot's
37
+ * `webhookUrl` comes back under `externalAgent`; an email template's
38
+ * customised copy comes back under `override`. Comparing against the
39
+ * un-projected row reports a change on every run, for ever. See
40
+ * `resources.ts`.
41
+ *
42
+ * ═══ AND WHAT IT MUST DO ══════════════════════════════════════════════════
43
+ *
44
+ * Refuse to guess. Two live rows with one natural key, a reference to a bot
45
+ * that neither exists nor is being created, a changed field no route can
46
+ * write — each produces a `blocked` item that `apply` will not touch, with
47
+ * the reason on the line. The alternative in every case is picking one and
48
+ * being wrong silently, which is how the wrong resource gets overwritten.
49
+ */
50
+ import { looksLikeCredential, normalizedKey, projected, routeForField, } from './resources.js';
51
+ import { isRedacted, REDACTED, sameValue } from './values.js';
52
+ export { isRedacted, REDACTED, sameValue } from './values.js';
53
+ function indexLive(def, rows) {
54
+ const byKey = new Map();
55
+ const ambiguous = new Set();
56
+ let keyless = 0;
57
+ for (const raw of rows) {
58
+ const row = projected(def, raw);
59
+ const key = row[def.naturalKey];
60
+ if (typeof key !== 'string' || key.length === 0) {
61
+ keyless += 1;
62
+ continue;
63
+ }
64
+ const norm = normalizedKey(def, key);
65
+ if (byKey.has(norm)) {
66
+ ambiguous.add(norm);
67
+ continue;
68
+ }
69
+ byKey.set(norm, { ...row, [def.idField]: raw[def.idField] });
70
+ }
71
+ return { byKey, ambiguous, keyless };
72
+ }
73
+ export function buildPlan(doc, live, opts = {}) {
74
+ const items = [];
75
+ const warnings = [];
76
+ const pruneUnsafe = [];
77
+ const known = new Map();
78
+ for (const section of doc.sections) {
79
+ const { def } = section;
80
+ const liveSection = live.get(def.type) ?? { rows: [] };
81
+ const index = indexLive(def, liveSection.rows);
82
+ const ids = new Map();
83
+ for (const [key, row] of index.byKey) {
84
+ const id = row[def.idField];
85
+ ids.set(key, typeof id === 'string' ? id : '');
86
+ }
87
+ known.set(def.type, ids);
88
+ warnings.push(...sectionWarnings(def, section.rows, liveSection, index));
89
+ if (liveSection.possiblyTruncated === true) {
90
+ pruneUnsafe.push(def.type);
91
+ }
92
+ const declared = new Set();
93
+ for (const row of section.rows) {
94
+ const norm = normalizedKey(def, row.key);
95
+ declared.add(norm);
96
+ const item = planRow(def, row, norm, index, known, opts);
97
+ items.push(item);
98
+ if (item.action === 'create') {
99
+ // A later section may reference it; the id is unknown until apply.
100
+ ids.set(norm, null);
101
+ }
102
+ }
103
+ for (const [key, row] of index.byKey) {
104
+ if (declared.has(key)) {
105
+ continue;
106
+ }
107
+ const id = row[def.idField];
108
+ items.push({
109
+ type: def.type,
110
+ label: def.label,
111
+ key: typeof row[def.naturalKey] === 'string' ? String(row[def.naturalKey]) : key,
112
+ action: 'orphan',
113
+ liveId: typeof id === 'string' ? id : undefined,
114
+ changes: [],
115
+ notes: def.remove === null
116
+ ? [`\`--prune\` cannot delete this: ${def.removeBlocked ?? 'no DELETE route.'}`]
117
+ : [],
118
+ reason: undefined,
119
+ row: undefined,
120
+ resolved: {},
121
+ dependsOn: [],
122
+ });
123
+ }
124
+ }
125
+ return { items, warnings, pruneUnsafe };
126
+ }
127
+ function planRow(def, row, norm, index, known, opts) {
128
+ const notes = [];
129
+ const resolved = {};
130
+ const dependsOn = [];
131
+ /* ── References first: an unresolvable one blocks the whole row. ────── */
132
+ for (const [wire, ref] of Object.entries(row.refs)) {
133
+ dependsOn.push(`${ref.type}/${ref.key}`);
134
+ const target = known.get(ref.type);
135
+ const normRef = ref.key;
136
+ if (target === undefined || !target.has(normRef)) {
137
+ return blocked(def, row, `names ${ref.type}/${normRef}, which is neither on the server nor created by this ` +
138
+ `plan. Add it under \`resources.${ref.type}\`, or correct the key.`, dependsOn);
139
+ }
140
+ const id = target.get(normRef);
141
+ if (id === null || id === undefined || id === '') {
142
+ notes.push(`${wire} resolves to ${ref.type}/${normRef}, which this plan creates first.`);
143
+ }
144
+ else {
145
+ resolved[wire] = id;
146
+ }
147
+ }
148
+ if (index.ambiguous.has(norm)) {
149
+ return blocked(def, row, `more than one ${def.label} on the server has ${def.naturalKey} "${row.key}", and ` +
150
+ `${def.naturalKey} is what this file matches on. Nothing will be written to either — ` +
151
+ 'picking one of two is how the wrong resource gets overwritten. Rename or delete the ' +
152
+ 'duplicate first.', dependsOn);
153
+ }
154
+ const liveRow = index.byKey.get(norm);
155
+ if (liveRow === undefined) {
156
+ return planCreate(def, row, notes, resolved, dependsOn);
157
+ }
158
+ return planUpdate(def, row, liveRow, notes, resolved, dependsOn, opts);
159
+ }
160
+ function planCreate(def, row, notes, resolved, dependsOn) {
161
+ if (def.create === null) {
162
+ return blocked(def, row, def.type === 'emailTemplates'
163
+ ? `"${row.key}" is not one of the five template kinds. \`chatly email-templates list\` ` +
164
+ 'names them, and all five always exist — so a kind that is missing here is a ' +
165
+ 'misspelling, not an absence.'
166
+ : `there is no route that creates a ${def.label}.`, dependsOn);
167
+ }
168
+ const changes = Object.entries(row.body)
169
+ .filter(([name]) => !def.opaque.includes(name))
170
+ .map(([name, to]) => ({ name, to, route: undefined }));
171
+ const extra = [...notes];
172
+ for (const field of def.opaque) {
173
+ if (row.body[field] !== undefined) {
174
+ extra.push(`${field} is write-only: sent on this create and never readable afterwards.`);
175
+ }
176
+ }
177
+ if (def.secrets.length > 0) {
178
+ extra.push(`the create response carries a one-time ${def.secrets.join(' / ')} — \`apply\` prints ` +
179
+ 'it once and writes it nowhere.');
180
+ }
181
+ return {
182
+ type: def.type,
183
+ label: def.label,
184
+ key: row.key,
185
+ action: 'create',
186
+ liveId: undefined,
187
+ changes,
188
+ notes: extra,
189
+ reason: undefined,
190
+ row,
191
+ resolved,
192
+ dependsOn,
193
+ };
194
+ }
195
+ function planUpdate(def, row, liveRow, notes, resolved, dependsOn, opts) {
196
+ const liveIdRaw = liveRow[def.idField];
197
+ const liveId = typeof liveIdRaw === 'string' ? liveIdRaw : undefined;
198
+ if (def.update.length === 0 && def.create?.upsert !== true) {
199
+ return blocked(def, row, `it exists and there is no route that changes a ${def.label} in place.`, dependsOn);
200
+ }
201
+ const changes = [];
202
+ const extra = [...notes];
203
+ const compare = (name, desired) => {
204
+ if (name === def.naturalKey) {
205
+ /*
206
+ * The key is what matched this row; it is not a field to change. A
207
+ * document that renames a key is describing a DIFFERENT resource — the
208
+ * new one is created and the old one shows up as an orphan, which is
209
+ * the honest reading and the only one that works for `bots`, whose
210
+ * PATCH schema has no `slug` at all.
211
+ */
212
+ return;
213
+ }
214
+ const unreadable = def.opaque.includes(name)
215
+ ? 'write-only'
216
+ : isRedacted(liveRow[name])
217
+ ? `redacted (reads back as \`${REDACTED}\`)`
218
+ : undefined;
219
+ if (unreadable !== undefined) {
220
+ if (opts.writeOnly !== true) {
221
+ extra.push(`${name} is ${unreadable}, so this plan cannot say whether it changed. Left alone ` +
222
+ 'unless `--write-only` is passed.');
223
+ return;
224
+ }
225
+ /*
226
+ * `--write-only`: send it, and be honest that this is not a diff. The
227
+ * `from` is undefined because there is nothing to compare against —
228
+ * `render.ts` prints `(unreadable)` rather than inventing a before.
229
+ */
230
+ changes.push({
231
+ name,
232
+ from: undefined,
233
+ to: desired,
234
+ route: def.create?.upsert === true ? undefined : routeForField(def, name),
235
+ });
236
+ extra.push(`${name} is ${unreadable}; --write-only sends it without a comparison.`);
237
+ return;
238
+ }
239
+ const current = liveRow[name];
240
+ if (!sameValue(current, desired)) {
241
+ changes.push({
242
+ name,
243
+ from: current,
244
+ to: desired,
245
+ route: def.create?.upsert === true ? undefined : routeForField(def, name),
246
+ });
247
+ }
248
+ };
249
+ for (const [name, desired] of Object.entries(row.body)) {
250
+ compare(name, desired);
251
+ }
252
+ for (const [wire, id] of Object.entries(resolved)) {
253
+ compare(wire, id);
254
+ }
255
+ if (changes.length === 0) {
256
+ return {
257
+ type: def.type,
258
+ label: def.label,
259
+ key: row.key,
260
+ action: 'noop',
261
+ liveId,
262
+ changes,
263
+ notes: extra,
264
+ reason: undefined,
265
+ row,
266
+ resolved,
267
+ dependsOn,
268
+ };
269
+ }
270
+ /*
271
+ * A changed field no route can write.
272
+ *
273
+ * Reported as blocked for the WHOLE row rather than partly applied: a
274
+ * webhook endpoint whose `eventTypes` changed and whose `schemaVersion`
275
+ * also changed would otherwise come out of `apply` having pinned the
276
+ * version and silently kept the old event list, which is a state nobody
277
+ * asked for and nobody can see.
278
+ */
279
+ if (def.create?.upsert !== true) {
280
+ const unroutable = changes.filter((c) => c.route === undefined);
281
+ if (unroutable.length > 0) {
282
+ return {
283
+ ...blocked(def, row, `${unroutable.map((c) => `\`${c.name}\``).join(', ')} changed, and ` +
284
+ (def.updateBlocked ?? `no route can change that on a ${def.label}.`), dependsOn),
285
+ liveId,
286
+ changes,
287
+ };
288
+ }
289
+ }
290
+ if (def.fullReplace === true) {
291
+ extra.push(`the write REPLACES this ${def.label}: every field the document omits reverts to its ` +
292
+ 'default. Declare the whole resource here, not just what you want changed.');
293
+ }
294
+ return {
295
+ type: def.type,
296
+ label: def.label,
297
+ key: row.key,
298
+ action: 'update',
299
+ liveId,
300
+ changes,
301
+ notes: extra,
302
+ reason: undefined,
303
+ row,
304
+ resolved,
305
+ dependsOn,
306
+ };
307
+ }
308
+ function blocked(def, row, reason, dependsOn) {
309
+ return {
310
+ type: def.type,
311
+ label: def.label,
312
+ key: row.key,
313
+ action: 'blocked',
314
+ liveId: undefined,
315
+ changes: [],
316
+ notes: [],
317
+ reason,
318
+ row,
319
+ resolved: {},
320
+ dependsOn,
321
+ };
322
+ }
323
+ /* ── Warnings ─────────────────────────────────────────────────────────── */
324
+ function sectionWarnings(def, rows, live, index) {
325
+ const out = [];
326
+ if (live.possiblyTruncated === true) {
327
+ out.push(`${def.type}: the list route is @PaginationExempt and answered at its cap, so there may ` +
328
+ 'be rows this plan cannot see. `--prune` is refused for this type while that holds — ' +
329
+ 'a row past the cap is invisible, not absent.');
330
+ }
331
+ if (index.keyless > 0) {
332
+ out.push(`${def.type}: ${String(index.keyless)} ${def.label}(s) on the server have no ` +
333
+ `\`${def.naturalKey}\`, so this file can neither match nor prune them. They are not ` +
334
+ 'listed below at all — give them one in the dashboard to bring them under management.');
335
+ }
336
+ for (const key of index.ambiguous) {
337
+ out.push(`${def.type}: ${def.naturalKey} "${key}" is on more than one ${def.label}` +
338
+ (def.keyEnforced
339
+ ? '.'
340
+ : ` — the database does not make \`${def.naturalKey}\` unique for this resource, so ` +
341
+ 'only this file does.'));
342
+ }
343
+ out.push(...vocabularyWarnings(def, rows, live.rows));
344
+ return out;
345
+ }
346
+ /**
347
+ * A field the document declares that NO live row carries.
348
+ *
349
+ * This is what stands in for a per-resource field allow-list, and it is
350
+ * better evidence than one: the vocabulary comes from the server on every
351
+ * run, so it cannot drift out of step with an API that shipped a field
352
+ * yesterday. CLAUDE.md's `helpProfile` / `profile` bug — a key zod strips,
353
+ * answering 200 while doing nothing — is exactly what it catches, and
354
+ * `unwritable` in `resources.ts` catches the mirror case (a field the server
355
+ * returns and no write path accepts).
356
+ *
357
+ * Two limits, both reported rather than hidden:
358
+ *
359
+ * - With no live rows there is nothing to compare against, so a brand-new
360
+ * workspace gets no warnings at all.
361
+ * - A legitimately optional field nobody in this workspace has set produces
362
+ * a false positive. That is why it is a warning and not a refusal: being
363
+ * wrong costs one line of output, where refusing wrongly costs a config
364
+ * file that cannot be applied.
365
+ */
366
+ export function vocabularyWarnings(def, rows, liveRows) {
367
+ if (liveRows.length === 0 || rows.length === 0) {
368
+ return [];
369
+ }
370
+ const serverFields = new Set();
371
+ for (const raw of liveRows) {
372
+ for (const field of Object.keys(projected(def, raw))) {
373
+ serverFields.add(field);
374
+ }
375
+ }
376
+ const unknown = new Set();
377
+ for (const row of rows) {
378
+ for (const field of Object.keys(row.body)) {
379
+ if (serverFields.has(field) || def.opaque.includes(field)) {
380
+ continue;
381
+ }
382
+ // A credential-looking name is write-only by nature, not a typo.
383
+ if (looksLikeCredential(field)) {
384
+ continue;
385
+ }
386
+ unknown.add(field);
387
+ }
388
+ }
389
+ if (unknown.size === 0) {
390
+ return [];
391
+ }
392
+ return [
393
+ `${def.type}: ${[...unknown].map((f) => `\`${f}\``).join(', ')} — no ${def.label} on this ` +
394
+ `server carries ${unknown.size === 1 ? 'that field' : 'those fields'}. The API validates ` +
395
+ 'with zod and zod STRIPS an unknown key, so a misspelling is a 200 that did nothing. ' +
396
+ `The fields it does return: ${[...serverFields].sort().join(', ')}.`,
397
+ ];
398
+ }
399
+ /** Counts for the summary line. */
400
+ export function tally(plan) {
401
+ const out = {
402
+ create: 0,
403
+ update: 0,
404
+ noop: 0,
405
+ orphan: 0,
406
+ blocked: 0,
407
+ };
408
+ for (const item of plan.items) {
409
+ out[item.action] += 1;
410
+ }
411
+ return out;
412
+ }
413
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/wac/diff.ts"],"names":[],"mappings":"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"}