@aisy/core 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 (270) hide show
  1. package/LICENSE +202 -0
  2. package/dist/agent-loop/index.d.ts +4 -0
  3. package/dist/agent-loop/index.d.ts.map +1 -0
  4. package/dist/agent-loop/index.js +352 -0
  5. package/dist/agent-loop/index.js.map +1 -0
  6. package/dist/agent-loop/types.d.ts +183 -0
  7. package/dist/agent-loop/types.d.ts.map +1 -0
  8. package/dist/agent-loop/types.js +3 -0
  9. package/dist/agent-loop/types.js.map +1 -0
  10. package/dist/bin/aisy.d.ts +3 -0
  11. package/dist/bin/aisy.d.ts.map +1 -0
  12. package/dist/bin/aisy.js +14 -0
  13. package/dist/bin/aisy.js.map +1 -0
  14. package/dist/cli/index.d.ts +17 -0
  15. package/dist/cli/index.d.ts.map +1 -0
  16. package/dist/cli/index.js +114 -0
  17. package/dist/cli/index.js.map +1 -0
  18. package/dist/context-engine/index.d.ts +4 -0
  19. package/dist/context-engine/index.d.ts.map +1 -0
  20. package/dist/context-engine/index.js +126 -0
  21. package/dist/context-engine/index.js.map +1 -0
  22. package/dist/context-engine/types.d.ts +54 -0
  23. package/dist/context-engine/types.d.ts.map +1 -0
  24. package/dist/context-engine/types.js +4 -0
  25. package/dist/context-engine/types.js.map +1 -0
  26. package/dist/eval/index.d.ts +20 -0
  27. package/dist/eval/index.d.ts.map +1 -0
  28. package/dist/eval/index.js +128 -0
  29. package/dist/eval/index.js.map +1 -0
  30. package/dist/eval/types.d.ts +62 -0
  31. package/dist/eval/types.d.ts.map +1 -0
  32. package/dist/eval/types.js +17 -0
  33. package/dist/eval/types.js.map +1 -0
  34. package/dist/gateway/index.d.ts +5 -0
  35. package/dist/gateway/index.d.ts.map +1 -0
  36. package/dist/gateway/index.js +288 -0
  37. package/dist/gateway/index.js.map +1 -0
  38. package/dist/gateway/types.d.ts +194 -0
  39. package/dist/gateway/types.d.ts.map +1 -0
  40. package/dist/gateway/types.js +94 -0
  41. package/dist/gateway/types.js.map +1 -0
  42. package/dist/goals/index.d.ts +11 -0
  43. package/dist/goals/index.d.ts.map +1 -0
  44. package/dist/goals/index.js +21 -0
  45. package/dist/goals/index.js.map +1 -0
  46. package/dist/goals/types.d.ts +47 -0
  47. package/dist/goals/types.d.ts.map +1 -0
  48. package/dist/goals/types.js +5 -0
  49. package/dist/goals/types.js.map +1 -0
  50. package/dist/index.d.ts +56 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +50 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/mcp/index.d.ts +5 -0
  55. package/dist/mcp/index.d.ts.map +1 -0
  56. package/dist/mcp/index.js +215 -0
  57. package/dist/mcp/index.js.map +1 -0
  58. package/dist/mcp/types.d.ts +148 -0
  59. package/dist/mcp/types.d.ts.map +1 -0
  60. package/dist/mcp/types.js +4 -0
  61. package/dist/mcp/types.js.map +1 -0
  62. package/dist/memory/index.d.ts +6 -0
  63. package/dist/memory/index.d.ts.map +1 -0
  64. package/dist/memory/index.js +419 -0
  65. package/dist/memory/index.js.map +1 -0
  66. package/dist/memory/types.d.ts +131 -0
  67. package/dist/memory/types.d.ts.map +1 -0
  68. package/dist/memory/types.js +33 -0
  69. package/dist/memory/types.js.map +1 -0
  70. package/dist/nightly/index.d.ts +4 -0
  71. package/dist/nightly/index.d.ts.map +1 -0
  72. package/dist/nightly/index.js +470 -0
  73. package/dist/nightly/index.js.map +1 -0
  74. package/dist/nightly/types.d.ts +326 -0
  75. package/dist/nightly/types.d.ts.map +1 -0
  76. package/dist/nightly/types.js +3 -0
  77. package/dist/nightly/types.js.map +1 -0
  78. package/dist/observability/index.d.ts +11 -0
  79. package/dist/observability/index.d.ts.map +1 -0
  80. package/dist/observability/index.js +396 -0
  81. package/dist/observability/index.js.map +1 -0
  82. package/dist/observability/types.d.ts +139 -0
  83. package/dist/observability/types.d.ts.map +1 -0
  84. package/dist/observability/types.js +4 -0
  85. package/dist/observability/types.js.map +1 -0
  86. package/dist/onboarding/index.d.ts +16 -0
  87. package/dist/onboarding/index.d.ts.map +1 -0
  88. package/dist/onboarding/index.js +787 -0
  89. package/dist/onboarding/index.js.map +1 -0
  90. package/dist/onboarding/interactive.d.ts +23 -0
  91. package/dist/onboarding/interactive.d.ts.map +1 -0
  92. package/dist/onboarding/interactive.js +45 -0
  93. package/dist/onboarding/interactive.js.map +1 -0
  94. package/dist/onboarding/types.d.ts +388 -0
  95. package/dist/onboarding/types.d.ts.map +1 -0
  96. package/dist/onboarding/types.js +35 -0
  97. package/dist/onboarding/types.js.map +1 -0
  98. package/dist/orchestration/index.d.ts +8 -0
  99. package/dist/orchestration/index.d.ts.map +1 -0
  100. package/dist/orchestration/index.js +706 -0
  101. package/dist/orchestration/index.js.map +1 -0
  102. package/dist/orchestration/types.d.ts +391 -0
  103. package/dist/orchestration/types.d.ts.map +1 -0
  104. package/dist/orchestration/types.js +30 -0
  105. package/dist/orchestration/types.js.map +1 -0
  106. package/dist/personality/index.d.ts +65 -0
  107. package/dist/personality/index.d.ts.map +1 -0
  108. package/dist/personality/index.js +339 -0
  109. package/dist/personality/index.js.map +1 -0
  110. package/dist/personality/types.d.ts +103 -0
  111. package/dist/personality/types.d.ts.map +1 -0
  112. package/dist/personality/types.js +15 -0
  113. package/dist/personality/types.js.map +1 -0
  114. package/dist/provider/index.d.ts +4 -0
  115. package/dist/provider/index.d.ts.map +1 -0
  116. package/dist/provider/index.js +236 -0
  117. package/dist/provider/index.js.map +1 -0
  118. package/dist/provider/types.d.ts +180 -0
  119. package/dist/provider/types.d.ts.map +1 -0
  120. package/dist/provider/types.js +4 -0
  121. package/dist/provider/types.js.map +1 -0
  122. package/dist/runtime/agent-cards.d.ts +14 -0
  123. package/dist/runtime/agent-cards.d.ts.map +1 -0
  124. package/dist/runtime/agent-cards.js +90 -0
  125. package/dist/runtime/agent-cards.js.map +1 -0
  126. package/dist/runtime/agent-runner.d.ts +30 -0
  127. package/dist/runtime/agent-runner.d.ts.map +1 -0
  128. package/dist/runtime/agent-runner.js +37 -0
  129. package/dist/runtime/agent-runner.js.map +1 -0
  130. package/dist/runtime/budget.d.ts +15 -0
  131. package/dist/runtime/budget.d.ts.map +1 -0
  132. package/dist/runtime/budget.js +24 -0
  133. package/dist/runtime/budget.js.map +1 -0
  134. package/dist/runtime/delegation-driver.d.ts +11 -0
  135. package/dist/runtime/delegation-driver.d.ts.map +1 -0
  136. package/dist/runtime/delegation-driver.js +132 -0
  137. package/dist/runtime/delegation-driver.js.map +1 -0
  138. package/dist/runtime/exact-cache.d.ts +10 -0
  139. package/dist/runtime/exact-cache.d.ts.map +1 -0
  140. package/dist/runtime/exact-cache.js +30 -0
  141. package/dist/runtime/exact-cache.js.map +1 -0
  142. package/dist/runtime/execute-tool.d.ts +29 -0
  143. package/dist/runtime/execute-tool.d.ts.map +1 -0
  144. package/dist/runtime/execute-tool.js +80 -0
  145. package/dist/runtime/execute-tool.js.map +1 -0
  146. package/dist/runtime/guardian.d.ts +9 -0
  147. package/dist/runtime/guardian.d.ts.map +1 -0
  148. package/dist/runtime/guardian.js +41 -0
  149. package/dist/runtime/guardian.js.map +1 -0
  150. package/dist/runtime/hook-gate.d.ts +17 -0
  151. package/dist/runtime/hook-gate.d.ts.map +1 -0
  152. package/dist/runtime/hook-gate.js +56 -0
  153. package/dist/runtime/hook-gate.js.map +1 -0
  154. package/dist/runtime/memory-adapter.d.ts +6 -0
  155. package/dist/runtime/memory-adapter.d.ts.map +1 -0
  156. package/dist/runtime/memory-adapter.js +38 -0
  157. package/dist/runtime/memory-adapter.js.map +1 -0
  158. package/dist/runtime/nightly-adapters.d.ts +48 -0
  159. package/dist/runtime/nightly-adapters.d.ts.map +1 -0
  160. package/dist/runtime/nightly-adapters.js +139 -0
  161. package/dist/runtime/nightly-adapters.js.map +1 -0
  162. package/dist/runtime/nightly-generator.d.ts +10 -0
  163. package/dist/runtime/nightly-generator.d.ts.map +1 -0
  164. package/dist/runtime/nightly-generator.js +335 -0
  165. package/dist/runtime/nightly-generator.js.map +1 -0
  166. package/dist/runtime/onboarding-node.d.ts +6 -0
  167. package/dist/runtime/onboarding-node.d.ts.map +1 -0
  168. package/dist/runtime/onboarding-node.js +356 -0
  169. package/dist/runtime/onboarding-node.js.map +1 -0
  170. package/dist/runtime/provider-anthropic.d.ts +43 -0
  171. package/dist/runtime/provider-anthropic.d.ts.map +1 -0
  172. package/dist/runtime/provider-anthropic.js +148 -0
  173. package/dist/runtime/provider-anthropic.js.map +1 -0
  174. package/dist/runtime/provider-cli.d.ts +18 -0
  175. package/dist/runtime/provider-cli.d.ts.map +1 -0
  176. package/dist/runtime/provider-cli.js +73 -0
  177. package/dist/runtime/provider-cli.js.map +1 -0
  178. package/dist/runtime/provider-openai.d.ts +30 -0
  179. package/dist/runtime/provider-openai.d.ts.map +1 -0
  180. package/dist/runtime/provider-openai.js +114 -0
  181. package/dist/runtime/provider-openai.js.map +1 -0
  182. package/dist/runtime/providers.d.ts +43 -0
  183. package/dist/runtime/providers.d.ts.map +1 -0
  184. package/dist/runtime/providers.js +72 -0
  185. package/dist/runtime/providers.js.map +1 -0
  186. package/dist/runtime/sandbox-bash.d.ts +21 -0
  187. package/dist/runtime/sandbox-bash.d.ts.map +1 -0
  188. package/dist/runtime/sandbox-bash.js +51 -0
  189. package/dist/runtime/sandbox-bash.js.map +1 -0
  190. package/dist/runtime/scoped-tool-executor.d.ts +10 -0
  191. package/dist/runtime/scoped-tool-executor.d.ts.map +1 -0
  192. package/dist/runtime/scoped-tool-executor.js +30 -0
  193. package/dist/runtime/scoped-tool-executor.js.map +1 -0
  194. package/dist/runtime/session-log.d.ts +6 -0
  195. package/dist/runtime/session-log.d.ts.map +1 -0
  196. package/dist/runtime/session-log.js +54 -0
  197. package/dist/runtime/session-log.js.map +1 -0
  198. package/dist/runtime/settings.d.ts +24 -0
  199. package/dist/runtime/settings.d.ts.map +1 -0
  200. package/dist/runtime/settings.js +29 -0
  201. package/dist/runtime/settings.js.map +1 -0
  202. package/dist/runtime/spawn-plan.d.ts +13 -0
  203. package/dist/runtime/spawn-plan.d.ts.map +1 -0
  204. package/dist/runtime/spawn-plan.js +107 -0
  205. package/dist/runtime/spawn-plan.js.map +1 -0
  206. package/dist/runtime/spend.d.ts +41 -0
  207. package/dist/runtime/spend.d.ts.map +1 -0
  208. package/dist/runtime/spend.js +0 -0
  209. package/dist/runtime/spend.js.map +1 -0
  210. package/dist/runtime/sub-agent-runner.d.ts +19 -0
  211. package/dist/runtime/sub-agent-runner.d.ts.map +1 -0
  212. package/dist/runtime/sub-agent-runner.js +47 -0
  213. package/dist/runtime/sub-agent-runner.js.map +1 -0
  214. package/dist/safety/grants.d.ts +7 -0
  215. package/dist/safety/grants.d.ts.map +1 -0
  216. package/dist/safety/grants.js +53 -0
  217. package/dist/safety/grants.js.map +1 -0
  218. package/dist/safety/index.d.ts +72 -0
  219. package/dist/safety/index.d.ts.map +1 -0
  220. package/dist/safety/index.js +464 -0
  221. package/dist/safety/index.js.map +1 -0
  222. package/dist/safety/types.d.ts +254 -0
  223. package/dist/safety/types.d.ts.map +1 -0
  224. package/dist/safety/types.js +3 -0
  225. package/dist/safety/types.js.map +1 -0
  226. package/dist/skills/index.d.ts +4 -0
  227. package/dist/skills/index.d.ts.map +1 -0
  228. package/dist/skills/index.js +463 -0
  229. package/dist/skills/index.js.map +1 -0
  230. package/dist/skills/types.d.ts +177 -0
  231. package/dist/skills/types.d.ts.map +1 -0
  232. package/dist/skills/types.js +3 -0
  233. package/dist/skills/types.js.map +1 -0
  234. package/dist/testing/clock.d.ts +8 -0
  235. package/dist/testing/clock.d.ts.map +1 -0
  236. package/dist/testing/clock.js +13 -0
  237. package/dist/testing/clock.js.map +1 -0
  238. package/dist/testing/effect-verifier.d.ts +15 -0
  239. package/dist/testing/effect-verifier.d.ts.map +1 -0
  240. package/dist/testing/effect-verifier.js +27 -0
  241. package/dist/testing/effect-verifier.js.map +1 -0
  242. package/dist/testing/index.d.ts +5 -0
  243. package/dist/testing/index.d.ts.map +1 -0
  244. package/dist/testing/index.js +5 -0
  245. package/dist/testing/index.js.map +1 -0
  246. package/dist/testing/provider-fake.d.ts +14 -0
  247. package/dist/testing/provider-fake.d.ts.map +1 -0
  248. package/dist/testing/provider-fake.js +18 -0
  249. package/dist/testing/provider-fake.js.map +1 -0
  250. package/dist/testing/sandbox-stub.d.ts +15 -0
  251. package/dist/testing/sandbox-stub.d.ts.map +1 -0
  252. package/dist/testing/sandbox-stub.js +15 -0
  253. package/dist/testing/sandbox-stub.js.map +1 -0
  254. package/dist/tools/index.d.ts +11 -0
  255. package/dist/tools/index.d.ts.map +1 -0
  256. package/dist/tools/index.js +0 -0
  257. package/dist/tools/index.js.map +1 -0
  258. package/dist/tools/types.d.ts +138 -0
  259. package/dist/tools/types.d.ts.map +1 -0
  260. package/dist/tools/types.js +4 -0
  261. package/dist/tools/types.js.map +1 -0
  262. package/dist/triggers/index.d.ts +4 -0
  263. package/dist/triggers/index.d.ts.map +1 -0
  264. package/dist/triggers/index.js +187 -0
  265. package/dist/triggers/index.js.map +1 -0
  266. package/dist/triggers/types.d.ts +74 -0
  267. package/dist/triggers/types.d.ts.map +1 -0
  268. package/dist/triggers/types.js +5 -0
  269. package/dist/triggers/types.js.map +1 -0
  270. package/package.json +36 -0
