arisa 5.2.7 → 5.2.19

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 (65) hide show
  1. package/README.md +25 -4
  2. package/package.json +10 -9
  3. package/pnpm-workspace.yaml +7 -5
  4. package/src/core/agent/agent-manager.js +92 -18
  5. package/src/core/agent/agent-session-lifecycle.js +29 -6
  6. package/src/core/agent/agent-turn-coordinator.js +143 -0
  7. package/src/core/agent/auth-flow.js +6 -6
  8. package/src/core/agent/model-speed.js +3 -1
  9. package/src/core/agent/pi-auth-login.js +28 -28
  10. package/src/core/agent/pi-capability-tools.js +8 -4
  11. package/src/core/agent/pi-runtime.js +14 -21
  12. package/src/core/agent/session-history-reader.js +168 -0
  13. package/src/core/agent/session-preload-migration.js +162 -0
  14. package/src/core/agent/session-rotation.js +29 -0
  15. package/src/core/agent/worker-tool-fanout.js +117 -0
  16. package/src/core/capabilities/capability-service.js +28 -2
  17. package/src/core/config/config-defaults.js +29 -0
  18. package/src/core/tasks/task-runner.js +8 -4
  19. package/src/core/tasks/task-store.js +48 -4
  20. package/src/core/tools/daemon-processes.js +7 -0
  21. package/src/core/tools/memory-pressure.js +2 -2
  22. package/src/core/tools/tool-registry.js +35 -7
  23. package/src/core/tools/weighted-resource-governor.js +7 -6
  24. package/src/official-tools.lock.json +129 -48
  25. package/src/runtime/bootstrap-cli.js +3 -3
  26. package/src/runtime/bootstrap-telegram.js +7 -7
  27. package/src/runtime/doctor.js +20 -73
  28. package/src/runtime/obsolete-daemon-reaper.js +43 -0
  29. package/src/runtime/process-inspection.js +78 -0
  30. package/src/runtime/slave-cli.js +20 -10
  31. package/src/runtime/slave-service.js +299 -7
  32. package/src/runtime/tool-process-supervisor.js +35 -8
  33. package/src/runtime/tui.js +6 -7
  34. package/src/transport/telegram/bot.js +11 -5
  35. package/src/transport/telegram/chat-queue.js +6 -2
  36. package/src/transport/telegram/model-controls.js +1 -1
  37. package/src/transport/telegram/task-dispatcher.js +67 -15
  38. package/src/transport/telegram/telegram-auth-controller.js +7 -7
  39. package/src/transport/telegram/telegram-prompt-controller.js +17 -4
  40. package/src/transport/telegram/telegram-session-bridge.js +2 -1
  41. package/test/agent-turn-coordinator.test.js +48 -0
  42. package/test/auth-flow.test.js +2 -2
  43. package/test/capabilities-security.test.js +36 -0
  44. package/test/context-and-task-bounds.test.js +2 -1
  45. package/test/daemon-runtime.test.js +2 -4
  46. package/test/doctor.test.js +19 -0
  47. package/test/memory-pressure.test.js +7 -2
  48. package/test/model-selection.test.js +3 -2
  49. package/test/obsolete-daemon-reaper.test.js +61 -0
  50. package/test/official-tool-dependencies.test.js +7 -2
  51. package/test/official-tool-installer.test.js +13 -0
  52. package/test/pi-auth-login.test.js +78 -0
  53. package/test/pi-capability-tools.test.js +3 -0
  54. package/test/pi-compaction.test.js +21 -0
  55. package/test/pi-speed-integration.test.js +176 -0
  56. package/test/session-history-reader.test.js +84 -0
  57. package/test/session-preload-migration.test.js +120 -0
  58. package/test/session-rotation.test.js +110 -0
  59. package/test/slave-cli.test.js +221 -5
  60. package/test/task-store.test.js +34 -0
  61. package/test/telegram-prompt-controller.test.js +2 -1
  62. package/test/telegram-task-dispatcher.test.js +121 -5
  63. package/test/tool-registry-run.test.js +10 -1
  64. package/test/weighted-resource-governor.test.js +28 -0
  65. package/test/worker-tool-fanout.test.js +79 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 1,
3
3
  "repository": "https://github.com/clasen/Arisa.git",
4
- "commit": "545befe63a5e3dc99dbdc7c73de11d1301ad84a7",
4
+ "commit": "2256f9e19f26f23826b9a9062d3a9643b511bb3c",
5
5
  "tools": {
6
6
  "audio-extractor": {
7
7
  "version": null,
@@ -13,40 +13,55 @@
13
13
  }
14
14
  },
