@phigon/observer 8.0.2 → 8.2.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 (375) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +8 -0
  3. package/README.md +376 -303
  4. package/THIRD_PARTY_NOTICES.md +610 -0
  5. package/dist/bin/guardian-runner-darwin-amd64 +0 -0
  6. package/dist/bin/guardian-runner-darwin-arm64 +0 -0
  7. package/dist/bin/guardian-runner-linux-amd64 +0 -0
  8. package/dist/bin/guardian-runner-linux-arm64 +0 -0
  9. package/dist/bin/guardian-runner-windows-amd64.exe +0 -0
  10. package/dist/bin/guardian-runner-windows-arm64.exe +0 -0
  11. package/dist/src/action-policy.d.ts +0 -0
  12. package/dist/src/action-policy.d.ts.map +1 -1
  13. package/dist/src/action-policy.js +4 -2
  14. package/dist/src/action-policy.js.map +1 -1
  15. package/dist/src/activity/adapters/claude.d.ts +0 -0
  16. package/dist/src/activity/adapters/claude.d.ts.map +1 -1
  17. package/dist/src/activity/adapters/claude.js +19 -1
  18. package/dist/src/activity/adapters/claude.js.map +1 -1
  19. package/dist/src/activity/adapters/cline-task.d.ts +7 -0
  20. package/dist/src/activity/adapters/cline-task.d.ts.map +1 -0
  21. package/dist/src/activity/adapters/cline-task.js +197 -0
  22. package/dist/src/activity/adapters/cline-task.js.map +1 -0
  23. package/dist/src/activity/adapters/cline.d.ts +3 -0
  24. package/dist/src/activity/adapters/cline.d.ts.map +1 -0
  25. package/dist/src/activity/adapters/cline.js +102 -0
  26. package/dist/src/activity/adapters/cline.js.map +1 -0
  27. package/dist/src/activity/adapters/codex.d.ts +0 -0
  28. package/dist/src/activity/adapters/codex.d.ts.map +1 -1
  29. package/dist/src/activity/adapters/codex.js +76 -0
  30. package/dist/src/activity/adapters/codex.js.map +1 -1
  31. package/dist/src/activity/adapters/copilot-chat.d.ts +3 -0
  32. package/dist/src/activity/adapters/copilot-chat.d.ts.map +1 -0
  33. package/dist/src/activity/adapters/copilot-chat.js +176 -0
  34. package/dist/src/activity/adapters/copilot-chat.js.map +1 -0
  35. package/dist/src/activity/adapters/copilot.d.ts +2 -1
  36. package/dist/src/activity/adapters/copilot.d.ts.map +1 -1
  37. package/dist/src/activity/adapters/copilot.js +173 -2
  38. package/dist/src/activity/adapters/copilot.js.map +1 -1
  39. package/dist/src/activity/adapters/cursor.d.ts +3 -0
  40. package/dist/src/activity/adapters/cursor.d.ts.map +1 -0
  41. package/dist/src/activity/adapters/cursor.js +86 -0
  42. package/dist/src/activity/adapters/cursor.js.map +1 -0
  43. package/dist/src/activity/adapters/factory-droid.d.ts +3 -0
  44. package/dist/src/activity/adapters/factory-droid.d.ts.map +1 -0
  45. package/dist/src/activity/adapters/factory-droid.js +126 -0
  46. package/dist/src/activity/adapters/factory-droid.js.map +1 -0
  47. package/dist/src/activity/adapters/gemini.d.ts +3 -0
  48. package/dist/src/activity/adapters/gemini.d.ts.map +1 -0
  49. package/dist/src/activity/adapters/gemini.js +177 -0
  50. package/dist/src/activity/adapters/gemini.js.map +1 -0
  51. package/dist/src/activity/adapters/generic.d.ts +0 -0
  52. package/dist/src/activity/adapters/generic.d.ts.map +0 -0
  53. package/dist/src/activity/adapters/generic.js +0 -0
  54. package/dist/src/activity/adapters/generic.js.map +0 -0
  55. package/dist/src/activity/adapters/goose.d.ts +3 -0
  56. package/dist/src/activity/adapters/goose.d.ts.map +1 -0
  57. package/dist/src/activity/adapters/goose.js +116 -0
  58. package/dist/src/activity/adapters/goose.js.map +1 -0
  59. package/dist/src/activity/adapters/hermes.d.ts +0 -0
  60. package/dist/src/activity/adapters/hermes.d.ts.map +0 -0
  61. package/dist/src/activity/adapters/hermes.js +0 -0
  62. package/dist/src/activity/adapters/hermes.js.map +0 -0
  63. package/dist/src/activity/adapters/kiro.d.ts +3 -0
  64. package/dist/src/activity/adapters/kiro.d.ts.map +1 -0
  65. package/dist/src/activity/adapters/kiro.js +47 -0
  66. package/dist/src/activity/adapters/kiro.js.map +1 -0
  67. package/dist/src/activity/adapters/openai-compatible.d.ts +0 -0
  68. package/dist/src/activity/adapters/openai-compatible.d.ts.map +0 -0
  69. package/dist/src/activity/adapters/openai-compatible.js +0 -0
  70. package/dist/src/activity/adapters/openai-compatible.js.map +0 -0
  71. package/dist/src/activity/adapters/openclaw.d.ts +0 -0
  72. package/dist/src/activity/adapters/openclaw.d.ts.map +0 -0
  73. package/dist/src/activity/adapters/openclaw.js +0 -0
  74. package/dist/src/activity/adapters/openclaw.js.map +0 -0
  75. package/dist/src/activity/adapters/opencode.d.ts +0 -0
  76. package/dist/src/activity/adapters/opencode.d.ts.map +1 -1
  77. package/dist/src/activity/adapters/opencode.js +108 -1
  78. package/dist/src/activity/adapters/opencode.js.map +1 -1
  79. package/dist/src/activity/adapters/zed.d.ts +3 -0
  80. package/dist/src/activity/adapters/zed.d.ts.map +1 -0
  81. package/dist/src/activity/adapters/zed.js +134 -0
  82. package/dist/src/activity/adapters/zed.js.map +1 -0
  83. package/dist/src/activity/bridges.d.ts +0 -0
  84. package/dist/src/activity/bridges.d.ts.map +0 -0
  85. package/dist/src/activity/bridges.js +0 -0
  86. package/dist/src/activity/bridges.js.map +0 -0
  87. package/dist/src/activity/collector.d.ts +12 -0
  88. package/dist/src/activity/collector.d.ts.map +1 -1
  89. package/dist/src/activity/collector.js +156 -3
  90. package/dist/src/activity/collector.js.map +1 -1
  91. package/dist/src/activity/goose-sqlite-source.d.ts +33 -0
  92. package/dist/src/activity/goose-sqlite-source.d.ts.map +1 -0
  93. package/dist/src/activity/goose-sqlite-source.js +274 -0
  94. package/dist/src/activity/goose-sqlite-source.js.map +1 -0
  95. package/dist/src/activity/index.d.ts +3 -0
  96. package/dist/src/activity/index.d.ts.map +1 -1
  97. package/dist/src/activity/index.js +3 -0
  98. package/dist/src/activity/index.js.map +1 -1
  99. package/dist/src/activity/ingest.d.ts +0 -0
  100. package/dist/src/activity/ingest.d.ts.map +1 -1
  101. package/dist/src/activity/ingest.js +2 -1
  102. package/dist/src/activity/ingest.js.map +1 -1
  103. package/dist/src/activity/json-document-source.d.ts +136 -0
  104. package/dist/src/activity/json-document-source.d.ts.map +1 -0
  105. package/dist/src/activity/json-document-source.js +569 -0
  106. package/dist/src/activity/json-document-source.js.map +1 -0
  107. package/dist/src/activity/native-capabilities.d.ts +0 -0
  108. package/dist/src/activity/native-capabilities.d.ts.map +0 -0
  109. package/dist/src/activity/native-capabilities.js +0 -0
  110. package/dist/src/activity/native-capabilities.js.map +0 -0
  111. package/dist/src/activity/normalize.d.ts +0 -0
  112. package/dist/src/activity/normalize.d.ts.map +1 -1
  113. package/dist/src/activity/normalize.js +64 -6
  114. package/dist/src/activity/normalize.js.map +1 -1
  115. package/dist/src/activity/opencode-message-tables.d.ts +87 -0
  116. package/dist/src/activity/opencode-message-tables.d.ts.map +1 -0
  117. package/dist/src/activity/opencode-message-tables.js +546 -0
  118. package/dist/src/activity/opencode-message-tables.js.map +1 -0
  119. package/dist/src/activity/opencode-sqlite-source.d.ts +7 -0
  120. package/dist/src/activity/opencode-sqlite-source.d.ts.map +1 -1
  121. package/dist/src/activity/opencode-sqlite-source.js +153 -63
  122. package/dist/src/activity/opencode-sqlite-source.js.map +1 -1
  123. package/dist/src/activity/policy.d.ts +0 -0
  124. package/dist/src/activity/policy.d.ts.map +1 -1
  125. package/dist/src/activity/policy.js +2 -13
  126. package/dist/src/activity/policy.js.map +1 -1
  127. package/dist/src/activity/record.d.ts +0 -0
  128. package/dist/src/activity/record.d.ts.map +0 -0
  129. package/dist/src/activity/record.js +0 -0
  130. package/dist/src/activity/record.js.map +0 -0
  131. package/dist/src/activity/source-reader.d.ts +16 -1
  132. package/dist/src/activity/source-reader.d.ts.map +1 -1
  133. package/dist/src/activity/source-reader.js +308 -29
  134. package/dist/src/activity/source-reader.js.map +1 -1
  135. package/dist/src/activity/sqlite-connections.d.ts +77 -0
  136. package/dist/src/activity/sqlite-connections.d.ts.map +1 -0
  137. package/dist/src/activity/sqlite-connections.js +220 -0
  138. package/dist/src/activity/sqlite-connections.js.map +1 -0
  139. package/dist/src/activity/types.d.ts +0 -0
  140. package/dist/src/activity/types.d.ts.map +0 -0
  141. package/dist/src/activity/types.js +0 -0
  142. package/dist/src/activity/types.js.map +0 -0
  143. package/dist/src/activity/zed-sqlite-source.d.ts +65 -0
  144. package/dist/src/activity/zed-sqlite-source.d.ts.map +1 -0
  145. package/dist/src/activity/zed-sqlite-source.js +547 -0
  146. package/dist/src/activity/zed-sqlite-source.js.map +1 -0
  147. package/dist/src/agent-action-executor.d.ts +14 -1
  148. package/dist/src/agent-action-executor.d.ts.map +1 -1
  149. package/dist/src/agent-action-executor.js +114 -57
  150. package/dist/src/agent-action-executor.js.map +1 -1
  151. package/dist/src/agentic-guardian.d.ts +0 -0
  152. package/dist/src/agentic-guardian.d.ts.map +1 -1
  153. package/dist/src/agentic-guardian.js +6 -5
  154. package/dist/src/agentic-guardian.js.map +1 -1
  155. package/dist/src/atomic-replace.d.ts +0 -0
  156. package/dist/src/atomic-replace.d.ts.map +0 -0
  157. package/dist/src/atomic-replace.js +0 -0
  158. package/dist/src/atomic-replace.js.map +0 -0
  159. package/dist/src/cli.d.ts +0 -0
  160. package/dist/src/cli.d.ts.map +1 -1
  161. package/dist/src/cli.js +96 -13
  162. package/dist/src/cli.js.map +1 -1
  163. package/dist/src/config.d.ts +15 -0
  164. package/dist/src/config.d.ts.map +1 -1
  165. package/dist/src/config.js +105 -4
  166. package/dist/src/config.js.map +1 -1
  167. package/dist/src/connection-config.d.ts +3 -0
  168. package/dist/src/connection-config.d.ts.map +1 -0
  169. package/dist/src/connection-config.js +29 -0
  170. package/dist/src/connection-config.js.map +1 -0
  171. package/dist/src/content-redaction.d.ts +3 -0
  172. package/dist/src/content-redaction.d.ts.map +1 -0
  173. package/dist/src/content-redaction.js +19 -0
  174. package/dist/src/content-redaction.js.map +1 -0
  175. package/dist/src/credential-store.d.ts +1 -0
  176. package/dist/src/credential-store.d.ts.map +1 -1
  177. package/dist/src/credential-store.js +13 -2
  178. package/dist/src/credential-store.js.map +1 -1
  179. package/dist/src/custom-agent-registry.d.ts +0 -0
  180. package/dist/src/custom-agent-registry.d.ts.map +1 -1
  181. package/dist/src/custom-agent-registry.js +2 -1
  182. package/dist/src/custom-agent-registry.js.map +1 -1
  183. package/dist/src/discovery/adapters/claude.d.ts +0 -0
  184. package/dist/src/discovery/adapters/claude.d.ts.map +0 -0
  185. package/dist/src/discovery/adapters/claude.js +0 -0
  186. package/dist/src/discovery/adapters/claude.js.map +0 -0
  187. package/dist/src/discovery/adapters/codex.d.ts +0 -0
  188. package/dist/src/discovery/adapters/codex.d.ts.map +0 -0
  189. package/dist/src/discovery/adapters/codex.js +0 -0
  190. package/dist/src/discovery/adapters/codex.js.map +0 -0
  191. package/dist/src/discovery/adapters/custom.d.ts +0 -0
  192. package/dist/src/discovery/adapters/custom.d.ts.map +0 -0
  193. package/dist/src/discovery/adapters/custom.js +0 -0
  194. package/dist/src/discovery/adapters/custom.js.map +0 -0
  195. package/dist/src/discovery/adapters/generic.d.ts +0 -0
  196. package/dist/src/discovery/adapters/generic.d.ts.map +1 -1
  197. package/dist/src/discovery/adapters/generic.js +160 -2
  198. package/dist/src/discovery/adapters/generic.js.map +1 -1
  199. package/dist/src/discovery/adapters/hermes.d.ts +0 -0
  200. package/dist/src/discovery/adapters/hermes.d.ts.map +0 -0
  201. package/dist/src/discovery/adapters/hermes.js +0 -0
  202. package/dist/src/discovery/adapters/hermes.js.map +0 -0
  203. package/dist/src/discovery/adapters/openclaw.d.ts +0 -0
  204. package/dist/src/discovery/adapters/openclaw.d.ts.map +0 -0
  205. package/dist/src/discovery/adapters/openclaw.js +0 -0
  206. package/dist/src/discovery/adapters/openclaw.js.map +0 -0
  207. package/dist/src/discovery/engine.d.ts +7 -1
  208. package/dist/src/discovery/engine.d.ts.map +1 -1
  209. package/dist/src/discovery/engine.js +20 -5
  210. package/dist/src/discovery/engine.js.map +1 -1
  211. package/dist/src/discovery/evidence.d.ts +0 -0
  212. package/dist/src/discovery/evidence.d.ts.map +0 -0
  213. package/dist/src/discovery/evidence.js +0 -0
  214. package/dist/src/discovery/evidence.js.map +0 -0
  215. package/dist/src/discovery/index.d.ts +0 -0
  216. package/dist/src/discovery/index.d.ts.map +0 -0
  217. package/dist/src/discovery/index.js +0 -0
  218. package/dist/src/discovery/index.js.map +0 -0
  219. package/dist/src/discovery/known-agent.d.ts +7 -0
  220. package/dist/src/discovery/known-agent.d.ts.map +1 -1
  221. package/dist/src/discovery/known-agent.js +9 -4
  222. package/dist/src/discovery/known-agent.js.map +1 -1
  223. package/dist/src/discovery/process-identity.d.ts +0 -0
  224. package/dist/src/discovery/process-identity.d.ts.map +0 -0
  225. package/dist/src/discovery/process-identity.js +0 -0
  226. package/dist/src/discovery/process-identity.js.map +0 -0
  227. package/dist/src/discovery/system-evidence.d.ts +40 -1
  228. package/dist/src/discovery/system-evidence.d.ts.map +1 -1
  229. package/dist/src/discovery/system-evidence.js +189 -16
  230. package/dist/src/discovery/system-evidence.js.map +1 -1
  231. package/dist/src/discovery/types.d.ts +0 -0
  232. package/dist/src/discovery/types.d.ts.map +0 -0
  233. package/dist/src/discovery/types.js +0 -0
  234. package/dist/src/discovery/types.js.map +0 -0
  235. package/dist/src/event-queue.d.ts +0 -0
  236. package/dist/src/event-queue.d.ts.map +1 -1
  237. package/dist/src/event-queue.js +88 -38
  238. package/dist/src/event-queue.js.map +1 -1
  239. package/dist/src/event-spool.d.ts +0 -0
  240. package/dist/src/event-spool.d.ts.map +1 -1
  241. package/dist/src/event-spool.js +58 -10
  242. package/dist/src/event-spool.js.map +1 -1
  243. package/dist/src/generated/phigon/v1/action_pb.d.ts +0 -0
  244. package/dist/src/generated/phigon/v1/action_pb.d.ts.map +1 -1
  245. package/dist/src/generated/phigon/v1/action_pb.js +1 -1
  246. package/dist/src/generated/phigon/v1/action_pb.js.map +1 -1
  247. package/dist/src/generated/phigon/v1/common_pb.d.ts +0 -0
  248. package/dist/src/generated/phigon/v1/common_pb.d.ts.map +1 -1
  249. package/dist/src/generated/phigon/v1/common_pb.js +1 -1
  250. package/dist/src/generated/phigon/v1/common_pb.js.map +1 -1
  251. package/dist/src/generated/phigon/v1/history_sync_pb.d.ts +0 -0
  252. package/dist/src/generated/phigon/v1/history_sync_pb.d.ts.map +1 -1
  253. package/dist/src/generated/phigon/v1/history_sync_pb.js +1 -1
  254. package/dist/src/generated/phigon/v1/history_sync_pb.js.map +1 -1
  255. package/dist/src/generated/phigon/v1/identity_pb.d.ts +0 -0
  256. package/dist/src/generated/phigon/v1/identity_pb.d.ts.map +1 -1
  257. package/dist/src/generated/phigon/v1/identity_pb.js +1 -1
  258. package/dist/src/generated/phigon/v1/identity_pb.js.map +1 -1
  259. package/dist/src/generated/phigon/v1/observer_service_pb.d.ts +0 -0
  260. package/dist/src/generated/phigon/v1/observer_service_pb.d.ts.map +1 -1
  261. package/dist/src/generated/phigon/v1/observer_service_pb.js +1 -1
  262. package/dist/src/generated/phigon/v1/observer_service_pb.js.map +1 -1
  263. package/dist/src/generated/phigon/v1/policy_pb.d.ts +0 -0
  264. package/dist/src/generated/phigon/v1/policy_pb.d.ts.map +1 -1
  265. package/dist/src/generated/phigon/v1/policy_pb.js +1 -1
  266. package/dist/src/generated/phigon/v1/policy_pb.js.map +1 -1
  267. package/dist/src/generated/phigon/v1/supervision_pb.d.ts +0 -0
  268. package/dist/src/generated/phigon/v1/supervision_pb.d.ts.map +1 -1
  269. package/dist/src/generated/phigon/v1/supervision_pb.js +1 -1
  270. package/dist/src/generated/phigon/v1/supervision_pb.js.map +1 -1
  271. package/dist/src/generated/phigon/v1/telemetry_pb.d.ts +0 -0
  272. package/dist/src/generated/phigon/v1/telemetry_pb.d.ts.map +1 -1
  273. package/dist/src/generated/phigon/v1/telemetry_pb.js +1 -1
  274. package/dist/src/generated/phigon/v1/telemetry_pb.js.map +1 -1
  275. package/dist/src/guardian-containment.d.ts +2 -6
  276. package/dist/src/guardian-containment.d.ts.map +1 -1
  277. package/dist/src/guardian-containment.js +12 -63
  278. package/dist/src/guardian-containment.js.map +1 -1
  279. package/dist/src/guardian-decision-journal.d.ts +0 -0
  280. package/dist/src/guardian-decision-journal.d.ts.map +1 -1
  281. package/dist/src/guardian-decision-journal.js +2 -1
  282. package/dist/src/guardian-decision-journal.js.map +1 -1
  283. package/dist/src/guardian-execution-manifest.d.ts +0 -0
  284. package/dist/src/guardian-execution-manifest.d.ts.map +0 -0
  285. package/dist/src/guardian-execution-manifest.js +0 -0
  286. package/dist/src/guardian-execution-manifest.js.map +0 -0
  287. package/dist/src/guardian-hosted-client.d.ts +0 -0
  288. package/dist/src/guardian-hosted-client.d.ts.map +0 -0
  289. package/dist/src/guardian-hosted-client.js +0 -0
  290. package/dist/src/guardian-hosted-client.js.map +0 -0
  291. package/dist/src/guardian-managed-exec.d.ts +0 -0
  292. package/dist/src/guardian-managed-exec.d.ts.map +1 -1
  293. package/dist/src/guardian-managed-exec.js +2 -1
  294. package/dist/src/guardian-managed-exec.js.map +1 -1
  295. package/dist/src/guardian-model-bridge.d.ts +0 -0
  296. package/dist/src/guardian-model-bridge.d.ts.map +1 -1
  297. package/dist/src/guardian-model-bridge.js +2 -1
  298. package/dist/src/guardian-model-bridge.js.map +1 -1
  299. package/dist/src/guardian-native.d.ts +0 -1
  300. package/dist/src/guardian-native.d.ts.map +1 -1
  301. package/dist/src/guardian-native.js +0 -6
  302. package/dist/src/guardian-native.js.map +1 -1
  303. package/dist/src/guardian-process-monitor.d.ts +6 -1
  304. package/dist/src/guardian-process-monitor.d.ts.map +1 -1
  305. package/dist/src/guardian-process-monitor.js +64 -8
  306. package/dist/src/guardian-process-monitor.js.map +1 -1
  307. package/dist/src/health.d.ts +0 -0
  308. package/dist/src/health.d.ts.map +0 -0
  309. package/dist/src/health.js +0 -0
  310. package/dist/src/health.js.map +0 -0
  311. package/dist/src/historical-identity-store.d.ts +0 -0
  312. package/dist/src/historical-identity-store.d.ts.map +1 -1
  313. package/dist/src/historical-identity-store.js +2 -1
  314. package/dist/src/historical-identity-store.js.map +1 -1
  315. package/dist/src/index.d.ts +0 -0
  316. package/dist/src/index.d.ts.map +0 -0
  317. package/dist/src/index.js +0 -0
  318. package/dist/src/index.js.map +0 -0
  319. package/dist/src/installation.d.ts +0 -0
  320. package/dist/src/installation.d.ts.map +1 -1
  321. package/dist/src/installation.js +3 -2
  322. package/dist/src/installation.js.map +1 -1
  323. package/dist/src/machine-command-executor.d.ts +26 -7
  324. package/dist/src/machine-command-executor.d.ts.map +1 -1
  325. package/dist/src/machine-command-executor.js +123 -21
  326. package/dist/src/machine-command-executor.js.map +1 -1
  327. package/dist/src/pair.d.ts +0 -0
  328. package/dist/src/pair.d.ts.map +1 -1
  329. package/dist/src/pair.js +13 -3
  330. package/dist/src/pair.js.map +1 -1
  331. package/dist/src/private-directory.d.ts +4 -0
  332. package/dist/src/private-directory.d.ts.map +1 -0
  333. package/dist/src/private-directory.js +35 -0
  334. package/dist/src/private-directory.js.map +1 -0
  335. package/dist/src/process-tree.d.ts +73 -0
  336. package/dist/src/process-tree.d.ts.map +1 -0
  337. package/dist/src/process-tree.js +256 -0
  338. package/dist/src/process-tree.js.map +1 -0
  339. package/dist/src/remove-machine.d.ts +0 -0
  340. package/dist/src/remove-machine.d.ts.map +0 -0
  341. package/dist/src/remove-machine.js +0 -0
  342. package/dist/src/remove-machine.js.map +0 -0
  343. package/dist/src/server-authority.d.ts +26 -0
  344. package/dist/src/server-authority.d.ts.map +1 -0
  345. package/dist/src/server-authority.js +102 -0
  346. package/dist/src/server-authority.js.map +1 -0
  347. package/dist/src/stream-client.d.ts +6 -2
  348. package/dist/src/stream-client.d.ts.map +1 -1
  349. package/dist/src/stream-client.js +95 -16
  350. package/dist/src/stream-client.js.map +1 -1
  351. package/dist/src/stream-state.d.ts +0 -0
  352. package/dist/src/stream-state.d.ts.map +1 -1
  353. package/dist/src/stream-state.js +2 -1
  354. package/dist/src/stream-state.js.map +1 -1
  355. package/dist/src/system-inspection.d.ts +78 -0
  356. package/dist/src/system-inspection.d.ts.map +1 -0
  357. package/dist/src/system-inspection.js +281 -0
  358. package/dist/src/system-inspection.js.map +1 -0
  359. package/dist/src/update.d.ts +15 -0
  360. package/dist/src/update.d.ts.map +1 -0
  361. package/dist/src/update.js +93 -0
  362. package/dist/src/update.js.map +1 -0
  363. package/dist/src/user-notices.d.ts +53 -0
  364. package/dist/src/user-notices.d.ts.map +1 -0
  365. package/dist/src/user-notices.js +117 -0
  366. package/dist/src/user-notices.js.map +1 -0
  367. package/package.json +83 -78
  368. package/scripts/install.mjs +306 -306
  369. package/scripts/managed-service.mjs +0 -0
  370. package/scripts/verify-guardian-release.mjs +0 -0
  371. package/scripts/windows-app-control.mjs +0 -0
  372. package/dist/src/windows-process.d.ts +0 -7
  373. package/dist/src/windows-process.d.ts.map +0 -1
  374. package/dist/src/windows-process.js +0 -18
  375. package/dist/src/windows-process.js.map +0 -1
