@mono-agent/agent-app 0.8.0 → 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 (186) hide show
  1. package/README.md +71 -22
  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/app-config.d.ts +3 -1
  7. package/dist/app-config.d.ts.map +1 -1
  8. package/dist/app-config.js +8 -5
  9. package/dist/app-config.js.map +1 -1
  10. package/dist/app.d.ts +25 -0
  11. package/dist/app.d.ts.map +1 -1
  12. package/dist/app.js +237 -16
  13. package/dist/app.js.map +1 -1
  14. package/dist/background-environment.d.ts +16 -0
  15. package/dist/background-environment.d.ts.map +1 -0
  16. package/dist/background-environment.js +68 -0
  17. package/dist/background-environment.js.map +1 -0
  18. package/dist/background-runtime.d.ts +62 -0
  19. package/dist/background-runtime.d.ts.map +1 -0
  20. package/dist/background-runtime.js +1115 -0
  21. package/dist/background-runtime.js.map +1 -0
  22. package/dist/background-snapshot-key.d.ts +13 -0
  23. package/dist/background-snapshot-key.d.ts.map +1 -0
  24. package/dist/background-snapshot-key.js +194 -0
  25. package/dist/background-snapshot-key.js.map +1 -0
  26. package/dist/background-snapshot.d.ts +96 -0
  27. package/dist/background-snapshot.d.ts.map +1 -0
  28. package/dist/background-snapshot.js +450 -0
  29. package/dist/background-snapshot.js.map +1 -0
  30. package/dist/background-worker-lease.d.ts +39 -0
  31. package/dist/background-worker-lease.d.ts.map +1 -0
  32. package/dist/background-worker-lease.js +356 -0
  33. package/dist/background-worker-lease.js.map +1 -0
  34. package/dist/background.d.ts +74 -2
  35. package/dist/background.d.ts.map +1 -1
  36. package/dist/background.js +815 -73
  37. package/dist/background.js.map +1 -1
  38. package/dist/channel-plugins.d.ts +2 -0
  39. package/dist/channel-plugins.d.ts.map +1 -1
  40. package/dist/channel-plugins.js +8 -0
  41. package/dist/channel-plugins.js.map +1 -1
  42. package/dist/channels.d.ts +10 -0
  43. package/dist/channels.d.ts.map +1 -1
  44. package/dist/channels.js +71 -3
  45. package/dist/channels.js.map +1 -1
  46. package/dist/cli.d.ts +12 -2
  47. package/dist/cli.d.ts.map +1 -1
  48. package/dist/cli.js +341 -63
  49. package/dist/cli.js.map +1 -1
  50. package/dist/config-reference.d.ts.map +1 -1
  51. package/dist/config-reference.js +253 -0
  52. package/dist/config-reference.js.map +1 -1
  53. package/dist/configuration-proposal-tool.d.ts +7 -0
  54. package/dist/configuration-proposal-tool.d.ts.map +1 -1
  55. package/dist/configuration-proposal-tool.js +55 -6
  56. package/dist/configuration-proposal-tool.js.map +1 -1
  57. package/dist/configured-agent.d.ts +4 -0
  58. package/dist/configured-agent.d.ts.map +1 -1
  59. package/dist/configured-agent.js +15 -0
  60. package/dist/configured-agent.js.map +1 -1
  61. package/dist/continuation-command.d.ts +15 -0
  62. package/dist/continuation-command.d.ts.map +1 -0
  63. package/dist/continuation-command.js +170 -0
  64. package/dist/continuation-command.js.map +1 -0
  65. package/dist/continuation-config.d.ts +25 -0
  66. package/dist/continuation-config.d.ts.map +1 -0
  67. package/dist/continuation-config.js +236 -0
  68. package/dist/continuation-config.js.map +1 -0
  69. package/dist/continuation-service.d.ts +99 -0
  70. package/dist/continuation-service.d.ts.map +1 -0
  71. package/dist/continuation-service.js +1313 -0
  72. package/dist/continuation-service.js.map +1 -0
  73. package/dist/continuation-store.d.ts +104 -0
  74. package/dist/continuation-store.d.ts.map +1 -0
  75. package/dist/continuation-store.js +688 -0
  76. package/dist/continuation-store.js.map +1 -0
  77. package/dist/continuations.d.ts +167 -0
  78. package/dist/continuations.d.ts.map +1 -0
  79. package/dist/continuations.js +71 -0
  80. package/dist/continuations.js.map +1 -0
  81. package/dist/doctor.d.ts +2 -0
  82. package/dist/doctor.d.ts.map +1 -1
  83. package/dist/doctor.js +426 -27
  84. package/dist/doctor.js.map +1 -1
  85. package/dist/first-run-managed-memory.d.ts.map +1 -1
  86. package/dist/first-run-managed-memory.js +66 -3
  87. package/dist/first-run-managed-memory.js.map +1 -1
  88. package/dist/first-run-readiness.d.ts.map +1 -1
  89. package/dist/first-run-readiness.js +2 -31
  90. package/dist/first-run-readiness.js.map +1 -1
  91. package/dist/index.d.ts +9 -0
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +4 -0
  94. package/dist/index.js.map +1 -1
  95. package/dist/init.d.ts +7 -0
  96. package/dist/init.d.ts.map +1 -1
  97. package/dist/init.js +7 -2
  98. package/dist/init.js.map +1 -1
  99. package/dist/launchd.d.ts +16 -6
  100. package/dist/launchd.d.ts.map +1 -1
  101. package/dist/launchd.js +30 -15
  102. package/dist/launchd.js.map +1 -1
  103. package/dist/local-configuration.d.ts +61 -18
  104. package/dist/local-configuration.d.ts.map +1 -1
  105. package/dist/local-configuration.js +530 -145
  106. package/dist/local-configuration.js.map +1 -1
  107. package/dist/managed-runtime-packages.d.ts +9 -0
  108. package/dist/managed-runtime-packages.d.ts.map +1 -0
  109. package/dist/managed-runtime-packages.js +56 -0
  110. package/dist/managed-runtime-packages.js.map +1 -0
  111. package/dist/memory-embedding-service.d.ts +33 -0
  112. package/dist/memory-embedding-service.d.ts.map +1 -0
  113. package/dist/memory-embedding-service.js +207 -0
  114. package/dist/memory-embedding-service.js.map +1 -0
  115. package/dist/memory-recall.d.ts +5 -4
  116. package/dist/memory-recall.d.ts.map +1 -1
  117. package/dist/memory-recall.js +21 -8
  118. package/dist/memory-recall.js.map +1 -1
  119. package/dist/modules/catalog.d.ts.map +1 -1
  120. package/dist/modules/catalog.js +91 -9
  121. package/dist/modules/catalog.js.map +1 -1
  122. package/dist/notify-runtime.d.ts +26 -0
  123. package/dist/notify-runtime.d.ts.map +1 -0
  124. package/dist/notify-runtime.js +27 -0
  125. package/dist/notify-runtime.js.map +1 -0
  126. package/dist/notify-tool.d.ts +51 -0
  127. package/dist/notify-tool.d.ts.map +1 -0
  128. package/dist/notify-tool.js +182 -0
  129. package/dist/notify-tool.js.map +1 -0
  130. package/dist/proactive-notify.d.ts +2 -0
  131. package/dist/proactive-notify.d.ts.map +1 -1
  132. package/dist/proactive-notify.js +1 -0
  133. package/dist/proactive-notify.js.map +1 -1
  134. package/dist/process-incarnation.d.ts +23 -0
  135. package/dist/process-incarnation.d.ts.map +1 -0
  136. package/dist/process-incarnation.js +208 -0
  137. package/dist/process-incarnation.js.map +1 -0
  138. package/dist/project-skills.d.ts +1 -1
  139. package/dist/project-skills.js +6 -6
  140. package/dist/recipes/base.d.ts +15 -0
  141. package/dist/recipes/base.d.ts.map +1 -0
  142. package/dist/recipes/base.js +51 -0
  143. package/dist/recipes/base.js.map +1 -0
  144. package/dist/recipes/catalog.d.ts +4 -0
  145. package/dist/recipes/catalog.d.ts.map +1 -0
  146. package/dist/recipes/catalog.js +525 -0
  147. package/dist/recipes/catalog.js.map +1 -0
  148. package/dist/recipes/index.d.ts +11 -0
  149. package/dist/recipes/index.d.ts.map +1 -0
  150. package/dist/recipes/index.js +14 -0
  151. package/dist/recipes/index.js.map +1 -0
  152. package/dist/recipes/types.d.ts +70 -0
  153. package/dist/recipes/types.d.ts.map +1 -0
  154. package/dist/recipes/types.js +15 -0
  155. package/dist/recipes/types.js.map +1 -0
  156. package/dist/sandbox-manager.d.ts +17 -0
  157. package/dist/sandbox-manager.d.ts.map +1 -1
  158. package/dist/sandbox-manager.js +673 -127
  159. package/dist/sandbox-manager.js.map +1 -1
  160. package/dist/setup.d.ts +29 -0
  161. package/dist/setup.d.ts.map +1 -0
  162. package/dist/setup.js +97 -0
  163. package/dist/setup.js.map +1 -0
  164. package/dist/supermemory-plugin.d.ts +5 -3
  165. package/dist/supermemory-plugin.d.ts.map +1 -1
  166. package/dist/supermemory-plugin.js +11 -5
  167. package/dist/supermemory-plugin.js.map +1 -1
  168. package/dist/tui-command.d.ts +43 -2
  169. package/dist/tui-command.d.ts.map +1 -1
  170. package/dist/tui-command.js +261 -27
  171. package/dist/tui-command.js.map +1 -1
  172. package/dist/wizard/answers.d.ts +4 -4
  173. package/dist/wizard/answers.d.ts.map +1 -1
  174. package/dist/wizard/answers.js +4 -21
  175. package/dist/wizard/answers.js.map +1 -1
  176. package/dist/wizard/run.d.ts.map +1 -1
  177. package/dist/wizard/run.js +162 -5
  178. package/dist/wizard/run.js.map +1 -1
  179. package/package.json +15 -15
  180. package/schema/mono-agent.config.schema.json +206 -3
  181. package/skills/mono-agent-composer/SKILL.md +4 -4
  182. package/skills/mono-agent-composer/references/config-blueprint.md +6 -6
  183. package/skills/mono-agent-composer/references/discovery-questions.md +25 -10
  184. package/skills/mono-agent-composer/references/feature-coverage.md +7 -7
  185. package/skills/mono-agent-composer/references/package-map.md +1 -1
  186. package/skills/mono-agent-composer/references/validation.md +2 -2