15
15
  "browser-session-bridge": {
16
- "version": "0.1.0",
16
+ "version": "0.2.5",
17
17
  "files": {
18
- "README.md": "fc2848472b48627838b757bf1a7be9564f31e483e8b673bd4ae95a11016f3309",
19
- "bridge-server.js": "87f5a392bc99fd97899836c0731b4694402b04d5dfbe88e66bb4f496bfef351d",
20
- "chrome-web-store.js": "a6bd9553f1490d5ccda3fe3044c30ee6fe243f422e69a5000bc844884e6d1e95",
18
+ "README.md": "79cb347ead539309429eca19ba6e9c472e4790ec1ab39a20bba71a4149f61f15",
19
+ "bridge-server.js": "03722a2657ba74bf34de9cae683b8f23242657da87c05771dd413a38fb446eca",
20
+ "chrome-web-store.js": "4b588d1288dee754c5d8afd609b8c1f67f73d23de7dda247b7a2ff8b68f7ef60",
21
21
  "config.js": "45c8e9e9a159b9125d6ea3458c616926c2ba2b5327fdfd750aa05316d3ce5af8",
22
22
  "extension/icons/icon-128.png": "a55af49bb570bd5471fc0a2e15a6bcaf3f76a2c5e7439f16bb1829682b343380",
23
23
  "extension/icons/icon-16.png": "a4aedb49e2227222a68dc56455812a9e17938fd197b1f30268f02d6c9f7bf95e",
24
24
  "extension/icons/icon-32.png": "2dfc9e6e7ec6b4e9feb9c1326d65116cda8e53306c65c84074c818c9e7f6a2a2",
25
25
  "extension/icons/icon-48.png": "2f316f1f2fbc72227e7e1f14cf1ff1553a12fc9aab139799f1ee2970c0303deb",
26
- "extension/manifest.json": "3e19d7b1c2a9521745b585fbbb3a6f4639d3056703fdbca17e8cd6dd80fc4c91",
27
- "extension/popup.css": "138811e3e96e9c7741f064f8cf017be75973cd0942efa9668e96a584b7b52c1c",
28
- "extension/popup.html": "9d7798efd04c57c534840a7966dd3818f9264022c52390f0fd1d462236a01d60",
29
- "extension/popup.js": "60ea83f17e5d87f072d27c6540b903361f70e03925c3727983cca6beba9696d3",
30
- "index.js": "4c92afffaec61910e3522f483535c760e8c660604158a23628d2807daa024934",
31
- "package-lock.json": "e1081b8b48c2eaaeca73c63e64902519b33e8822ce351a45afe8509224776c12",
32
- "package.json": "b54fad02442d9d09fb42d6c1fa01bb2e441e946babdf73dbc7e5767002a07b28",
33
- "session-browser.js": "d5544db5c6712327e76b8436cfabe02e34d8e043ff2d251c2c5ff3f00f1a9dd7",
34
- "session-store.js": "56b33e1a342ba148cb4443e03435e5c728db60903ecd0ae87c05fbff3ca881ab",
35
- "test/device-enrollment.test.js": "3dd36d37044eaf1043bd8b2e9f10ead9dc87479152a07237ab87d50146782f4c",
36
- "test/session-refresh.test.js": "8f5facb81444f0d09928d48f22e82112d47bde21927afcd7fd830ce6832b9f79",
37
- "tool.manifest.json": "40326de8bc08f2fd51ce51d4a20637b9af37de588d6cb97d27bc0b0d16304095",
38
- "web-store/listing.md": "914e7c38bc67e19f3afbea86288c0cbc49afcb8941f4734fd3f786c5533861e7",
39
- "web-store/privacy-policy.md": "c96e84f1a112e5949a3e7bd952fcf5ec794eaa5c4bee14a1dbe0c8e0f5888fb7"
26
+ "extension/manifest.json": "fbf3dd9fcb119eaaa2a0e43720096c19eb2d3ceca45ea5a893a00bfaa5b44452",
27
+ "extension/onboarding-state.js": "79f5601ac66686b0d371bbfa8c9e38e12fd23213f3ad309f8c9c6d55c1f856cb",
28
+ "extension/popup.css": "8044a298f91790d38c8e84823d10951baffcf823bee5c330f3f297db125a5726",
29
+ "extension/popup.html": "2f8590991f9941b50ad61d0a7563a0a073eae5a5e980251fe16e19fe86c7a94f",
30
+ "extension/popup.js": "cf4bb363403381590b872991642f38b98c0964fdd9c3df00b6ec3b40b90c9be9",
31
+ "extension/session-send-state.js": "ec574454825679d8d3eb1fc5692d9a9fcbf133f3d9ac3621648ad09e76ff4abc",
32
+ "extension/site-permissions.js": "83f9aa4d0295318fc730bd561c2db9d1aacf36152319090e99d12f62deea11ad",
33
+ "index.js": "c01a6b825da4587a550ecec560a558cc6736200e73b6831f5919000c7b81679d",
34
+ "lightpanda-session.js": "57c713dafac531617d7285122b2098c1e0b2f334e43144632f2b1fc79405f789",
35
+ "package-lock.json": "b97f5a333df234fecde788d0f90b620d39e02fee6079c1b4347baaabd8010b1b",
36
+ "package.json": "5c9edd6155b6b4868cc87d474e808dfc23567bc312e0d1e0230d8f9f0a1cc081",
37
+ "session-browser.js": "7af716a1c0d6793b82ebbaaf64ec3e8f73dfc52b3c9aceef2179d2d859e32a9c",
38
+ "session-redaction.js": "c2393023c1d3b7634432606ad82a96d79c1f093d9b0a6440d955d0ae419c8393",
39
+ "session-selection.js": "da5a4f55ccc8ba22791840943288e7aecacd730425c03f05c2bc10fd6a14341f",
40
+ "session-store.js": "ee85e5b9696e542bb535a996743ddbbd2093fc66e18873a2f1c7a27707a83994",
41
+ "test/device-enrollment.test.js": "a4246f4cb19e959ef4b8a83f60664887b624526b0e5646e5ec1fdb93750082b0",
42
+ "test/lightpanda-session.test.js": "1fa6c1693a5008c173ec6c5c97effe001b68c535c7a3d4530500c0c4b691c532",
43
+ "test/onboarding-state.test.js": "889f7746bbdb51320e68447560459d2a5d812e4b135de08a7b6e94ef5a142250",
44
+ "test/session-redaction.test.js": "e45b5cbd19eea7996d57141b5185c3a6e4c79989e4cb7253272fc66cd2cbd719",
45
+ "test/session-refresh.test.js": "ffa688433185c08696761f189df244ed9ac212731b012a3eb9a91da05b43dd56",
46
+ "test/session-selection.test.js": "ee1a15d42b156403d46d789a3ecf0a9c8f0019a00ab908276297d031243a89f5",
47
+ "test/session-send-state.test.js": "c8ccbdf0863c5de85f784e7e32436591fe2db16a2ef4c554f671c6352736d5b6",
48
+ "test/site-permissions.test.js": "27c297475c38ee1cbe7c7df210c767c157e03ecd379cde99a1b502268bda56ab",
49
+ "tool.manifest.json": "820f6060f077b95c286168f175e5521bc67b043425cae69c5be40834d5016454",
50
+ "web-store/listing.md": "3e6d7aab1f60142984c3f8c18d92bf23646dc901644c6b71bdb979802bcf320c",
51
+ "web-store/privacy-policy.md": "eaaaa6066b36ef56896321d62b6ac4596d62104a0591d4edceb8c6040c47fd5c"
52
+ },
53
+ "toolDependencies": {
54
+ "lightpanda-browser": "^0.11.5"
40
55
  }
41
56
  },
