primitive-admin 1.2.0-alpha.6 → 1.2.0-alpha.7
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.
- package/README.md +1 -1
- package/dist/src/commands/apps-children.d.ts +1 -1
- package/dist/src/commands/apps-children.js +170 -28
- package/dist/src/commands/apps-children.js.map +1 -1
- package/dist/src/commands/auth.js +41 -6
- package/dist/src/commands/auth.js.map +1 -1
- package/dist/src/commands/config.js +43 -4
- package/dist/src/commands/config.js.map +1 -1
- package/dist/src/commands/database-types.js +313 -13
- package/dist/src/commands/database-types.js.map +1 -1
- package/dist/src/commands/databases.js +130 -53
- package/dist/src/commands/databases.js.map +1 -1
- package/dist/src/commands/init.d.ts +7 -0
- package/dist/src/commands/init.js +9 -1
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/llm.js +6 -9
- package/dist/src/commands/llm.js.map +1 -1
- package/dist/src/commands/settings.d.ts +9 -12
- package/dist/src/commands/settings.js +79 -31
- package/dist/src/commands/settings.js.map +1 -1
- package/dist/src/commands/sync.d.ts +118 -6
- package/dist/src/commands/sync.js +594 -55
- package/dist/src/commands/sync.js.map +1 -1
- package/dist/src/lib/child-apps-local.d.ts +45 -21
- package/dist/src/lib/child-apps-local.js +68 -30
- package/dist/src/lib/child-apps-local.js.map +1 -1
- package/dist/src/lib/credentials-store.d.ts +38 -3
- package/dist/src/lib/credentials-store.js +175 -9
- package/dist/src/lib/credentials-store.js.map +1 -1
- package/dist/src/lib/function-collect.d.ts +1 -1
- package/dist/src/lib/function-collect.js +4 -0
- package/dist/src/lib/function-collect.js.map +1 -1
- package/dist/src/lib/function-triggers.d.ts +3 -15
- package/dist/src/lib/function-triggers.js +10 -72
- package/dist/src/lib/function-triggers.js.map +1 -1
- package/dist/src/lib/generated-config-surfaces.d.ts +148 -0
- package/dist/src/lib/generated-config-surfaces.js +208 -25
- package/dist/src/lib/generated-config-surfaces.js.map +1 -1
- package/dist/src/lib/generated-sdk-types.d.ts +1 -1
- package/dist/src/lib/generated-sdk-types.js +1 -1
- package/dist/src/lib/generated-sdk-types.js.map +1 -1
- package/dist/src/lib/local-state.d.ts +21 -6
- package/dist/src/lib/local-state.js +78 -34
- package/dist/src/lib/local-state.js.map +1 -1
- package/dist/src/lib/push-failure-report.d.ts +45 -0
- package/dist/src/lib/push-failure-report.js +57 -0
- package/dist/src/lib/push-failure-report.js.map +1 -0
- package/dist/src/lib/sync-selectors.d.ts +5 -1
- package/dist/src/lib/sync-selectors.js +23 -13
- package/dist/src/lib/sync-selectors.js.map +1 -1
- package/dist/src/lib/transient-retry.d.ts +9 -0
- package/dist/src/lib/transient-retry.js +37 -0
- package/dist/src/lib/transient-retry.js.map +1 -1
- package/dist/src/lib/vars-override.d.ts +105 -0
- package/dist/src/lib/vars-override.js +143 -0
- package/dist/src/lib/vars-override.js.map +1 -0
- package/package.json +2 -2
- package/dist/src/lib/generated-workflow-model-fields.d.ts +0 -20
- package/dist/src/lib/generated-workflow-model-fields.js +0 -53
- package/dist/src/lib/generated-workflow-model-fields.js.map +0 -1
- package/dist/src/lib/workflow-field-descriptor.d.ts +0 -91
- package/dist/src/lib/workflow-field-descriptor.js +0 -153
- package/dist/src/lib/workflow-field-descriptor.js.map +0 -1
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A child app's own config var values: `vars.<name>.override.toml` (#4485).
|
|
3
|
+
*
|
|
4
|
+
* A machine-local environment `<name>` (#4117) shares the committed
|
|
5
|
+
* environment's `primitive/<tree>/`, so the `vars.toml` there holds the
|
|
6
|
+
* parent's values. Vars whose value belongs to one app — its database ids, a
|
|
7
|
+
* webhook URL embedding its app id, an OAuth origin — need a place of their
|
|
8
|
+
* own that survives a push, a diff and a pull without touching what merges to
|
|
9
|
+
* main. That place is `primitive/<tree>/vars.<name>.override.toml`, a flat
|
|
10
|
+
* `KEY = "value"` table under the same rules as `vars.toml`:
|
|
11
|
+
*
|
|
12
|
+
* - It is read only when `<name>` is the SELECTED environment. A committed
|
|
13
|
+
* environment has no override, so a file named for one is never read.
|
|
14
|
+
* - It LAYERS over `vars.toml`: its keys replace or add, every other key keeps
|
|
15
|
+
* `vars.toml`'s value, and no key can be made absent on the child.
|
|
16
|
+
* - It is machine-local and git-ignored (`primitive/*\/*.override.toml`).
|
|
17
|
+
*
|
|
18
|
+
* Everything here is pure apart from `readLocalVars`, which reads the two
|
|
19
|
+
* files; the commands own the writes.
|
|
20
|
+
*/
|
|
21
|
+
import { existsSync, readFileSync } from "fs";
|
|
22
|
+
import { basename, join } from "path";
|
|
23
|
+
import { parseConfigToml, stringifyConfigToml } from "./config-toml.js";
|
|
24
|
+
import { assertSafePathComponent } from "./sync-paths.js";
|
|
25
|
+
/** The tree's shared var file. */
|
|
26
|
+
export const VARS_FILE_NAME = "vars.toml";
|
|
27
|
+
/**
|
|
28
|
+
* The gitignore pattern that keeps every override file out of a commit,
|
|
29
|
+
* written by `primitive init` and carried by both app templates.
|
|
30
|
+
*/
|
|
31
|
+
export const VARS_OVERRIDE_GITIGNORE_PATTERN = "primitive/*/*.override.toml";
|
|
32
|
+
/** `vars.<name>.override.toml` — the override file's name inside the tree. */
|
|
33
|
+
export function varsOverrideFileName(name) {
|
|
34
|
+
assertSafePathComponent(name, "environment name");
|
|
35
|
+
return `vars.${name}.override.toml`;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The override file for `env` in the tree `configDir`, or `null` for a
|
|
39
|
+
* committed environment, which never has one. Refuses a name that is not a
|
|
40
|
+
* safe path component.
|
|
41
|
+
*/
|
|
42
|
+
export function varsOverridePath(configDir, env) {
|
|
43
|
+
if (!env.local)
|
|
44
|
+
return null;
|
|
45
|
+
return join(configDir, varsOverrideFileName(env.name));
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* `base` with `override`'s keys replacing or adding to it. Either side may be
|
|
49
|
+
* absent; the result is a new table.
|
|
50
|
+
*/
|
|
51
|
+
export function layerVars(base, override) {
|
|
52
|
+
return { ...(base ?? {}), ...(override ?? {}) };
|
|
53
|
+
}
|
|
54
|
+
function readVarTable(path) {
|
|
55
|
+
if (!existsSync(path))
|
|
56
|
+
return null;
|
|
57
|
+
try {
|
|
58
|
+
return parseConfigToml(readFileSync(path, "utf-8"));
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
throw new Error(`${basename(path)}: ${err?.message || String(err)}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Reads `vars.toml` in `configDir` and the override at `overridePath`, and
|
|
66
|
+
* layers them. A file that cannot be parsed throws an error naming it.
|
|
67
|
+
*/
|
|
68
|
+
export function readLocalVars(configDir, overridePath) {
|
|
69
|
+
const basePath = join(configDir, VARS_FILE_NAME);
|
|
70
|
+
const base = readVarTable(basePath);
|
|
71
|
+
const override = overridePath ? readVarTable(overridePath) : null;
|
|
72
|
+
const overrideKeys = Object.keys(override ?? {}).sort();
|
|
73
|
+
return {
|
|
74
|
+
basePath,
|
|
75
|
+
base,
|
|
76
|
+
overridePath,
|
|
77
|
+
override,
|
|
78
|
+
layered: layerVars(base, override),
|
|
79
|
+
overridingKeys: overrideKeys.filter((key) => base !== null && key in base),
|
|
80
|
+
addedKeys: overrideKeys.filter((key) => base === null || !(key in base)),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* The override file's body: a header saying what the file is, then the keys
|
|
85
|
+
* sorted. An empty table is a comment-only file.
|
|
86
|
+
*/
|
|
87
|
+
export function serializeVarsOverride(vars, target) {
|
|
88
|
+
const sorted = {};
|
|
89
|
+
for (const key of Object.keys(vars).sort())
|
|
90
|
+
sorted[key] = vars[key];
|
|
91
|
+
const header = `# Config var values for the machine-local environment "${target.name}" only.\n` +
|
|
92
|
+
`# Layered over primitive/${target.tree}/${VARS_FILE_NAME} when "${target.name}" is\n` +
|
|
93
|
+
"# selected: a key here replaces or adds to that file's value. Machine-local —\n" +
|
|
94
|
+
"# never commit this file. Non-secret values only; use `primitive secrets`\n" +
|
|
95
|
+
"# for credentials.\n\n";
|
|
96
|
+
return header + stringifyConfigToml(sorted);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* What `config pull` on a machine-local environment writes into its override
|
|
100
|
+
* file. `vars.toml` is never written by such a pull, so each pulled key —
|
|
101
|
+
* every key on the server or in the override, or only `selectedKeys` — is
|
|
102
|
+
* resolved against it: a server value equal to `vars.toml`'s is dropped from
|
|
103
|
+
* the override, any other server value is held there, and a key the server no
|
|
104
|
+
* longer has is removed. Keys outside the selection stay as they are.
|
|
105
|
+
*/
|
|
106
|
+
export function planVarsOverridePull(serverVars, baseVars, selectedKeys, currentOverride, target) {
|
|
107
|
+
const server = new Map(serverVars.map((v) => [v.key, String(v.value ?? "")]));
|
|
108
|
+
const vars = {};
|
|
109
|
+
for (const [key, value] of Object.entries(currentOverride))
|
|
110
|
+
vars[key] = String(value);
|
|
111
|
+
const pulled = selectedKeys ?? new Set([...server.keys(), ...Object.keys(currentOverride)]);
|
|
112
|
+
for (const key of pulled) {
|
|
113
|
+
const value = server.get(key);
|
|
114
|
+
if (value === undefined || (key in baseVars && String(baseVars[key]) === value)) {
|
|
115
|
+
delete vars[key];
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
vars[key] = value;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return { vars, content: serializeVarsOverride(vars, target) };
|
|
122
|
+
}
|
|
123
|
+
/** The one line push, diff and pull print when an override is in play. */
|
|
124
|
+
export function varsOverrideSummaryLine(fileName, keys) {
|
|
125
|
+
return (`Vars override: ${fileName} (${keys.overridingKeys.length} overriding ${VARS_FILE_NAME}, ` +
|
|
126
|
+
`${keys.addedKeys.length} added)`);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* The note a push on a child with an override prints when it changed the
|
|
130
|
+
* value of a var that already existed and left at least one function as it
|
|
131
|
+
* was. Functions read vars through a cache keyed by function version, so an
|
|
132
|
+
* unchanged function keeps the value it first read until a new version of it
|
|
133
|
+
* is pushed or its isolate is recycled. `null` when neither applies.
|
|
134
|
+
*/
|
|
135
|
+
export function cachedVarsNote(changedKeys, skippedFunctionCount) {
|
|
136
|
+
if (changedKeys.length === 0 || skippedFunctionCount === 0)
|
|
137
|
+
return null;
|
|
138
|
+
const keys = [...changedKeys].sort().join(", ");
|
|
139
|
+
return (`Note: changed var value(s) ${keys}; ${skippedFunctionCount} unchanged function(s) were not re-pushed. ` +
|
|
140
|
+
"A running function version caches the vars it has read, so it keeps the old value " +
|
|
141
|
+
"until a new version of it is pushed (any change to its code or TOML) or its isolate recycles.");
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=vars-override.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vars-override.js","sourceRoot":"","sources":["../../../src/lib/vars-override.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEtC,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,kCAAkC;AAClC,MAAM,CAAC,MAAM,cAAc,GAAG,WAAW,CAAC;AAE1C;;;GAGG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,6BAA6B,CAAC;AAK7E,8EAA8E;AAC9E,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,uBAAuB,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IAClD,OAAO,QAAQ,IAAI,gBAAgB,CAAC;AACtC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,GAAqC;IAErC,IAAI,CAAC,GAAG,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,IAAoC,EACpC,QAAwC;IAExC,OAAO,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC;AAClD,CAAC;AAmBD,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,eAAe,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAA4B,CAAC;IACjF,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,YAA2B;IAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACxD,OAAO;QACL,QAAQ;QACR,IAAI;QACJ,YAAY;QACZ,QAAQ;QACR,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC;QAClC,cAAc,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC;QAC1E,SAAS,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;KACzE,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAc,EACd,MAAsC;IAEtC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;QAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACpE,MAAM,MAAM,GACV,0DAA0D,MAAM,CAAC,IAAI,WAAW;QAChF,4BAA4B,MAAM,CAAC,IAAI,IAAI,cAAc,UAAU,MAAM,CAAC,IAAI,QAAQ;QACtF,iFAAiF;QACjF,6EAA6E;QAC7E,wBAAwB,CAAC;IAC3B,OAAO,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAA0D,EAC1D,QAAiC,EACjC,YAAwC,EACxC,eAAwC,EACxC,MAAsC;IAEtC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC;QAAE,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACtF,MAAM,MAAM,GAAG,YAAY,IAAI,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC5F,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,GAAG,IAAI,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YAChF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;AAChE,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,uBAAuB,CACrC,QAAgB,EAChB,IAAyE;IAEzE,OAAO,CACL,kBAAkB,QAAQ,KAAK,IAAI,CAAC,cAAc,CAAC,MAAM,eAAe,cAAc,IAAI;QAC1F,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,SAAS,CAClC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,WAA8B,EAC9B,oBAA4B;IAE5B,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,oBAAoB,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACxE,MAAM,IAAI,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,OAAO,CACL,8BAA8B,IAAI,KAAK,oBAAoB,6CAA6C;QACxG,oFAAoF;QACpF,+FAA+F,CAChG,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "primitive-admin",
|
|
3
|
-
"version": "1.2.0-alpha.
|
|
3
|
+
"version": "1.2.0-alpha.7",
|
|
4
4
|
"description": "CLI for administering Primitive applications",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"commander": "^12.1.0",
|
|
59
59
|
"esbuild": "0.25.12",
|
|
60
60
|
"inquirer": "^9.2.12",
|
|
61
|
-
"js-bao": "0.12.0-alpha.
|
|
61
|
+
"js-bao": "0.12.0-alpha.7",
|
|
62
62
|
"mime-types": "^2.1.35",
|
|
63
63
|
"open": "^10.0.3",
|
|
64
64
|
"smol-toml": "1.7.0",
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GENERATED FILE — DO NOT EDIT BY HAND.
|
|
3
|
-
*
|
|
4
|
-
* Source of truth: the `WorkflowDefinition` model in the repo-root
|
|
5
|
-
* `models.yaml` — the one statically-parseable server anchor for the
|
|
6
|
-
* `[workflow]`-level config surface (issue #2326, Phase 1 of #1976).
|
|
7
|
-
*
|
|
8
|
-
* Regenerate with:
|
|
9
|
-
* node cli/scripts/gen-workflow-fields.mjs (runs automatically at CLI prebuild)
|
|
10
|
-
*
|
|
11
|
-
* A CI freshness guard (`cli/scripts/gen-workflow-fields.mjs --check`, also
|
|
12
|
-
* asserted by `cli/tests/unit/workflow-field-descriptor-drift-guard.test.ts`)
|
|
13
|
-
* fails if this committed artifact does not match a fresh parse of
|
|
14
|
-
* `models.yaml`. The same test asserts every field below is classified in
|
|
15
|
-
* `cli/src/lib/workflow-field-descriptor.ts` as synced, structural, or
|
|
16
|
-
* internal — so a new server-side workflow field cannot be silently ignored by
|
|
17
|
-
* the CLI.
|
|
18
|
-
*/
|
|
19
|
-
/** Every `WorkflowDefinition` field, in `models.yaml` declaration order (#2326). */
|
|
20
|
-
export declare const GENERATED_WORKFLOW_MODEL_FIELDS: readonly string[];
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GENERATED FILE — DO NOT EDIT BY HAND.
|
|
3
|
-
*
|
|
4
|
-
* Source of truth: the `WorkflowDefinition` model in the repo-root
|
|
5
|
-
* `models.yaml` — the one statically-parseable server anchor for the
|
|
6
|
-
* `[workflow]`-level config surface (issue #2326, Phase 1 of #1976).
|
|
7
|
-
*
|
|
8
|
-
* Regenerate with:
|
|
9
|
-
* node cli/scripts/gen-workflow-fields.mjs (runs automatically at CLI prebuild)
|
|
10
|
-
*
|
|
11
|
-
* A CI freshness guard (`cli/scripts/gen-workflow-fields.mjs --check`, also
|
|
12
|
-
* asserted by `cli/tests/unit/workflow-field-descriptor-drift-guard.test.ts`)
|
|
13
|
-
* fails if this committed artifact does not match a fresh parse of
|
|
14
|
-
* `models.yaml`. The same test asserts every field below is classified in
|
|
15
|
-
* `cli/src/lib/workflow-field-descriptor.ts` as synced, structural, or
|
|
16
|
-
* internal — so a new server-side workflow field cannot be silently ignored by
|
|
17
|
-
* the CLI.
|
|
18
|
-
*/
|
|
19
|
-
/** Every `WorkflowDefinition` field, in `models.yaml` declaration order (#2326). */
|
|
20
|
-
export const GENERATED_WORKFLOW_MODEL_FIELDS = [
|
|
21
|
-
"workflowId",
|
|
22
|
-
"appId",
|
|
23
|
-
"workflowKey",
|
|
24
|
-
"name",
|
|
25
|
-
"status",
|
|
26
|
-
"latestRevision",
|
|
27
|
-
"description",
|
|
28
|
-
"stepsR2Key",
|
|
29
|
-
"draftStepsR2Key",
|
|
30
|
-
"draftInputSchema",
|
|
31
|
-
"draftOutputSchema",
|
|
32
|
-
"draftModifiedAt",
|
|
33
|
-
"activeConfigId",
|
|
34
|
-
"inputSchema",
|
|
35
|
-
"outputSchema",
|
|
36
|
-
"perUserMaxRunning",
|
|
37
|
-
"perUserMaxQueued",
|
|
38
|
-
"perAppMaxRunning",
|
|
39
|
-
"perAppMaxQueued",
|
|
40
|
-
"queueTtlSeconds",
|
|
41
|
-
"dequeueOrder",
|
|
42
|
-
"requiresClientApply",
|
|
43
|
-
"syncCallable",
|
|
44
|
-
"accessRule",
|
|
45
|
-
"metadataManifest",
|
|
46
|
-
"runAs",
|
|
47
|
-
"lock",
|
|
48
|
-
"capabilities",
|
|
49
|
-
"createdBy",
|
|
50
|
-
"createdAt",
|
|
51
|
-
"modifiedAt",
|
|
52
|
-
];
|
|
53
|
-
//# sourceMappingURL=generated-workflow-model-fields.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generated-workflow-model-fields.js","sourceRoot":"","sources":["../../../src/lib/generated-workflow-model-fields.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,oFAAoF;AACpF,MAAM,CAAC,MAAM,+BAA+B,GAAsB;IAChE,YAAY;IACZ,OAAO;IACP,aAAa;IACb,MAAM;IACN,QAAQ;IACR,gBAAgB;IAChB,aAAa;IACb,YAAY;IACZ,iBAAiB;IACjB,kBAAkB;IAClB,mBAAmB;IACnB,iBAAiB;IACjB,gBAAgB;IAChB,aAAa;IACb,cAAc;IACd,mBAAmB;IACnB,kBAAkB;IAClB,kBAAkB;IAClB,iBAAiB;IACjB,iBAAiB;IACjB,cAAc;IACd,qBAAqB;IACrB,cAAc;IACd,YAAY;IACZ,kBAAkB;IAClB,OAAO;IACP,MAAM;IACN,cAAc;IACd,WAAW;IACX,WAAW;IACX,YAAY;CACb,CAAC"}
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Classification of the `WorkflowDefinition` field surface (issue #2326,
|
|
3
|
-
* Phase 1 of #1976).
|
|
4
|
-
*
|
|
5
|
-
* Purpose: give the CLI a mechanical trip-wire for the drift that keeps
|
|
6
|
-
* happening — the server grows a `[workflow]`-level config field (`syncCallable`
|
|
7
|
-
* #807, `accessRule` #571, `runAs` #1081, `capabilities` #1172, `lock` #1518)
|
|
8
|
-
* and the CLI silently drops it on `sync push` / `sync pull`. Every field of the
|
|
9
|
-
* `WorkflowDefinition` model must appear in exactly one of the three groups
|
|
10
|
-
* below. The generated artifact `generated-workflow-model-fields.ts` carries the
|
|
11
|
-
* model's real field list (parsed from `models.yaml` at build time), and
|
|
12
|
-
* `cli/tests/unit/workflow-field-descriptor-drift-guard.test.ts` asserts
|
|
13
|
-
*
|
|
14
|
-
* synced ∪ structural ∪ internal === the model's fields
|
|
15
|
-
*
|
|
16
|
-
* so a new field hard-fails the guard until someone classifies it.
|
|
17
|
-
*
|
|
18
|
-
* ── Scope: declarative classification and coverage ONLY ──────────────────
|
|
19
|
-
* Decision of record (#1976, 2026-07-23): this table records WHICH fields
|
|
20
|
-
* exist, whether each is synced / structural / internal, and its `[workflow]`
|
|
21
|
-
* TOML key. Anything with real BEHAVIOR gets an explicit per-field handler or
|
|
22
|
-
* stays outside the table. In particular this file deliberately does NOT encode
|
|
23
|
-
* as boolean knobs:
|
|
24
|
-
* - the schema fields' native-TOML-table-vs-JSON-string parsing
|
|
25
|
-
* (`buildWorkflowPayloadFromToml` / `safeJsonParse` own that),
|
|
26
|
-
* - `syncCallable`'s deferred second PATCH on update (#807 — `applyWorkflowBody`
|
|
27
|
-
* owns that),
|
|
28
|
-
* - the `metadataManifest` (#1304) and `expr.cel` (#1614) structural side
|
|
29
|
-
* channels, which are attached alongside the steps write and are not
|
|
30
|
-
* `[workflow]`-table keys at all.
|
|
31
|
-
* `cli/src/lib/app-settings-descriptor.ts` is the shape being matched:
|
|
32
|
-
* deliberately narrow.
|
|
33
|
-
*
|
|
34
|
-
* ── What Phase 1 does and does not do ───────────────────────────────────
|
|
35
|
-
* Phase 1 (this file) is the guard only. Making the push builder
|
|
36
|
-
* (`workflow-payload.ts`) and the pull serializer (`serializeWorkflow` in
|
|
37
|
-
* `commands/sync.ts`) *consume* this table is Phase 2 (#2327).
|
|
38
|
-
* `synced` therefore means "belongs in the `[workflow]` TOML table", NOT
|
|
39
|
-
* "already round-trips" — see `SYNCED_NOT_YET_WIRED` below.
|
|
40
|
-
*/
|
|
41
|
-
/** Value shape of a synced `[workflow]` key. Descriptive; behavior lives in the handlers. */
|
|
42
|
-
export type WorkflowFieldType = "string" | "number" | "boolean" | "string[]" | "json";
|
|
43
|
-
export interface WorkflowFieldDescriptor {
|
|
44
|
-
/** `WorkflowDefinition` model field name === the server payload key. */
|
|
45
|
-
field: string;
|
|
46
|
-
/** Key under the `[workflow]` table in workflow TOML (usually === `field`). */
|
|
47
|
-
tomlKey: string;
|
|
48
|
-
/** Value shape, for the Phase 2 handlers and for documentation. */
|
|
49
|
-
type: WorkflowFieldType;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* The author-facing `[workflow]`-table config fields — the ones a workflow
|
|
53
|
-
* author manages as code and the CLI must round-trip.
|
|
54
|
-
*/
|
|
55
|
-
export declare const WORKFLOW_FIELD_DESCRIPTOR: readonly WorkflowFieldDescriptor[];
|
|
56
|
-
/**
|
|
57
|
-
* Fields that ARE author-controlled but do not live in the `[workflow]` table —
|
|
58
|
-
* they travel through their own structural channel. Kept distinct from
|
|
59
|
-
* `WORKFLOW_FIELDS_INTERNAL` so "internal" keeps meaning "not author-facing".
|
|
60
|
-
*/
|
|
61
|
-
export declare const WORKFLOW_FIELDS_STRUCTURAL: ReadonlySet<string>;
|
|
62
|
-
/**
|
|
63
|
-
* Fields the server owns: identity, ownership, timestamps, computed pointers,
|
|
64
|
-
* and the deprecated draft/revision slot. None of these are ever sent by the
|
|
65
|
-
* CLI, and none belong in workflow TOML.
|
|
66
|
-
*/
|
|
67
|
-
export declare const WORKFLOW_FIELDS_INTERNAL: ReadonlySet<string>;
|
|
68
|
-
/**
|
|
69
|
-
* Synced fields the CLI does NOT round-trip yet — Phase 2 (#2327) wires them.
|
|
70
|
-
* Recorded explicitly so "classified" is never mistaken for "implemented".
|
|
71
|
-
* `lock` was wired by #1972; `templateMissingMarker` was removed from the
|
|
72
|
-
* platform by #2643, so the set is now empty.
|
|
73
|
-
*/
|
|
74
|
-
export declare const SYNCED_NOT_YET_WIRED: ReadonlySet<string>;
|
|
75
|
-
/** Descriptor `field` names, for coverage/parity checks. */
|
|
76
|
-
export declare const WORKFLOW_SYNCED_FIELDS: ReadonlySet<string>;
|
|
77
|
-
/** Look up a synced field's descriptor by model field name. */
|
|
78
|
-
export declare function getWorkflowFieldDescriptor(field: string): WorkflowFieldDescriptor | undefined;
|
|
79
|
-
/**
|
|
80
|
-
* Model fields that are classified in NONE of synced / structural / internal —
|
|
81
|
-
* i.e. a field someone added to `models.yaml` without deciding how the CLI
|
|
82
|
-
* treats it. Non-empty is a hard failure in the drift guard.
|
|
83
|
-
*/
|
|
84
|
-
export declare function findUnclassifiedWorkflowFields(modelFields: readonly string[]): string[];
|
|
85
|
-
/**
|
|
86
|
-
* Classifications that no longer correspond to a model field — i.e. a field
|
|
87
|
-
* removed from `models.yaml` while the CLI still classifies it. Also a hard
|
|
88
|
-
* failure: a stale classification must not silently pass, or the coverage
|
|
89
|
-
* claim quietly stops meaning anything.
|
|
90
|
-
*/
|
|
91
|
-
export declare function findStaleWorkflowClassifications(modelFields: readonly string[]): string[];
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Classification of the `WorkflowDefinition` field surface (issue #2326,
|
|
3
|
-
* Phase 1 of #1976).
|
|
4
|
-
*
|
|
5
|
-
* Purpose: give the CLI a mechanical trip-wire for the drift that keeps
|
|
6
|
-
* happening — the server grows a `[workflow]`-level config field (`syncCallable`
|
|
7
|
-
* #807, `accessRule` #571, `runAs` #1081, `capabilities` #1172, `lock` #1518)
|
|
8
|
-
* and the CLI silently drops it on `sync push` / `sync pull`. Every field of the
|
|
9
|
-
* `WorkflowDefinition` model must appear in exactly one of the three groups
|
|
10
|
-
* below. The generated artifact `generated-workflow-model-fields.ts` carries the
|
|
11
|
-
* model's real field list (parsed from `models.yaml` at build time), and
|
|
12
|
-
* `cli/tests/unit/workflow-field-descriptor-drift-guard.test.ts` asserts
|
|
13
|
-
*
|
|
14
|
-
* synced ∪ structural ∪ internal === the model's fields
|
|
15
|
-
*
|
|
16
|
-
* so a new field hard-fails the guard until someone classifies it.
|
|
17
|
-
*
|
|
18
|
-
* ── Scope: declarative classification and coverage ONLY ──────────────────
|
|
19
|
-
* Decision of record (#1976, 2026-07-23): this table records WHICH fields
|
|
20
|
-
* exist, whether each is synced / structural / internal, and its `[workflow]`
|
|
21
|
-
* TOML key. Anything with real BEHAVIOR gets an explicit per-field handler or
|
|
22
|
-
* stays outside the table. In particular this file deliberately does NOT encode
|
|
23
|
-
* as boolean knobs:
|
|
24
|
-
* - the schema fields' native-TOML-table-vs-JSON-string parsing
|
|
25
|
-
* (`buildWorkflowPayloadFromToml` / `safeJsonParse` own that),
|
|
26
|
-
* - `syncCallable`'s deferred second PATCH on update (#807 — `applyWorkflowBody`
|
|
27
|
-
* owns that),
|
|
28
|
-
* - the `metadataManifest` (#1304) and `expr.cel` (#1614) structural side
|
|
29
|
-
* channels, which are attached alongside the steps write and are not
|
|
30
|
-
* `[workflow]`-table keys at all.
|
|
31
|
-
* `cli/src/lib/app-settings-descriptor.ts` is the shape being matched:
|
|
32
|
-
* deliberately narrow.
|
|
33
|
-
*
|
|
34
|
-
* ── What Phase 1 does and does not do ───────────────────────────────────
|
|
35
|
-
* Phase 1 (this file) is the guard only. Making the push builder
|
|
36
|
-
* (`workflow-payload.ts`) and the pull serializer (`serializeWorkflow` in
|
|
37
|
-
* `commands/sync.ts`) *consume* this table is Phase 2 (#2327).
|
|
38
|
-
* `synced` therefore means "belongs in the `[workflow]` TOML table", NOT
|
|
39
|
-
* "already round-trips" — see `SYNCED_NOT_YET_WIRED` below.
|
|
40
|
-
*/
|
|
41
|
-
/**
|
|
42
|
-
* The author-facing `[workflow]`-table config fields — the ones a workflow
|
|
43
|
-
* author manages as code and the CLI must round-trip.
|
|
44
|
-
*/
|
|
45
|
-
export const WORKFLOW_FIELD_DESCRIPTOR = [
|
|
46
|
-
{ field: "name", tomlKey: "name", type: "string" },
|
|
47
|
-
{ field: "status", tomlKey: "status", type: "string" },
|
|
48
|
-
{ field: "description", tomlKey: "description", type: "string" },
|
|
49
|
-
// JSON Schema objects. TOML may present them as an inline table OR as a
|
|
50
|
-
// JSON string; the push builder owns that parse (not a knob here).
|
|
51
|
-
{ field: "inputSchema", tomlKey: "inputSchema", type: "json" },
|
|
52
|
-
{ field: "outputSchema", tomlKey: "outputSchema", type: "json" },
|
|
53
|
-
{ field: "perUserMaxRunning", tomlKey: "perUserMaxRunning", type: "number" },
|
|
54
|
-
{ field: "perUserMaxQueued", tomlKey: "perUserMaxQueued", type: "number" },
|
|
55
|
-
{ field: "perAppMaxRunning", tomlKey: "perAppMaxRunning", type: "number" },
|
|
56
|
-
{ field: "perAppMaxQueued", tomlKey: "perAppMaxQueued", type: "number" },
|
|
57
|
-
{ field: "queueTtlSeconds", tomlKey: "queueTtlSeconds", type: "number" },
|
|
58
|
-
{ field: "dequeueOrder", tomlKey: "dequeueOrder", type: "string" },
|
|
59
|
-
{
|
|
60
|
-
field: "requiresClientApply",
|
|
61
|
-
tomlKey: "requiresClientApply",
|
|
62
|
-
type: "boolean",
|
|
63
|
-
},
|
|
64
|
-
// Create-only on the wire (#807: update sends it as a deferred second PATCH
|
|
65
|
-
// once the new steps are live). That sequencing is the payload builder's job.
|
|
66
|
-
{ field: "syncCallable", tomlKey: "syncCallable", type: "boolean" },
|
|
67
|
-
{ field: "accessRule", tomlKey: "accessRule", type: "string" },
|
|
68
|
-
{ field: "runAs", tomlKey: "runAs", type: "string" },
|
|
69
|
-
// #1518/#1972 — declarative run-scoped lock. `[workflow.lock]` inline table
|
|
70
|
-
// on the TOML side, JSON on the wire; validated server-side by
|
|
71
|
-
// `parseWorkflowLock` (decision of record #6: no client-side mirror validator).
|
|
72
|
-
{ field: "lock", tomlKey: "lock", type: "json" },
|
|
73
|
-
// #1078 Tier 1b — StringSetField on the model, string array in TOML/JSON.
|
|
74
|
-
{ field: "capabilities", tomlKey: "capabilities", type: "string[]" },
|
|
75
|
-
];
|
|
76
|
-
/**
|
|
77
|
-
* Fields that ARE author-controlled but do not live in the `[workflow]` table —
|
|
78
|
-
* they travel through their own structural channel. Kept distinct from
|
|
79
|
-
* `WORKFLOW_FIELDS_INTERNAL` so "internal" keeps meaning "not author-facing".
|
|
80
|
-
*/
|
|
81
|
-
export const WORKFLOW_FIELDS_STRUCTURAL = new Set([
|
|
82
|
-
// The workflow's identity. Comes from the TOML file name / `--key`, and is
|
|
83
|
-
// attached by the caller rather than spread from the `[workflow]` table.
|
|
84
|
-
"workflowKey",
|
|
85
|
-
// #1304 — JSON declared-access manifest, derived from the workflow's CEL
|
|
86
|
-
// fields and attached alongside the steps write, not typed by the author.
|
|
87
|
-
"metadataManifest",
|
|
88
|
-
]);
|
|
89
|
-
/**
|
|
90
|
-
* Fields the server owns: identity, ownership, timestamps, computed pointers,
|
|
91
|
-
* and the deprecated draft/revision slot. None of these are ever sent by the
|
|
92
|
-
* CLI, and none belong in workflow TOML.
|
|
93
|
-
*/
|
|
94
|
-
export const WORKFLOW_FIELDS_INTERNAL = new Set([
|
|
95
|
-
// Identity / ownership / timestamps — assigned by the server.
|
|
96
|
-
"workflowId",
|
|
97
|
-
"appId",
|
|
98
|
-
"createdBy",
|
|
99
|
-
"createdAt",
|
|
100
|
-
"modifiedAt",
|
|
101
|
-
// Pointer to the active WorkflowConfiguration — server-computed on publish.
|
|
102
|
-
"activeConfigId",
|
|
103
|
-
// DEPRECATED in models.yaml: the legacy revision + draft slot, kept for
|
|
104
|
-
// migration/backward compatibility. Server-managed; never author-authored.
|
|
105
|
-
"latestRevision",
|
|
106
|
-
"stepsR2Key",
|
|
107
|
-
"draftStepsR2Key",
|
|
108
|
-
"draftInputSchema",
|
|
109
|
-
"draftOutputSchema",
|
|
110
|
-
"draftModifiedAt",
|
|
111
|
-
]);
|
|
112
|
-
/**
|
|
113
|
-
* Synced fields the CLI does NOT round-trip yet — Phase 2 (#2327) wires them.
|
|
114
|
-
* Recorded explicitly so "classified" is never mistaken for "implemented".
|
|
115
|
-
* `lock` was wired by #1972; `templateMissingMarker` was removed from the
|
|
116
|
-
* platform by #2643, so the set is now empty.
|
|
117
|
-
*/
|
|
118
|
-
export const SYNCED_NOT_YET_WIRED = new Set([]);
|
|
119
|
-
/** Descriptor `field` names, for coverage/parity checks. */
|
|
120
|
-
export const WORKFLOW_SYNCED_FIELDS = new Set(WORKFLOW_FIELD_DESCRIPTOR.map((d) => d.field));
|
|
121
|
-
/** Look up a synced field's descriptor by model field name. */
|
|
122
|
-
export function getWorkflowFieldDescriptor(field) {
|
|
123
|
-
return WORKFLOW_FIELD_DESCRIPTOR.find((d) => d.field === field);
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Model fields that are classified in NONE of synced / structural / internal —
|
|
127
|
-
* i.e. a field someone added to `models.yaml` without deciding how the CLI
|
|
128
|
-
* treats it. Non-empty is a hard failure in the drift guard.
|
|
129
|
-
*/
|
|
130
|
-
export function findUnclassifiedWorkflowFields(modelFields) {
|
|
131
|
-
return modelFields
|
|
132
|
-
.filter((f) => !WORKFLOW_SYNCED_FIELDS.has(f) &&
|
|
133
|
-
!WORKFLOW_FIELDS_STRUCTURAL.has(f) &&
|
|
134
|
-
!WORKFLOW_FIELDS_INTERNAL.has(f))
|
|
135
|
-
.sort();
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Classifications that no longer correspond to a model field — i.e. a field
|
|
139
|
-
* removed from `models.yaml` while the CLI still classifies it. Also a hard
|
|
140
|
-
* failure: a stale classification must not silently pass, or the coverage
|
|
141
|
-
* claim quietly stops meaning anything.
|
|
142
|
-
*/
|
|
143
|
-
export function findStaleWorkflowClassifications(modelFields) {
|
|
144
|
-
const known = new Set(modelFields);
|
|
145
|
-
return [
|
|
146
|
-
...WORKFLOW_SYNCED_FIELDS,
|
|
147
|
-
...WORKFLOW_FIELDS_STRUCTURAL,
|
|
148
|
-
...WORKFLOW_FIELDS_INTERNAL,
|
|
149
|
-
]
|
|
150
|
-
.filter((f) => !known.has(f))
|
|
151
|
-
.sort();
|
|
152
|
-
}
|
|
153
|
-
//# sourceMappingURL=workflow-field-descriptor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-field-descriptor.js","sourceRoot":"","sources":["../../../src/lib/workflow-field-descriptor.ts"],"names":[],"mappings":"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"}
|