@@ -0,0 +1,339 @@
1
+ // Component 08 — Personality (docs/specs/08-personality.md)
2
+ //
3
+ // Deterministic identity: SOUL.md persona + ordered constitution.md with exactly
4
+ // one veto principle, assembled into a byte-stable IdentityPayload (ADR-0019
5
+ // prefix segments 1-2) and re-seeded verbatim across generations and provider
6
+ // failovers (finding 3, ADR-0005 / ADR-0018). Parsing, ordering, validation, and
7
+ // hashing are 100% deterministic code (§5.1); the model performs the personality,
8
+ // the harness guarantees it is present, ordered, and unchanged.
9
+ // Re-export error classes (they are values, not just types)
10
+ export { ConstitutionError, SoulMissing } from './types.js';
11
+ import { createHash } from 'node:crypto';
12
+ import { readFileSync } from 'node:fs';
13
+ import { join } from 'node:path';
14
+ import { ConstitutionError, SoulMissing } from './types.js';
15
+ const noopRecord = () => { };
16
+ /** SHA-256 over (constitution || soul) — the identity fingerprint (§4.3, ADR-0004). */
17
+ function sha256(input) {
18
+ return createHash('sha256').update(input, 'utf8').digest('hex');
19
+ }
20
+ // ---------------------------------------------------------------------------
21
+ // constitution.md parsing (§4.2) — deterministic, no model call.
22
+ // Entries: "[N] (veto) text..." with indented continuation lines.
23
+ // ---------------------------------------------------------------------------
24
+ const PRINCIPLE_RE = /^\[(\d+)\]\s*(\(veto\)\s*)?(\S.*)$/;
25
+ /** Stable id from the principle text: first four word tokens, /^[a-z0-9][a-z0-9-]*$/ (§3). */
26
+ function principleId(text) {
27
+ const tokens = text
28
+ .toLowerCase()
29
+ .replace(/[^a-z0-9\s]/g, ' ')
30
+ .trim()
31
+ .split(/\s+/)
32
+ .filter(t => t.length > 0)
33
+ .slice(0, 4);
34
+ return tokens.length > 0 ? tokens.join('-') : 'principle';
35
+ }
36
+ /**
37
+ * Parse constitution.md bytes into an ordered Constitution (§4.2).
38
+ * Principles are sorted ascending by precedence at parse time (§3); structural
39
+ * validity (total order, single veto) is judged by validateIdentity().
40
+ * Throws ConstitutionError when no principle can be parsed at all.
41
+ */
42
+ export function parseConstitution(raw) {
43
+ const principles = [];
44
+ let current = null;
45
+ for (const line of raw.split('\n')) {
46
+ const match = PRINCIPLE_RE.exec(line);
47
+ if (match !== null) {
48
+ current = {
49
+ id: principleId(match[3] ?? ''),
50
+ precedence: Number(match[1]),
51
+ veto: match[2] !== undefined,
52
+ text: (match[3] ?? '').trim(),
53
+ };
54
+ principles.push(current);
55
+ continue;
56
+ }
57
+ // Indented continuation lines extend the current principle's text.
58
+ if (current !== null && /^\s+\S/.test(line) && !line.trimStart().startsWith('<!--')) {
59
+ current.text += ' ' + line.trim();
60
+ }
61
+ else if (line.trim() === '') {
62
+ current = null;
63
+ }
64
+ }
65
+ if (principles.length === 0) {
66
+ throw new ConstitutionError('ConstitutionError: constitution.md is unparseable — no "[N] text" principles found (§4.2)');
67
+ }
68
+ // Stable ids must be unique: a colliding id silently shadows an earlier
69
+ // principle (incl. vetoId resolution). Fail closed (§3, §5.1).
70
+ const seenIds = new Set();
71
+ for (const p of principles) {
72
+ if (seenIds.has(p.id)) {
73
+ throw new ConstitutionError(`ConstitutionError: duplicate principle id "${p.id}" in constitution.md — ids must be unique, no silent shadowing (§3)`);
74
+ }
75
+ seenIds.add(p.id);
76
+ }
77
+ // Sorted ascending by precedence at parse time (§3); the model never sees an
78
+ // unordered bag and cannot "choose" a different precedence (§5.1).
79
+ principles.sort((a, b) => a.precedence - b.precedence);
80
+ const vetoes = principles.filter(p => p.veto);
81
+ return {
82
+ principles,
83
+ vetoId: vetoes.length === 1 ? vetoes[0].id : '',
84
+ };
85
+ }
86
+ /** Parse SOUL.md bytes (§4.1): raw persona text plus named register modes ("- name: body"). */
87
+ export function parseSoul(raw) {
88
+ const modes = {};
89
+ const MODE_RE = /^-\s*([a-z][a-z0-9-]*):\s+(.+)$/;
90
+ for (const line of raw.split('\n')) {
91
+ const match = MODE_RE.exec(line.trim());
92
+ if (match !== null) {
93
+ modes[match[1]] = match[2].trim();
94
+ }
95
+ }
96
+ return { raw, modes };
97
+ }
98
+ /**
99
+ * Load-time validation, fail-closed (§3, §5.1):
100
+ * unique_precedence — no two principles share a precedence (total order)
101
+ * exactly_one_veto — exactly one veto === true, at the LOWEST precedence (§5.1)
102
+ * soul_present — SOUL.md non-empty and parses
103
+ */
104
+ export function validateIdentity(c, s) {
105
+ const precedences = c.principles.map(p => p.precedence);
106
+ const unique_precedence = c.principles.length > 0 && new Set(precedences).size === precedences.length;
107
+ const vetoes = c.principles.filter(p => p.veto);
108
+ const lowest = Math.min(...precedences);
109
+ // §5.1: exactly one veto===true, lowest precedence — the veto always wins (§4.2 table).
110
+ const exactly_one_veto = vetoes.length === 1 && vetoes[0].precedence === lowest;
111
+ const soul_present = s.raw.trim().length > 0;
112
+ return {
113
+ unique_precedence,
114
+ exactly_one_veto,
115
+ soul_present,
116
+ ok: unique_precedence && exactly_one_veto && soul_present,
117
+ };
118
+ }
119
+ /** Fail-closed gate shared by the loader and the Personality factory (§5.1, §7). */
120
+ function assertValid(report, where) {
121
+ if (!report.unique_precedence) {
122
+ throw new ConstitutionError(`ConstitutionError: duplicate precedence in ${where} — no total order, the model could pick (§7, AC-08-5)`);
123
+ }
124
+ if (!report.exactly_one_veto) {
125
+ throw new ConstitutionError(`ConstitutionError: ${where} must mark exactly one veto principle at the lowest precedence (§7, AC-08-6)`);
126
+ }
127
+ if (!report.soul_present) {
128
+ throw new SoulMissing(`SoulMissing: SOUL.md absent or empty in ${where} — identity must not come from model weights (§7, AC-08-15)`);
129
+ }
130
+ }
131
+ function defaultReadFile(path) {
132
+ try {
133
+ return readFileSync(path, 'utf8');
134
+ }
135
+ catch {
136
+ return null;
137
+ }
138
+ }
139
+ export function makePersonalityLoader(deps = {}) {
140
+ const readFile = deps.readFile ?? defaultReadFile;
141
+ const record = deps.record ?? noopRecord;
142
+ // Frozen per-path session snapshots (ADR-0019): the first successful load is
143
+ // the session's identity; mid-session disk edits are ignored until the next
144
+ // session's loadIdentity() (§7 "Mid-session edit", AC-08-17).
145
+ const snapshots = new Map();
146
+ return {
147
+ async load(path) {
148
+ const frozen = snapshots.get(path);
149
+ if (frozen !== undefined) {
150
+ return frozen;
151
+ }
152
+ // Constitution first: a harness with no enforceable veto must not run (§5.1).
153
+ const constitutionRaw = readFile(join(path, 'constitution.md'));
154
+ if (constitutionRaw === null || constitutionRaw.trim() === '') {
155
+ throw new ConstitutionError(`ConstitutionError: constitution.md absent or empty at ${path} — fail closed, no session (§7 cold start)`);
156
+ }
157
+ const constitution = parseConstitution(constitutionRaw);
158
+ const soulRaw = readFile(join(path, 'SOUL.md'));
159
+ const soul = parseSoul(soulRaw ?? '');
160
+ const report = validateIdentity(constitution, soul);
161
+ if (soulRaw === null || !report.soul_present) {
162
+ throw new SoulMissing(`SoulMissing: SOUL.md absent or empty at ${path} — fail closed, no silent default persona (§7 cold start)`);
163
+ }
164
+ assertValid(report, `${path}/constitution.md`);
165
+ // Byte-identical payload: raw on-disk bytes, never a re-serialization (§4.3).
166
+ const payload = Object.freeze({
167
+ constitution: constitutionRaw,
168
+ soul: soulRaw,
169
+ hash: sha256(constitutionRaw + soulRaw),
170
+ });
171
+ snapshots.set(path, payload);
172
+ record({ kind: 'tool-call', target: 'identity.loaded', payload: { hash: payload.hash } });
173
+ return payload;
174
+ },
175
+ getActivePersona() {
176
+ // Mode selection lives on the full Personality surface; the loader always
177
+ // reports the default register (§4.4, types.ts contract).
178
+ return 'default';
179
+ },
180
+ async checkDegradation(ctx) {
181
+ // The hash invariant is the machine-checkable anti-degradation check (§4.3):
182
+ // a drifted candidate is rejected fail-closed before any turn runs (AC-08-14).
183
+ if (ctx.candidatePayload.hash !== ctx.sessionHash) {
184
+ return { ok: false, reason: 'hash_mismatch' };
185
+ }
186
+ const recomputed = sha256(ctx.candidatePayload.constitution + ctx.candidatePayload.soul);
187
+ if (recomputed !== ctx.sessionHash) {
188
+ // Declared hash matches but the bytes drifted — name the drifted segment
189
+ // when the frozen session snapshot is available.
190
+ for (const snapshot of snapshots.values()) {
191
+ if (snapshot.hash !== ctx.sessionHash)
192
+ continue;
193
+ if (ctx.candidatePayload.soul !== snapshot.soul) {
194
+ return { ok: false, reason: 'soul_mismatch' };
195
+ }
196
+ if (ctx.candidatePayload.constitution !== snapshot.constitution) {
197
+ return { ok: false, reason: 'constitution_mismatch' };
198
+ }
199
+ }
200
+ return { ok: false, reason: 'hash_mismatch' };
201
+ }
202
+ return { ok: true };
203
+ },
204
+ };
205
+ }
206
+ /**
207
+ * Provenance gate for the veto (ADR-0029). Returns true only for a confirmation
208
+ * that the harness — not the model — could have produced.
209
+ * - With a trusted-channel allowlist: requires a structured HumanConfirmation
210
+ * token whose channel is on the allowlist. A bare boolean or a token with an
211
+ * untrusted/missing channel is rejected.
212
+ * - Without an allowlist (no approval handler wired): the legacy bare boolean
213
+ * is honored, preserving existing callers.
214
+ */
215
+ function isHumanConfirmed(metadata, trustedChannels) {
216
+ const raw = metadata?.['humanConfirmation'];
217
+ if (trustedChannels === undefined) {
218
+ return raw === true;
219
+ }
220
+ if (typeof raw !== 'object' || raw === null)
221
+ return false;
222
+ const token = raw;
223
+ return typeof token.channel === 'string' && trustedChannels.includes(token.channel);
224
+ }
225
+ export function makePersonality(deps) {
226
+ const record = deps.record ?? noopRecord;
227
+ // Parse + validate fail-closed at construction (§5.1): a Personality with no
228
+ // enforceable veto must not exist.
229
+ const constitution = parseConstitution(deps.constitution);
230
+ const soul = parseSoul(deps.soul);
231
+ const report = validateIdentity(constitution, soul);
232
+ if (!report.ok) {
233
+ // §3 "Events emitted": leave an audit trail before failing closed so a
234
+ // validation failure is not silent (§8 repudiation threat).
235
+ record({ kind: 'tool-call', target: 'identity.validation_failed', payload: { report } });
236
+ }
237
+ assertValid(report, 'constitution.md');
238
+ const vetoPrinciple = constitution.principles.find(p => p.veto);
239
+ // The frozen session payload (ADR-0019 segments 1-2): byte-identical for the
240
+ // whole session; reseedPayload() returns these exact bytes (finding 3).
241
+ const payload = Object.freeze({
242
+ constitution: deps.constitution,
243
+ soul: deps.soul,
244
+ hash: sha256(deps.constitution + deps.soul),
245
+ });
246
+ // Mode registry: SOUL.md registers (tone only) plus any proposed extras.
247
+ const modeRegistry = {};
248
+ for (const [name, body] of Object.entries(soul.modes)) {
249
+ modeRegistry[name] = { body };
250
+ }
251
+ for (const [name, spec] of Object.entries(deps.modes ?? {})) {
252
+ modeRegistry[name] = spec;
253
+ }
254
+ // An explicit initialMode must name a registered register; an unknown one would
255
+ // start the session in a register that does not exist. Fail closed at
256
+ // construction (§5.1), consistent with the constitution/soul gates above. The
257
+ // implicit 'default' fallback (when initialMode is omitted) stays a safe default.
258
+ if (deps.initialMode !== undefined && modeRegistry[deps.initialMode] === undefined) {
259
+ throw new ConstitutionError(`ConstitutionError: initialMode "${deps.initialMode}" is not a registered mode — fail closed at construction (§5.1)`);
260
+ }
261
+ let activeMode = deps.initialMode ?? 'default';
262
+ let generation = 0;
263
+ return {
264
+ loadIdentity() {
265
+ record({ kind: 'tool-call', target: 'identity.loaded', payload: { hash: payload.hash } });
266
+ return payload;
267
+ },
268
+ reseedPayload() {
269
+ // Byte-identical to loadIdentity() this session — the anti-degradation
270
+ // invariant (§5.4, AC-08-12/13).
271
+ generation += 1;
272
+ record({
273
+ kind: 'tool-call',
274
+ target: 'identity.reseeded',
275
+ payload: { hash: payload.hash, generation_id: generation },
276
+ });
277
+ return payload;
278
+ },
279
+ checkVeto(action) {
280
+ // (b) of §5.3: the veto-check event is journaled BEFORE any execute, so
281
+ // Observability can assert consultation order (AC-08-9, AC-08-19).
282
+ record({
283
+ kind: 'tool-call',
284
+ target: 'veto-check',
285
+ payload: { actionId: action.id, vetoId: vetoPrinciple.id, hash: payload.hash },
286
+ });
287
+ if (!action.irreversible) {
288
+ return {
289
+ allowed: true,
290
+ vetoId: null,
291
+ reason: 'reversible action — the veto principle gates only irreversible steps (§5.3)',
292
+ };
293
+ }
294
+ // The veto principle (§4.2): no irreversible harm/destruction WITHOUT
295
+ // explicit, provenance-bound human confirmation. The deterministic gate
296
+ // reads that confirmation from action metadata and binds it to a
297
+ // harness-controlled channel (ADR-0029) so a model-set flag cannot pass;
298
+ // absent a valid confirmation, fail closed.
299
+ const confirmed = isHumanConfirmed(action.metadata, deps.trustedConfirmationChannels);
300
+ if (confirmed) {
301
+ return {
302
+ allowed: true,
303
+ vetoId: null,
304
+ reason: 'irreversible action carries explicit, provenance-bound human confirmation (§4.2 [1])',
305
+ };
306
+ }
307
+ record({
308
+ kind: 'tool-call',
309
+ target: 'veto.blocked',
310
+ payload: { vetoId: vetoPrinciple.id, action: action.id, hash: payload.hash },
311
+ });
312
+ return {
313
+ allowed: false,
314
+ vetoId: vetoPrinciple.id,
315
+ reason: `blocked by veto principle "${vetoPrinciple.id}": ${vetoPrinciple.text}`,
316
+ };
317
+ },
318
+ setMode(name) {
319
+ // §5.5: a mode is a register, not a constitution amendment.
320
+ const spec = modeRegistry[name];
321
+ if (spec === undefined) {
322
+ return { ok: false, reason: 'unknown_mode' };
323
+ }
324
+ if (spec.precedenceOverrides !== undefined && Object.keys(spec.precedenceOverrides).length > 0) {
325
+ return { ok: false, reason: 'mode_touches_precedence' };
326
+ }
327
+ if (spec.vetoOverride === false) {
328
+ return { ok: false, reason: 'mode_disables_veto' };
329
+ }
330
+ activeMode = name;
331
+ record({ kind: 'tool-call', target: 'mode.changed', payload: { mode: activeMode, hash: payload.hash } });
332
+ return { ok: true, mode: name };
333
+ },
334
+ validate(c, s) {
335
+ return validateIdentity(c, s);
336
+ },
337
+ };
338
+ }
339
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/personality/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ export type Precedence = number;
2
+ export interface Principle {
3
+ id: string;
4
+ precedence: Precedence;
5
+ veto: boolean;
6
+ text: string;
7
+ }
8
+ export interface Constitution {
9
+ principles: Principle[];
10
+ vetoId: string;
11
+ }
12
+ export interface Soul {
13
+ raw: string;
14
+ modes: Record<string, string>;
15
+ }
16
+ export interface IdentityPayload {
17
+ constitution: string;
18
+ soul: string;
19
+ hash: string;
20
+ }
21
+ /**
22
+ * Provenance-bound human confirmation (ADR-0029). Set ONLY by the deterministic
23
+ * approval handler in direct response to a human tap on a specific channel —
24
+ * never by model-turn code. The `channel` is verified against the
25
+ * harness-controlled trusted-channel allowlist; a model can propose this shape
26
+ * but cannot forge a trusted channel.
27
+ */
28
+ export interface HumanConfirmation {
29
+ channel: string;
30
+ requestId: string;
31
+ issuedAt: number;
32
+ }
33
+ export interface ProposedAction {
34
+ id: string;
35
+ irreversible: boolean;
36
+ description: string;
37
+ metadata?: Record<string, unknown>;
38
+ }
39
+ export interface VetoVerdict {
40
+ allowed: boolean;
41
+ vetoId: string | null;
42
+ reason: string;
43
+ }
44
+ export type ModeResult = {
45
+ ok: true;
46
+ mode: string;
47
+ } | {
48
+ ok: false;
49
+ reason: 'unknown_mode' | 'mode_touches_precedence' | 'mode_disables_veto';
50
+ };
51
+ export interface ValidationReport {
52
+ unique_precedence: boolean;
53
+ exactly_one_veto: boolean;
54
+ soul_present: boolean;
55
+ ok: boolean;
56
+ }
57
+ export interface DegradationCheckContext {
58
+ sessionHash: string;
59
+ candidatePayload: IdentityPayload;
60
+ }
61
+ export interface DegradationCheckResult {
62
+ ok: boolean;
63
+ reason?: 'hash_mismatch' | 'soul_mismatch' | 'constitution_mismatch';
64
+ }
65
+ export interface PersonalityLoader {
66
+ /** Session start: load, validate, sort, and hash the identity payload. Fail-closed. */
67
+ load(path: string): Promise<IdentityPayload>;
68
+ /** Return the active mode name (default: 'default'). */
69
+ getActivePersona(): string;
70
+ /** Anti-degradation check: verify a candidate payload is byte-identical to the session original. */
71
+ checkDegradation(ctx: DegradationCheckContext): Promise<DegradationCheckResult>;
72
+ }
73
+ export interface Personality {
74
+ /** Session start: build the identity segment of the stable prefix. */
75
+ loadIdentity(): IdentityPayload;
76
+ /** Anti-degradation: the verbatim payload Orchestration re-seeds (finding 3). */
77
+ reseedPayload(): IdentityPayload;
78
+ /** Normative veto: deterministic frame check before an irreversible step. */
79
+ checkVeto(action: ProposedAction): VetoVerdict;
80
+ /** Mode selection: tone only, never precedence. */
81
+ setMode(name: string): ModeResult;
82
+ /** Load-time validation — fail-closed. */
83
+ validate(c: Constitution, s: Soul): ValidationReport;
84
+ }
85
+ export interface AntiDegradationGuard {
86
+ /** Assert the re-seeded payload matches the session-original hash. Fail-closed on mismatch. */
87
+ assertReseed(payload: IdentityPayload): DegradationCheckResult;
88
+ }
89
+ export interface PersonalityConfig {
90
+ /** Absolute path to SOUL.md on disk */
91
+ soulPath: string;
92
+ /** Absolute path to constitution.md on disk */
93
+ constitutionPath: string;
94
+ /** Initial mode name (default: 'default') */
95
+ initialMode?: string;
96
+ }
97
+ export declare class ConstitutionError extends Error {
98
+ constructor(message: string);
99
+ }
100
+ export declare class SoulMissing extends Error {
101
+ constructor(message?: string);
102
+ }
103
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/personality/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ // §3 interfaces — pure types, no implementation
2
+ // ---- Errors ----
3
+ export class ConstitutionError extends Error {
4
+ constructor(message) {
5
+ super(message);
6
+ this.name = 'ConstitutionError';
7
+ }
8
+ }
9
+ export class SoulMissing extends Error {
10
+ constructor(message = 'SOUL.md absent or empty') {
11
+ super(message);
12
+ this.name = 'SoulMissing';
13
+ }
14
+ }
15
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/personality/types.ts"],"names":[],"mappings":"AAAA,gDAAgD;AA0IhD,mBAAmB;AAEnB,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAA;IACjC,CAAC;CACF;AAED,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,YAAY,OAAO,GAAG,yBAAyB;QAC7C,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,aAAa,CAAA;IAC3B,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import type { ModelRouter, ModelRouterDeps } from './types.js';
2
+ export type { DispatchError, HysteresisState, ModelRequest, ModelResult, ModelRouter, ModelRouterDeps, PrefixContract, ProviderId, ProviderAdapter, ProviderFamily, QueueRecord, RequestBody, RouteDecision, RouterEvent, RouteTier, RoutingPolicy, TaskBudget, } from './types.js';
3
+ export declare function makeModelRouter(deps: ModelRouterDeps): ModelRouter;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/provider/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAKV,WAAW,EACX,eAAe,EAShB,MAAM,YAAY,CAAA;AAEnB,YAAY,EACV,aAAa,EACb,eAAe,EACf,YAAY,EACZ,WAAW,EACX,WAAW,EACX,eAAe,EACf,cAAc,EACd,UAAU,EACV,eAAe,EACf,cAAc,EACd,WAAW,EACX,WAAW,EACX,aAAa,EACb,WAAW,EACX,SAAS,EACT,aAAa,EACb,UAAU,GACX,MAAM,YAAY,CAAA;AAoCnB,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,WAAW,CAuNlE"}