42
57
  "campaign-draft-runner": {
43
- "version": "0.7.2",
58
+ "version": "0.8.1",
44
59
  "files": {
45
- "README.md": "dc294ee65686b141e0a85f069232cc2a0503ba0e2d7452cbf54bcea10b60512c",
60
+ "README.md": "9d8c9d87edc66375b5f059bd5abb06a8b8ee743e979d77ffc4f5312f3ec7b57f",
46
61
  "batch-skip.js": "ad428464b739e7355e00ac7cf399247ce611fcef0470d97a73893701e5b07627",
47
62
  "config.js": "9b9c2d9686cebf17c3ba2630088c7028281883608f61054e733283aeb8d383cb",
48
63
  "discovery-operations.js": "a5e9f046358938a07ffba039085c5c48f829c6a2e05362d0d0230a37a3c47f60",
49
- "index.js": "8c4febce077f57ed33d6ed3136e1c084b1d32c7e05a010462c594c25ae5536ee",
64
+ "index.js": "3ee8ab5f2cc041ddcbeeeda7225f744b13a1ce843c25aabe693c0269a1aa681e",
50
65
  "operation-timeout.js": "9b1ced30ec9ed710bb9118b91f6f3feded5111a08e1e21abf163e4cfb91d7ad2",
51
66
  "package.json": "a25b7ed1dd2c30cd68c3c10feb8ee1752cac8cd55cd4344690ffad649e231ec1",
52
67
  "pitch-experiment.js": "3da9350dc862cab36a630f628d3b3c06974375facd999b8bdbeed8ebf15e63a3",
@@ -58,15 +73,18 @@
58
73
  "telemetry.js": "b3ededa1277d5028f7a8299926e16bb4dc06d70c470d3b97352c29080cfc0974",
59
74
  "test/batch-skip.test.js": "638d185dc0b38900afe6ee9058e733ae36583d0762a0ff0347fdf245df064abc",
60
75
  "test/discovery-operations.test.js": "bc3e7c877911278bf87ef2a5844990721570a4957b78478e2e916be869bc2159",
76
+ "test/orchestrator-fanout.test.js": "e882f2c22418d4d3bdc66223c8bf37ed2ca0fbb94ae99f0d828c9257ca551f6b",
61
77
  "test/pitch-experiment.test.js": "5c43901a9986b666f1094a7dc298adf2072dcb167ea023bb24fb5c9f13c152b0",
62
78
  "test/prospect-pool.test.js": "d0a81f21899b0055c210747008db2ed12afe11b3a57d3e80d1aae797732982d3",
63
- "test/selection-policy.test.js": "9621fa4fb4cac782734fbcf519990e107ad1d7d794dd9924dd1c6319a55e9ec4",
79
+ "test/selection-policy.test.js": "33967a965b47c50febb3533ab8cc7080b378f8e4dbed363f6c0304eb90da4277",
64
80
  "test/telemetry.test.js": "8e52a43fa9eb08fa0f3be124b72b7cd39258666cb88311b1df6978037372c257",
65
- "tool.manifest.json": "a81752d7314810a8005fc864d3d0b938c0c954a20efcc982ca39a2818e3c6200"
81
+ "test/web-tool-default.test.js": "bafd71c48fc922d449b40b2603900c08a45ba3701ffa9a48e3e533219f1bd1a5",
82
+ "tool.manifest.json": "acd3a902aa0e52e4ea9429def5bc76808d0a33ead4fd3c670b8a737a2afb2c7b"
66
83
  },
67
84
  "toolDependencies": {
68
85
  "pr-campaign": "^0.1.0",
69
- "gmail-workspace": "^0.1.0"
86
+ "gmail-workspace": "^0.1.0",
87
+ "lightpanda-browser": "^0.10.0"
70
88
  }
71
89
  },
72
90
  "change-plan-runner": {
@@ -98,16 +116,26 @@
98
116
  }
99
117
  },
100
118
  "creator-scout": {
101
- "version": "1.0.1",
119
+ "version": "1.4.0",
102
120
  "files": {
103
- "README.md": "4f50850317c0875ad7ddea767c7dda112669112bec107a98e67a31a42787b82c",
121
+ "README.md": "6895b2c0cc3a230ddf3f59f1c4670b12070464f8e742bfdf40a04120a7fefaea",
104
122
  "config.js": "bab728665650b986c0eaef8e1be1c259ec42b1f83df4217c9780f5468d3c7666",
105
- "index.js": "d1266d622b6abaf77ce1fe93823d4f2faedb8a5991371997c364082a198dc728",
106
- "package-lock.json": "ed479120b59c2d9b083991dea60eb7750ba36bc7b2c7defb01cfb598889b8d90",
107
- "package.json": "ad463eeddea6a958ef291d58f216c0b42c5ff3b398b62ed9512b857ea5e4b672",
108
- "reference-match.js": "762d822ad31f89c06cb5a40f84ba3f864436db486375ed30e48bde94de282c7c",
109
- "test/reference-match.test.js": "701ce83396126b1e42bd3a54e331ff011a1fc27646a0f3aa99ce1c3e576aff6d",
110
- "tool.manifest.json": "0617b0488035fd7f8a83a8e5a698558b3d0e956e7ea1e043e2e80bb224d4974f"
123
+ "index.js": "a544e5dbac9cb92e996c2b07690a18481a20b8b10c13c397412581ec9ac6bb04",
124
+ "outcome-contract.js": "5685bd8fbe4fcb608ee43a0148201206283013c1a60855c974a928c1d312480a",
125
+ "package-lock.json": "a2e847954e9d6682b8fd435c46d7ecbf38568147fc3d336e10f6d806f6be620a",
126
+ "package.json": "19c61d77ec90fce64d1a3baa1acc5b29af23f7c0574964504bc69b19e38aa34f",
127
+ "panda-results.js": "24a31263b4a03e2c2719d9c54be7b5c022b17fb7dcb249eed33b93882518145b",
128
+ "panda-session.js": "69878ff01bfbf26afe4db0e2e6489b211e3aca100ba5353befefaea009636bb5",
129
+ "reference-match.js": "5ceb71bfe57763258d89c60936bb7e5b3166b6aa7127f9d2f8da49f01298f46b",
130
+ "test/outcome-contract.test.js": "dda85d1f56880b30d7fad3e8a27aacbb0808d91fc0addac6e0c38f9f0c4849bf",
131
+ "test/panda-results.test.js": "b918d6341251822292fe3e375ab66694a0f71f3c7a24e91be263ee36e5f3e92c",
132
+ "test/panda-session.test.js": "6cfa4e0543fab77c502c1103c60d8cb7d16040770e7aa5c034a47e0292de8521",
133
+ "test/reference-match.test.js": "38572ee3756f4ff0b0c61942dda0a19c9d06697826051cf0924dd3c47fc99b67",
134
+ "tool.manifest.json": "5368082b6808dc9b5966a46afcc6042cc82aabef0cd55ed65b4e783a4cb2579e"
135
+ },
136
+ "toolDependencies": {
137
+ "lightpanda-browser": "^0.11.4",
138
+ "browser-session-bridge": "^0.1.3"
111
139
  }
112
140
  },