package/dist/launchd.d.ts CHANGED
@@ -23,9 +23,16 @@ export interface PlistInput {
23
23
  readonly configPath: string;
24
24
  readonly cwd: string;
25
25
  readonly envFile?: string;
26
+ /** Secret-free approved input identity, encoded for the internal worker. */
27
+ readonly expectedBackgroundSnapshot: string;
26
28
  readonly stdoutPath: string;
27
29
  readonly stderrPath: string;
28
- readonly pathEnv: string;
30
+ /** Deliberately allowlisted, non-secret worker environment. */
31
+ readonly environment: Readonly<Record<string, string>>;
32
+ }
33
+ export interface LaunchdServiceInfo {
34
+ readonly loaded: boolean;
35
+ readonly pid?: number;
29
36
  }
30
37
  /**
31
38
  * A stable, launchd-legal label derived from the resolved config path. The
@@ -37,9 +44,10 @@ export declare function deriveLaunchdLabel(configPath: string): string;
37
44
  export declare function launchdPathsFor(label: string, home?: string): LaunchdPaths;
38
45
  export declare function escapeXml(value: string): string;
39
46
  /**
40
- * The plist runs `node <cli.js> start --foreground …` (the existing blocking
41
- * worker) in the config's directory. No secrets are written here the worker
42
- * loads `.env` from its working directory exactly like the foreground CLI.
47
+ * The plist runs the blocking worker through `/usr/bin/env -i`. Clearing the
48
+ * launchd job's inherited environment before Node starts is important: Node
49
+ * startup variables such as NODE_OPTIONS execute before cli.ts can sanitise
50
+ * process.env. Only the explicit, non-secret operational allowlist is restored.
43
51
  */
