systemoneprompts 0.1.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 (147) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/LICENSE +21 -0
  3. package/README.md +214 -0
  4. package/dist/answers.d.ts +21 -0
  5. package/dist/answers.d.ts.map +1 -0
  6. package/dist/answers.js +104 -0
  7. package/dist/answers.js.map +1 -0
  8. package/dist/cli/cache.d.ts +2 -0
  9. package/dist/cli/cache.d.ts.map +1 -0
  10. package/dist/cli/cache.js +26 -0
  11. package/dist/cli/cache.js.map +1 -0
  12. package/dist/cli/check.d.ts +2 -0
  13. package/dist/cli/check.d.ts.map +1 -0
  14. package/dist/cli/check.js +28 -0
  15. package/dist/cli/check.js.map +1 -0
  16. package/dist/cli/env.d.ts +2 -0
  17. package/dist/cli/env.d.ts.map +1 -0
  18. package/dist/cli/env.js +29 -0
  19. package/dist/cli/env.js.map +1 -0
  20. package/dist/cli/eval.d.ts +18 -0
  21. package/dist/cli/eval.d.ts.map +1 -0
  22. package/dist/cli/eval.js +314 -0
  23. package/dist/cli/eval.js.map +1 -0
  24. package/dist/cli/generate.d.ts +5 -0
  25. package/dist/cli/generate.d.ts.map +1 -0
  26. package/dist/cli/generate.js +93 -0
  27. package/dist/cli/generate.js.map +1 -0
  28. package/dist/cli/index.d.ts +3 -0
  29. package/dist/cli/index.d.ts.map +1 -0
  30. package/dist/cli/index.js +76 -0
  31. package/dist/cli/index.js.map +1 -0
  32. package/dist/cli/io.d.ts +28 -0
  33. package/dist/cli/io.d.ts.map +1 -0
  34. package/dist/cli/io.js +88 -0
  35. package/dist/cli/io.js.map +1 -0
  36. package/dist/cli/run.d.ts +7 -0
  37. package/dist/cli/run.d.ts.map +1 -0
  38. package/dist/cli/run.js +63 -0
  39. package/dist/cli/run.js.map +1 -0
  40. package/dist/client.d.ts +65 -0
  41. package/dist/client.d.ts.map +1 -0
  42. package/dist/client.js +301 -0
  43. package/dist/client.js.map +1 -0
  44. package/dist/cloudflare.d.ts +29 -0
  45. package/dist/cloudflare.d.ts.map +1 -0
  46. package/dist/cloudflare.js +159 -0
  47. package/dist/cloudflare.js.map +1 -0
  48. package/dist/definition/check.d.ts +9 -0
  49. package/dist/definition/check.d.ts.map +1 -0
  50. package/dist/definition/check.js +26 -0
  51. package/dist/definition/check.js.map +1 -0
  52. package/dist/definition/diagnostics.d.ts +29 -0
  53. package/dist/definition/diagnostics.d.ts.map +1 -0
  54. package/dist/definition/diagnostics.js +74 -0
  55. package/dist/definition/diagnostics.js.map +1 -0
  56. package/dist/definition/locate.d.ts +23 -0
  57. package/dist/definition/locate.d.ts.map +1 -0
  58. package/dist/definition/locate.js +211 -0
  59. package/dist/definition/locate.js.map +1 -0
  60. package/dist/definition/parse.d.ts +15 -0
  61. package/dist/definition/parse.d.ts.map +1 -0
  62. package/dist/definition/parse.js +170 -0
  63. package/dist/definition/parse.js.map +1 -0
  64. package/dist/definition/schema.d.ts +39 -0
  65. package/dist/definition/schema.d.ts.map +1 -0
  66. package/dist/definition/schema.js +11 -0
  67. package/dist/definition/schema.js.map +1 -0
  68. package/dist/dev/cache.d.ts +58 -0
  69. package/dist/dev/cache.d.ts.map +1 -0
  70. package/dist/dev/cache.js +287 -0
  71. package/dist/dev/cache.js.map +1 -0
  72. package/dist/dev/index.d.ts +2 -0
  73. package/dist/dev/index.d.ts.map +1 -0
  74. package/dist/dev/index.js +3 -0
  75. package/dist/dev/index.js.map +1 -0
  76. package/dist/factors/evaluate.d.ts +21 -0
  77. package/dist/factors/evaluate.d.ts.map +1 -0
  78. package/dist/factors/evaluate.js +199 -0
  79. package/dist/factors/evaluate.js.map +1 -0
  80. package/dist/factors/graph.d.ts +7 -0
  81. package/dist/factors/graph.d.ts.map +1 -0
  82. package/dist/factors/graph.js +39 -0
  83. package/dist/factors/graph.js.map +1 -0
  84. package/dist/factors/schema.d.ts +54 -0
  85. package/dist/factors/schema.d.ts.map +1 -0
  86. package/dist/factors/schema.js +235 -0
  87. package/dist/factors/schema.js.map +1 -0
  88. package/dist/generate/generate.d.ts +16 -0
  89. package/dist/generate/generate.d.ts.map +1 -0
  90. package/dist/generate/generate.js +100 -0
  91. package/dist/generate/generate.js.map +1 -0
  92. package/dist/generate/types.d.ts +10 -0
  93. package/dist/generate/types.d.ts.map +1 -0
  94. package/dist/generate/types.js +126 -0
  95. package/dist/generate/types.js.map +1 -0
  96. package/dist/index.d.ts +15 -0
  97. package/dist/index.d.ts.map +1 -0
  98. package/dist/index.js +13 -0
  99. package/dist/index.js.map +1 -0
  100. package/dist/json.d.ts +6 -0
  101. package/dist/json.d.ts.map +1 -0
  102. package/dist/json.js +52 -0
  103. package/dist/json.js.map +1 -0
  104. package/dist/model.d.ts +9 -0
  105. package/dist/model.d.ts.map +1 -0
  106. package/dist/model.js +22 -0
  107. package/dist/model.js.map +1 -0
  108. package/dist/native.d.ts +97 -0
  109. package/dist/native.d.ts.map +1 -0
  110. package/dist/native.js +2 -0
  111. package/dist/native.js.map +1 -0
  112. package/dist/patterns/index.d.ts +3 -0
  113. package/dist/patterns/index.d.ts.map +1 -0
  114. package/dist/patterns/index.js +3 -0
  115. package/dist/patterns/index.js.map +1 -0
  116. package/dist/patterns/options.d.ts +2 -0
  117. package/dist/patterns/options.d.ts.map +1 -0
  118. package/dist/patterns/options.js +7 -0
  119. package/dist/patterns/options.js.map +1 -0
  120. package/dist/patterns/run-many.d.ts +41 -0
  121. package/dist/patterns/run-many.d.ts.map +1 -0
  122. package/dist/patterns/run-many.js +51 -0
  123. package/dist/patterns/run-many.js.map +1 -0
  124. package/dist/patterns/walk-taxonomy.d.ts +37 -0
  125. package/dist/patterns/walk-taxonomy.d.ts.map +1 -0
  126. package/dist/patterns/walk-taxonomy.js +81 -0
  127. package/dist/patterns/walk-taxonomy.js.map +1 -0
  128. package/dist/questions/references.d.ts +12 -0
  129. package/dist/questions/references.d.ts.map +1 -0
  130. package/dist/questions/references.js +76 -0
  131. package/dist/questions/references.js.map +1 -0
  132. package/dist/questions/schema.d.ts +18 -0
  133. package/dist/questions/schema.d.ts.map +1 -0
  134. package/dist/questions/schema.js +169 -0
  135. package/dist/questions/schema.js.map +1 -0
  136. package/dist/state/paths.d.ts +13 -0
  137. package/dist/state/paths.d.ts.map +1 -0
  138. package/dist/state/paths.js +70 -0
  139. package/dist/state/paths.js.map +1 -0
  140. package/dist/state/requirements.d.ts +25 -0
  141. package/dist/state/requirements.d.ts.map +1 -0
  142. package/dist/state/requirements.js +189 -0
  143. package/dist/state/requirements.js.map +1 -0
  144. package/docs/SPEC.html +57 -0
  145. package/docs/skills/systemoneprompts/SKILL.md +239 -0
  146. package/docs/skills/systemoneprompts/references/application-data.md +79 -0
  147. package/package.json +94 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../src/factors/evaluate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/D,OAAO,KAAK,EAAE,UAAU,EAAa,WAAW,EAAE,MAAM,aAAa,CAAC;AAGtE,sEAAsE;AACtE,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,SAAS,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAE5E,uFAAuF;AACvF,eAAO,MAAM,WAAW,MAAM,CAAC;AAE/B;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChG,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAChC,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAgC/B;AA6ED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAc5D;AAsGD,mEAAmE;AACnE,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAU/D"}