@@ -0,0 +1,78 @@
1
+ /**
2
+ * inspect_system report. Every field from the first version keeps its name
3
+ * and meaning (the desktop parses them). New facts are bounded and contain no
4
+ * file contents, environment values, command lines or user names.
5
+ */
6
+ export type SystemInspection = {
7
+ hostname: string;
8
+ platform: string;
9
+ release: string;
10
+ logical_cpus: number;
11
+ memory_bytes: number;
12
+ free_memory_bytes: number;
13
+ uptime_seconds: number;
14
+ observed_at: string;
15
+ observer_version: string;
16
+ architecture: string;
17
+ cpu_model: string | null;
18
+ /** Share of all logical processors busy during the sample window, 0-100. */
19
+ cpu_load_percent: number | null;
20
+ /** 1, 5 and 15 minute run-queue averages; Windows has none. */
21
+ load_average: [number, number, number] | null;
22
+ sample_window_ms: number;
23
+ disk_path: string;
24
+ disk_total_bytes: number | null;
25
+ /** Space the observer's account can still use. */
26
+ disk_free_bytes: number | null;
27
+ agents: InspectedAgent[];
28
+ /** False when discovery or measurement was partial, timed out or unavailable. */
29
+ agents_complete: boolean;
30
+ /** Running agents left out to keep the report short (busiest are kept). */
31
+ agents_omitted: number;
32
+ };
33
+ export type InspectedAgent = {
34
+ name: string;
35
+ process_id: number;
36
+ /** Share of the whole machine's CPU during the sample window, 0-100. */
37
+ cpu_percent: number | null;
38
+ /** Resident memory (Windows working set). */
39
+ memory_bytes: number | null;
40
+ run_time_seconds: number;
41
+ };
42
+ export type RunningAgent = Readonly<{
43
+ name: string;
44
+ processId: number;
45
+ startedAt: Date;
46
+ }>;
47
+ export type RunningAgents = Readonly<{
48
+ agents: readonly RunningAgent[];
49
+ complete: boolean;
50
+ }>;
51
+ /** One reading of cumulative CPU time and memory for a process. */
52
+ export type ProcessReading = Readonly<{
53
+ startedAt: number | null;
54
+ cpuMs: number | null;
55
+ memoryBytes: number | null;
56
+ }>;
57
+ export type ProcessSample = Readonly<{
58
+ before: ReadonlyMap<number, ProcessReading>;
59
+ after: ReadonlyMap<number, ProcessReading>;
60
+ elapsedMs: number;
61
+ }>;
62
+ export type ProcessSampler = (processIds: readonly number[], windowMs: number) => Promise<ProcessSample>;
63
+ export declare function inspectSystem(options?: Readonly<{
64
+ agents?: () => Promise<RunningAgents>;
65
+ sampler?: ProcessSampler;
66
+ observerVersion?: string;
67
+ windowMs?: number;
68
+ now?: () => number;
69
+ }>): Promise<SystemInspection>;
70
+ /** Compact enough for the 4,000 characters Cortex reads, still readable as JSON. */
71
+ export declare function formatInspection(report: SystemInspection): string;
72
+ export declare function defaultProcessSampler(target?: NodeJS.Platform): ProcessSampler;
73
+ export declare function parseWindowsSample(stdout: string): ProcessSample;
74
+ export declare function parseLinuxProcess(stat: string, status: string, bootSeconds: number): ProcessReading | null;
75
+ export declare function parsePsSample(stdout: string): Map<number, ProcessReading>;
76
+ /** "[[dd-]hh:]mm:ss[.cc]" as printed by ps. */
77
+ export declare function parseCpuTime(value: string): number | null;
78
+ //# sourceMappingURL=system-inspection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-inspection.d.ts","sourceRoot":"","sources":["../../src/system-inspection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,281 @@
1
+ import { execFile } from "node:child_process";
2
+ import { readFile, statfs } from "node:fs/promises";
3
+ import { arch, cpus, freemem, hostname, loadavg, platform, release, totalmem, uptime } from "node:os";
4
+ const maxAgents = 20;
5
+ const sampleWindowMs = 500;
6
+ const agentListTimeoutMs = 15_000;
7
+ const sampleTimeoutMs = 10_000;
8
+ const diskTimeoutMs = 2_000;
9
+ export async function inspectSystem(options = {}) {
10
+ const now = options.now ?? Date.now;
11
+ const windowMs = options.windowMs ?? sampleWindowMs;
12
+ const logicalCpus = Math.max(1, cpus().length);
13
+ const diskPath = mainDiskPath();
14
+ // The machine-wide CPU window runs before discovery or sampling starts, so
15
+ // the observer's own work does not inflate it.
16
+ const [cpuLoad, disk, version] = await Promise.all([
17
+ machineCpuLoad(windowMs),
18
+ withTimeout(statfs(diskPath), diskTimeoutMs).then((stats) => ({ total: stats.blocks * stats.bsize, free: stats.bavail * stats.bsize }), () => null),
19
+ options.observerVersion === undefined ? readObserverVersion() : Promise.resolve(options.observerVersion),
20
+ ]);
21
+ const measured = await measureAgents(options.agents, options.sampler ?? defaultProcessSampler(), windowMs, logicalCpus, now);
22
+ const model = cpus()[0]?.model.trim().replace(/\s+/gu, " ").slice(0, 128);
23
+ return {
24
+ hostname: hostname(),
25
+ platform: platform(),
26
+ release: release(),
27
+ logical_cpus: cpus().length,
28
+ memory_bytes: totalmem(),
29
+ free_memory_bytes: freemem(),
30
+ uptime_seconds: Math.floor(uptime()),
31
+ observed_at: new Date(now()).toISOString(),
32
+ observer_version: version,
33
+ architecture: arch(),
34
+ cpu_model: model ? model : null,
35
+ cpu_load_percent: cpuLoad,
36
+ load_average: platform() === "win32" ? null : loadavg().map((value) => round(value, 2)),
37
+ sample_window_ms: windowMs,
38
+ disk_path: diskPath,
39
+ disk_total_bytes: disk?.total ?? null,
40
+ disk_free_bytes: disk?.free ?? null,
41
+ agents: measured.agents,
42
+ agents_complete: measured.complete,
43
+ agents_omitted: measured.omitted,
44
+ };
45
+ }
46
+ /** Compact enough for the 4,000 characters Cortex reads, still readable as JSON. */
47
+ export function formatInspection(report) {
48
+ const lines = Object.entries(report).map(([key, value]) => key === "agents" && Array.isArray(value) && value.length > 0
49
+ ? ` ${JSON.stringify(key)}: [\n${value.map((agent) => ` ${JSON.stringify(agent)}`).join(",\n")}\n ]`
50
+ : ` ${JSON.stringify(key)}: ${JSON.stringify(value)}`);
51
+ return `{\n${lines.join(",\n")}\n}`;
52
+ }
53
+ async function measureAgents(list, sampler, windowMs, logicalCpus, now) {
54
+ if (list === undefined)
55
+ return { agents: [], complete: false, omitted: 0 };
56
+ let running;
57
+ try {
58
+ running = await withTimeout(list(), agentListTimeoutMs);
59
+ }
60
+ catch {
61
+ return { agents: [], complete: false, omitted: 0 };
62
+ }
63
+ const candidates = running.agents.filter((agent) => Number.isSafeInteger(agent.processId) && agent.processId > 0).slice(0, 256);
64
+ if (candidates.length === 0)
65
+ return { agents: [], complete: running.complete, omitted: 0 };
66
+ let sample;
67
+ try {
68
+ sample = await withTimeout(sampler(candidates.map((agent) => agent.processId), windowMs), sampleTimeoutMs);
69
+ }
70
+ catch {
71
+ sample = undefined;
72
+ }
73
+ const measured = [];
74
+ let complete = running.complete && sample !== undefined;
75
+ for (const agent of candidates) {
76
+ const before = sample?.before.get(agent.processId);
77
+ const after = sample?.after.get(agent.processId);
78
+ const startedAt = agent.startedAt.getTime();
79
+ if (sample !== undefined) {
80
+ // Gone, or the PID now belongs to another process: not a running agent.
81
+ if (after === undefined)
82
+ continue;
83
+ if (after.startedAt !== null && Math.abs(after.startedAt - startedAt) >= 1_000)
84
+ continue;
85
+ }
86
+ const cpuDelta = before?.cpuMs != null && after?.cpuMs != null && sample !== undefined && sample.elapsedMs > 0
87
+ ? Math.max(0, after.cpuMs - before.cpuMs) / (sample.elapsedMs * logicalCpus) * 100
88
+ : null;
89
+ if (sample !== undefined && (cpuDelta === null || after?.memoryBytes == null))
90
+ complete = false;
91
+ measured.push({
92
+ name: agent.name.replace(/[\u0000-\u001f\u007f]/gu, " ").trim().slice(0, 64) || "Unnamed agent",
93
+ process_id: agent.processId,
94
+ cpu_percent: cpuDelta === null ? null : round(Math.min(100, cpuDelta), 1),
95
+ memory_bytes: after?.memoryBytes ?? null,
96
+ run_time_seconds: Math.max(0, Math.floor((now() - startedAt) / 1_000)),
97
+ });
98
+ }
99
+ measured.sort((left, right) => (right.cpu_percent ?? -1) - (left.cpu_percent ?? -1) ||
100
+ (right.memory_bytes ?? -1) - (left.memory_bytes ?? -1) || left.process_id - right.process_id);
101
+ return { agents: measured.slice(0, maxAgents), complete, omitted: Math.max(0, measured.length - maxAgents) };
102
+ }
103
+ async function machineCpuLoad(windowMs) {
104
+ const before = cpuTotals(cpus());
105
+ await new Promise((resolve) => setTimeout(resolve, windowMs));
106
+ const after = cpuTotals(cpus());
107
+ const total = after.total - before.total;
108
+ if (!(total > 0))
109
+ return null;
110
+ return round(Math.min(100, Math.max(0, (total - (after.idle - before.idle)) / total * 100)), 1);
111
+ }
112
+ function cpuTotals(processors) {
113
+ let total = 0;
114
+ let idle = 0;
115
+ for (const { times } of processors) {
116
+ total += times.user + times.nice + times.sys + times.idle + times.irq;
117
+ idle += times.idle;
118
+ }
119
+ return { total, idle };
120
+ }
121
+ function mainDiskPath() {
122
+ if (platform() !== "win32")
123
+ return "/";
124
+ const drive = process.env["SystemDrive"] ?? "C:";
125
+ return /^[A-Za-z]:$/u.test(drive) ? `${drive.toUpperCase()}\\` : "C:\\";
126
+ }
127
+ async function readObserverVersion() {
128
+ try {
129
+ const value = JSON.parse(await readFile(new URL("../../package.json", import.meta.url), "utf8"));
130
+ const version = value !== null && typeof value === "object" && "version" in value ? value.version : undefined;
131
+ return typeof version === "string" && /^[0-9A-Za-z.+-]{1,64}$/u.test(version) ? version : "unknown";
132
+ }
133
+ catch {
134
+ return "unknown";
135
+ }
136
+ }
137
+ function round(value, digits) {
138
+ const scale = 10 ** digits;
139
+ return Math.round(value * scale) / scale;
140
+ }
141
+ function withTimeout(work, milliseconds) {
142
+ return new Promise((resolve, reject) => {
143
+ const timer = setTimeout(() => reject(new Error("timeout")), milliseconds);
144
+ work.then((value) => { clearTimeout(timer); resolve(value); }, (error) => { clearTimeout(timer); reject(error instanceof Error ? error : new Error("failed")); });
145
+ });
146
+ }
147
+ export function defaultProcessSampler(target = process.platform) {
148
+ if (target === "win32")
149
+ return sampleWindowsProcesses;
150
+ if (target === "linux")
151
+ return sampleLinuxProcesses;
152
+ return samplePsProcesses;
153
+ }
154
+ // Windows: one PowerShell call takes both readings, so its own start-up cost
155
+ // falls outside the measured window.
156
+ async function sampleWindowsProcesses(processIds, windowMs) {
157
+ const ids = processIds.filter((id) => Number.isSafeInteger(id) && id > 0).join(",");
158
+ const script = [
159
+ `$ids = @(${ids})`,
160
+ "function Read-Agents { foreach ($p in @(Get-Process -Id $ids -ErrorAction SilentlyContinue)) {",
161
+ " $s = $null; $c = $null",
162
+ " try { $s = $p.StartTime.ToUniversalTime().ToString('o') } catch {}",
163
+ " try { $c = $p.TotalProcessorTime.TotalMilliseconds } catch {}",
164
+ " [pscustomobject]@{ i = $p.Id; s = $s; c = $c; m = $p.WorkingSet64 } } }",
165
+ "$w = [Diagnostics.Stopwatch]::StartNew(); $a = @(Read-Agents)",
166
+ `Start-Sleep -Milliseconds ${Math.max(50, Math.min(5_000, Math.floor(windowMs)))}`,
167
+ "$e = $w.Elapsed.TotalMilliseconds; $b = @(Read-Agents)",
168
+ "ConvertTo-Json -Compress -Depth 3 -InputObject @{ a = $a; b = $b; e = $e }",
169
+ ].join("\n");
170
+ const stdout = await run("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", script], {});
171
+ return parseWindowsSample(stdout);
172
+ }
173
+ export function parseWindowsSample(stdout) {
174
+ const value = JSON.parse(stdout);
175
+ const readings = (entries) => {
176
+ const map = new Map();
177
+ for (const entry of Array.isArray(entries) ? entries : entries === undefined || entries === null ? [] : [entries]) {
178
+ if (entry === null || typeof entry !== "object")
179
+ continue;
180
+ const item = entry;
181
+ if (typeof item["i"] !== "number" || !Number.isSafeInteger(item["i"]))
182
+ continue;
183
+ const startedAt = typeof item["s"] === "string" ? Date.parse(item["s"]) : Number.NaN;
184
+ map.set(item["i"], {
185
+ startedAt: Number.isFinite(startedAt) ? startedAt : null,
186
+ cpuMs: finiteOrNull(item["c"]),
187
+ memoryBytes: finiteOrNull(item["m"]),
188
+ });
189
+ }
190
+ return map;
191
+ };
192
+ return { before: readings(value.a), after: readings(value.b), elapsedMs: finiteOrNull(value.e) ?? 0 };
193
+ }
194
+ // Linux: /proc gives CPU time in clock ticks (USER_HZ, 100 on Linux) and
195
+ // the start time relative to boot.
196
+ async function sampleLinuxProcesses(processIds, windowMs) {
197
+ const bootSeconds = Number(/^btime\s+(\d+)$/mu.exec(await readFile("/proc/stat", "utf8"))?.[1]);
198
+ const read = async () => {
199
+ const readings = new Map();
200
+ await Promise.all(processIds.map(async (processId) => {
201
+ try {
202
+ const [stat, status] = await Promise.all([
203
+ readFile(`/proc/${processId}/stat`, "utf8"),
204
+ readFile(`/proc/${processId}/status`, "utf8"),
205
+ ]);
206
+ const reading = parseLinuxProcess(stat, status, bootSeconds);
207
+ if (reading !== null)
208
+ readings.set(processId, reading);
209
+ }
210
+ catch { /* exited or not visible */ }
211
+ }));
212
+ return readings;
213
+ };
214
+ const started = performance.now();
215
+ const before = await read();
216
+ await new Promise((resolve) => setTimeout(resolve, windowMs));
217
+ const elapsedMs = performance.now() - started;
218
+ return { before, after: await read(), elapsedMs };
219
+ }
220
+ export function parseLinuxProcess(stat, status, bootSeconds) {
221
+ // The command name may contain spaces and parentheses; fields follow the last ")".
222
+ const fields = stat.slice(stat.lastIndexOf(")") + 2).split(" ");
223
+ if (fields.length < 20 || fields[0] === "Z")
224
+ return null;
225
+ const ticks = Number(fields[11]) + Number(fields[12]);
226
+ const startTicks = Number(fields[19]);
227
+ const rssKiB = Number(/^VmRSS:\s+(\d+)\s+kB$/mu.exec(status)?.[1]);
228
+ return {
229
+ startedAt: Number.isFinite(bootSeconds) && Number.isFinite(startTicks) ? bootSeconds * 1_000 + startTicks * 10 : null,
230
+ cpuMs: Number.isFinite(ticks) ? ticks * 10 : null,
231
+ memoryBytes: Number.isFinite(rssKiB) ? rssKiB * 1_024 : null,
232
+ };
233
+ }
234
+ // macOS and other Unix systems: two ps readings.
235
+ async function samplePsProcesses(processIds, windowMs) {
236
+ const read = async () => parsePsSample(await run("ps", ["-o", "pid=,rss=,time=,lstart=", "-p", processIds.join(",")], { LANG: "C", LC_ALL: "C" }, true));
237
+ const started = performance.now();
238
+ const before = await read();
239
+ await new Promise((resolve) => setTimeout(resolve, windowMs));
240
+ const elapsedMs = performance.now() - started;
241
+ return { before, after: await read(), elapsedMs };
242
+ }
243
+ export function parsePsSample(stdout) {
244
+ const readings = new Map();
245
+ for (const line of stdout.split(/\r?\n/u)) {
246
+ const match = /^\s*(\d+)\s+(\d+)\s+(\S+)\s+(\S+\s+\S+\s+\d{1,2}\s+\d{2}:\d{2}:\d{2}\s+\d{4})\s*$/u.exec(line);
247
+ if (match === null)
248
+ continue;
249
+ const startedAt = Date.parse(match[4]);
250
+ readings.set(Number(match[1]), {
251
+ startedAt: Number.isFinite(startedAt) ? startedAt : null,
252
+ cpuMs: parseCpuTime(match[3]),
253
+ memoryBytes: Number(match[2]) * 1_024,
254
+ });
255
+ }
256
+ return readings;
257
+ }
258
+ /** "[[dd-]hh:]mm:ss[.cc]" as printed by ps. */
259
+ export function parseCpuTime(value) {
260
+ const match = /^(?:(\d+)-)?(?:(\d+):)?(\d+):(\d+(?:\.\d+)?)$/u.exec(value);
261
+ if (match === null)
262
+ return null;
263
+ const [days, hours, minutes, seconds] = [match[1], match[2], match[3], match[4]].map((part) => Number(part ?? 0));
264
+ return Math.round((((days * 24 + hours) * 60 + minutes) * 60 + seconds) * 1_000);
265
+ }
266
+ function run(file, args, environment, allowExitOne = false) {
267
+ return new Promise((resolve, reject) => execFile(file, args, {
268
+ timeout: sampleTimeoutMs, maxBuffer: 1 << 20, encoding: "utf8", windowsHide: true,
269
+ env: { ...process.env, ...environment },
270
+ }, (error, stdout) => {
271
+ // ps exits 1 when some of the listed processes have already exited.
272
+ if (error === null || (allowExitOne && error.code === 1))
273
+ resolve(stdout);
274
+ else
275
+ reject(error);
276
+ }));
277
+ }
278
+ function finiteOrNull(value) {
279
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
280
+ }
281
+ //# sourceMappingURL=system-inspection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-inspection.js","sourceRoot":"","sources":["../../src/system-inspection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare function newerVersion(current: string, latest: string): boolean;
2
+ export declare function latestObserverVersion(directory: string, options?: {
3
+ force?: boolean;
4
+ fetcher?: typeof fetch;
5
+ now?: number;
6
+ }): Promise<string | null>;
7
+ export declare function installObserverUpdate(version: string): Promise<void>;
8
+ export declare function offerObserverUpdate(options: {
9
+ current: string;
10
+ latest: string | null;
11
+ confirm: () => Promise<string>;
12
+ write: (message: string) => void;
13
+ install?: (version: string) => Promise<void>;
14
+ }): Promise<boolean>;
15
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/update.ts"],"names":[],"mappings":"AAQA,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAQrE;AAED,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE;IACtE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CAClD,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAoC9B;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY1E;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IACjD,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACvE,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChF,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnB"}
@@ -0,0 +1,93 @@
1
+ import { spawn } from "node:child_process";
2
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ const versionPattern = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/u;
5
+ const cacheTTLms = 24 * 60 * 60 * 1000;
6
+ const failureRetryMs = 15 * 60 * 1000;
7
+ const registryURL = "https://registry.npmjs.org/@phigon%2fobserver/latest";
8
+ export function newerVersion(current, latest) {
9
+ if (!versionPattern.test(current) || !versionPattern.test(latest))
10
+ return false;
11
+ const before = current.split(".").map(Number);
12
+ const after = latest.split(".").map(Number);
13
+ for (let index = 0; index < 3; index++) {
14
+ if (after[index] !== before[index])
15
+ return after[index] > before[index];
16
+ }
17
+ return false;
18
+ }
19
+ export async function latestObserverVersion(directory, options = {}) {
20
+ const now = options.now ?? Date.now();
21
+ const cachePath = join(directory, "update-check.json");
22
+ if (!options.force) {
23
+ try {
24
+ const cache = JSON.parse(await readFile(cachePath, "utf8"));
25
+ if (typeof cache.checkedAt === "number" && now >= cache.checkedAt && now - cache.checkedAt < cacheTTLms &&
26
+ (cache.version === null || (typeof cache.version === "string" && versionPattern.test(cache.version))))
27
+ return cache.version;
28
+ }
29
+ catch { /* Missing or malformed cache is safe to replace. */ }
30
+ }
31
+ let version = null;
32
+ let checked = false;
33
+ try {
34
+ const response = await (options.fetcher ?? fetch)(registryURL, { signal: AbortSignal.timeout(1500), redirect: "error", headers: { Accept: "application/json" } });
35
+ if (!response.ok || !response.body)
36
+ throw new Error("Registry unavailable.");
37
+ const reader = response.body.getReader();
38
+ const chunks = [];
39
+ let size = 0;
40
+ try {
41
+ while (true) {
42
+ const next = await reader.read();
43
+ if (next.done)
44
+ break;
45
+ size += next.value.byteLength;
46
+ if (size > 128 * 1024)
47
+ throw new Error("Registry metadata exceeds limit.");
48
+ chunks.push(next.value);
49
+ }
50
+ const value = JSON.parse(Buffer.concat(chunks).toString("utf8"));
51
+ if (value.name === "@phigon/observer" && typeof value.version === "string" && versionPattern.test(value.version)) {
52
+ version = value.version;
53
+ checked = true;
54
+ }
55
+ }
56
+ finally {
57
+ await reader.cancel().catch(() => undefined);
58
+ }
59
+ }
60
+ catch { /* Offline update checks must not block monitoring or pairing. */ }
61
+ try {
62
+ await mkdir(directory, { recursive: true, mode: 0o700 });
63
+ // A failed lookup is retried soon; only a real answer is cached for a day.
64
+ await writeFile(cachePath, JSON.stringify({ checkedAt: checked ? now : now - cacheTTLms + failureRetryMs, version }), { mode: 0o600 });
65
+ }
66
+ catch { /* A cache is optional. */ }
67
+ return version;
68
+ }
69
+ export async function installObserverUpdate(version) {
70
+ if (!versionPattern.test(version))
71
+ throw new Error("Invalid observer version.");
72
+ const args = ["install", "--global", `@phigon/observer@${version}`, "--registry=https://registry.npmjs.org"];
73
+ // cmd is needed for npm.cmd on Windows; every argument above is fixed or a
74
+ // validated numeric version. No caller-controlled shell syntax is accepted.
75
+ const command = process.platform === "win32" ? "cmd.exe" : "npm";
76
+ const commandArgs = process.platform === "win32" ? ["/d", "/s", "/c", `npm ${args.join(" ")}`] : args;
77
+ await new Promise((resolve, reject) => {
78
+ const child = spawn(command, commandArgs, { stdio: "inherit", windowsHide: true, shell: false });
79
+ child.once("error", () => reject(new Error("Could not start npm. Run npm install --global @phigon/observer manually.")));
80
+ child.once("exit", (code) => code === 0 ? resolve() : reject(new Error("Update failed. Check npm permissions and network access, then run npm install --global @phigon/observer. Your pairing data was not removed.")));
81
+ });
82
+ }
83
+ export async function offerObserverUpdate(options) {
84
+ if (!options.latest || !newerVersion(options.current, options.latest))
85
+ return false;
86
+ options.write(`A new Phigon observer version is available: ${options.current} → ${options.latest}.\nType "yes" to update, or press Enter to continue: `);
87
+ if ((await options.confirm()).trim().toLowerCase() !== "yes")
88
+ return false;
89
+ await (options.install ?? installObserverUpdate)(options.latest);
90
+ options.write("Observer updated. Run your command again. Restart the observer service if it is running; your pairing and queued activity are preserved.\n");
91
+ return true;
92
+ }
93
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /** What the person at this computer is told when Phigon acts on it. */
2
+ export type UserNotice = Readonly<{
3
+ title: string;
4
+ body: string;
5
+ }>;
6
+ export type NoticeSender = (notice: UserNotice) => Promise<void>;
7
+ /**
8
+ * Tells the person at this computer what Phigon did to it: an agent stopped,
9
+ * a command run, the computer about to restart. Notices are best effort: a
10
+ * computer with no desktop session, or an observer running as a service
11
+ * with no access to it, shows nothing, and a notice never affects the action.
12
+ */
13
+ export declare class UserNotices {
14
+ #private;
15
+ constructor(options: Readonly<{
16
+ enabled: boolean;
17
+ send?: NoticeSender;
18
+ now?: () => number;
19
+ }>);
20
+ /** An agent Phigon stopped, because someone asked or a rule said so. */
21
+ agentStopped(input: Readonly<{
22
+ key: string;
23
+ agent: string;
24
+ forced: boolean;
25
+ reason: string;
26
+ }>): void;
27
+ /** A blocked agent Phigon stopped as soon as it started. */
28
+ agentBlocked(input: Readonly<{
29
+ key: string;
30
+ agent: string;
31
+ reason: string;
32
+ }>): void;
33
+ commandRan(input: Readonly<{
34
+ key: string;
35
+ program: string;
36
+ reason: string;
37
+ }>): void;
38
+ powerChange(input: Readonly<{
39
+ key: string;
40
+ restart: boolean;
41
+ reason: string;
42
+ }>): void;
43
+ }
44
+ /** One line of plain text: no control characters, and bounded. */
45
+ export declare function plainText(value: string, limit: number): string;
46
+ /** The name people know an agent by: "Claude Code · PID 4120" is "Claude Code". */
47
+ export declare function noticeAgentName(displayName: string): string;
48
+ /**
49
+ * The operating system's own notification, shown without a shell. The text
50
+ * travels in environment variables, never in the command line or a script.
51
+ */
52
+ export declare function platformNoticeSender(platform?: NodeJS.Platform): NoticeSender | undefined;
53
+ //# sourceMappingURL=user-notices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-notices.d.ts","sourceRoot":"","sources":["../../src/user-notices.ts"],"names":[],"mappings":"AAGA,uEAAuE;AACvE,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEnE,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAKjE;;;;;GAKG;AACH,qBAAa,WAAW;;gBAKV,OAAO,EAAE,QAAQ,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,YAAY,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;KAAE,CAAC;IAK5F,wEAAwE;IACxE,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAOpG,4DAA4D;IAC5D,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAOnF,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAOnF,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;CAiBtF;AAED,kEAAkE;AAClE,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG9D;AAED,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,YAAY,GAAG,SAAS,CAiB3G"}