113
141
  "file-document": {
@@ -153,6 +181,52 @@
153
181
  "tool.manifest.json": "e44f75443084d79df1846f19980af823a171f49a470196237ce802791328adc2"
154
182
  }
155
183
  },
184
+ "lightpanda-browser": {
185
+ "version": "0.11.5",
186
+ "files": {
187
+ "BENCHMARK.md": "9c732c65f6d8bceb4e73c1a03d298d5140d919f50269f982bd0ec6c1b21fa8b6",
188
+ "COMPATIBILITY-MIGRATION.md": "230e12e8ddac837b7772519693e530c43d2158b69c671036bf246fb3a9e35561",
189
+ "LIMITS.md": "6c0ec9624c76de8ddf09b82a4da1dba1b89a48a1f0e71a083ffbcf7a3d5401fb",
190
+ "README.md": "c79a9a24d2fe804a7ce3e160e8308b1ac0039461cbfd012347aaa61f841f5fed",
191
+ "action-policy.js": "66c6ad39f65378ccf8ed54177f5a3665e23ef82818c30fb05d28cd58cba9b2ab",
192
+ "authenticated-profile.js": "2bbb96c4d25a108c44256514c1c9b4e61e1f125e470ab35c5e02515216cd1b33",
193
+ "benchmark-latest.json": "c5524e6d42479578579fd7db0e50857ff0831ca219e611b821ad1e0a4fade303",
194
+ "benchmark-policy.js": "2c3763d7f327293c9d54ca24da9e65b94dc304af44908c1e196a4af45ed49a89",
195
+ "binary.js": "accd3f1f536ae7ceee4dbfcee2de9ac56fc1ae343656238d62003233417257f1",
196
+ "browser-operation.js": "51384d146d45fda8c672d3d6672fa223b715ad40c3c5b5878719e9df38151592",
197
+ "capture.js": "b68b198d494c762822c6da079a556dd3463e681557f2abef1387d9cd41abaf4c",
198
+ "config.js": "d08eb436df15540a53b02cf72e117c7fc8ead80195dbd53764a17598c9e565c5",
199
+ "daemon-service.js": "10e70ed64f1fe8c7660044f6ce24e78d01da75a50322bfc08f42248c14ad5226",
200
+ "index.js": "5fc54aec13fb27c6b55e20aed132853b79c44041f45ea4b0f4b47b00c205da16",
201
+ "limit-suite-latest.json": "3d30f958d2d6c1e9dfcaf53e40a401ae288bf264a97ba6c3b64a25a08031feb0",
202
+ "limit-suite-policy.js": "61440ee2e7f557ab2f3c74f8ef4ec2ec85fd2fb7fc53a4121e1f0d066670ea17",
203
+ "mcp-session.js": "cd4a1e6d3c9d80c399fda8f313d69e38fa22a9b24789d7919832a56df7dc90c2",
204
+ "output-bounds.js": "08ab730d0d8722c5e0e761911a509653dd23d8eb4d8c2abf2d9c5e8432870bdd",
205
+ "package-lock.json": "815dfdb89ce94b543e520955480e322438abd2b71fad4c4ddd699838b8622b65",
206
+ "package.json": "934ae0f55d1baea305c28f12c0c9faccdd864244d899663c96f9083d96442841",
207
+ "process-metrics.js": "e39d2980abb581ca0b917d0d33a1d71922ce49b679a7e96cf16a6a66b81d879a",
208
+ "recipe-store.js": "358ac391ae86e0bfb82fc5b55bd08cfe3fd4fa56ac12a5ad4ad5abfa43c9a6c6",
209
+ "scripts/benchmark.js": "f1bb939984460d84118317f9b4f811e0df80f590b0a441cd62a56eb97bb69b37",
210
+ "scripts/install-lightpanda.js": "ba4a2f9e5ffae80b9375578731d68eff25997333cb9e3e443b155f7834948205",
211
+ "scripts/limit-suite.js": "d314aa43cd3319135c9abe42dcd9e8bf744e17ae5f2c2b84bcd03c1ff51aeedb",
212
+ "session-manager.js": "3b1792687815bdcd3a0a5aa043798838aa6ff6fa788c38519300963ebf3794cd",
213
+ "test/action-policy.test.js": "9ac45bf10c353b5c0f94cd46436dc2cfc0f42ed958294e80f6417c805782c3fc",
214
+ "test/authenticated-profile.test.js": "95389180c0d644782fc4dc4833e6306305a01a8b1eadbdbc5102adc2646710b2",
215
+ "test/benchmark-policy.test.js": "02dbd3e7619aaa28f63df1de7ec3af5f206d8cf3d0f74afa8f14b69a0b084716",
216
+ "test/browser-operation.test.js": "283f074ef7ec499f70ba5db3450b792aacebdc2ef72b14727e7b3992cd6f173f",
217
+ "test/capture.test.js": "b4551640d008b73575919e33e5565f7eed2c766a154f8fbe6703ef826f4b9f76",
218
+ "test/daemon-contract.test.js": "8b50c7de83f87324f2b5f94e69ae6b4398b889ee3ab73c1f5b07e95fe9d986fb",
219
+ "test/limit-suite-policy.test.js": "3bc29952084d0febf617f22ffefeeec15ede245e778e7f00fa86fd4c8140cbd6",
220
+ "test/mcp-session.test.js": "cf2484ae14b647eaf66a17286383ff0c143c276b5b2c92b3bba4cf6643f5bc5f",
221
+ "test/recipe-store.test.js": "f249b33aa42bebc4f6e61150400f6bca7647feea13b0770e72016485e8d13b46",
222
+ "test/safety.test.js": "2842a7c2b05c1d3d340050deee969a1a8b7d2999262f2c636e5a5bae6a751899",
223
+ "test/session-manager.test.js": "bc1e2986d2e659066a770277ed4736b2fc3d250d16d4b987012f6adab0fad66e",
224
+ "test/web-search.test.js": "b6b42f82bb3cae516cf8ad40b55f467ab637d72cf4b04da3eb9e77391386397f",
225
+ "tool.manifest.json": "81428513d8677449046c204fa43ba074f4453afc7b929680fcf1737a71c05331",
226
+ "url-security.js": "e1f370b3d9b9a74c7ae435d073a8a069a1bc8adbf4e0caa65c817099a48a1c22",
227
+ "web-search.js": "18c1b9980b1724668e0aec9d354dcac236e0aa43fa58cbe652b1bcd3770d8d0e"
228
+ }
229
+ },
156
230
  "magnific-mcp": {
157
231
  "version": "0.4.1",
158
232
  "files": {
@@ -188,6 +262,7 @@
188
262
  "master-slave": {
189
263
  "version": "0.1.9",
190
264
  "files": {
265
+ "README.md": "a75f87df7906fe143d2ecaddfe9263561db17436df7ec2c4a8d985e1e3e8996e",
191
266
  "batch-cancellation.js": "b9ca57dfcca4f1a672d5435536b7eb83547dba98ed3fd09f34376f1d995bb97f",
192
267
  "batch-runner.js": "97756a03b36278cd0315cc16da0c34a7821c322149c51ba6666f1c5081dbecbc",
193
268
  "chat-state-store.js": "50de39aa33432733bb688eb01968e314a32b169324a66d0f0089b2a19ed9c880",
@@ -204,7 +279,6 @@
204
279
  "master-domain.js": "10b7dfb43eb9939eb5baec54f742076cc73a2add6589a0ff57c51bc79c236faf",
205
280
  "network-session.js": "6ef332ef9694ff211f4aed1e8b6ff4df3614a1d4c63affe6fdd00409329ec431",
206
281
  "package.json": "774af304ec05a24461318172882a28373e568b5240d8eee9a31a286997b9a403",
207
- "README.md": "a75f87df7906fe143d2ecaddfe9263561db17436df7ec2c4a8d985e1e3e8996e",
208
282
  "remote-runtime.js": "d38b7a28f36e8f1be1d4826a056a03d0ebc2b9b17be277e010be25048797a562",
209
283
  "slave-operations.js": "5a8967e2006f3f30ee221614d25fbf7863ffd9c717fd7eeeb0ba981c8c8c367a",
210
284
  "state-store.js": "c56849a3f1b9c990128276e17963034a7836abacedc44f2e500d5732ebf9e451",
@@ -508,12 +582,13 @@
508
582
  }
509
583
  },
510
584
  "video-analyze": {
511
- "version": null,
585
+ "version": "2.0.0",
512
586
  "files": {
513
587
  "config.js": "72f05ac42eda19de47e232c2a0778c6cd99cb468d5b1a25eb8187e29e3a329a1",
514
- "index.js": "082bb49495265cce3c26dfe1f47799274a2c66eb11e34542ca6bf9618ba1d276",
515
- "package.json": "b3fd3984d11999b552f15be4f2c4664229954ffb11b1705770dd9fb320f5ab0c",
516
- "tool.manifest.json": "61e544338a7c32c35b9caf784623bb74b5701245c64ce164c804309c3b6ffcbc"
588
+ "index.js": "c622ca371d8c9864079bae40e4a9a944960055605c891f1d89589dacb95f5154",
589
+ "package.json": "1bd75c7fc49cfe4b46c573ff24b0c3c0c79951d71e161dcf482ee14f04462a43",
590
+ "test/video-analyze.test.js": "2c999d27b5542b0a1ce0515943a8c6802c953dd83ad5cd3de53e1079ef08d936",
591
+ "tool.manifest.json": "af861dd0c9f04ad82e7267e2e362a35111aa675e4bfaf61a9747df8ecd991493"
517
592
  }
518
593
  },
519
594
  "video-downloader": {
@@ -570,14 +645,18 @@
570
645
  }
571
646
  },
572
647
  "x-campaign-runner": {
573
- "version": "0.1.1",
648
+ "version": "0.2.1",
574
649
  "files": {
575
- "README.md": "7cb7264446b9bef41332da9634cd6c94130f55c740142d084cddec776cf703c8",
650
+ "README.md": "081de53492143a499c8a74b7353e7ce4ea89ffb4632f13e93579094014ff9c7f",
576
651
  "config.js": "5eb3c5667d01705d48504a4bf711347262b8a440605cb6b75ec519dd56cb1309",
577
- "index.js": "19ca6dd9aa62b15e62481c6c7ce65023af6a25a21ffc622527acae12ff0171ed",
578
- "package.json": "1eecda56828887b3a59ed512362632dd6db16db229857dd66e40a129b2b83b8d",
579
- "test/x-campaign-runner.test.mjs": "cf62245bccc7d7b5804117ca02753130e7eec4f56fcc671af82757f922117389",
580
- "tool.manifest.json": "0f5dcd2ba69c2f57f85cad7873d6bd0a8492886d3eec34f71feb8e308bdb7751"
652
+ "index.js": "d2cdc3c51fe130406f90db2cafd63783ff3d3ab7e4e09e699de4bed2a1e583c7",
653
+ "package.json": "afc17bc28241f1b3a9bd0d7a4952074fcc1b6e7e4ca9dd85e71a08e9fe185e55",
654
+ "test/x-campaign-runner.test.mjs": "e810f56acd107b56986967a860b8cdc159eca85b3dfb5a9d086898041175ec5f",
655
+ "tool.manifest.json": "7578ec336424501359d4a18be88ed4d067ef42322c047bfbb9f9c0173efaef47"
656
+ },
657
+ "toolDependencies": {
658
+ "x-dm": "^0.4.0",
659
+ "lightpanda-browser": "^0.11.0"
581
660
  }
582
661
  },
583
662
  "x-dm": {
@@ -606,13 +685,15 @@
606
685
  }
607
686
  },