44
52
  export declare function buildPlistXml(input: PlistInput): string;
45
53
  /**
@@ -53,10 +61,12 @@ export declare function serviceTarget(label: string, uid: number): string;
53
61
  export declare function makeLaunchctlRunner(): LaunchctlRunner;
54
62
  /** True when the service is bootstrapped in the user's gui domain. */
55
63
  export declare function isLoaded(runner: LaunchctlRunner, label: string, uid: number): Promise<boolean>;
64
+ /** Read the launchd-owned process identity from `launchctl print`. */
65
+ export declare function launchdServiceInfo(runner: LaunchctlRunner, label: string, uid: number): Promise<LaunchdServiceInfo>;
66
+ /** Parse only launchd's top-level `pid = N` field; never infer a pid from noise. */
67
+ export declare function parseLaunchdServicePid(output: string): number | undefined;
56
68
  /** Bootstrap (load + RunAtLoad-launch) the plist. Caller tolerates "already bootstrapped". */
57
69
  export declare function bootstrap(runner: LaunchctlRunner, plistPath: string, uid: number): Promise<LaunchctlResult>;
58
- /** Kill and restart an already-loaded service, picking up a rewritten plist. */
59
- export declare function kickstartRestart(runner: LaunchctlRunner, label: string, uid: number): Promise<LaunchctlResult>;
60
70
  /**
61
71
  * Remove the service from the domain. Sends SIGTERM and — unlike a plain kill —
62
72
  * prevents KeepAlive from relaunching it. Caller tolerates "not loaded".
@@ -1 +1 @@
1
- {"version":3,"file":"launchd.d.ts","sourceRoot":"","sources":["../src/launchd.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AAEH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;AAEpF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAOD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAW7D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAAkB,GAAG,YAAY,CAUrF;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO/C;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CA+CvD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,MAAM,CAY5F;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,mBAAmB,IAAI,eAAe,CAmBrD;AAED,sEAAsE;AACtE,wBAAsB,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGpG;AAED,8FAA8F;AAC9F,wBAAsB,SAAS,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAEjH;AAED,gFAAgF;AAChF,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAEpH;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAE3G"}
1
+ {"version":3,"file":"launchd.d.ts","sourceRoot":"","sources":["../src/launchd.ts"],"names":[],"mappings":"AAOA;;;;GAIG;AAEH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;AAEpF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,4EAA4E;IAC5E,QAAQ,CAAC,0BAA0B,EAAE,MAAM,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAOD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAW7D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAA+B,GAAG,YAAY,CAUlG;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO/C;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAkDvD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,MAAM,CAY5F;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,mBAAmB,IAAI,eAAe,CAmBrD;AAED,sEAAsE;AACtE,wBAAsB,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEpG;AAED,sEAAsE;AACtE,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,kBAAkB,CAAC,CAK7B;AAED,oFAAoF;AACpF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKzE;AAED,8FAA8F;AAC9F,wBAAsB,SAAS,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAEjH;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAE3G"}
package/dist/launchd.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import { createHash } from "node:crypto";
3
- import { homedir } from "node:os";
4
3
  import { basename, dirname, resolve } from "node:path";
5
4
  import process from "node:process";
5
+ import { accountHomeDirectory } from "./account-home.js";
6
6
  const LABEL_PREFIX = "com.mono-agent";
7
7
  const MAX_FOLDER_SEGMENT = 40;
8
8
  const FALLBACK_PATH = "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/homebrew/bin";
@@ -25,7 +25,7 @@ export function deriveLaunchdLabel(configPath) {
25
25
  const hash = createHash("sha256").update(resolved).digest("hex").slice(0, 8);
26
26
  return `${LABEL_PREFIX}.${folder.length === 0 ? "agent" : folder}-${hash}`;
27
27
  }
28
- export function launchdPathsFor(label, home = homedir()) {
28
+ export function launchdPathsFor(label, home = accountHomeDirectory()) {
29
29
  const launchAgentsDir = resolve(home, "Library", "LaunchAgents");
30
30
  const logDir = resolve(home, ".mono-agent", "logs");
31
31
  return {
@@ -45,12 +45,19 @@ export function escapeXml(value) {
45
45
  .replace(/'/gu, "&apos;");
46
46
  }
47
47
  /**
48
- * The plist runs `node <cli.js> start --foreground …` (the existing blocking
49
- * worker) in the config's directory. No secrets are written here the worker
50
- * loads `.env` from its working directory exactly like the foreground CLI.
48
+ * The plist runs the blocking worker through `/usr/bin/env -i`. Clearing the
49
+ * launchd job's inherited environment before Node starts is important: Node
50
+ * startup variables such as NODE_OPTIONS execute before cli.ts can sanitise
51
+ * process.env. Only the explicit, non-secret operational allowlist is restored.
51
52
  */
