@mono-agent/agent-app 0.6.2 → 0.9.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 (313) hide show
  1. package/README.md +259 -19
  2. package/dist/account-home.d.ts +6 -0
  3. package/dist/account-home.d.ts.map +1 -0
  4. package/dist/account-home.js +9 -0
  5. package/dist/account-home.js.map +1 -0
  6. package/dist/adapter-send-proxy.d.ts +18 -0
  7. package/dist/adapter-send-proxy.d.ts.map +1 -0
  8. package/dist/adapter-send-proxy.js +229 -0
  9. package/dist/adapter-send-proxy.js.map +1 -0
  10. package/dist/adapter-send-tools-main.js +62 -4
  11. package/dist/adapter-send-tools-main.js.map +1 -1
  12. package/dist/adapter-send-tools.d.ts +33 -6
  13. package/dist/adapter-send-tools.d.ts.map +1 -1
  14. package/dist/adapter-send-tools.js +485 -87
  15. package/dist/adapter-send-tools.js.map +1 -1
  16. package/dist/app-config.d.ts +3 -1
  17. package/dist/app-config.d.ts.map +1 -1
  18. package/dist/app-config.js +16 -5
  19. package/dist/app-config.js.map +1 -1
  20. package/dist/app.d.ts +27 -0
  21. package/dist/app.d.ts.map +1 -1
  22. package/dist/app.js +761 -147
  23. package/dist/app.js.map +1 -1
  24. package/dist/background-environment.d.ts +16 -0
  25. package/dist/background-environment.d.ts.map +1 -0
  26. package/dist/background-environment.js +68 -0
  27. package/dist/background-environment.js.map +1 -0
  28. package/dist/background-runtime.d.ts +62 -0
  29. package/dist/background-runtime.d.ts.map +1 -0
  30. package/dist/background-runtime.js +1115 -0
  31. package/dist/background-runtime.js.map +1 -0
  32. package/dist/background-snapshot-key.d.ts +13 -0
  33. package/dist/background-snapshot-key.d.ts.map +1 -0
  34. package/dist/background-snapshot-key.js +194 -0
  35. package/dist/background-snapshot-key.js.map +1 -0
  36. package/dist/background-snapshot.d.ts +96 -0
  37. package/dist/background-snapshot.d.ts.map +1 -0
  38. package/dist/background-snapshot.js +450 -0
  39. package/dist/background-snapshot.js.map +1 -0
  40. package/dist/background-worker-lease.d.ts +39 -0
  41. package/dist/background-worker-lease.d.ts.map +1 -0
  42. package/dist/background-worker-lease.js +356 -0
  43. package/dist/background-worker-lease.js.map +1 -0
  44. package/dist/background.d.ts +74 -2
  45. package/dist/background.d.ts.map +1 -1
  46. package/dist/background.js +815 -73
  47. package/dist/background.js.map +1 -1
  48. package/dist/broadcast-recorder.d.ts.map +1 -1
  49. package/dist/broadcast-recorder.js +24 -2
  50. package/dist/broadcast-recorder.js.map +1 -1
  51. package/dist/channel-plugins.d.ts +2 -0
  52. package/dist/channel-plugins.d.ts.map +1 -1
  53. package/dist/channel-plugins.js +8 -0
  54. package/dist/channel-plugins.js.map +1 -1
  55. package/dist/channels.d.ts +10 -0
  56. package/dist/channels.d.ts.map +1 -1
  57. package/dist/channels.js +87 -9
  58. package/dist/channels.js.map +1 -1
  59. package/dist/cli.d.ts +86 -4
  60. package/dist/cli.d.ts.map +1 -1
  61. package/dist/cli.js +2421 -143
  62. package/dist/cli.js.map +1 -1
  63. package/dist/config-reference.d.ts.map +1 -1
  64. package/dist/config-reference.js +448 -6
  65. package/dist/config-reference.js.map +1 -1
  66. package/dist/configuration-proposal-main.d.ts +3 -0
  67. package/dist/configuration-proposal-main.d.ts.map +1 -0
  68. package/dist/configuration-proposal-main.js +13 -0
  69. package/dist/configuration-proposal-main.js.map +1 -0
  70. package/dist/configuration-proposal-tool.d.ts +33 -0
  71. package/dist/configuration-proposal-tool.d.ts.map +1 -0
  72. package/dist/configuration-proposal-tool.js +188 -0
  73. package/dist/configuration-proposal-tool.js.map +1 -0
  74. package/dist/configured-agent.d.ts +16 -0
  75. package/dist/configured-agent.d.ts.map +1 -1
  76. package/dist/configured-agent.js +165 -18
  77. package/dist/configured-agent.js.map +1 -1
  78. package/dist/consumer-contract.d.ts +3 -0
  79. package/dist/consumer-contract.d.ts.map +1 -1
  80. package/dist/consumer-contract.js +44 -1
  81. package/dist/consumer-contract.js.map +1 -1
  82. package/dist/continuation-command.d.ts +15 -0
  83. package/dist/continuation-command.d.ts.map +1 -0
  84. package/dist/continuation-command.js +170 -0
  85. package/dist/continuation-command.js.map +1 -0
  86. package/dist/continuation-config.d.ts +25 -0
  87. package/dist/continuation-config.d.ts.map +1 -0
  88. package/dist/continuation-config.js +236 -0
  89. package/dist/continuation-config.js.map +1 -0
  90. package/dist/continuation-service.d.ts +99 -0
  91. package/dist/continuation-service.d.ts.map +1 -0
  92. package/dist/continuation-service.js +1313 -0
  93. package/dist/continuation-service.js.map +1 -0
  94. package/dist/continuation-store.d.ts +104 -0
  95. package/dist/continuation-store.d.ts.map +1 -0
  96. package/dist/continuation-store.js +688 -0
  97. package/dist/continuation-store.js.map +1 -0
  98. package/dist/continuations.d.ts +167 -0
  99. package/dist/continuations.d.ts.map +1 -0
  100. package/dist/continuations.js +71 -0
  101. package/dist/continuations.js.map +1 -0
  102. package/dist/doctor.d.ts +29 -5
  103. package/dist/doctor.d.ts.map +1 -1
  104. package/dist/doctor.js +1611 -116
  105. package/dist/doctor.js.map +1 -1
  106. package/dist/first-run-managed-memory.d.ts +39 -0
  107. package/dist/first-run-managed-memory.d.ts.map +1 -0
  108. package/dist/first-run-managed-memory.js +584 -0
  109. package/dist/first-run-managed-memory.js.map +1 -0
  110. package/dist/first-run-readiness.d.ts +111 -0
  111. package/dist/first-run-readiness.d.ts.map +1 -0
  112. package/dist/first-run-readiness.js +728 -0
  113. package/dist/first-run-readiness.js.map +1 -0
  114. package/dist/index.d.ts +17 -3
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js +8 -1
  117. package/dist/index.js.map +1 -1
  118. package/dist/init.d.ts +95 -3
  119. package/dist/init.d.ts.map +1 -1
  120. package/dist/init.js +1218 -24
  121. package/dist/init.js.map +1 -1
  122. package/dist/interaction-bridge.d.ts +25 -1
  123. package/dist/interaction-bridge.d.ts.map +1 -1
  124. package/dist/interaction-bridge.js +281 -19
  125. package/dist/interaction-bridge.js.map +1 -1
  126. package/dist/launchd.d.ts +16 -6
  127. package/dist/launchd.d.ts.map +1 -1
  128. package/dist/launchd.js +30 -15
  129. package/dist/launchd.js.map +1 -1
  130. package/dist/local-configuration.d.ts +99 -0
  131. package/dist/local-configuration.d.ts.map +1 -0
  132. package/dist/local-configuration.js +1299 -0
  133. package/dist/local-configuration.js.map +1 -0
  134. package/dist/managed-runtime-packages.d.ts +9 -0
  135. package/dist/managed-runtime-packages.d.ts.map +1 -0
  136. package/dist/managed-runtime-packages.js +56 -0
  137. package/dist/managed-runtime-packages.js.map +1 -0
  138. package/dist/memory-command.d.ts +4 -0
  139. package/dist/memory-command.d.ts.map +1 -1
  140. package/dist/memory-command.js +751 -27
  141. package/dist/memory-command.js.map +1 -1
  142. package/dist/memory-embedding-service.d.ts +33 -0
  143. package/dist/memory-embedding-service.d.ts.map +1 -0
  144. package/dist/memory-embedding-service.js +207 -0
  145. package/dist/memory-embedding-service.js.map +1 -0
  146. package/dist/memory-recall.d.ts +43 -14
  147. package/dist/memory-recall.d.ts.map +1 -1
  148. package/dist/memory-recall.js +103 -33
  149. package/dist/memory-recall.js.map +1 -1
  150. package/dist/memory-retrieval.d.ts +66 -0
  151. package/dist/memory-retrieval.d.ts.map +1 -0
  152. package/dist/memory-retrieval.js +332 -0
  153. package/dist/memory-retrieval.js.map +1 -0
  154. package/dist/modules/base.d.ts +6 -5
  155. package/dist/modules/base.d.ts.map +1 -1
  156. package/dist/modules/base.js +11 -7
  157. package/dist/modules/base.js.map +1 -1
  158. package/dist/modules/catalog.d.ts.map +1 -1
  159. package/dist/modules/catalog.js +141 -25
  160. package/dist/modules/catalog.js.map +1 -1
  161. package/dist/modules/index.d.ts +2 -2
  162. package/dist/modules/index.d.ts.map +1 -1
  163. package/dist/modules/index.js +1 -1
  164. package/dist/modules/index.js.map +1 -1
  165. package/dist/modules/known-tools.d.ts +3 -0
  166. package/dist/modules/known-tools.d.ts.map +1 -1
  167. package/dist/modules/known-tools.js +11 -1
  168. package/dist/modules/known-tools.js.map +1 -1
  169. package/dist/modules/types.d.ts +20 -6
  170. package/dist/modules/types.d.ts.map +1 -1
  171. package/dist/modules/types.js.map +1 -1
  172. package/dist/notify-runtime.d.ts +26 -0
  173. package/dist/notify-runtime.d.ts.map +1 -0
  174. package/dist/notify-runtime.js +27 -0
  175. package/dist/notify-runtime.js.map +1 -0
  176. package/dist/notify-tool.d.ts +51 -0
  177. package/dist/notify-tool.d.ts.map +1 -0
  178. package/dist/notify-tool.js +182 -0
  179. package/dist/notify-tool.js.map +1 -0
  180. package/dist/package-version.d.ts +3 -0
  181. package/dist/package-version.d.ts.map +1 -0
  182. package/dist/package-version.js +14 -0
  183. package/dist/package-version.js.map +1 -0
  184. package/dist/pi-auth-store-inspection.d.ts +21 -0
  185. package/dist/pi-auth-store-inspection.d.ts.map +1 -0
  186. package/dist/pi-auth-store-inspection.js +120 -0
  187. package/dist/pi-auth-store-inspection.js.map +1 -0
  188. package/dist/pi-oauth-login-main.d.ts +3 -0
  189. package/dist/pi-oauth-login-main.d.ts.map +1 -0
  190. package/dist/pi-oauth-login-main.js +14 -0
  191. package/dist/pi-oauth-login-main.js.map +1 -0
  192. package/dist/pi-oauth-login.d.ts +22 -0
  193. package/dist/pi-oauth-login.d.ts.map +1 -0
  194. package/dist/pi-oauth-login.js +79 -0
  195. package/dist/pi-oauth-login.js.map +1 -0
  196. package/dist/proactive-notify.d.ts +2 -0
  197. package/dist/proactive-notify.d.ts.map +1 -1
  198. package/dist/proactive-notify.js +1 -0
  199. package/dist/proactive-notify.js.map +1 -1
  200. package/dist/process-incarnation.d.ts +23 -0
  201. package/dist/process-incarnation.d.ts.map +1 -0
  202. package/dist/process-incarnation.js +208 -0
  203. package/dist/process-incarnation.js.map +1 -0
  204. package/dist/project-skills.d.ts +40 -0
  205. package/dist/project-skills.d.ts.map +1 -0
  206. package/dist/project-skills.js +573 -0
  207. package/dist/project-skills.js.map +1 -0
  208. package/dist/provider-setup.d.ts +117 -2
  209. package/dist/provider-setup.d.ts.map +1 -1
  210. package/dist/provider-setup.js +1505 -49
  211. package/dist/provider-setup.js.map +1 -1
  212. package/dist/readiness-probe-worker.d.ts +12 -0
  213. package/dist/readiness-probe-worker.d.ts.map +1 -0
  214. package/dist/readiness-probe-worker.js +276 -0
  215. package/dist/readiness-probe-worker.js.map +1 -0
  216. package/dist/readiness-probe.d.ts +100 -0
  217. package/dist/readiness-probe.d.ts.map +1 -0
  218. package/dist/readiness-probe.js +780 -0
  219. package/dist/readiness-probe.js.map +1 -0
  220. package/dist/recipes/base.d.ts +15 -0
  221. package/dist/recipes/base.d.ts.map +1 -0
  222. package/dist/recipes/base.js +51 -0
  223. package/dist/recipes/base.js.map +1 -0
  224. package/dist/recipes/catalog.d.ts +4 -0
  225. package/dist/recipes/catalog.d.ts.map +1 -0
  226. package/dist/recipes/catalog.js +525 -0
  227. package/dist/recipes/catalog.js.map +1 -0
  228. package/dist/recipes/index.d.ts +11 -0
  229. package/dist/recipes/index.d.ts.map +1 -0
  230. package/dist/recipes/index.js +14 -0
  231. package/dist/recipes/index.js.map +1 -0
  232. package/dist/recipes/types.d.ts +70 -0
  233. package/dist/recipes/types.d.ts.map +1 -0
  234. package/dist/recipes/types.js +15 -0
  235. package/dist/recipes/types.js.map +1 -0
  236. package/dist/request-model-override.d.ts +43 -1
  237. package/dist/request-model-override.d.ts.map +1 -1
  238. package/dist/request-model-override.js +178 -19
  239. package/dist/request-model-override.js.map +1 -1
  240. package/dist/run-history.d.ts +32 -0
  241. package/dist/run-history.d.ts.map +1 -0
  242. package/dist/run-history.js +859 -0
  243. package/dist/run-history.js.map +1 -0
  244. package/dist/runs-health.d.ts.map +1 -1
  245. package/dist/runs-health.js +12 -4
  246. package/dist/runs-health.js.map +1 -1
  247. package/dist/runtime-option-extensions.d.ts +14 -0
  248. package/dist/runtime-option-extensions.d.ts.map +1 -0
  249. package/dist/runtime-option-extensions.js +98 -0
  250. package/dist/runtime-option-extensions.js.map +1 -0
  251. package/dist/runtime-routes.d.ts +9 -0
  252. package/dist/runtime-routes.d.ts.map +1 -0
  253. package/dist/runtime-routes.js +13 -0
  254. package/dist/runtime-routes.js.map +1 -0
  255. package/dist/sandbox-manager.d.ts +86 -0
  256. package/dist/sandbox-manager.d.ts.map +1 -0
  257. package/dist/sandbox-manager.js +1402 -0
  258. package/dist/sandbox-manager.js.map +1 -0
  259. package/dist/setup.d.ts +29 -0
  260. package/dist/setup.d.ts.map +1 -0
  261. package/dist/setup.js +97 -0
  262. package/dist/setup.js.map +1 -0
  263. package/dist/supermemory-plugin.d.ts +56 -0
  264. package/dist/supermemory-plugin.d.ts.map +1 -0
  265. package/dist/supermemory-plugin.js +142 -0
  266. package/dist/supermemory-plugin.js.map +1 -0
  267. package/dist/tui-command.d.ts +56 -0
  268. package/dist/tui-command.d.ts.map +1 -1
  269. package/dist/tui-command.js +305 -31
  270. package/dist/tui-command.js.map +1 -1
  271. package/dist/web-command.d.ts +8 -0
  272. package/dist/web-command.d.ts.map +1 -1
  273. package/dist/web-command.js +174 -17
  274. package/dist/web-command.js.map +1 -1
  275. package/dist/wizard/answers.d.ts +31 -4
  276. package/dist/wizard/answers.d.ts.map +1 -1
  277. package/dist/wizard/answers.js +141 -29
  278. package/dist/wizard/answers.js.map +1 -1
  279. package/dist/wizard/from-flags.d.ts +7 -0
  280. package/dist/wizard/from-flags.d.ts.map +1 -1
  281. package/dist/wizard/from-flags.js +36 -2
  282. package/dist/wizard/from-flags.js.map +1 -1
  283. package/dist/wizard/index.d.ts +4 -4
  284. package/dist/wizard/index.d.ts.map +1 -1
  285. package/dist/wizard/index.js +2 -2
  286. package/dist/wizard/index.js.map +1 -1
  287. package/dist/wizard/model-discovery.d.ts +33 -2
  288. package/dist/wizard/model-discovery.d.ts.map +1 -1
  289. package/dist/wizard/model-discovery.js +826 -108
  290. package/dist/wizard/model-discovery.js.map +1 -1
  291. package/dist/wizard/presets.d.ts +1 -1
  292. package/dist/wizard/presets.d.ts.map +1 -1
  293. package/dist/wizard/presets.js +7 -12
  294. package/dist/wizard/presets.js.map +1 -1
  295. package/dist/wizard/prompts.d.ts +56 -9
  296. package/dist/wizard/prompts.d.ts.map +1 -1
  297. package/dist/wizard/prompts.js +172 -20
  298. package/dist/wizard/prompts.js.map +1 -1
  299. package/dist/wizard/run.d.ts +59 -3
  300. package/dist/wizard/run.d.ts.map +1 -1
  301. package/dist/wizard/run.js +1290 -191
  302. package/dist/wizard/run.js.map +1 -1
  303. package/package.json +21 -16
  304. package/resources/srt/package-lock.json +66 -0
  305. package/resources/srt/package.json +9 -0
  306. package/schema/mono-agent.config.schema.json +587 -20
  307. package/skills/mono-agent-composer/SKILL.md +6 -6
  308. package/skills/mono-agent-composer/references/config-blueprint.md +11 -10
  309. package/skills/mono-agent-composer/references/discovery-questions.md +33 -18
  310. package/skills/mono-agent-composer/references/feature-coverage.md +14 -12
  311. package/skills/mono-agent-composer/references/package-map.md +2 -2
  312. package/skills/mono-agent-composer/references/playbooks.md +8 -7
  313. package/skills/mono-agent-composer/references/validation.md +3 -3