608
687
  "x-session-reader": {
609
- "version": "1.1.0",
688
+ "version": "1.2.0",
610
689
  "files": {
611
690
  "browser-cache.js": "f71c20f9ab5f04d9d46c5e2551b348d47baba89a10a07173070298098a6d5551",
612
691
  "config.js": "b0929c48bcf9ecf1408f246703fde3a6eb14e73bc4b8e71084910a96e641a7cb",
613
- "index.js": "5695eec5516069ef9310ae2100e2a1cd5e8e4e92ccc5d93aa9091d2b2bce1fb8",
614
- "package.json": "dbfbc9fc4343346afba5603644b34a2bf922d6e8fcad38c50fdc2c7db5936934",
615
- "tool.manifest.json": "b9b519d60b970ff4bbb779e5f276a0e4f928805a9c8a68152a87b3b460bcc4dd"
692
+ "index.js": "c390dd9b89bd234103c88888981ea3882e955c3d1f4f5bb4642f8e48ef12d5bc",
693
+ "package.json": "968775d30b71fff684ec3541c781198db693bba5c46e723d51cbbab3f267b693",
694
+ "target-validation.js": "e085cffe5b44fab100d0456ad37554c71085ae2c04c368d6469c69b2e1fdf5b1",
695
+ "test/target-validation.test.js": "ee26b8e4f8d8db600e65eb8a189fbb05ba2623c581cd874bde5d8d41f043d491",
696
+ "tool.manifest.json": "d5a1affbc6f5abb17d186cdfe1068c359e08ecdc2380c695610193da0ce5c72d"
616
697
  },
617
698
  "toolDependencies": {
618
699
  "browser-session-bridge": "^0.1.0"
@@ -66,7 +66,7 @@ async function runInternalPiLogin(provider, { rl = null } = {}) {
66
66
 
67
67
  export async function collectCliBootstrapChoices({ telegramApiKey, rl, ask }) {
68
68
  const telegramMaxChatIds = Number(await ask("Maximum authorized chat IDs", "1"));
69
- const runtime = createPiRuntime();
69
+ const runtime = await createPiRuntime();
70
70
  const providers = sortBootstrapProviders(listPiProviders(runtime));
71
71
  console.log("\nAvailable Pi providers:");
72
72
  providers.forEach((item, index) => console.log(`${index + 1}. ${formatProviderOption(item)}`));
@@ -89,7 +89,7 @@ export async function collectCliBootstrapChoices({ telegramApiKey, rl, ask }) {
89
89
  while (true) {
90
90
  piApiKey = (await rl.question(`Pi API key for ${selectedProvider.provider} (optional): `)).trim();
91
91
  if (piApiKey) break;
92
- if (hasProviderAuth(selectedProvider.provider, createPiRuntime())) break;
92
+ if (hasProviderAuth(selectedProvider.provider, await createPiRuntime())) break;
93
93
  if (!providerSupportsOAuth) {
94
94
  console.log(`No existing Pi auth found for ${selectedProvider.provider}. This provider requires an API key.`);
95
95
  continue;
@@ -100,7 +100,7 @@ export async function collectCliBootstrapChoices({ telegramApiKey, rl, ask }) {
100
100
  } catch (error) {
101
101
  console.log(`Internal Pi login failed: ${error instanceof Error ? error.message : String(error)}`);
102
102
  }
103
- if (hasProviderAuth(selectedProvider.provider, createPiRuntime())) {
103
+ if (hasProviderAuth(selectedProvider.provider, await createPiRuntime())) {
104
104
  console.log(`Detected Pi auth for ${selectedProvider.provider}. Continuing bootstrap.`);
105
105
  break;
106
106
  }
@@ -23,7 +23,7 @@ import {
23
23
 
24
24
  export async function runTelegramBootstrap({ telegramApiKey, setupToken, botInfo }) {
25
25
  const bot = new Bot(telegramApiKey);
26
- const runtime = createPiRuntime();
26
+ const runtime = await createPiRuntime();
27
27
  const providers = sortBootstrapProviders(listPiProviders(runtime));
28
28
  let setupChatId = null;
29
29
  let chatMeta = {};
@@ -90,7 +90,7 @@ export async function runTelegramBootstrap({ telegramApiKey, setupToken, botInfo
90
90
 
91
91
  const askModel = async (ctx = null, page = 0) => {
92
92
  state = "model";
93
- const models = sortBootstrapModels(selectedProvider.provider, listProviderModels(selectedProvider.provider, createPiRuntime()));
93
+ const models = sortBootstrapModels(selectedProvider.provider, listProviderModels(selectedProvider.provider, await createPiRuntime()));
94
94
  const keyboard = buildPagedInlineKeyboard("model", models.map((model) => ({ text: formatPiModelOption(model) })), {
95
95
  page,
96
96
  pageSize: telegramConfigDefaults.modelPickerPageSize
@@ -119,7 +119,7 @@ export async function runTelegramBootstrap({ telegramApiKey, setupToken, botInfo
119
119
  };
120
120
 
121
121
  const askAuthMethod = async (ctx = null) => {
122
- const providerRuntime = createPiRuntime();
122
+ const providerRuntime = await createPiRuntime();
123
123
  const selectedAuthReady = hasProviderAuth(selectedProvider.provider, providerRuntime);
124
124
  const providerSupportsOAuth = supportsProviderOAuth(selectedProvider.provider, providerRuntime);
125
125
  const buttons = [];
@@ -142,7 +142,7 @@ export async function runTelegramBootstrap({ telegramApiKey, setupToken, botInfo
142
142
  try {
143
143
  await login.promise;
144
144
  activeLogin = null;
145
- if (hasProviderAuth(selectedProvider.provider, createPiRuntime())) {
145
+ if (hasProviderAuth(selectedProvider.provider, await createPiRuntime())) {
146
146
  await sendSetupMessage(`Detected Pi auth for ${selectedProvider.provider}.`);
147
147
  await askBackground();
148
148
  return;
@@ -157,7 +157,7 @@ export async function runTelegramBootstrap({ telegramApiKey, setupToken, botInfo
157
157
  };
158
158
 
159
159
  const startPiLogin = async () => {
160
- if (hasProviderAuth(selectedProvider.provider, createPiRuntime())) {
160
+ if (hasProviderAuth(selectedProvider.provider, await createPiRuntime())) {
161
161
  await sendSetupMessage(`Existing Pi auth for ${selectedProvider.provider} detected.`);
162
162
  await askBackground();
163
163
  return;
@@ -248,7 +248,7 @@ export async function runTelegramBootstrap({ telegramApiKey, setupToken, botInfo
248
248
  return;
249
249
  }
250
250
  if (action === "model" && state === "model") {
251
- const models = sortBootstrapModels(selectedProvider.provider, listProviderModels(selectedProvider.provider, createPiRuntime()));
251
+ const models = sortBootstrapModels(selectedProvider.provider, listProviderModels(selectedProvider.provider, await createPiRuntime()));
252
252
  selectedModel = models[Number(rawValue)];
253
253
  if (!selectedModel) return;
254
254
  await askAuthMethod(ctx);
@@ -256,7 +256,7 @@ export async function runTelegramBootstrap({ telegramApiKey, setupToken, botInfo
256
256
  }
257
257
  if (action === "auth" && state === "auth-method") {
258
258
  if (rawValue === "existing") {
259
- if (hasProviderAuth(selectedProvider.provider, createPiRuntime())) {
259
+ if (hasProviderAuth(selectedProvider.provider, await createPiRuntime())) {
260
260
  await askBackground(ctx);
261
261
  } else {
262
262
  await sendSetupMessage(`No existing Pi auth found for ${selectedProvider.provider}.`);
@@ -1,86 +1,21 @@
1
- import { execFile } from "node:child_process";
2
1
  import { statfs } from "node:fs/promises";
3
2
  import os from "node:os";
4
3
  import process from "node:process";
5
- import { promisify } from "node:util";
6
4
  import { stopManagedDaemon, unregisterManagedDaemon } from "../core/tools/daemon-processes.js";
7
5
  import { getServiceStatus, serviceEntryFile } from "./service-manager.js";
8
6
  import { arisaHomeDir } from "../platform/paths.js";
9
7
  import { renderTextReport, reportRow, wrapReportText } from "./report-format.js";
8
+ import {
9
+ isArisaServiceProcess as matchesArisaServiceProcess,
10
+ isDaemonProcess,
11
+ listSystemProcesses,
12
+ terminateProcess
13
+ } from "./process-inspection.js";
10
14
 
11
- const execFileAsync = promisify(execFile);
12
-
13
- function parsePosixProcesses(output) {
14
- return String(output || "")
15
- .split("\n")
16
- .map((line) => /^\s*(\d+)\s+(.+)$/.exec(line))
17
- .filter(Boolean)
18
- .map((match) => ({ pid: Number(match[1]), command: match[2] }));
19
- }
20
-
21
- function parseWindowsProcesses(output) {
22
- const parsed = JSON.parse(output || "[]");
23
- const records = Array.isArray(parsed) ? parsed : [parsed];
24
- return records
25
- .filter((record) => record?.ProcessId && record?.CommandLine)
26
- .map((record) => ({ pid: Number(record.ProcessId), command: String(record.CommandLine) }));
27
- }
28
-
29
- export async function listSystemProcesses({ timeoutMs, platform = process.platform } = {}) {
30
- if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
31
- throw new Error("Doctor process inspection requires a positive timeoutMs");
32
- }
33
- if (platform === "win32") {
34
- const { stdout } = await execFileAsync("powershell.exe", [
35
- "-NoProfile",
36
- "-Command",
37
- "Get-CimInstance Win32_Process | Select-Object ProcessId,CommandLine | ConvertTo-Json -Compress"
38
- ], { timeout: timeoutMs, windowsHide: true });
39
- return parseWindowsProcesses(stdout);
40
- }
41
- const { stdout } = await execFileAsync("ps", ["-ww", "-axo", "pid=,command="], { timeout: timeoutMs });
42
- return parsePosixProcesses(stdout);
43
- }
15
+ export { listSystemProcesses, terminateProcess } from "./process-inspection.js";
44
16
 
45
17
  function isArisaServiceProcess(record) {
46
- return record.command.includes(serviceEntryFile)
47
- && /(?:^|\s)--service-runner(?:\s|$)/.test(record.command);
48
- }
49
-
50
- function isDaemonProcess(record, daemon) {
51
- return record.command.includes(daemon.entryPath)
52
- && /(?:^|\s)daemon(?:\s|$)/.test(record.command);
53
- }
54
-
55
- function sleep(ms) {
56
- return new Promise((resolve) => setTimeout(resolve, ms));
57
- }
58
-
59
- function isAlive(pid) {
60
- try {
61
- process.kill(pid, 0);
62
- return true;
63
- } catch {
64
- return false;
65
- }
66
- }
67
-
68
- export async function terminateProcess(pid, { forceAfterMs } = {}) {
69
- if (!Number.isSafeInteger(pid) || pid <= 0 || pid === process.pid) {
70
- throw new Error(`Refusing to terminate invalid doctor target: ${pid}`);
71
- }
72
- if (!Number.isFinite(forceAfterMs) || forceAfterMs <= 0) {
73
- throw new Error("Doctor process cleanup requires a positive forceAfterMs");
74
- }
75
- if (!isAlive(pid)) return false;
76
- process.kill(pid, "SIGTERM");
77
- const startedAt = Date.now();
78
- while (Date.now() - startedAt < forceAfterMs) {
79
- if (!isAlive(pid)) return true;
80
- await sleep(Math.min(100, forceAfterMs));
81
- }
82
- if (isAlive(pid)) process.kill(pid, "SIGKILL");
83
- return true;
18
+ return matchesArisaServiceProcess(record, serviceEntryFile);
84
19
  }
85
20
 
86
21
  function daemonLabel(record) {
@@ -386,6 +321,18 @@ export async function runDoctor({
386
321
  }
387
322
  for (const result of report.daemons) {
388
323
  const label = daemonLabel(result.record);
324
+ if (result.outcome === "obsolete-removed") {
325
+ report.repairs.push(`Removed obsolete daemon ${label}: ${result.reason}.`);
326
+ continue;
327
+ }
328
+ if (result.outcome === "obsolete-unverified") {
329
+ report.attention.push(`${label} is obsolete, but its live process identity could not be verified.`);
330
+ continue;
331
+ }
332
+ if (result.outcome === "obsolete-cleanup-error") {
333
+ report.attention.push(`${label} obsolete daemon cleanup failed: ${result.error || "unknown error"}.`);
334
+ continue;
335
+ }
389
336
  if (result.outcome === "stale-registration") {
390
337
  const pid = result.diagnostic?.pid;
391
338
  const registered = pid ? processByPid.get(pid) : null;
@@ -0,0 +1,43 @@
1
+ import { purgeManagedDaemon } from "../core/tools/daemon-processes.js";
2
+ import { isDaemonProcess, listSystemProcesses, terminateProcess } from "./process-inspection.js";
3
+
4
+ export async function reapObsoleteDaemon({
5
+ record,
6
+ diagnostic,
7
+ reason,
8
+ timeoutMs,
9
+ stopTimeoutMs,
10
+ inspectProcesses = listSystemProcesses,
11
+ stopProcess = terminateProcess,
12
+ purgeDaemon = purgeManagedDaemon
13
+ } = {}) {
14
+ const pid = diagnostic?.pid;
15
+ if (pid) {
16
+ let processes;
17
+ try {
18
+ processes = await inspectProcesses({ timeoutMs });
19
+ } catch (error) {
20
+ return {
21
+ record,
22
+ outcome: "obsolete-unverified",
23
+ reason,
24
+ diagnostic,
25
+ error: `process inspection failed: ${error instanceof Error ? error.message : String(error)}`
26
+ };
27
+ }
28
+ const processRecord = processes.find((item) => item.pid === pid);
29
+ if (!processRecord || !isDaemonProcess(processRecord, record)) {
30
+ return { record, outcome: "obsolete-unverified", reason, diagnostic };
31
+ }
32
+ await stopProcess(pid, { forceAfterMs: stopTimeoutMs });
33
+ }
34
+
35
+ await purgeDaemon({ toolName: record.toolName, scope: record.scope });
36
+ return {
37
+ record,
38
+ outcome: "obsolete-removed",
39
+ reason,
40
+ diagnostic,
41
+ stoppedPid: pid || null
42
+ };
43
+ }
@@ -0,0 +1,78 @@
1
+ import { execFile } from "node:child_process";
2
+ import process from "node:process";
3
+ import { promisify } from "node:util";
4
+
5
+ const execFileAsync = promisify(execFile);
6
+
7
+ function parsePosixProcesses(output) {
8
+ return String(output || "")
9
+ .split("\n")
10
+ .map((line) => /^\s*(\d+)\s+(.+)$/.exec(line))
11
+ .filter(Boolean)
12
+ .map((match) => ({ pid: Number(match[1]), command: match[2] }));
13
+ }
14
+
15
+ function parseWindowsProcesses(output) {
16
+ const parsed = JSON.parse(output || "[]");
17
+ const records = Array.isArray(parsed) ? parsed : [parsed];
18
+ return records
19
+ .filter((record) => record?.ProcessId && record?.CommandLine)
20
+ .map((record) => ({ pid: Number(record.ProcessId), command: String(record.CommandLine) }));
21
+ }
22
+
23
+ export async function listSystemProcesses({ timeoutMs, platform = process.platform } = {}) {
24
+ if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
25
+ throw new Error("Process inspection requires a positive timeoutMs");
26
+ }
27
+ if (platform === "win32") {
28
+ const { stdout } = await execFileAsync("powershell.exe", [
29
+ "-NoProfile",
30
+ "-Command",
31
+ "Get-CimInstance Win32_Process | Select-Object ProcessId,CommandLine | ConvertTo-Json -Compress"
32
+ ], { timeout: timeoutMs, windowsHide: true });
33
+ return parseWindowsProcesses(stdout);
34
+ }
35
+ const { stdout } = await execFileAsync("ps", ["-ww", "-axo", "pid=,command="], { timeout: timeoutMs });
36
+ return parsePosixProcesses(stdout);
37
+ }
38
+
39
+ export function isArisaServiceProcess(record, entryFile) {
40
+ return record.command.includes(entryFile)
41
+ && /(?:^|\s)--service-runner(?:\s|$)/.test(record.command);
42
+ }
43
+
44
+ export function isDaemonProcess(record, daemon) {
45
+ return record.command.includes(daemon.entryPath)
46
+ && /(?:^|\s)daemon(?:\s|$)/.test(record.command);
47
+ }
48
+
49
+ function sleep(ms) {
50
+ return new Promise((resolve) => setTimeout(resolve, ms));
51
+ }
52
+
53
+ function isAlive(pid) {
54
+ try {
55
+ process.kill(pid, 0);
56
+ return true;
57
+ } catch {
58
+ return false;
59
+ }
60
+ }
61
+
62
+ export async function terminateProcess(pid, { forceAfterMs } = {}) {
63
+ if (!Number.isSafeInteger(pid) || pid <= 0 || pid === process.pid) {
64
+ throw new Error(`Refusing to terminate invalid process target: ${pid}`);
65
+ }
66
+ if (!Number.isFinite(forceAfterMs) || forceAfterMs <= 0) {
67
+ throw new Error("Process cleanup requires a positive forceAfterMs");
68
+ }
69
+ if (!isAlive(pid)) return false;
70
+ process.kill(pid, "SIGTERM");
71
+ const startedAt = Date.now();
72
+ while (Date.now() - startedAt < forceAfterMs) {
73
+ if (!isAlive(pid)) return true;
74
+ await sleep(Math.min(100, forceAfterMs));
75
+ }
76
+ if (isAlive(pid)) process.kill(pid, "SIGKILL");
77
+ return true;
78
+ }