52
53
  export function buildPlistXml(input) {
54
+ const environmentArguments = Object.entries(input.environment)
55
+ .sort(([left], [right]) => left.localeCompare(right))
56
+ .map(([key, value]) => `${key}=${value}`);
53
57
  const programArguments = [
58
+ "/usr/bin/env",
59
+ "-i",
60
+ ...environmentArguments,
54
61
  input.nodePath,
55
62
  input.cliPath,
56
63
  "start",
@@ -58,6 +65,8 @@ export function buildPlistXml(input) {
58
65
  "--config",
59
66
  input.configPath,
60
67
  ...(input.envFile === undefined ? [] : ["--env-file", input.envFile]),
68
+ "--expected-background-snapshot",
69
+ input.expectedBackgroundSnapshot,
61
70
  ];
62
71
  const argsXml = programArguments.map((arg) => ` <string>${escapeXml(arg)}</string>`).join("\n");
63
72
  return `<?xml version="1.0" encoding="UTF-8"?>
@@ -72,11 +81,6 @@ ${argsXml}
72
81
  </array>
73
82
  <key>WorkingDirectory</key>
74
83
  <string>${escapeXml(input.cwd)}</string>
75
- <key>EnvironmentVariables</key>
76
- <dict>
77
- <key>PATH</key>
78
- <string>${escapeXml(input.pathEnv)}</string>
79
- </dict>
80
84
  <key>RunAtLoad</key>
81
85
  <true/>
82
86
  <key>KeepAlive</key>
@@ -141,17 +145,28 @@ export function makeLaunchctlRunner() {
141
145
  }
142
146
  /** True when the service is bootstrapped in the user's gui domain. */
143
147
  export async function isLoaded(runner, label, uid) {
148
+ return (await launchdServiceInfo(runner, label, uid)).loaded;
149
+ }
150
+ /** Read the launchd-owned process identity from `launchctl print`. */
151
+ export async function launchdServiceInfo(runner, label, uid) {
144
152
  const result = await runner(["print", serviceTarget(label, uid)]);
145
- return result.code === 0;
153
+ if (result.code !== 0)
154
+ return { loaded: false };
155
+ const pid = parseLaunchdServicePid(result.stdout);
156
+ return pid === undefined ? { loaded: true } : { loaded: true, pid };
157
+ }
158
+ /** Parse only launchd's top-level `pid = N` field; never infer a pid from noise. */
159
+ export function parseLaunchdServicePid(output) {
160
+ const match = /^\s*pid\s*=\s*(\d+)\s*$/mu.exec(output);
161
+ if (match?.[1] === undefined)
162
+ return undefined;
163
+ const pid = Number(match[1]);
164
+ return Number.isSafeInteger(pid) && pid > 0 ? pid : undefined;
146
165
  }
147
166
  /** Bootstrap (load + RunAtLoad-launch) the plist. Caller tolerates "already bootstrapped". */
148
167
  export async function bootstrap(runner, plistPath, uid) {
149
168
  return await runner(["bootstrap", domainTarget(uid), plistPath]);
150
169
  }
151
- /** Kill and restart an already-loaded service, picking up a rewritten plist. */
152
- export async function kickstartRestart(runner, label, uid) {
153
- return await runner(["kickstart", "-k", serviceTarget(label, uid)]);
154
- }
155
170
  /**
156
171
  * Remove the service from the domain. Sends SIGTERM and — unlike a plain kill —
157
172
  * prevents KeepAlive from relaunching it. Caller tolerates "not loaded".
@@ -1 +1 @@
1
- {"version":3,"file":"launchd.js","sourceRoot":"","sources":["../src/launchd.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"launchd.js","sourceRoot":"","sources":["../src/launchd.ts"],"names":[],"mappings":"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"}
@@ -1,52 +1,95 @@
1
1
  import type { AgentResponder } from "@mono-agent/agent-contracts";
2
2
  import { type MonoAgentConfig, type MonoAgentConfigJson } from "@mono-agent/config";
3
- import type { ConfigurationProposalCard, ConfigurationProposalResult } from "@mono-agent/tui";
3
+ import type { AgentHarnessRuntimeOptionsExtension, AgentHarnessRuntimeOptionsInput } from "@mono-agent/agent-harness";
4
+ import type { ConfigurationProposalCard, ConfigurationProposalResult, TuiConfigurationController } from "@mono-agent/tui";
5
+ import type { BackgroundSnapshot } from "./background-snapshot.js";
4
6
  import { type AgentConfigurationProposal, type JsonPatchOperation } from "./configuration-proposal-tool.js";
5
- export declare const LOCAL_CONFIGURATION_PROMPT = "Begin local configuration mode. Read the mono-agent-configure skill, then ask the operator one concise question: how would they like to configure you further? Mention that behavior, memory, skills, tools, or channels can be discussed, but do not repeat the setup wizard and do not ask for secrets.";
6
- type DisposableResponder = AgentResponder & {
7
- dispose?(): Promise<void>;
7
+ export declare const LOCAL_CONFIGURATION_PROMPT = "Begin temporary post-wizard configuration mode. This is not an ordinary chat. Read the mono-agent-configure skill. Your first assistant message must explain that this short conversation is for discussing the agent's Role (the configured identity document \u2192 ## Role; normally IDENTITY.md \u2192 ## Role), behavior, memory, skills, tools, or channels; secrets must never be entered; nothing changes without a separate host-owned approval; the operator can reply done or no changes to finish without edits; and ordinary chat starts after the operator's reply and any approval or rejection. Mention that /quit closes only the console and never sends a background stop request; the agent remains running unless a later restart or recovery explicitly reports failure. Then ask one concise question: how would the operator like to configure you further? Do not repeat the setup wizard. After the operator's single reply, either record one constrained proposal with ProposeAgentConfiguration or explain that no changes are needed. Never claim a proposal was applied: the local host validates it and asks for separate approval.";
8
+ export declare const LOCAL_CONFIGURATION_OPERATOR_PROMPT = "Continue the temporary post-wizard configuration exchange after the opening invitation. The invitation was already shown in a separate provider conversation: do not repeat it and do not ask the opening question again. Read the mono-agent-configure skill, act on the operator's one reply, and either record one constrained proposal with ProposeAgentConfiguration or clearly state that no changes are proposed so the host can hand off to ordinary chat. Never ask for secrets or claim a proposal was applied.";
9
+ export interface ConfigurationBackgroundConnection {
10
+ readonly baseUrl: string;
11
+ readonly apiKey?: string;
12
+ }
13
+ export type ConfigurationBackgroundRestartResult = {
14
+ readonly ok: true;
15
+ readonly connection: ConfigurationBackgroundConnection;
16
+ } | {
17
+ readonly ok: false;
18
+ readonly message: string;
8
19
  };
20
+ export type RestartConfigurationBackground = (expectedSnapshot: BackgroundSnapshot) => Promise<ConfigurationBackgroundRestartResult>;
9
21
  interface AppliedConfigurationChange {
10
22
  readonly changeId: string;
11
23
  readonly rollbackDir: string;
12
- rollback(): Promise<void>;
24
+ readonly snapshot: BackgroundSnapshot;
25
+ rollback(): Promise<BackgroundSnapshot>;
13
26
  }
14
27
  export interface LocalConfigurationSession {
15
28
  readonly responder: AgentResponder;
16
29
  readonly title: string;
17
- readonly configuration: {
18
- readonly initialPrompt?: string;
19
- readonly prompt: string;
20
- takeProposal(): Promise<ConfigurationProposalCard | undefined>;
21
- approve(id: string): Promise<ConfigurationProposalResult>;
22
- reject(id: string): Promise<ConfigurationProposalResult>;
23
- };
24
30
  dispose(): Promise<void>;
25
31
  }
26
32
  export interface CreateLocalConfigurationSessionOptions {
27
33
  readonly cwd: string;
28
34
  readonly configPath: string;
29
35
  readonly env: Record<string, string | undefined>;
30
- readonly configure: boolean;
36
+ readonly configure?: boolean;
37
+ readonly envFile?: string;
38
+ /** Deterministic transaction-race seam for regression tests. */
39
+ readonly beforeSnapshotCapture?: (phase: "apply" | "rollback") => void | Promise<void>;
40
+ }
41
+ export interface CreateRemoteConfigurationSessionOptions extends CreateLocalConfigurationSessionOptions {
42
+ readonly restartBackground: RestartConfigurationBackground;
43
+ /** Deterministic failure seam for capability-rotation regression tests. */
44
+ readonly beforeRotateAttempt?: () => void | Promise<void>;
45
+ }
46
+ export interface RemoteConfigurationSession {
47
+ readonly configuration: TuiConfigurationController;
48
+ dispose(): Promise<void>;
31
49
  }
32
- /** Build a current-folder responder without starting channels or creating service state. */
50
+ /** Build a current-folder responder for ordinary embedded chat only. */
33
51
  export declare function createLocalConfigurationSession(options: CreateLocalConfigurationSessionOptions): Promise<LocalConfigurationSession>;
52
+ /**
53
+ * Create the local host controller for a remote configuration conversation.
54
+ * The daemon only proposes; this process validates, confirms, writes, restarts,
55
+ * proves readiness, and rolls back on failure.
56
+ */
57
+ export declare function createRemoteConfigurationSession(options: CreateRemoteConfigurationSessionOptions): Promise<RemoteConfigurationSession>;
58
+ export interface ConfigurationRuntimeExtensionOptions {
59
+ readonly cwd: string;
60
+ /** Canonical mutable path used only to authenticate this agent folder/capability root. */
61
+ readonly configPath: string;
62
+ /** Immutable worker copy used for route classification and proposal base version. */
63
+ readonly configReadPath?: string;
64
+ readonly env: Record<string, string | undefined>;
65
+ }
66
+ /** Install proposal-only authority on explicitly capability-marked TUI requests. */
67
+ export declare function createLocalConfigurationRuntimeExtension(options: ConfigurationRuntimeExtensionOptions): (input: AgentHarnessRuntimeOptionsInput) => Promise<AgentHarnessRuntimeOptionsExtension>;
34
68
  export declare class LocalConfigurationManager {
35
69
  private readonly options;
36
- private readonly sessionDir;
70
+ private readonly proposalRoot;
37
71
  readonly currentConfig: MonoAgentConfig;
38
- private readonly pendingSinks;
72
+ readonly roleLocation: string;
39
73
  private readonly prepared;
74
+ private readonly cleanupPaths;
75
+ private currentSessionId;
76
+ private currentSessionDir;
77
+ private disabledReason;
40
78
  private constructor();
79
+ get sessionId(): string;
41
80
  static create(options: CreateLocalConfigurationSessionOptions): Promise<LocalConfigurationManager>;
42
- buildResponder(): Promise<DisposableResponder>;
43
- private runtimeExtension;
81
+ /** Revoke the completed attempt's opaque filesystem capability before issuing the next one. */
82
+ rotateAttempt(): Promise<void>;
83
+ /** Poison the public capability id and best-effort remove every owned attempt path. */
84
+ disableConfigurationAttempts(error: unknown): Promise<void>;
85
+ private assertAttemptsEnabled;
44
86
  takeProposal(): Promise<ConfigurationProposalCard | undefined>;
45
87
  reject(id: string): Promise<ConfigurationProposalResult>;
46
88
  prepareProposal(proposal: AgentConfigurationProposal): Promise<ConfigurationProposalCard>;
47
89
  private prepare;
48
90
  apply(id: string): Promise<AppliedConfigurationChange>;
49
91
  private applyPrepared;
92
+ private captureCommittedSnapshot;
50
93
  private validateCandidate;
51
94
  dispose(): Promise<void>;
52
95
  }
@@ -1 +1 @@
1
- {"version":3,"file":"local-configuration.d.ts","sourceRoot":"","sources":["../src/local-configuration.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local-configuration.d.ts","sourceRoot":"","sources":["../src/local-configuration.ts"],"names":[],"mappings":"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"}