@@ -0,0 +1,199 @@
1
+ import { diagnostic, errorsOf, SystemOnePromptsError } from "../definition/diagnostics.js";
2
+ import { isPlainObject } from "../json.js";
3
+ import { topoSortFactors } from "./graph.js";
4
+ import { parseFactors } from "./schema.js";
5
+ /** A bare Noul reference in a Boolean context means `noul >= 0.5`. Fixed by design. */
6
+ export const NOUL_CUTOFF = 0.5;
7
+ /**
8
+ * Compile verbatim factor tables into a pure evaluator: answers in, Booleans out.
9
+ * Structural problems and cycles throw here; missing answers throw at evaluation time
10
+ * (never silently `false`, which `not` would flip into a wrong `true`).
11
+ */
12
+ export function createFactorEvaluator(defs) {
13
+ if (!isPlainObject(defs)) {
14
+ throw new SystemOnePromptsError(diagnostic("error", "factors-not-table", "createFactorEvaluator expects the factor tables (definition.factorDefinitions)"));
15
+ }
16
+ const parsed = parseFactors(defs, new Set());
17
+ const errors = errorsOf(parsed.diagnostics);
18
+ if (errors.length > 0)
19
+ throw new SystemOnePromptsError(errors);
20
+ const sorted = topoSortFactors(parsed.factors, () => ({}));
21
+ if (sorted.diagnostics.length > 0)
22
+ throw new SystemOnePromptsError(sorted.diagnostics);
23
+ const factors = parsed.factors;
24
+ const order = sorted.order;
25
+ const factorIds = Object.keys(defs);
26
+ return (answers) => {
27
+ const resolved = new Map();
28
+ for (const id of order) {
29
+ const factor = factors[id];
30
+ if (!factor)
31
+ continue;
32
+ resolved.set(id, evaluateFactor(id, factor, answers, resolved, factors));
33
+ }
34
+ const out = Object.create(null);
35
+ for (const id of factorIds) {
36
+ out[id] = resolved.get(id) ?? false;
37
+ }
38
+ return out;
39
+ };
40
+ }
41
+ function evaluateFactor(id, factor, answers, resolved, factors) {
42
+ switch (factor.kind) {
43
+ case "predicate":
44
+ return evaluatePredicate(id, factor, answers);
45
+ case "not":
46
+ return !resolveBoolean(factor.of, answers, resolved, factors);
47
+ case "all": {
48
+ let result = true;
49
+ for (const ref of factor.of) {
50
+ if (!resolveBoolean(ref, answers, resolved, factors))
51
+ result = false;
52
+ }
53
+ return result;
54
+ }
55
+ case "any": {
56
+ let result = false;
57
+ for (const ref of factor.of) {
58
+ if (resolveBoolean(ref, answers, resolved, factors))
59
+ result = true;
60
+ }
61
+ return result;
62
+ }
63
+ case "at_least": {
64
+ let count = 0;
65
+ for (const ref of factor.of) {
66
+ if (resolveBoolean(ref, answers, resolved, factors))
67
+ count += 1;
68
+ }
69
+ return count >= factor.count;
70
+ }
71
+ }
72
+ }
73
+ function resolveBoolean(ref, answers, resolved, factors) {
74
+ if (resolved.has(ref))
75
+ return resolved.get(ref) ?? false;
76
+ if (Object.hasOwn(factors, ref)) {
77
+ throw new SystemOnePromptsError(diagnostic("error", "factor-order", `factor \`${ref}\` was referenced before it was evaluated`));
78
+ }
79
+ const answer = requireAnswer(ref, answers);
80
+ if (!isPlainObject(answer) || !Object.hasOwn(answer, "noul") || typeof answer.noul !== "number") {
81
+ throw new SystemOnePromptsError(diagnostic("error", "non-noul-runtime", `reference \`${ref}\` is not a Noul answer; wrap Choice/Score in a predicate`));
82
+ }
83
+ requireFiniteNumber(`answer \`${ref}\``, "noul", answer.noul);
84
+ return answer.noul >= NOUL_CUTOFF;
85
+ }
86
+ function hasValueChecks(factor) {
87
+ return (factor.choice !== undefined ||
88
+ factor.noul !== undefined ||
89
+ factor.score !== undefined ||
90
+ factor.confidence !== undefined);
91
+ }
92
+ /**
93
+ * Known-answer rule aligned with pi-start-smart `isKnownAnswer`:
94
+ * explicit `missing`, confidence 0, and a bare Noul of 0.5 are unknown.
95
+ * Missing answers are unknown (not an error) when the predicate asks about known-ness.
96
+ */
97
+ export function isKnownNativeAnswer(answer) {
98
+ if (!isPlainObject(answer))
99
+ return false;
100
+ if (answer.missing === true)
101
+ return false;
102
+ if (Object.hasOwn(answer, "confidence")) {
103
+ if (typeof answer.confidence !== "number" || !Number.isFinite(answer.confidence))
104
+ return false;
105
+ return answer.confidence !== 0;
106
+ }
107
+ if (Object.hasOwn(answer, "noul")) {
108
+ if (typeof answer.noul !== "number" || !Number.isFinite(answer.noul))
109
+ return false;
110
+ return answer.noul !== NOUL_CUTOFF;
111
+ }
112
+ if (typeof answer.choice === "string")
113
+ return true;
114
+ if (typeof answer.score === "number")
115
+ return Number.isFinite(answer.score);
116
+ return false;
117
+ }
118
+ function lookupAnswer(id, answers) {
119
+ if (!Object.hasOwn(answers, id))
120
+ return undefined;
121
+ return answers[id];
122
+ }
123
+ function evaluatePredicate(id, factor, answers) {
124
+ const lookedUp = lookupAnswer(factor.ref, answers);
125
+ const known = isKnownNativeAnswer(lookedUp);
126
+ if (factor.known !== undefined) {
127
+ if (factor.known !== known)
128
+ return false;
129
+ if (!hasValueChecks(factor))
130
+ return true;
131
+ // known=false matched: the answer is unknown. Value comparisons still
132
+ // need a body and throw if it is missing (not coerced to false).
133
+ if (factor.known === false && (lookedUp == null || !isPlainObject(lookedUp))) {
134
+ throw new SystemOnePromptsError(diagnostic("error", "missing-answer", `missing answer \`${factor.ref}\``));
135
+ }
136
+ }
137
+ const answer = requireAnswer(factor.ref, answers);
138
+ if (!isPlainObject(answer)) {
139
+ throw new SystemOnePromptsError(diagnostic("error", "invalid-answer", `answer \`${factor.ref}\` is not an object`));
140
+ }
141
+ const checks = [];
142
+ if (factor.choice !== undefined) {
143
+ if (!Object.hasOwn(answer, "choice") || typeof answer.choice !== "string") {
144
+ throw new SystemOnePromptsError(diagnostic("error", "missing-choice-field", `factor \`${id}\` expected Choice answer \`${factor.ref}\` to have a choice field`));
145
+ }
146
+ checks.push(answer.choice === factor.choice);
147
+ }
148
+ if (factor.noul !== undefined) {
149
+ if (!Object.hasOwn(answer, "noul") || typeof answer.noul !== "number") {
150
+ throw new SystemOnePromptsError(diagnostic("error", "missing-noul-field", `factor \`${id}\` expected Noul answer \`${factor.ref}\` to have a noul field`));
151
+ }
152
+ requireFiniteNumber(`factor \`${id}\` answer \`${factor.ref}\``, "noul", answer.noul);
153
+ checks.push(compare(answer.noul, factor.noul));
154
+ }
155
+ if (factor.score !== undefined) {
156
+ if (!Object.hasOwn(answer, "score") || typeof answer.score !== "number") {
157
+ throw new SystemOnePromptsError(diagnostic("error", "missing-score-field", `factor \`${id}\` expected Score answer \`${factor.ref}\` to have a score field`));
158
+ }
159
+ requireFiniteNumber(`factor \`${id}\` answer \`${factor.ref}\``, "score", answer.score);
160
+ checks.push(compare(answer.score, factor.score));
161
+ }
162
+ if (factor.confidence !== undefined) {
163
+ if (!Object.hasOwn(answer, "confidence") || typeof answer.confidence !== "number") {
164
+ throw new SystemOnePromptsError(diagnostic("error", "missing-confidence-field", `factor \`${id}\` expected \`${factor.ref}\` to have a confidence field`));
165
+ }
166
+ requireFiniteNumber(`factor \`${id}\` answer \`${factor.ref}\``, "confidence", answer.confidence);
167
+ checks.push(compare(answer.confidence, factor.confidence));
168
+ }
169
+ return checks.every(Boolean);
170
+ }
171
+ function requireAnswer(id, answers) {
172
+ if (!Object.hasOwn(answers, id) || answers[id] == null) {
173
+ throw new SystemOnePromptsError(diagnostic("error", "missing-answer", `missing answer \`${id}\``));
174
+ }
175
+ return answers[id];
176
+ }
177
+ /** All comparators present in `cmp` must hold (they are ANDed). */
178
+ export function compare(value, cmp) {
179
+ requireFiniteNumber("comparison", "value", value);
180
+ for (const key of ["gt", "gte", "lt", "lte"]) {
181
+ if (cmp[key] !== undefined)
182
+ requireFiniteNumber("comparison", key, cmp[key]);
183
+ }
184
+ if (cmp.gt !== undefined && !(value > cmp.gt))
185
+ return false;
186
+ if (cmp.gte !== undefined && !(value >= cmp.gte))
187
+ return false;
188
+ if (cmp.lt !== undefined && !(value < cmp.lt))
189
+ return false;
190
+ if (cmp.lte !== undefined && !(value <= cmp.lte))
191
+ return false;
192
+ return true;
193
+ }
194
+ function requireFiniteNumber(context, field, value) {
195
+ if (!Number.isFinite(value)) {
196
+ throw new SystemOnePromptsError(diagnostic("error", "nonfinite-number", `${context} field \`${field}\` must be finite`));
197
+ }
198
+ }
199
+ //# sourceMappingURL=evaluate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/factors/evaluate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type Diagnostic, type SourceLocation } from "../definition/diagnostics.js";
2
+ import type { FactorDef } from "./schema.js";
3
+ export declare function topoSortFactors(factors: Record<string, FactorDef>, locateFactor: (id: string) => SourceLocation): {
4
+ order: string[];
5
+ diagnostics: Diagnostic[];
6
+ };
7
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/factors/graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAc,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAChG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAClC,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,cAAc,GAC3C;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,UAAU,EAAE,CAAA;CAAE,CAsChD"}
@@ -0,0 +1,39 @@
1
+ import { diagnostic } from "../definition/diagnostics.js";
2
+ import { referencedIds } from "./schema.js";
3
+ export function topoSortFactors(factors, locateFactor) {
4
+ const diagnostics = [];
5
+ const factorIds = new Set(Object.keys(factors));
6
+ const visiting = new Set();
7
+ const visited = new Set();
8
+ const order = [];
9
+ const stack = [];
10
+ const visit = (id) => {
11
+ if (visited.has(id))
12
+ return;
13
+ if (visiting.has(id)) {
14
+ const cycleStart = stack.indexOf(id);
15
+ const cycle = [...stack.slice(cycleStart), id];
16
+ diagnostics.push(diagnostic("error", "cycle", `cycle: ${cycle.join(" → ")}`, locateFactor(id)));
17
+ return;
18
+ }
19
+ visiting.add(id);
20
+ stack.push(id);
21
+ if (Object.hasOwn(factors, id)) {
22
+ const factor = factors[id];
23
+ for (const ref of referencedIds(factor)) {
24
+ if (!factorIds.has(ref))
25
+ continue;
26
+ visit(ref);
27
+ }
28
+ }
29
+ stack.pop();
30
+ visiting.delete(id);
31
+ visited.add(id);
32
+ order.push(id);
33
+ };
34
+ for (const id of Object.keys(factors)) {
35
+ visit(id);
36
+ }
37
+ return { order, diagnostics };
38
+ }
39
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/factors/graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,UAAU,EAAuB,MAAM,8BAA8B,CAAC;AAEhG,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,UAAU,eAAe,CAC7B,OAAkC,EAClC,YAA4C;IAE5C,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,MAAM,KAAK,GAAG,CAAC,EAAU,EAAQ,EAAE;QACjC,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO;QAC5B,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACrB,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACrC,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/C,WAAW,CAAC,IAAI,CACd,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,CAC9E,CAAC;YACF,OAAO;QACT,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,CAAE,CAAC;YAC5B,KAAK,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAClC,KAAK,CAAC,GAAG,CAAC,CAAC;YACb,CAAC;QACH,CAAC;QACD,KAAK,CAAC,GAAG,EAAE,CAAC;QACZ,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,KAAK,CAAC,EAAE,CAAC,CAAC;IACZ,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AAChC,CAAC"}
@@ -0,0 +1,54 @@
1
+ import type { Diagnostic, SourceLocation } from "../definition/diagnostics.js";
2
+ import { type SourceIndex } from "../definition/locate.js";
3
+ import type { QuestionInfo } from "../questions/schema.js";
4
+ export declare const COMPARATOR_KEYS: readonly ["gt", "gte", "lt", "lte"];
5
+ export type ComparatorKey = (typeof COMPARATOR_KEYS)[number];
6
+ export type Comparator = {
7
+ gt?: number;
8
+ gte?: number;
9
+ lt?: number;
10
+ lte?: number;
11
+ };
12
+ export type PredicateFactor = {
13
+ kind: "predicate";
14
+ ref: string;
15
+ /** Require a known (or unknown) answer before other predicate fields. */
16
+ known?: boolean;
17
+ choice?: string;
18
+ noul?: Comparator;
19
+ score?: Comparator;
20
+ confidence?: Comparator;
21
+ };
22
+ export type AllFactor = {
23
+ kind: "all";
24
+ of: string[];
25
+ };
26
+ export type AnyFactor = {
27
+ kind: "any";
28
+ of: string[];
29
+ };
30
+ export type NotFactor = {
31
+ kind: "not";
32
+ of: string;
33
+ };
34
+ export type AtLeastFactor = {
35
+ kind: "at_least";
36
+ count: number;
37
+ of: string[];
38
+ };
39
+ export type FactorDef = PredicateFactor | AllFactor | AnyFactor | NotFactor | AtLeastFactor;
40
+ /** One verbatim `[factors]` inline table, e.g. `{ ref = "topic", choice = "billing" }`. */
41
+ export type FactorTable = Record<string, unknown>;
42
+ export declare function parseFactors(raw: unknown, questionIds: ReadonlySet<string>, index?: SourceIndex): {
43
+ factors: Record<string, FactorDef>;
44
+ factorDefinitions: Record<string, FactorTable>;
45
+ diagnostics: Diagnostic[];
46
+ };
47
+ export declare function referencedIds(factor: FactorDef): string[];
48
+ /**
49
+ * Check a factor's references against the questions they name: unknown ids,
50
+ * Choice/Score used as Booleans, predicate fields that the primitive does not carry,
51
+ * and unknown Choice labels.
52
+ */
53
+ export declare function validatePrimitiveRefs(id: string, factor: FactorDef, questions: ReadonlyMap<string, QuestionInfo>, factorIds: ReadonlySet<string>, loc: SourceLocation): Diagnostic[];
54
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/factors/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE/E,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,eAAO,MAAM,eAAe,qCAAsC,CAAC;AACnE,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,yEAAyE;IACzE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AACtD,MAAM,MAAM,SAAS,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AACtD,MAAM,MAAM,SAAS,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AACpD,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE9E,MAAM,MAAM,SAAS,GAAG,eAAe,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,CAAC;AAE5F,2FAA2F;AAC3F,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAWlD,wBAAgB,YAAY,CAC1B,GAAG,EAAE,OAAO,EACZ,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,EAChC,KAAK,GAAE,WAAyB,GAC/B;IACD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACnC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC/C,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B,CA8CA;AAyQD,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,EAAE,CAWzD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,EAC5C,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,EAC9B,GAAG,EAAE,cAAc,GAClB,UAAU,EAAE,CA2Fd"}
@@ -0,0 +1,235 @@
1
+ import { diagnostic } from "../definition/diagnostics.js";
2
+ import { EMPTY_INDEX, locate } from "../definition/locate.js";
3
+ import { isPlainObject } from "../json.js";
4
+ export const COMPARATOR_KEYS = ["gt", "gte", "lt", "lte"];
5
+ const OPERATOR_KEYS = ["all", "any", "not", "at_least"];
6
+ const OPERATOR_ALLOWED_KEYS = {
7
+ all: new Set(["all"]),
8
+ any: new Set(["any"]),
9
+ not: new Set(["not"]),
10
+ at_least: new Set(["at_least", "of"]),
11
+ };
12
+ const PREDICATE_ALLOWED_KEYS = new Set(["ref", "known", "choice", "noul", "score", "confidence"]);
13
+ export function parseFactors(raw, questionIds, index = EMPTY_INDEX) {
14
+ const diagnostics = [];
15
+ const factors = Object.create(null);
16
+ const factorDefinitions = Object.create(null);
17
+ if (raw == null)
18
+ return { factors, factorDefinitions, diagnostics };
19
+ if (!isPlainObject(raw)) {
20
+ diagnostics.push(diagnostic("error", "factors-not-table", "[factors] must be a table of Boolean derivations", locate(index, { table: "factors" })));
21
+ return { factors, factorDefinitions, diagnostics };
22
+ }
23
+ for (const [id, value] of Object.entries(raw)) {
24
+ const loc = locate(index, { section: "factors", key: id, table: "factors" });
25
+ if (questionIds.has(id)) {
26
+ diagnostics.push(diagnostic("error", "id-collision", `factor \`${id}\` collides with question \`${id}\``, loc));
27
+ continue;
28
+ }
29
+ if (!isPlainObject(value)) {
30
+ diagnostics.push(diagnostic("error", "factor-not-table", `factor \`${id}\` must be an inline table`, loc));
31
+ continue;
32
+ }
33
+ const parsed = parseFactor(id, value, loc);
34
+ diagnostics.push(...parsed.diagnostics);
35
+ if (parsed.factor) {
36
+ factors[id] = parsed.factor;
37
+ factorDefinitions[id] = value;
38
+ }
39
+ }
40
+ return { factors, factorDefinitions, diagnostics };
41
+ }
42
+ function parseFactor(id, value, loc) {
43
+ const diagnostics = [];
44
+ const hasRef = Object.hasOwn(value, "ref");
45
+ const operators = OPERATOR_KEYS.filter((key) => Object.hasOwn(value, key));
46
+ if (hasRef && operators.length > 0) {
47
+ diagnostics.push(diagnostic("error", "factor-mixed", `factor \`${id}\` cannot mix a predicate \`ref\` with Boolean operators`, loc));
48
+ return { diagnostics };
49
+ }
50
+ if (operators.length > 1) {
51
+ diagnostics.push(diagnostic("error", "factor-mixed", `factor \`${id}\` uses several operators (${operators.join(", ")}); use exactly one`, loc, "nest them as separate factors instead"));
52
+ return { diagnostics };
53
+ }
54
+ const allowedKeys = hasRef
55
+ ? PREDICATE_ALLOWED_KEYS
56
+ : OPERATOR_ALLOWED_KEYS[operators[0] ?? "at_least"];
57
+ const unknown = Object.keys(value).filter((k) => !allowedKeys.has(k));
58
+ for (const key of unknown) {
59
+ diagnostics.push(diagnostic("error", "unknown-factor-field", `factor \`${id}\` has unknown field \`${key}\``, loc));
60
+ }
61
+ if (unknown.length > 0)
62
+ return { diagnostics };
63
+ if (hasRef) {
64
+ return parsePredicate(id, value, loc, diagnostics);
65
+ }
66
+ if (Object.hasOwn(value, "at_least") || (Object.hasOwn(value, "of") && operators.length === 0)) {
67
+ return parseAtLeast(id, value, loc, diagnostics);
68
+ }
69
+ if (Object.hasOwn(value, "all")) {
70
+ const of = readStringList(id, "all", value.all, loc, diagnostics);
71
+ if (!of)
72
+ return { diagnostics };
73
+ return { factor: { kind: "all", of }, diagnostics };
74
+ }
75
+ if (Object.hasOwn(value, "any")) {
76
+ const of = readStringList(id, "any", value.any, loc, diagnostics);
77
+ if (!of)
78
+ return { diagnostics };
79
+ return { factor: { kind: "any", of }, diagnostics };
80
+ }
81
+ if (Object.hasOwn(value, "not")) {
82
+ if (typeof value.not !== "string") {
83
+ diagnostics.push(diagnostic("error", "factor-not", `factor \`${id}\` \`not\` must be a string id`, loc));
84
+ return { diagnostics };
85
+ }
86
+ return { factor: { kind: "not", of: value.not }, diagnostics };
87
+ }
88
+ diagnostics.push(diagnostic("error", "factor-empty", `factor \`${id}\` must be a predicate or a Boolean operator`, loc, "use ref / all / any / not / at_least"));
89
+ return { diagnostics };
90
+ }
91
+ function parsePredicate(id, value, loc, diagnostics) {
92
+ if (typeof value.ref !== "string" || value.ref === "") {
93
+ diagnostics.push(diagnostic("error", "predicate-ref", `factor \`${id}\` \`ref\` must be a question id`, loc));
94
+ return { diagnostics };
95
+ }
96
+ const factor = { kind: "predicate", ref: value.ref };
97
+ if (Object.hasOwn(value, "known")) {
98
+ if (typeof value.known !== "boolean") {
99
+ diagnostics.push(diagnostic("error", "predicate-known", `factor \`${id}\` \`known\` must be a boolean`, loc));
100
+ return { diagnostics };
101
+ }
102
+ factor.known = value.known;
103
+ }
104
+ if (Object.hasOwn(value, "choice")) {
105
+ if (typeof value.choice !== "string") {
106
+ diagnostics.push(diagnostic("error", "predicate-choice", `factor \`${id}\` \`choice\` must be a string label`, loc));
107
+ return { diagnostics };
108
+ }
109
+ factor.choice = value.choice;
110
+ }
111
+ for (const field of ["noul", "score", "confidence"]) {
112
+ if (!Object.hasOwn(value, field) || value[field] === undefined)
113
+ continue;
114
+ const cmp = parseComparator(id, field, value[field], loc, diagnostics);
115
+ if (!cmp)
116
+ return { diagnostics };
117
+ factor[field] = cmp;
118
+ }
119
+ if (factor.known === undefined &&
120
+ factor.choice === undefined &&
121
+ factor.noul === undefined &&
122
+ factor.score === undefined &&
123
+ factor.confidence === undefined) {
124
+ diagnostics.push(diagnostic("error", "predicate-empty", `factor \`${id}\` predicate needs one of known / choice / noul / score / confidence`, loc));
125
+ return { diagnostics };
126
+ }
127
+ return { factor, diagnostics };
128
+ }
129
+ function parseAtLeast(id, value, loc, diagnostics) {
130
+ if (typeof value.at_least !== "number" ||
131
+ !Number.isInteger(value.at_least) ||
132
+ value.at_least < 1) {
133
+ diagnostics.push(diagnostic("error", "at-least-count", `factor \`${id}\` \`at_least\` must be a positive integer`, loc));
134
+ return { diagnostics };
135
+ }
136
+ const of = readStringList(id, "of", value.of, loc, diagnostics);
137
+ if (!of)
138
+ return { diagnostics };
139
+ return { factor: { kind: "at_least", count: value.at_least, of }, diagnostics };
140
+ }
141
+ function parseComparator(id, field, value, loc, diagnostics) {
142
+ if (!isPlainObject(value)) {
143
+ diagnostics.push(diagnostic("error", "comparator-table", `factor \`${id}\` \`${field}\` must be a comparator table`, loc, "e.g. { gte = 0.75 }"));
144
+ return undefined;
145
+ }
146
+ const unknown = Object.keys(value).filter((k) => !COMPARATOR_KEYS.includes(k));
147
+ if (unknown.length > 0) {
148
+ diagnostics.push(diagnostic("error", "comparator-keys", `factor \`${id}\` \`${field}\` has unknown comparator ${unknown.map((k) => `\`${k}\``).join(", ")}`, loc, "use gt, gte, lt, lte"));
149
+ return undefined;
150
+ }
151
+ const cmp = {};
152
+ for (const key of COMPARATOR_KEYS) {
153
+ if (!Object.hasOwn(value, key) || value[key] === undefined)
154
+ continue;
155
+ if (typeof value[key] !== "number" || !Number.isFinite(value[key])) {
156
+ diagnostics.push(diagnostic("error", "comparator-number", `factor \`${id}\` \`${field}.${key}\` must be a finite number`, loc));
157
+ return undefined;
158
+ }
159
+ cmp[key] = value[key];
160
+ }
161
+ if (Object.keys(cmp).length === 0) {
162
+ diagnostics.push(diagnostic("error", "comparator-empty", `factor \`${id}\` \`${field}\` needs at least one of gt/gte/lt/lte`, loc));
163
+ return undefined;
164
+ }
165
+ return cmp;
166
+ }
167
+ function readStringList(id, field, value, loc, diagnostics) {
168
+ if (!Array.isArray(value) ||
169
+ value.length === 0 ||
170
+ value.some((item) => typeof item !== "string")) {
171
+ diagnostics.push(diagnostic("error", "factor-list", `factor \`${id}\` \`${field}\` must be a non-empty array of ids`, loc));
172
+ return undefined;
173
+ }
174
+ return [...value];
175
+ }
176
+ export function referencedIds(factor) {
177
+ switch (factor.kind) {
178
+ case "predicate":
179
+ return [factor.ref];
180
+ case "not":
181
+ return [factor.of];
182
+ case "all":
183
+ case "any":
184
+ case "at_least":
185
+ return factor.of;
186
+ }
187
+ }
188
+ /**
189
+ * Check a factor's references against the questions they name: unknown ids,
190
+ * Choice/Score used as Booleans, predicate fields that the primitive does not carry,
191
+ * and unknown Choice labels.
192
+ */
193
+ export function validatePrimitiveRefs(id, factor, questions, factorIds, loc) {
194
+ const diagnostics = [];
195
+ if (factor.kind === "predicate") {
196
+ const q = questions.get(factor.ref);
197
+ if (!q) {
198
+ diagnostics.push(diagnostic("error", "unknown-ref", `factor \`${id}\` references unknown question \`${factor.ref}\``, loc));
199
+ return diagnostics;
200
+ }
201
+ if (factor.choice !== undefined) {
202
+ if (q.type !== "choice") {
203
+ diagnostics.push(diagnostic("error", "choice-on-non-choice", `\`choice\` is not available on ${capitalize(q.type)} \`${factor.ref}\``, loc));
204
+ }
205
+ else if (!q.choiceLabels?.includes(factor.choice)) {
206
+ diagnostics.push(diagnostic("error", "unknown-option", `factor \`${id}\` references Choice \`${factor.ref}\` with unknown option \`${factor.choice}\``, loc, `available: ${q.choiceLabels?.join(", ") ?? ""}`));
207
+ }
208
+ }
209
+ if (factor.noul !== undefined && q.type !== "noul") {
210
+ diagnostics.push(diagnostic("error", "noul-on-non-noul", `\`noul\` is not available on ${capitalize(q.type)} \`${factor.ref}\``, loc));
211
+ }
212
+ if (factor.score !== undefined && q.type !== "score") {
213
+ diagnostics.push(diagnostic("error", "score-on-non-score", `\`score\` is not available on ${capitalize(q.type)} \`${factor.ref}\``, loc));
214
+ }
215
+ if (factor.confidence !== undefined && q.type === "noul") {
216
+ diagnostics.push(diagnostic("error", "noul-confidence", `\`confidence\` is not available on Noul \`${factor.ref}\` (Noul answers carry only \`noul\`)`, loc));
217
+ }
218
+ return diagnostics;
219
+ }
220
+ for (const ref of referencedIds(factor)) {
221
+ if (factorIds.has(ref) || questions.has(ref)) {
222
+ const q = questions.get(ref);
223
+ if (q && q.type !== "noul") {
224
+ diagnostics.push(diagnostic("error", "non-boolean-ref", `${capitalize(q.type)} \`${ref}\` used directly in \`${factor.kind}\`; wrap it in a predicate: { ref = "${ref}", ${q.type === "choice" ? 'choice = "…"' : "score = { gte = … }"} }`, loc));
225
+ }
226
+ continue;
227
+ }
228
+ diagnostics.push(diagnostic("error", "unknown-ref", `factor \`${id}\` references unknown id \`${ref}\``, loc));
229
+ }
230
+ return diagnostics;
231
+ }
232
+ function capitalize(value) {
233
+ return value.length === 0 ? value : value[0].toUpperCase() + value.slice(1);
234
+ }
235
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/factors/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Definition } from "../definition/schema.js";
2
+ export interface GenerateOptions {
3
+ /** Used for diagnostics and, unless `sourceName` is given, for the header. */
4
+ filename?: string;
5
+ /** Name recorded in the generated header; defaults to the basename of `filename`. */
6
+ sourceName?: string;
7
+ }
8
+ /**
9
+ * Parse, check, and emit a `*.generated.ts` module. Throws `SystemOnePromptsError` listing every
10
+ * error when the definition does not check. Output is deterministic: identical TOML
11
+ * yields byte-identical TypeScript.
12
+ */
13
+ export declare function generate(source: string, opts?: GenerateOptions): string;
14
+ /** Emit TypeScript for an already-checked definition. */
15
+ export declare function emitGenerated(def: Definition, sourceName: string): string;
16
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/generate/generate.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAG1D,MAAM,WAAW,eAAe;IAC9B,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,eAAoB,GAAG,MAAM,CAM3E;AAED,yDAAyD;AACzD,wBAAgB,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAwCzE"}