@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,48 @@
1
+ import type { RunLock, Validators, Fact, MemOp } from '../nightly/index.js';
2
+ import type { MemoryFact, MemoryOp } from '../memory/index.js';
3
+ export interface FileRunLockDeps {
4
+ lockPath: string;
5
+ readFile(path: string): string;
6
+ writeFile(path: string, content: string): void;
7
+ exists(path: string): boolean;
8
+ removeFile(path: string): void;
9
+ pid: number;
10
+ bootId: string;
11
+ startTime: number;
12
+ now(): number;
13
+ maxHeldMs?: number;
14
+ }
15
+ /**
16
+ * File-based RunLock.
17
+ * acquire(): if the lockfile does not exist → write token JSON, return {ok:true, token}.
18
+ * if it exists → parse; if stale (now - acquiredAt > maxHeldMs) → overwrite and take over.
19
+ * if corrupt (parse error) → treat as stale, take over.
20
+ * if live → return {ok:false, heldBy, heldForMs}.
21
+ * release(token): if the lockfile exists AND its nonce matches → remove; otherwise no-op.
22
+ */
23
+ export declare function makeFileRunLock(deps: FileRunLockDeps): RunLock;
24
+ export interface MemoryValidatorsDeps {
25
+ liveFactIds: Set<string>;
26
+ }
27
+ /**
28
+ * Deterministic Validators for nightly consolidation.
29
+ * - MemOp UPDATE/DELETE with an unknown factId → fails refs_exist
30
+ * - MemOp ADD with empty text → fails (no_conflicts as the "content" validator)
31
+ * - SkillDraft (no kind field) → passes always
32
+ * - Otherwise → passes
33
+ */
34
+ export declare function makeMemoryValidators(deps: MemoryValidatorsDeps): Validators;
35
+ /**
36
+ * Bridge mapper: converts Memory's MemoryFact shape to the nightly Fact shape.
37
+ * Memory's factKey is a string hash; nightly's FactKey is {entity, relation, object}.
38
+ * We map id→entity, 'memory'→relation, factKey→object as a stable bridge convention.
39
+ */
40
+ export declare function liveFactsForNightly(facts: MemoryFact[]): Fact[];
41
+ /**
42
+ * Bridge mapper: converts a nightly MemOp to a Memory MemoryOp for promotion.
43
+ * NOOP → null (no commit needed).
44
+ * DELETE uses humanConfirmed: true because promotion runs only after the
45
+ * operator's morning-card Approve tap → human-confirmed.
46
+ */
47
+ export declare function memOpToMemoryOp(op: MemOp): MemoryOp | null;
48
+ //# sourceMappingURL=nightly-adapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nightly-adapters.d.ts","sourceRoot":"","sources":["../../src/runtime/nightly-adapters.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAa,UAAU,EAAmB,IAAI,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AACvG,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAM9D,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IAC9B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9C,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IAC7B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,IAAI,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CA4D9D;AAMD,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CACzB;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,oBAAoB,GAAG,UAAU,CAyB3E;AAMD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,CAQ/D;AAMD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,KAAK,GAAG,QAAQ,GAAG,IAAI,CAY1D"}
@@ -0,0 +1,139 @@
1
+ // packages/core-ts/src/runtime/nightly-adapters.ts
2
+ // Nightly support adapters: file-based RunLock, deterministic Validators,
3
+ // and the nightly↔memory type bridge (Tier-4 B2).
4
+ import { randomUUID } from 'node:crypto';
5
+ /**
6
+ * File-based RunLock.
7
+ * acquire(): if the lockfile does not exist → write token JSON, return {ok:true, token}.
8
+ * if it exists → parse; if stale (now - acquiredAt > maxHeldMs) → overwrite and take over.
9
+ * if corrupt (parse error) → treat as stale, take over.
10
+ * if live → return {ok:false, heldBy, heldForMs}.
11
+ * release(token): if the lockfile exists AND its nonce matches → remove; otherwise no-op.
12
+ */
13
+ export function makeFileRunLock(deps) {
14
+ const maxHeldMs = deps.maxHeldMs ?? 7_200_000;
15
+ const readToken = () => {
16
+ if (!deps.exists(deps.lockPath))
17
+ return null;
18
+ try {
19
+ return JSON.parse(deps.readFile(deps.lockPath));
20
+ }
21
+ catch {
22
+ // Corrupt lockfile — treat as absent (stale takeover)
23
+ return null;
24
+ }
25
+ };
26
+ const writeToken = (token) => {
27
+ deps.writeFile(deps.lockPath, JSON.stringify(token));
28
+ };
29
+ return {
30
+ acquire() {
31
+ const nowMs = deps.now();
32
+ if (!deps.exists(deps.lockPath)) {
33
+ const token = {
34
+ pid: deps.pid,
35
+ bootId: deps.bootId,
36
+ startTime: deps.startTime,
37
+ nonce: randomUUID(),
38
+ acquiredAt: nowMs,
39
+ };
40
+ writeToken(token);
41
+ return { ok: true, token };
42
+ }
43
+ const existing = readToken();
44
+ const heldForMs = existing ? nowMs - existing.acquiredAt : maxHeldMs + 1;
45
+ // Stale or corrupt: take over
46
+ if (existing === null || heldForMs > maxHeldMs) {
47
+ const token = {
48
+ pid: deps.pid,
49
+ bootId: deps.bootId,
50
+ startTime: deps.startTime,
51
+ nonce: randomUUID(),
52
+ acquiredAt: nowMs,
53
+ };
54
+ writeToken(token);
55
+ return { ok: true, token };
56
+ }
57
+ return { ok: false, heldBy: existing, heldForMs };
58
+ },
59
+ release(token) {
60
+ if (!deps.exists(deps.lockPath))
61
+ return;
62
+ const stored = readToken();
63
+ if (stored === null)
64
+ return;
65
+ if (stored.nonce !== token.nonce)
66
+ return;
67
+ deps.removeFile(deps.lockPath);
68
+ },
69
+ };
70
+ }
71
+ /**
72
+ * Deterministic Validators for nightly consolidation.
73
+ * - MemOp UPDATE/DELETE with an unknown factId → fails refs_exist
74
+ * - MemOp ADD with empty text → fails (no_conflicts as the "content" validator)
75
+ * - SkillDraft (no kind field) → passes always
76
+ * - Otherwise → passes
77
+ */
78
+ export function makeMemoryValidators(deps) {
79
+ return {
80
+ check(candidate) {
81
+ // SkillDraft has no `kind` field; MemOp always has one.
82
+ if (!('kind' in candidate)) {
83
+ return { ok: true };
84
+ }
85
+ const op = candidate;
86
+ if (op.kind === 'UPDATE' || op.kind === 'DELETE') {
87
+ if (!deps.liveFactIds.has(op.factId)) {
88
+ return { ok: false, failed: ['refs_exist'] };
89
+ }
90
+ }
91
+ if (op.kind === 'ADD') {
92
+ if (op.text.trim() === '') {
93
+ return { ok: false, failed: ['dry_run_ok'] };
94
+ }
95
+ }
96
+ return { ok: true };
97
+ },
98
+ };
99
+ }
100
+ // ---------------------------------------------------------------------------
101
+ // liveFactsForNightly — MemoryFact[] → nightly Fact[]
102
+ // ---------------------------------------------------------------------------
103
+ /**
104
+ * Bridge mapper: converts Memory's MemoryFact shape to the nightly Fact shape.
105
+ * Memory's factKey is a string hash; nightly's FactKey is {entity, relation, object}.
106
+ * We map id→entity, 'memory'→relation, factKey→object as a stable bridge convention.
107
+ */
108
+ export function liveFactsForNightly(facts) {
109
+ return facts.map((f) => ({
110
+ id: f.id,
111
+ text: f.text,
112
+ factKey: { entity: f.id, relation: 'memory', object: f.factKey },
113
+ invalidAt: f.invalidAt,
114
+ isHumanConfirmed: f.isHumanConfirmed,
115
+ }));
116
+ }
117
+ // ---------------------------------------------------------------------------
118
+ // memOpToMemoryOp — nightly MemOp → memory MemoryOp | null
119
+ // ---------------------------------------------------------------------------
120
+ /**
121
+ * Bridge mapper: converts a nightly MemOp to a Memory MemoryOp for promotion.
122
+ * NOOP → null (no commit needed).
123
+ * DELETE uses humanConfirmed: true because promotion runs only after the
124
+ * operator's morning-card Approve tap → human-confirmed.
125
+ */
126
+ export function memOpToMemoryOp(op) {
127
+ switch (op.kind) {
128
+ case 'ADD':
129
+ return { op: 'ADD', text: op.text };
130
+ case 'UPDATE':
131
+ return { op: 'UPDATE', targetId: op.factId, text: op.text };
132
+ case 'DELETE':
133
+ // promotion runs only after the operator's morning-card Approve tap → human-confirmed
134
+ return { op: 'DELETE', targetId: op.factId, humanConfirmed: true, reason: op.reason };
135
+ case 'NOOP':
136
+ return null;
137
+ }
138
+ }
139
+ //# sourceMappingURL=nightly-adapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nightly-adapters.js","sourceRoot":"","sources":["../../src/runtime/nightly-adapters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Generator, Judge } from '../nightly/index.js';
2
+ import type { ProviderAdapter } from '../agent-loop/types.js';
3
+ export declare function makeNightlyGenerator(deps: {
4
+ provider: ProviderAdapter;
5
+ nowIso: () => string;
6
+ }): Generator;
7
+ export declare function makeNightlyJudge(deps: {
8
+ provider: ProviderAdapter;
9
+ }): Judge;
10
+ //# sourceMappingURL=nightly-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nightly-generator.d.ts","sourceRoot":"","sources":["../../src/runtime/nightly-generator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAA2F,MAAM,qBAAqB,CAAA;AACpJ,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAqN7D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,QAAQ,EAAE,eAAe,CAAA;IACzB,MAAM,EAAE,MAAM,MAAM,CAAA;CACrB,GAAG,SAAS,CAgDZ;AAMD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,eAAe,CAAA;CAAE,GAAG,KAAK,CAsD3E"}
@@ -0,0 +1,335 @@
1
+ // packages/core-ts/src/runtime/nightly-generator.ts
2
+ // LLM-backed Generator and Judge adapters for nightly consolidation (Tier-4 B3).
3
+ // ---------------------------------------------------------------------------
4
+ // Helpers
5
+ // ---------------------------------------------------------------------------
6
+ /**
7
+ * Wrap a raw slug string from the LLM into the structured nightly FactKey.
8
+ * Convention: { entity: 'fact', relation: 'asserts', object: <slug> }
9
+ */
10
+ function wrapSlug(slug) {
11
+ return { entity: 'fact', relation: 'asserts', object: slug };
12
+ }
13
+ /**
14
+ * Scan `text` starting at `from`, tracking JSON string-literal context.
15
+ * Returns the index of the next occurrence of `open` that is NOT inside a
16
+ * JSON string, or -1 if none found.
17
+ */
18
+ function indexOfOutsideString(text, open, from) {
19
+ let inString = false;
20
+ for (let i = from; i < text.length; i++) {
21
+ const ch = text[i];
22
+ if (inString) {
23
+ if (ch === '\\') {
24
+ i++;
25
+ continue;
26
+ } // skip escaped char
27
+ if (ch === '"')
28
+ inString = false;
29
+ }
30
+ else {
31
+ if (ch === '"') {
32
+ inString = true;
33
+ continue;
34
+ }
35
+ if (ch === open)
36
+ return i;
37
+ }
38
+ }
39
+ return -1;
40
+ }
41
+ /**
42
+ * Starting at `start` (which must be the opening bracket `open`), scan to the
43
+ * matching close bracket, respecting JSON string-literal context so brackets
44
+ * inside strings are not counted. Returns the index of the matching close, or
45
+ * -1 if the text ends before the brackets balance.
46
+ */
47
+ function matchingClose(text, start, open, close) {
48
+ let inString = false;
49
+ let depth = 0;
50
+ for (let i = start; i < text.length; i++) {
51
+ const ch = text[i];
52
+ if (inString) {
53
+ if (ch === '\\') {
54
+ i++;
55
+ continue;
56
+ }
57
+ if (ch === '"')
58
+ inString = false;
59
+ }
60
+ else {
61
+ if (ch === '"') {
62
+ inString = true;
63
+ continue;
64
+ }
65
+ if (ch === open)
66
+ depth++;
67
+ else if (ch === close) {
68
+ depth--;
69
+ if (depth === 0)
70
+ return i;
71
+ }
72
+ }
73
+ }
74
+ return -1;
75
+ }
76
+ /**
77
+ * Extract the first top-level JSON array from a string that may contain prose.
78
+ * String-aware: brackets inside JSON string literals are not counted.
79
+ * If a candidate substring fails JSON.parse, scanning resumes after that '['.
80
+ * Returns the raw substring or null if no valid JSON array is found.
81
+ */
82
+ function extractFirstJsonArray(text) {
83
+ let searchFrom = 0;
84
+ while (true) {
85
+ const start = indexOfOutsideString(text, '[', searchFrom);
86
+ if (start === -1)
87
+ return null;
88
+ const end = matchingClose(text, start, '[', ']');
89
+ if (end === -1)
90
+ return null;
91
+ const candidate = text.slice(start, end + 1);
92
+ try {
93
+ JSON.parse(candidate);
94
+ return candidate;
95
+ }
96
+ catch {
97
+ searchFrom = start + 1; // this '[' is junk prose; try the next one
98
+ }
99
+ }
100
+ }
101
+ /**
102
+ * Extract the first top-level JSON object from a string that may contain prose.
103
+ * String-aware: brackets inside JSON string literals are not counted.
104
+ * If a candidate substring fails JSON.parse, scanning resumes after that '{'.
105
+ * Used by the judge to parse { verdict: ... }.
106
+ */
107
+ function extractFirstJsonObject(text) {
108
+ let searchFrom = 0;
109
+ while (true) {
110
+ const start = indexOfOutsideString(text, '{', searchFrom);
111
+ if (start === -1)
112
+ return null;
113
+ const end = matchingClose(text, start, '{', '}');
114
+ if (end === -1)
115
+ return null;
116
+ const candidate = text.slice(start, end + 1);
117
+ try {
118
+ JSON.parse(candidate);
119
+ return candidate;
120
+ }
121
+ catch {
122
+ searchFrom = start + 1; // this '{' is junk prose; try the next one
123
+ }
124
+ }
125
+ }
126
+ const MAX_OPS = 50;
127
+ /**
128
+ * Parse the LLM reply into validated MemOps.
129
+ * - Extracts the first JSON array from reply (handles prose wrapping).
130
+ * - Validates each element: kind ∈ {ADD,UPDATE,DELETE,NOOP} + required fields.
131
+ * - Wraps the string factKey slug into the structured FactKey for ADD/UPDATE.
132
+ * - For UPDATE missing factKey, reuses the live fact's factKey.
133
+ * - Drops malformed elements silently.
134
+ * - Caps array at MAX_OPS.
135
+ * On any parse failure returns [].
136
+ */
137
+ function parseMemOps(reply, liveFacts) {
138
+ const raw = extractFirstJsonArray(reply);
139
+ if (raw === null)
140
+ return [];
141
+ let parsed;
142
+ try {
143
+ parsed = JSON.parse(raw);
144
+ }
145
+ catch {
146
+ return [];
147
+ }
148
+ if (!Array.isArray(parsed))
149
+ return [];
150
+ const ops = [];
151
+ for (const el of parsed) {
152
+ if (ops.length >= MAX_OPS)
153
+ break;
154
+ if (el === null || typeof el !== 'object')
155
+ continue;
156
+ const elem = el;
157
+ const kind = elem['kind'];
158
+ if (kind !== 'ADD' && kind !== 'UPDATE' && kind !== 'DELETE' && kind !== 'NOOP')
159
+ continue;
160
+ if (kind === 'ADD') {
161
+ const rawKey = elem['factKey'];
162
+ const text = elem['text'];
163
+ if (typeof text !== 'string' || text === '')
164
+ continue;
165
+ // factKey may be a string slug (from LLM) or already a structured object
166
+ const factKey = typeof rawKey === 'string'
167
+ ? wrapSlug(rawKey)
168
+ : isStructuredFactKey(rawKey)
169
+ ? rawKey
170
+ : null;
171
+ if (factKey === null)
172
+ continue;
173
+ ops.push({ kind: 'ADD', factKey, text });
174
+ }
175
+ else if (kind === 'UPDATE') {
176
+ const factId = elem['factId'];
177
+ const text = elem['text'];
178
+ if (typeof factId !== 'string' || typeof text !== 'string' || text === '')
179
+ continue;
180
+ // factKey: use LLM-provided slug/object, or fall back to live fact's factKey
181
+ const rawKey = elem['factKey'];
182
+ let factKey = null;
183
+ if (typeof rawKey === 'string') {
184
+ factKey = wrapSlug(rawKey);
185
+ }
186
+ else if (isStructuredFactKey(rawKey)) {
187
+ factKey = rawKey;
188
+ }
189
+ else {
190
+ // LLM omitted factKey — reuse from live facts
191
+ factKey = liveFacts.find((f) => f.id === factId)?.factKey ?? null;
192
+ }
193
+ if (factKey === null)
194
+ continue;
195
+ ops.push({ kind: 'UPDATE', factId, factKey, text });
196
+ }
197
+ else if (kind === 'DELETE') {
198
+ const factId = elem['factId'];
199
+ const reason = elem['reason'];
200
+ if (typeof factId !== 'string' || typeof reason !== 'string')
201
+ continue;
202
+ ops.push({ kind: 'DELETE', factId, reason });
203
+ }
204
+ else if (kind === 'NOOP') {
205
+ const factId = elem['factId'];
206
+ if (typeof factId !== 'string')
207
+ continue;
208
+ ops.push({ kind: 'NOOP', factId });
209
+ }
210
+ }
211
+ return ops;
212
+ }
213
+ function isStructuredFactKey(v) {
214
+ if (v === null || typeof v !== 'object')
215
+ return false;
216
+ const k = v;
217
+ return typeof k['entity'] === 'string' && typeof k['relation'] === 'string' && typeof k['object'] === 'string';
218
+ }
219
+ function buildDiff(ops) {
220
+ const added = [];
221
+ const removed = [];
222
+ const updated = [];
223
+ for (const op of ops) {
224
+ if (op.kind === 'ADD')
225
+ added.push(op);
226
+ else if (op.kind === 'DELETE')
227
+ removed.push(op.factId);
228
+ else if (op.kind === 'UPDATE')
229
+ updated.push(op);
230
+ // NOOP excluded from the diff
231
+ }
232
+ return { added, removed, updated };
233
+ }
234
+ const EMPTY_DIFF = { added: [], removed: [], updated: [] };
235
+ // ---------------------------------------------------------------------------
236
+ // makeNightlyGenerator
237
+ // ---------------------------------------------------------------------------
238
+ export function makeNightlyGenerator(deps) {
239
+ return {
240
+ async proposeMemoryOps(log, liveFacts) {
241
+ const logText = JSON.stringify(log.records);
242
+ const factsText = liveFacts
243
+ .map((f) => `${f.id} | ${f.factKey.object} | ${f.text}`)
244
+ .join('\n');
245
+ const systemPrompt = 'You consolidate a day\'s events into durable long-term memory. ' +
246
+ 'Output ONLY a JSON array of operations, no prose. ' +
247
+ 'Each element must be one of:\n' +
248
+ ' {"kind":"ADD","factKey":"<short-topic-slug>","text":"..."}\n' +
249
+ ' {"kind":"UPDATE","factId":"<existing id>","factKey":"<slug>","text":"..."}\n' +
250
+ ' {"kind":"DELETE","factId":"<existing id>","reason":"..."}\n' +
251
+ ' {"kind":"NOOP","factId":"<id>"}\n' +
252
+ 'factKey must be a plain string slug (e.g. "user-location"). Do NOT emit structured objects.';
253
+ const userPrompt = `Day log records:\n${logText}\n\n` +
254
+ `Current live facts (factId | topic | text):\n${factsText || '(none)'}`;
255
+ let response;
256
+ try {
257
+ response = await deps.provider.complete({
258
+ sessionId: 'nightly',
259
+ prefixBytes: new Uint8Array(0),
260
+ spans: [
261
+ { role: 'system', provenance: 'operator', text: systemPrompt },
262
+ { role: 'user', provenance: 'operator', text: userPrompt },
263
+ ],
264
+ });
265
+ }
266
+ catch {
267
+ // Provider unavailable — graceful degrade
268
+ return { ops: [], diff: EMPTY_DIFF };
269
+ }
270
+ const ops = parseMemOps(response.reply, liveFacts);
271
+ const diff = buildDiff(ops);
272
+ return { ops, diff };
273
+ },
274
+ async draftSkills(_log) {
275
+ // Skill drafting deferred to a follow-up task. The runner handles an empty
276
+ // draft set gracefully (the lint pass is not skipped on an empty return).
277
+ return [];
278
+ },
279
+ };
280
+ }
281
+ // ---------------------------------------------------------------------------
282
+ // makeNightlyJudge
283
+ // ---------------------------------------------------------------------------
284
+ export function makeNightlyJudge(deps) {
285
+ return {
286
+ async grade(quarantinedDiff) {
287
+ const systemPrompt = 'You are a STRICT reviewer of a proposed memory diff. ' +
288
+ 'You see only the artifact, never the author\'s reasoning. ' +
289
+ 'Accept only safe, durable, non-redundant edits. ' +
290
+ 'Output ONLY strict JSON: {"verdict":"accept"} or {"verdict":"reject"} or {"verdict":"edit"}. No prose.';
291
+ const diffSummary = `Added ops: ${quarantinedDiff.diff.added.length}\n` +
292
+ `Removed factIds: ${quarantinedDiff.diff.removed.join(', ') || '(none)'}\n` +
293
+ `Updated ops: ${quarantinedDiff.diff.updated.length}`;
294
+ const userPrompt = `Proposed diff body:\n${quarantinedDiff.body}\n\n` +
295
+ `Diff summary:\n${diffSummary}`;
296
+ let reply;
297
+ try {
298
+ const response = await deps.provider.complete({
299
+ sessionId: 'nightly',
300
+ prefixBytes: new Uint8Array(0),
301
+ spans: [
302
+ { role: 'system', provenance: 'operator', text: systemPrompt },
303
+ { role: 'user', provenance: 'operator', text: userPrompt },
304
+ ],
305
+ });
306
+ reply = response.reply;
307
+ }
308
+ catch {
309
+ // Provider unavailable — fail-safe: reject
310
+ return 'reject';
311
+ }
312
+ // Parse the verdict from the reply
313
+ const raw = extractFirstJsonObject(reply);
314
+ if (raw === null)
315
+ return 'reject';
316
+ let parsed;
317
+ try {
318
+ parsed = JSON.parse(raw);
319
+ }
320
+ catch {
321
+ return 'reject';
322
+ }
323
+ if (parsed === null || typeof parsed !== 'object')
324
+ return 'reject';
325
+ const verdict = parsed['verdict'];
326
+ if (verdict === 'accept')
327
+ return 'accept';
328
+ if (verdict === 'edit')
329
+ return 'edit';
330
+ // 'reject' or anything else → reject (fail-safe)
331
+ return 'reject';
332
+ },
333
+ };
334
+ }
335
+ //# sourceMappingURL=nightly-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nightly-generator.js","sourceRoot":"","sources":["../../src/runtime/nightly-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { makeOnboardingOps } from '../onboarding/index.js';
2
+ /** Build the onboarding ops with real Node adapters. Honors AISY_HOME. */
3
+ export declare function makeNodeOnboardingOps(): ReturnType<typeof makeOnboardingOps>;
4
+ /** Harness version from package.json (for the CLI version flag). */
5
+ export declare function harnessVersion(): string;
6
+ //# sourceMappingURL=onboarding-node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding-node.d.ts","sourceRoot":"","sources":["../../src/runtime/onboarding-node.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AA+D1D,0EAA0E;AAC1E,wBAAgB,qBAAqB,IAAI,UAAU,CAAC,OAAO,iBAAiB,CAAC,CA4R5E;AAED,oEAAoE;AACpE,wBAAgB,cAAc,IAAI,MAAM,CAGvC"}