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
package/CHANGELOG.md ADDED
@@ -0,0 +1,12 @@
1
+ # Changelog
2
+
3
+ ## Unreleased
4
+
5
+ ## 0.1.0
6
+
7
+ - First TypeScript release for TOML decision definitions.
8
+ - Validation, factors, clients, CLI tools, caching, and conformance checks.
9
+ - Documented OpenRouter via `baseURL` / `TYPESAFE_BASE_URL`. Put the OpenRouter
10
+ key in `TYPESAFE_API_KEY`.
11
+ - Cloudflare Workers AI via `cloudflareAccountId` / `CLOUDFLARE_ACCOUNT_ID`
12
+ and `CLOUDFLARE_API_TOKEN`. Exclusive with `TYPESAFE_BASE_URL`.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 svilupp
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,214 @@
1
+ # systemoneprompts
2
+
3
+ Define TypeSafe questions, required state, and Boolean factors in TOML.
4
+ Generate typed TypeScript modules and call the System One API.
5
+
6
+ ## Quick start
7
+
8
+ Requires Node 20+ or Bun. Set `TYPESAFE_API_KEY` for native TypeSafe API calls.
9
+ OpenRouter and Cloudflare credentials are described under [Providers](#providers).
10
+
11
+ ```sh
12
+ npm install systemoneprompts
13
+ # or: bun add systemoneprompts
14
+ ```
15
+
16
+ Save as `triage.toml`:
17
+
18
+ ```toml
19
+ [requires]
20
+ "ticket.message" = "string"
21
+
22
+ [questions.topic]
23
+ type = "choice"
24
+ instructions = "Which team should handle `ticket.message`?"
25
+
26
+ [questions.topic.criteria]
27
+ billing = "Charges, invoices, refunds"
28
+ orders = "Shipments and deliveries"
29
+
30
+ [factors]
31
+ billing = { ref = "topic", choice = "billing" }
32
+ ```
33
+
34
+ ```sh
35
+ npx systemoneprompts generate triage.toml
36
+ # or: bunx systemoneprompts generate triage.toml
37
+ ```
38
+
39
+ Use the generated module in your TypeScript app:
40
+
41
+ ```ts
42
+ import { TypeSafeClient } from "systemoneprompts";
43
+ import { questions, model, assertState, evaluateFactors } from "./triage.generated.js";
44
+
45
+ const state = { ticket: { message: "I was charged twice." } };
46
+ assertState(state);
47
+ const response = await new TypeSafeClient().systemOne({ state, questions, model });
48
+ console.log(evaluateFactors(response.answers).billing);
49
+ ```
50
+
51
+ `assertState` validates and narrows the original state. Generated types cover
52
+ state, answers, and factors.
53
+
54
+ ## Definitions
55
+
56
+ | Field | Purpose |
57
+ | --- | --- |
58
+ | `title`, `version`, `description` | Optional metadata |
59
+ | `model` | Optional model for API calls |
60
+ | `[requires]` | Required state paths and types |
61
+ | `[questions]` | TypeSafe `noul`, `choice`, or `score` questions |
62
+ | `[factors]` | Boolean results computed from answers |
63
+ | `[data]` | Optional application data, exported as `data` |
64
+
65
+ Requirements accept `string`, `number`, `boolean`, `array`, `object`, `null`,
66
+ and `exists`. Paths support dots, indexes, and wildcards:
67
+ `ticket.message`, `tickets[0].message`, `tickets[].message`.
68
+ An empty array satisfies a wildcard requirement.
69
+
70
+ Questions use TypeSafe's `type`, `instructions`, and `criteria` fields.
71
+ Instructions and criteria entries can be strings, tables, or arrays.
72
+ At least one question is required.
73
+
74
+ Factors use `all`, `any`, `not`, `at_least`, or a `ref` predicate.
75
+ Bare Noul references use a threshold of `0.5`; Choice and Score answers need
76
+ a predicate. Missing answers raise errors, except in a `known`-only predicate.
77
+
78
+ `[data]` holds JSON-compatible application data. Your code defines its schema
79
+ and use; the package preserves it without sending it to the provider.
80
+
81
+ See the [specification](docs/SPEC.html) for the full rules,
82
+ [examples](examples/) for patterns, and the
83
+ [agent guide](docs/skills/systemoneprompts/SKILL.md) for authoring definitions.
84
+
85
+ ## API
86
+
87
+ Import core functions from `systemoneprompts`:
88
+
89
+ | Function | Purpose |
90
+ | --- | --- |
91
+ | `parseDefinition(toml)` / `loadDefinition(path)` | Read a definition |
92
+ | `checkDefinition(def)` | Collect validation errors and warnings |
93
+ | `createStateAssert(def.requires)` | Validate state |
94
+ | `createFactorEvaluator(def.factorDefinitions)` | Compute Boolean factors from answers |
95
+ | `generate(toml, { filename })` | Generate TypeScript source |
96
+ | `TypeSafeClient` | Call System One; accepts `apiKey`, `baseURL`, `cloudflareAccountId`, `fetch`, and `timeout` |
97
+
98
+ Invalid TOML throws `SystemOnePromptsError`. Definition errors are returned as
99
+ diagnostics; generation rejects definitions with errors.
100
+
101
+ `systemoneprompts/dev` exports `createCachingFetch` for per-question caching.
102
+ `systemoneprompts/patterns` exports `runMany` for batches and `walkTaxonomy`
103
+ for Choice tree searches.
104
+
105
+ ## Providers
106
+
107
+ The client builds System One JSON `{ state, questions, model }` (this is what
108
+ the cache hashes). Where that JSON goes depends on how you construct
109
+ `TypeSafeClient`. In Cloudflare mode the body is rewritten before the network.
110
+ Cloudflare mode and `baseURL` / `TYPESAFE_BASE_URL` cannot be combined.
111
+
112
+ ### Native TypeSafe
113
+
114
+ Default. `TYPESAFE_API_KEY` authenticates against `https://api.typesafe.ai`.
115
+ Send TypeSafe model ids such as `jev-1.13.0` or `jev-latest`.
116
+
117
+ ```ts
118
+ const client = new TypeSafeClient(); // TYPESAFE_API_KEY
119
+ ```
120
+
121
+ ### OpenRouter
122
+
123
+ Point `baseURL` at OpenRouter's System One API and pass an OpenRouter key as
124
+ `apiKey`. The client does not read `OPENROUTER_API_KEY`. OpenRouter accepts
125
+ `jev-1.13` or `typesafe/jev-1.13`. Extra response fields such as `id`,
126
+ `provider`, and `usage.cost` are left in place; Python validation strips them.
127
+
128
+ ```ts
129
+ const client = new TypeSafeClient({
130
+ apiKey: process.env.TYPESAFE_API_KEY, // OpenRouter key
131
+ baseURL: "https://openrouter.ai/api",
132
+ });
133
+ await client.systemOne({ state, questions, model: "typesafe/jev-1.13" });
134
+ ```
135
+
136
+ CLI: `TYPESAFE_BASE_URL=https://openrouter.ai/api` and put the OpenRouter key
137
+ in `TYPESAFE_API_KEY`.
138
+
139
+ ### Cloudflare
140
+
141
+ Set `cloudflareAccountId` (or `CLOUDFLARE_ACCOUNT_ID`). The client then treats
142
+ `apiKey` as a Cloudflare token (`CLOUDFLARE_API_TOKEN` when `apiKey` is
143
+ omitted), posts to
144
+ `https://api.cloudflare.com/client/v4/accounts/{id}/ai/run` as
145
+ `{ model: "typesafe/jev", input: { state, questions } }`, and unwraps the
146
+ Workers AI envelope to `{ model, answers, usage }`. TOML `model` and CLI
147
+ `--model` are not sent as the Cloudflare catalog id.
148
+
149
+ ```ts
150
+ const client = new TypeSafeClient({
151
+ apiKey: process.env.CLOUDFLARE_API_TOKEN,
152
+ cloudflareAccountId: process.env.CLOUDFLARE_ACCOUNT_ID,
153
+ });
154
+ ```
155
+
156
+ CLI: set `CLOUDFLARE_ACCOUNT_ID` and `CLOUDFLARE_API_TOKEN`. Do not also set
157
+ `TYPESAFE_BASE_URL`. The token needs Account → Workers AI → Read. For
158
+ `--cache`, the CLI wraps Cloudflare inside `createCachingFetch` so cache keys
159
+ stay System One JSON. If you pass your own cache as `fetch`, wrap Cloudflare
160
+ inside it first; otherwise the client rejects the combination.
161
+
162
+ | Host | Model to send |
163
+ | --- | --- |
164
+ | `api.typesafe.ai` | `jev-1.13.0` / `jev-latest` |
165
+ | OpenRouter | `jev-1.13` or `typesafe/jev-1.13` |
166
+ | Cloudflare | catalog `typesafe/jev` (set by the client) |
167
+
168
+ ## CLI
169
+
170
+ ```sh
171
+ npx systemoneprompts check triage.toml --strict
172
+ npx systemoneprompts generate triage.toml --check
173
+ npx systemoneprompts run triage.toml --state state.json --cache --json
174
+ npx systemoneprompts eval triage.toml --cases cases.jsonl --report report.json
175
+ npx systemoneprompts cache stats
176
+ # bunx systemoneprompts works the same way
177
+ ```
178
+
179
+ `generate --check` fails if generated files are stale. `run` accepts state from
180
+ stdin when `--state` is omitted. `--cache` reuses per-question answers from
181
+ `.systemoneprompts/cache`.
182
+
183
+ Each eval case has `state` and optional `id`, `labels`, and `factors`.
184
+ Labels are Choice strings, Noul Booleans, or integer Score levels.
185
+ `--sweep <factor>` compares thresholds.
186
+
187
+ CLI model precedence: `--model`, TOML `model`, `TYPESAFE_MODEL`,
188
+ `TYPESAFE_DEFAULT_MODEL`, then `jev-latest`. In Cloudflare mode `--model` does
189
+ not change the catalog id `typesafe/jev`; the reported `response.model` is
190
+ whatever Cloudflare returned.
191
+
192
+ ## Development
193
+
194
+ Run from this package directory:
195
+
196
+ ```sh
197
+ bun install --frozen-lockfile
198
+ sh scripts/run-quiet.sh "Checks" -- bun run check
199
+ sh scripts/run-quiet.sh "Release checks" -- bun run release:check
200
+ ```
201
+
202
+ Checks cover types, lint, tests, examples, and public exports. Release checks
203
+ also pack the npm archive and smoke it from npm and bun consumers under Node
204
+ and Bun. Use `scripts/run-quiet.sh` for focused tests too; it retains full
205
+ logs and prints failures.
206
+
207
+ After editing example definitions, run `bun run examples:generate`.
208
+ Live tests require `TYPESAFE_API_KEY`:
209
+
210
+ ```sh
211
+ sh scripts/run-quiet.sh "Live tests" -- bun run test:live
212
+ ```
213
+
214
+ After release checks pass, `bun run release:publish` builds and publishes to npm.
@@ -0,0 +1,21 @@
1
+ export declare function isAnswerForQuestion(question: unknown, answer: unknown): boolean;
2
+ export declare function isAnswerShape(answer: unknown): answer is Record<string, unknown>;
3
+ export declare function noulValue(answer: unknown): number | undefined;
4
+ export declare function choiceLabel(answer: unknown): string | undefined;
5
+ export declare function scoreValue(answer: unknown): number | undefined;
6
+ export declare function wireQuestions(questions: Record<string, {
7
+ type: string;
8
+ instructions?: unknown;
9
+ criteria?: unknown;
10
+ [k: string]: unknown;
11
+ }>): Record<string, {
12
+ type: string;
13
+ instructions?: unknown;
14
+ criteria?: unknown;
15
+ }>;
16
+ export declare function partitionAnswers(questions: Record<string, unknown>, answers: unknown): {
17
+ valid: Record<string, unknown>;
18
+ missing: string[];
19
+ malformed: string[];
20
+ };
21
+ //# sourceMappingURL=answers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answers.d.ts","sourceRoot":"","sources":["../src/answers.ts"],"names":[],"mappings":"AAEA,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CA8B/E;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqBhF;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAI7D;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAG/D;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAI9D;AAED,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,CACf,MAAM,EACN;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CACnF,GACA,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAc9E;AAED,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,OAAO,EAAE,OAAO,GACf;IAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAe5E"}
@@ -0,0 +1,104 @@
1
+ import { isJsonValue, isPlainObject } from "./json.js";
2
+ export function isAnswerForQuestion(question, answer) {
3
+ if (!isPlainObject(question) || !isAnswerShape(answer))
4
+ return false;
5
+ if (question.type !== answer.type)
6
+ return false;
7
+ if (question.type === "choice") {
8
+ if (!isPlainObject(question.criteria) || typeof answer.choice !== "string")
9
+ return false;
10
+ if (!Object.hasOwn(question.criteria, answer.choice))
11
+ return false;
12
+ const probabilities = answer.probabilities;
13
+ if (!isPlainObject(probabilities))
14
+ return false;
15
+ return Object.keys(question.criteria).every((label) => Object.hasOwn(probabilities, label) && isFiniteNumber(probabilities[label]));
16
+ }
17
+ if (question.type === "score") {
18
+ if (!Array.isArray(question.criteria))
19
+ return false;
20
+ const legend = answer.legend;
21
+ const probabilities = answer.probabilities;
22
+ if (!isPlainObject(legend) || !isPlainObject(probabilities))
23
+ return false;
24
+ return question.criteria.every((_, index) => {
25
+ const score = String(index);
26
+ return (Object.hasOwn(legend, score) &&
27
+ Object.hasOwn(probabilities, score) &&
28
+ isFiniteNumber(probabilities[score]));
29
+ });
30
+ }
31
+ return true;
32
+ }
33
+ export function isAnswerShape(answer) {
34
+ if (!isPlainObject(answer) || !isJsonValue(answer))
35
+ return false;
36
+ switch (answer.type) {
37
+ case "noul":
38
+ return isFiniteNumber(answer.noul);
39
+ case "choice":
40
+ return (typeof answer.choice === "string" &&
41
+ isFiniteNumber(answer.confidence) &&
42
+ isPlainObject(answer.probabilities));
43
+ case "score":
44
+ return (isFiniteNumber(answer.score) &&
45
+ isFiniteNumber(answer.confidence) &&
46
+ isPlainObject(answer.legend) &&
47
+ isPlainObject(answer.probabilities));
48
+ default:
49
+ return false;
50
+ }
51
+ }
52
+ export function noulValue(answer) {
53
+ if (!isAnswerShape(answer) || answer.type !== "noul")
54
+ return undefined;
55
+ const value = answer.noul;
56
+ return isFiniteNumber(value) ? value : undefined;
57
+ }
58
+ export function choiceLabel(answer) {
59
+ if (!isAnswerShape(answer) || answer.type !== "choice")
60
+ return undefined;
61
+ return typeof answer.choice === "string" ? answer.choice : undefined;
62
+ }
63
+ export function scoreValue(answer) {
64
+ if (!isAnswerShape(answer) || answer.type !== "score")
65
+ return undefined;
66
+ const value = answer.score;
67
+ return isFiniteNumber(value) ? value : undefined;
68
+ }
69
+ export function wireQuestions(questions) {
70
+ const wired = Object.create(null);
71
+ for (const [id, question] of Object.entries(questions)) {
72
+ const entry = {
73
+ type: question.type,
74
+ };
75
+ if (question.instructions !== undefined)
76
+ entry.instructions = question.instructions;
77
+ if (question.criteria !== undefined)
78
+ entry.criteria = question.criteria;
79
+ wired[id] = entry;
80
+ }
81
+ return wired;
82
+ }
83
+ export function partitionAnswers(questions, answers) {
84
+ const valid = Object.create(null);
85
+ const missing = [];
86
+ const malformed = [];
87
+ const answersObject = isPlainObject(answers) ? answers : undefined;
88
+ for (const [id, question] of Object.entries(questions)) {
89
+ if (answersObject === undefined || !Object.hasOwn(answersObject, id)) {
90
+ missing.push(id);
91
+ }
92
+ else if (!isAnswerForQuestion(question, answersObject[id])) {
93
+ malformed.push(id);
94
+ }
95
+ else {
96
+ valid[id] = answersObject[id];
97
+ }
98
+ }
99
+ return { valid, missing, malformed };
100
+ }
101
+ function isFiniteNumber(value) {
102
+ return typeof value === "number" && Number.isFinite(value);
103
+ }
104
+ //# sourceMappingURL=answers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answers.js","sourceRoot":"","sources":["../src/answers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runCache(action: string | undefined): Promise<void>;
2
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/cli/cache.ts"],"names":[],"mappings":"AAGA,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBxE"}
@@ -0,0 +1,26 @@
1
+ import { cacheStats, clearCache, defaultCacheDir } from "../dev/cache.js";
2
+ import { fail } from "./io.js";
3
+ export async function runCache(action) {
4
+ const dir = defaultCacheDir();
5
+ if (action === "clear") {
6
+ await clearCache(dir);
7
+ console.log(`cleared ${dir}`);
8
+ return;
9
+ }
10
+ if (action === "stats" || action == null) {
11
+ const stats = await cacheStats(dir);
12
+ console.log(`dir ${dir}`);
13
+ console.log(`entries ${stats.entries}`);
14
+ for (const [model, count] of Object.entries(stats.models)) {
15
+ console.log(`model ${model} ${count}`);
16
+ }
17
+ for (const row of stats.drift) {
18
+ if (row.requested && row.requested !== row.reported) {
19
+ console.log(`drift ${row.requested} → ${row.reported} ${row.count}`);
20
+ }
21
+ }
22
+ return;
23
+ }
24
+ fail("systemoneprompts cache stats | clear");
25
+ }
26
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/cli/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAA0B;IACvD,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAC9B,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IACD,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACzC,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,KAAK,GAAG,CAAC,QAAQ,EAAE,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,SAAS,MAAM,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,CAAC,sCAAsC,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runCheck(files: string[], strict: boolean): Promise<void>;
2
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/cli/check.ts"],"names":[],"mappings":"AAKA,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB9E"}
@@ -0,0 +1,28 @@
1
+ import { checkDefinition } from "../definition/check.js";
2
+ import { SystemOnePromptsError } from "../definition/diagnostics.js";
3
+ import { parseDefinition } from "../definition/parse.js";
4
+ import { fail, printDiagnostics, readText } from "./io.js";
5
+ export async function runCheck(files, strict) {
6
+ if (files.length === 0)
7
+ fail("systemoneprompts check <files...> [--strict]");
8
+ let errors = 0;
9
+ for (const file of files) {
10
+ try {
11
+ const source = await readText(file);
12
+ const def = parseDefinition(source, { filename: file });
13
+ errors += printDiagnostics(checkDefinition(def), strict);
14
+ }
15
+ catch (error) {
16
+ if (error instanceof SystemOnePromptsError) {
17
+ errors += printDiagnostics(error.diagnostics, strict);
18
+ }
19
+ else {
20
+ errors += 1;
21
+ console.error(`error: ${file}: ${error instanceof Error ? error.message : String(error)}`);
22
+ }
23
+ }
24
+ }
25
+ if (errors > 0)
26
+ process.exit(1);
27
+ }
28
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/cli/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAe,EAAE,MAAe;IAC7D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAC7E,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,MAAM,IAAI,gBAAgB,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,qBAAqB,EAAE,CAAC;gBAC3C,MAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,CAAC,CAAC;gBACZ,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function loadDotEnv(cwd?: string): void;
2
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/cli/env.ts"],"names":[],"mappings":"AAGA,wBAAgB,UAAU,CAAC,GAAG,SAAgB,GAAG,IAAI,CAuBpD"}
@@ -0,0 +1,29 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ export function loadDotEnv(cwd = process.cwd()) {
4
+ const path = resolve(cwd, ".env");
5
+ let text;
6
+ try {
7
+ text = readFileSync(path, "utf8");
8
+ }
9
+ catch {
10
+ return;
11
+ }
12
+ for (const line of text.split(/\r?\n/)) {
13
+ const trimmed = line.trim();
14
+ if (!trimmed || trimmed.startsWith("#"))
15
+ continue;
16
+ const eq = trimmed.indexOf("=");
17
+ if (eq <= 0)
18
+ continue;
19
+ const key = trimmed.slice(0, eq).trim();
20
+ let value = trimmed.slice(eq + 1).trim();
21
+ if ((value.startsWith('"') && value.endsWith('"')) ||
22
+ (value.startsWith("'") && value.endsWith("'"))) {
23
+ value = value.slice(1, -1);
24
+ }
25
+ if (process.env[key] === undefined)
26
+ process.env[key] = value;
27
+ }
28
+ }
29
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/cli/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,UAAU,UAAU,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAClC,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAClD,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,EAAE,IAAI,CAAC;YAAE,SAAS;QACtB,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,IACE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9C,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAC9C,CAAC;YACD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC/D,CAAC;AACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * One line of `cases.jsonl`. `labels` are expected answers keyed by question id
3
+ * (Choice label, Noul Boolean, or Score level); `factors` are expected factor values.
4
+ */
5
+ export interface EvalCase {
6
+ id?: string;
7
+ state: unknown;
8
+ labels?: Record<string, unknown>;
9
+ factors?: Record<string, boolean>;
10
+ }
11
+ export declare function runEval(file: string | undefined, options: {
12
+ cases?: string;
13
+ cache?: boolean;
14
+ sweep?: string;
15
+ report?: string;
16
+ model?: string;
17
+ }): Promise<void>;
18
+ //# sourceMappingURL=eval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval.d.ts","sourceRoot":"","sources":["../../src/cli/eval.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAuBD,wBAAsB,OAAO,CAC3B,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5F,OAAO,CAAC,IAAI,CAAC,CAsHf"}