@@ -0,0 +1,450 @@
1
+ import { createHmac } from "node:crypto";
2
+ import { constants as fsConstants } from "node:fs";
3
+ import { chmod, lstat, mkdir, mkdtemp, open, readFile, realpath, rm, writeFile } from "node:fs/promises";
4
+ import { join, resolve } from "node:path";
5
+ import { accountHomeDirectory } from "./account-home.js";
6
+ import { loadAppCoreConfig } from "./app-config.js";
7
+ import { loadBackgroundSnapshotKey, loadOrCreateBackgroundSnapshotKey, } from "./background-snapshot-key.js";
8
+ import { fingerprintBackgroundOperationalEnvironment, isBackgroundOperationalEnvName, selectBackgroundOperationalEnvironment, } from "./background-environment.js";
9
+ import { readCliConfigSnapshot, readCliDotenvSnapshot } from "./first-run-readiness.js";
10
+ export const BACKGROUND_SNAPSHOT_SCHEMA = "mono-agent.background-snapshot.v1";
11
+ const MAX_ENCODED_BACKGROUND_SNAPSHOT_LENGTH = 32_768;
12
+ /**
13
+ * Encode the secret-free approved snapshot for the owner-private LaunchAgent
14
+ * ProgramArguments. base64url keeps the value XML/shell inert while remaining
15
+ * visible and deterministic for diagnostics.
16
+ */
17
+ export function encodeBackgroundSnapshot(snapshot) {
18
+ return Buffer.from(JSON.stringify(snapshot), "utf8").toString("base64url");
19
+ }
20
+ /** Fail closed when an internal managed-worker snapshot argument is malformed. */
21
+ export function decodeBackgroundSnapshot(encoded) {
22
+ if (encoded.length === 0
23
+ || encoded.length > MAX_ENCODED_BACKGROUND_SNAPSHOT_LENGTH
24
+ || !/^[A-Za-z0-9_-]+$/u.test(encoded)) {
25
+ throw new Error("The managed background snapshot argument is malformed.");
26
+ }
27
+ let bytes;
28
+ let parsed;
29
+ try {
30
+ bytes = Buffer.from(encoded, "base64url");
31
+ if (bytes.toString("base64url") !== encoded) {
32
+ throw new Error("non-canonical base64url");
33
+ }
34
+ parsed = JSON.parse(bytes.toString("utf8"));
35
+ }
36
+ catch {
37
+ throw new Error("The managed background snapshot argument is malformed.");
38
+ }
39
+ const snapshot = backgroundSnapshotFromMetadata({ backgroundSnapshot: parsed });
40
+ if (snapshot === undefined) {
41
+ throw new Error("The managed background snapshot argument has an invalid schema.");
42
+ }
43
+ return snapshot;
44
+ }
45
+ /**
46
+ * Reconstruct the worker environment without inheriting shell credentials or
47
+ * config overrides, then attest it. This mirrors managed-worker startup:
48
+ * operational plist values exist first and dotenv fills every other key.
49
+ */
50
+ export async function captureDurableBackgroundSnapshot(input) {
51
+ return (await captureDurableBackgroundInputs(input)).snapshot;
52
+ }
53
+ /**
54
+ * Reconstruct and attest one indivisible durable worker input. Returning the
55
+ * environment with its snapshot prevents callers from accidentally validating
56
+ * one environment and launching with a shell-enriched variant.
57
+ */
58
+ export async function captureDurableBackgroundInputs(input) {
59
+ const cwd = resolve(input.cwd);
60
+ const environment = await loadDurableBackgroundEnvironment(input);
61
+ const configPath = resolve(cwd, input.configPath);
62
+ const configBefore = await readCliConfigSnapshot(configPath);
63
+ const snapshot = await captureBackgroundSnapshot({
64
+ cwd,
65
+ configPath: input.configPath,
66
+ ...(input.envFile === undefined ? {} : { envFile: input.envFile }),
67
+ env: environment,
68
+ ...(input.proofKey === undefined ? {} : { proofKey: input.proofKey }),
69
+ });
70
+ const configAfter = await readCliConfigSnapshot(configPath);
71
+ if (configBefore.fingerprint !== configAfter.fingerprint) {
72
+ throw new Error("Refusing to prove background readiness because the config changed during durable capture.");
73
+ }
74
+ return { environment, snapshot, configSourceFingerprint: configAfter.fingerprint };
75
+ }
76
+ export async function loadDurableBackgroundEnvironment(input) {
77
+ const cwd = resolve(input.cwd);
78
+ const dotenvPath = resolve(cwd, input.envFile ?? ".env");
79
+ const dotenv = await readCliDotenvSnapshot(dotenvPath);
80
+ const operational = selectBackgroundOperationalEnvironment(input.operationalEnvironment);
81
+ return { ...dotenv.env, ...operational };
82
+ }
83
+ export async function captureBackgroundSnapshot(input) {
84
+ const cwd = resolve(input.cwd);
85
+ const configPath = resolve(cwd, input.configPath);
86
+ const dotenvPath = resolve(cwd, input.envFile ?? ".env");
87
+ const proofKey = normalizeProofKey(input.proofKey ?? await loadOrCreateBackgroundSnapshotKey(configPath));
88
+ const [config, dotenv, dotenvFingerprint] = await Promise.all([
89
+ readRegularFileProof(configPath, "config", proofKey),
90
+ readCliDotenvSnapshot(dotenvPath),
91
+ fingerprintOptionalRegularFile(dotenvPath, "dotenv", proofKey),
92
+ ]);
93
+ assertDotenvMatchesEffectiveEnvironment(dotenv.env, input.env, dotenvPath);
94
+ const core = await loadAppCoreConfig({ cwd, configPath, env: input.env });
95
+ const identityPath = resolve(core.context.identityPath);
96
+ const identityFingerprint = await fingerprintRegularFile(identityPath, "identity", proofKey);
97
+ const soulPath = core.context.soulPath === undefined ? undefined : resolve(core.context.soulPath);
98
+ const soulFingerprint = soulPath === undefined
99
+ ? undefined
100
+ : await fingerprintRegularFile(soulPath, "soul", proofKey);
101
+ const mcpConfigPath = core.tools.mcpConfigPath === undefined ? undefined : resolve(core.tools.mcpConfigPath);
102
+ const mcpConfigFingerprint = mcpConfigPath === undefined
103
+ ? undefined
104
+ : await fingerprintRegularFile(mcpConfigPath, "MCP config", proofKey);
105
+ // The config determines Identity/Soul/MCP paths and the effective env
106
+ // determines the loaded config. Re-read every durable input after resolution so a
107
+ // rename/write racing this capture cannot produce a self-inconsistent proof.
108
+ const [configAfter, dotenvAfter, dotenvFingerprintAfter, identityAfter, soulAfter, mcpConfigAfter,] = await Promise.all([
109
+ readRegularFileProof(configPath, "config", proofKey),
110
+ readCliDotenvSnapshot(dotenvPath),
111
+ fingerprintOptionalRegularFile(dotenvPath, "dotenv", proofKey),
112
+ fingerprintRegularFile(identityPath, "identity", proofKey),
113
+ soulPath === undefined ? Promise.resolve(undefined) : fingerprintRegularFile(soulPath, "soul", proofKey),
114
+ mcpConfigPath === undefined
115
+ ? Promise.resolve(undefined)
116
+ : fingerprintRegularFile(mcpConfigPath, "MCP config", proofKey),
117
+ ]);
118
+ if (config.fingerprint !== configAfter.fingerprint
119
+ || dotenv.fingerprint !== dotenvAfter.fingerprint
120
+ || dotenvFingerprint !== dotenvFingerprintAfter
121
+ || identityFingerprint !== identityAfter
122
+ || soulFingerprint !== soulAfter
123
+ || mcpConfigFingerprint !== mcpConfigAfter) {
124
+ throw new Error("Refusing to prove background readiness because a durable input changed during startup capture.");
125
+ }
126
+ assertDotenvMatchesEffectiveEnvironment(dotenvAfter.env, input.env, dotenvPath);
127
+ return {
128
+ schema: BACKGROUND_SNAPSHOT_SCHEMA,
129
+ configPath,
130
+ configFingerprint: config.fingerprint,
131
+ dotenvPath,
132
+ dotenvFingerprint,
133
+ identityPath,
134
+ identityFingerprint,
135
+ ...(soulPath === undefined || soulFingerprint === undefined ? {} : { soulPath, soulFingerprint }),
136
+ ...(mcpConfigPath === undefined || mcpConfigFingerprint === undefined
137
+ ? {}
138
+ : { mcpConfigPath, mcpConfigFingerprint }),
139
+ operationalEnvironmentFingerprint: fingerprintBackgroundOperationalEnvironment(input.env),
140
+ };
141
+ }
142
+ /**
143
+ * Freeze the exact config and context bytes attested by `snapshot` before any
144
+ * app/channel loader runs. The app advertises the canonical config path, but
145
+ * reads this private copy so an edit/revert during startup cannot produce a
146
+ * mixed worker while retaining the old trace proof.
147
+ */
148
+ export async function materializeBackgroundRuntimeInputs(input) {
149
+ const snapshot = input.snapshot;
150
+ const cwd = resolve(input.cwd);
151
+ const proofKey = normalizeProofKey(input.proofKey ?? await loadBackgroundSnapshotKey(snapshot.configPath));
152
+ const root = await ensureRuntimeInputsRoot(input.runtimeRoot, input.homeDir);
153
+ const directory = await mkdtemp(join(root, "worker-"));
154
+ await chmod(directory, 0o700);
155
+ let disposed = false;
156
+ try {
157
+ const [config, dotenvFingerprint, identity, soul, mcpConfig] = await Promise.all([
158
+ readRegularFileProof(snapshot.configPath, "config", proofKey),
159
+ fingerprintOptionalRegularFile(snapshot.dotenvPath, "dotenv", proofKey),
160
+ readRegularFileProof(snapshot.identityPath, "identity", proofKey),
161
+ snapshot.soulPath === undefined
162
+ ? Promise.resolve(undefined)
163
+ : readRegularFileProof(snapshot.soulPath, "soul", proofKey),
164
+ snapshot.mcpConfigPath === undefined
165
+ ? Promise.resolve(undefined)
166
+ : readRegularFileProof(snapshot.mcpConfigPath, "MCP config", proofKey),
167
+ ]);
168
+ if (config.fingerprint !== snapshot.configFingerprint
169
+ || dotenvFingerprint !== snapshot.dotenvFingerprint
170
+ || identity.fingerprint !== snapshot.identityFingerprint
171
+ || (snapshot.soulPath === undefined) !== (snapshot.soulFingerprint === undefined)
172
+ || (snapshot.soulPath !== undefined
173
+ && (soul === undefined || soul.fingerprint !== snapshot.soulFingerprint))
174
+ || (snapshot.mcpConfigPath === undefined) !== (snapshot.mcpConfigFingerprint === undefined)
175
+ || (snapshot.mcpConfigPath !== undefined
176
+ && (mcpConfig === undefined || mcpConfig.fingerprint !== snapshot.mcpConfigFingerprint))) {
177
+ throw new Error("Refusing to materialize background runtime inputs because the approved snapshot changed.");
178
+ }
179
+ const configPath = join(directory, "mono-agent.config.json");
180
+ const identityPath = join(directory, "IDENTITY.md");
181
+ const soulPath = soul === undefined ? undefined : join(directory, "SOUL.md");
182
+ const mcpConfigPath = mcpConfig === undefined ? undefined : join(directory, "mcp-config.json");
183
+ await writeFile(configPath, config.bytes, { flag: "wx", mode: 0o400 });
184
+ await writeFile(identityPath, identity.bytes, { flag: "wx", mode: 0o400 });
185
+ if (soulPath !== undefined && soul !== undefined) {
186
+ await writeFile(soulPath, soul.bytes, { flag: "wx", mode: 0o400 });
187
+ }
188
+ if (mcpConfigPath !== undefined && mcpConfig !== undefined) {
189
+ await writeFile(mcpConfigPath, mcpConfig.bytes, { flag: "wx", mode: 0o400 });
190
+ }
191
+ await Promise.all([
192
+ chmod(configPath, 0o400),
193
+ chmod(identityPath, 0o400),
194
+ ...(soulPath === undefined ? [] : [chmod(soulPath, 0o400)]),
195
+ ...(mcpConfigPath === undefined ? [] : [chmod(mcpConfigPath, 0o400)]),
196
+ ]);
197
+ const [copiedConfig, copiedIdentity, copiedSoul, copiedMcpConfig] = await Promise.all([
198
+ readFile(configPath),
199
+ readFile(identityPath),
200
+ soulPath === undefined ? Promise.resolve(undefined) : readFile(soulPath),
201
+ mcpConfigPath === undefined ? Promise.resolve(undefined) : readFile(mcpConfigPath),
202
+ ]);
203
+ if (!copiedConfig.equals(config.bytes)
204
+ || !copiedIdentity.equals(identity.bytes)
205
+ || (soul !== undefined && (copiedSoul === undefined || !copiedSoul.equals(soul.bytes)))
206
+ || (mcpConfig !== undefined
207
+ && (copiedMcpConfig === undefined || !copiedMcpConfig.equals(mcpConfig.bytes)))) {
208
+ throw new Error("The private background runtime input copy failed exact verification.");
209
+ }
210
+ // Re-attest every canonical input after materialisation. File fingerprints
211
+ // include ctime, so even an edit followed by byte-for-byte restoration is
212
+ // detected rather than accepted as the approved snapshot.
213
+ const after = await captureBackgroundSnapshot({
214
+ cwd,
215
+ configPath: snapshot.configPath,
216
+ envFile: snapshot.dotenvPath,
217
+ env: input.env,
218
+ proofKey,
219
+ });
220
+ if (!sameBackgroundSnapshot(after, snapshot)) {
221
+ throw new Error("Refusing to start because durable inputs changed while the private runtime snapshot was created.");
222
+ }
223
+ await chmod(directory, 0o500);
224
+ return {
225
+ configPath,
226
+ environment: {
227
+ ...input.env,
228
+ MONO_AGENT_IDENTITY_PATH: identityPath,
229
+ ...(soulPath === undefined ? {} : { MONO_AGENT_SOUL_PATH: soulPath }),
230
+ ...(mcpConfigPath === undefined ? {} : { MONO_AGENT_MCP_CONFIG_PATH: mcpConfigPath }),
231
+ },
232
+ async dispose() {
233
+ if (disposed)
234
+ return;
235
+ disposed = true;
236
+ await chmod(directory, 0o700).catch(() => undefined);
237
+ await rm(directory, { recursive: true, force: true });
238
+ },
239
+ };
240
+ }
241
+ catch (error) {
242
+ await chmod(directory, 0o700).catch(() => undefined);
243
+ await rm(directory, { recursive: true, force: true }).catch(() => undefined);
244
+ throw error;
245
+ }
246
+ }
247
+ function assertDotenvMatchesEffectiveEnvironment(dotenv, env, dotenvPath) {
248
+ const dotenvNames = new Set(Object.keys(dotenv));
249
+ for (const [name, value] of Object.entries(dotenv)) {
250
+ // launchd explicitly materialises operational values and Node's dotenv
251
+ // semantics leave them in precedence. Every other dotenv entry must be the
252
+ // value the worker is actually about to use.
253
+ if (!isBackgroundOperationalEnvName(name) && env[name] !== value) {
254
+ throw new Error(`Refusing to prove background readiness because the effective ${name} value does not match ${dotenvPath}.`);
255
+ }
256
+ }
257
+ for (const [name, value] of Object.entries(env)) {
258
+ if (value !== undefined
259
+ && !isBackgroundOperationalEnvName(name)
260
+ && !dotenvNames.has(name)) {
261
+ throw new Error(`Refusing to prove background readiness because the effective ${name} value is not present in ${dotenvPath}.`);
262
+ }
263
+ }
264
+ }
265
+ export function sameBackgroundSnapshot(left, right) {
266
+ return left.schema === right.schema
267
+ && left.configPath === right.configPath
268
+ && left.configFingerprint === right.configFingerprint
269
+ && left.dotenvPath === right.dotenvPath
270
+ && left.dotenvFingerprint === right.dotenvFingerprint
271
+ && left.identityPath === right.identityPath
272
+ && left.identityFingerprint === right.identityFingerprint
273
+ && left.soulPath === right.soulPath
274
+ && left.soulFingerprint === right.soulFingerprint
275
+ && left.mcpConfigPath === right.mcpConfigPath
276
+ && left.mcpConfigFingerprint === right.mcpConfigFingerprint
277
+ && left.operationalEnvironmentFingerprint === right.operationalEnvironmentFingerprint;
278
+ }
279
+ /** Fail-closed parser for untrusted trace-source metadata. */
280
+ export function backgroundSnapshotFromMetadata(metadata) {
281
+ const value = metadata?.backgroundSnapshot;
282
+ if (!isRecord(value) || value.schema !== BACKGROUND_SNAPSHOT_SCHEMA)
283
+ return undefined;
284
+ const allowedFields = new Set([
285
+ "schema",
286
+ "configPath",
287
+ "configFingerprint",
288
+ "dotenvPath",
289
+ "dotenvFingerprint",
290
+ "identityPath",
291
+ "identityFingerprint",
292
+ "soulPath",
293
+ "soulFingerprint",
294
+ "mcpConfigPath",
295
+ "mcpConfigFingerprint",
296
+ "operationalEnvironmentFingerprint",
297
+ ]);
298
+ if (Object.keys(value).some((field) => !allowedFields.has(field)))
299
+ return undefined;
300
+ const fields = [
301
+ "configPath",
302
+ "configFingerprint",
303
+ "dotenvPath",
304
+ "dotenvFingerprint",
305
+ "identityPath",
306
+ "identityFingerprint",
307
+ "operationalEnvironmentFingerprint",
308
+ ];
309
+ if (fields.some((field) => typeof value[field] !== "string" || value[field].length === 0))
310
+ return undefined;
311
+ if ((value.soulPath === undefined) !== (value.soulFingerprint === undefined)
312
+ || (value.soulPath !== undefined && (typeof value.soulPath !== "string" || value.soulPath.length === 0))
313
+ || (value.soulFingerprint !== undefined
314
+ && (typeof value.soulFingerprint !== "string" || value.soulFingerprint.length === 0)))
315
+ return undefined;
316
+ if ((value.mcpConfigPath === undefined) !== (value.mcpConfigFingerprint === undefined)
317
+ || (value.mcpConfigPath !== undefined
318
+ && (typeof value.mcpConfigPath !== "string" || value.mcpConfigPath.length === 0))
319
+ || (value.mcpConfigFingerprint !== undefined
320
+ && (typeof value.mcpConfigFingerprint !== "string" || value.mcpConfigFingerprint.length === 0)))
321
+ return undefined;
322
+ return {
323
+ schema: BACKGROUND_SNAPSHOT_SCHEMA,
324
+ configPath: value.configPath,
325
+ configFingerprint: value.configFingerprint,
326
+ dotenvPath: value.dotenvPath,
327
+ dotenvFingerprint: value.dotenvFingerprint,
328
+ identityPath: value.identityPath,
329
+ identityFingerprint: value.identityFingerprint,
330
+ ...(value.soulPath === undefined
331
+ ? {}
332
+ : { soulPath: value.soulPath, soulFingerprint: value.soulFingerprint }),
333
+ ...(value.mcpConfigPath === undefined
334
+ ? {}
335
+ : {
336
+ mcpConfigPath: value.mcpConfigPath,
337
+ mcpConfigFingerprint: value.mcpConfigFingerprint,
338
+ }),
339
+ operationalEnvironmentFingerprint: value.operationalEnvironmentFingerprint,
340
+ };
341
+ }
342
+ async function fingerprintRegularFile(path, label, proofKey) {
343
+ return (await readRegularFileProof(path, label, proofKey)).fingerprint;
344
+ }
345
+ async function fingerprintOptionalRegularFile(path, label, proofKey) {
346
+ try {
347
+ return await fingerprintRegularFile(path, label, proofKey);
348
+ }
349
+ catch (error) {
350
+ if (error.code === "ENOENT")
351
+ return "missing";
352
+ throw error;
353
+ }
354
+ }
355
+ async function readRegularFileProof(path, label, proofKey) {
356
+ let handle;
357
+ try {
358
+ handle = await open(path, fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW | fsConstants.O_NONBLOCK);
359
+ }
360
+ catch (error) {
361
+ if (["ELOOP", "EMLINK"].includes(error.code ?? "")) {
362
+ throw new Error(`Refusing to read ${label} path ${path} because it is a symbolic link.`);
363
+ }
364
+ throw error;
365
+ }
366
+ try {
367
+ const before = await handle.stat({ bigint: true });
368
+ if (!before.isFile()) {
369
+ throw new Error(`Refusing to read ${label} path ${path} because it is not a regular file.`);
370
+ }
371
+ const bytes = await handle.readFile();
372
+ const [afterHandle, afterPath] = await Promise.all([
373
+ handle.stat({ bigint: true }),
374
+ lstat(path, { bigint: true }),
375
+ ]);
376
+ if (afterPath.isSymbolicLink()
377
+ || !afterPath.isFile()
378
+ || !sameRegularFileVersion(before, afterHandle)
379
+ || !sameRegularFileVersion(before, afterPath)) {
380
+ throw new Error(`Refusing to read ${label} path ${path} because it changed during startup.`);
381
+ }
382
+ return { bytes, fingerprint: [
383
+ "file",
384
+ before.dev.toString(),
385
+ before.ino.toString(),
386
+ before.size.toString(),
387
+ before.mtimeNs.toString(),
388
+ before.ctimeNs.toString(),
389
+ before.mode.toString(8),
390
+ createHmac("sha256", proofKey)
391
+ .update("mono-agent.background-file.v1\0", "utf8")
392
+ .update(label, "utf8")
393
+ .update("\0", "utf8")
394
+ .update(path, "utf8")
395
+ .update("\0", "utf8")
396
+ .update(bytes)
397
+ .digest("hex"),
398
+ ].join(":") };
399
+ }
400
+ finally {
401
+ await handle.close();
402
+ }
403
+ }
404
+ function sameRegularFileVersion(left, right) {
405
+ return left.dev === right.dev
406
+ && left.ino === right.ino
407
+ && left.size === right.size
408
+ && left.mtimeNs === right.mtimeNs
409
+ && left.ctimeNs === right.ctimeNs
410
+ && left.mode === right.mode;
411
+ }
412
+ function normalizeProofKey(value) {
413
+ if (value.byteLength !== 32) {
414
+ throw new Error("The background snapshot proof key must contain exactly 32 bytes.");
415
+ }
416
+ return Buffer.from(value);
417
+ }
418
+ async function ensureRuntimeInputsRoot(runtimeRoot, homeDir) {
419
+ if (runtimeRoot !== undefined) {
420
+ await mkdir(resolve(runtimeRoot), { recursive: true, mode: 0o700 });
421
+ const canonical = await realpath(resolve(runtimeRoot));
422
+ await assertPrivateDirectory(canonical, "background runtime input root");
423
+ return canonical;
424
+ }
425
+ const home = await realpath(resolve(homeDir ?? accountHomeDirectory()));
426
+ let current = home;
427
+ for (const segment of [".mono-agent", "runtime-inputs"]) {
428
+ current = join(current, segment);
429
+ await mkdir(current, { mode: 0o700 }).catch((error) => {
430
+ if (error.code !== "EEXIST")
431
+ throw error;
432
+ });
433
+ await assertPrivateDirectory(current, "background runtime input root");
434
+ }
435
+ return current;
436
+ }
437
+ async function assertPrivateDirectory(path, label) {
438
+ const details = await lstat(path);
439
+ if (!details.isDirectory() || details.isSymbolicLink()) {
440
+ throw new Error(`${label} ${path} must be a real directory.`);
441
+ }
442
+ if (typeof process.getuid === "function" && details.uid !== process.getuid()) {
443
+ throw new Error(`${label} ${path} must be owned by the current user.`);
444
+ }
445
+ await chmod(path, 0o700);
446
+ }
447
+ function isRecord(value) {
448
+ return typeof value === "object" && value !== null && !Array.isArray(value);
449
+ }
450
+ //# sourceMappingURL=background-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"background-snapshot.js","sourceRoot":"","sources":["../src/background-snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { ProcessIncarnation, SameProcessIncarnation } from "./process-incarnation.js";
2
+ export interface BackgroundWorkerLease {
3
+ readonly configPath: string;
4
+ readonly path: string;
5
+ readonly ownerPid: number;
6
+ /** Idempotently release only this process's exact lease token. */
7
+ release(): Promise<void>;
8
+ }
9
+ export interface BackgroundWorkerLeaseOptions {
10
+ readonly homeDir?: string;
11
+ readonly pid?: number;
12
+ readonly now?: () => number;
13
+ /** Test/embed seam for the owner record written by this acquisition. */
14
+ readonly processIncarnation?: ProcessIncarnation;
15
+ /** Test/embed seam; production checks boot session plus process birth. */
16
+ readonly isSameProcessIncarnation?: SameProcessIncarnation;
17
+ readonly randomToken?: () => string;
18
+ readonly ownerlessGraceMs?: number;
19
+ /** Narrow deterministic seams for filesystem-race tests. */
20
+ readonly hooks?: {
21
+ readonly afterLeaseDirectoryCreated?: () => Promise<void>;
22
+ readonly beforeStaleLeaseRename?: () => Promise<void>;
23
+ };
24
+ }
25
+ /**
26
+ * Stable owner-private lifetime-lease path for one exact resolved config.
27
+ * The full path digest avoids relying on the shorter human-facing launchd hash.
28
+ */
29
+ export declare function backgroundWorkerLeasePath(configPath: string, homeDir?: string): string;
30
+ /**
31
+ * Acquire the process-lifetime singleton for a config.
32
+ *
33
+ * `undefined` means either a live owner or a fresh ownerless directory (the
34
+ * atomic mkdir -> owner.json initialization window) already holds the lease.
35
+ * Dead owners and old ownerless crash debris are atomically quarantined before
36
+ * one bounded retry. The returned lease must be held until worker shutdown.
37
+ */
38
+ export declare function acquireBackgroundWorkerLease(configPath: string, options?: BackgroundWorkerLeaseOptions): Promise<BackgroundWorkerLease | undefined>;
39
+ //# sourceMappingURL=background-worker-lease.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"background-worker-lease.d.ts","sourceRoot":"","sources":["../src/background-worker-lease.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAe3F,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,kEAAkE;IAClE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,wEAAwE;IACxE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACjD,0EAA0E;IAC1E,QAAQ,CAAC,wBAAwB,CAAC,EAAE,sBAAsB,CAAC;IAC3D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC;IACpC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,CAAC,EAAE;QACf,QAAQ,CAAC,0BAA0B,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1D,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;KACvD,CAAC;CACH;AAWD;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,MAA4B,GACpC,MAAM,CAIR;AAED;;;;;;;GAOG;AACH,wBAAsB,4BAA4B,CAChD,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAkG5C"}