@abot-ai/runtime 1.2.0 → 1.3.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 (516) hide show
  1. package/README.md +14 -0
  2. package/dist/src/bridge/request-steering.d.ts +2 -1
  3. package/dist/src/bridge/request-steering.js +4 -2
  4. package/dist/src/bridge/runtime-replay.js +2 -19
  5. package/dist/src/bridge/start-agent-bridge.js +1 -1
  6. package/dist/src/capabilities/normal-invocation/validator.js +1 -1
  7. package/dist/src/capabilities/tool-definition-validator/event-presentation.js +3 -0
  8. package/dist/src/capabilities/tool-definition-validator/event-result-metadata.d.ts +2 -0
  9. package/dist/src/capabilities/tool-definition-validator/event-result-metadata.js +74 -0
  10. package/dist/src/capabilities/tool-event-metadata.js +3 -0
  11. package/dist/src/capabilities/tool-result-event-projection.d.ts +3 -0
  12. package/dist/src/capabilities/tool-result-event-projection.js +82 -0
  13. package/dist/src/capabilities/tool-types.d.ts +5 -0
  14. package/dist/src/cli/abot.js +2 -11
  15. package/dist/src/runtime/adapters/in-memory-session-store.js +1 -0
  16. package/dist/src/runtime/adapters/long-term-memory/file-lock/acquisition.js +11 -2
  17. package/dist/src/runtime/adapters/long-term-memory/file-lock/contracts.d.ts +2 -0
  18. package/dist/src/runtime/adapters/long-term-memory/file-lock/synchronous-release.d.ts +2 -0
  19. package/dist/src/runtime/adapters/long-term-memory/file-lock/synchronous-release.js +40 -0
  20. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/approval.d.ts +3 -0
  21. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/approval.js +9 -0
  22. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/rejection-event.d.ts +13 -0
  23. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/rejection-event.js +25 -0
  24. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/run.js +18 -2
  25. package/dist/src/runtime/adapters/registered-tool-normal-invocations/executor.js +8 -0
  26. package/dist/src/runtime/adapters/registered-tool-normal-invocations/payload/lifecycle.js +7 -3
  27. package/dist/src/runtime/adapters/registered-tool-normal-invocations/shared/contracts.d.ts +17 -2
  28. package/dist/src/runtime/adapters/registered-tool-normal-invocations/shared/event-metadata.d.ts +9 -0
  29. package/dist/src/runtime/adapters/registered-tool-normal-invocations/shared/event-metadata.js +8 -0
  30. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/execution.js +16 -1
  31. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-observability.js +2 -2
  32. package/dist/src/runtime/adapters/scheduled-request-outcome.d.ts +11 -0
  33. package/dist/src/runtime/adapters/scheduled-request-outcome.js +41 -0
  34. package/dist/src/runtime/adapters/scheduler-runtime.d.ts +19 -0
  35. package/dist/src/runtime/adapters/scheduler-runtime.js +138 -0
  36. package/dist/src/runtime/capabilities/scheduling/create-operations.d.ts +55 -0
  37. package/dist/src/runtime/capabilities/scheduling/create-operations.js +30 -0
  38. package/dist/src/runtime/capabilities/scheduling/create-time-zone.d.ts +1 -0
  39. package/dist/src/runtime/capabilities/scheduling/create-time-zone.js +11 -0
  40. package/dist/src/runtime/capabilities/scheduling/job-list-page.d.ts +25 -0
  41. package/dist/src/runtime/capabilities/scheduling/job-list-page.js +40 -0
  42. package/dist/src/runtime/capabilities/scheduling/model-validation.d.ts +2 -0
  43. package/dist/src/runtime/capabilities/scheduling/model-validation.js +15 -0
  44. package/dist/src/runtime/capabilities/scheduling/tool-contract.d.ts +2 -0
  45. package/dist/src/runtime/capabilities/scheduling/tool-contract.js +35 -0
  46. package/dist/src/runtime/capabilities/scheduling/tool-input-properties.d.ts +43 -0
  47. package/dist/src/runtime/capabilities/scheduling/tool-input-properties.js +27 -0
  48. package/dist/src/runtime/capabilities/scheduling/tool-module.d.ts +4 -0
  49. package/dist/src/runtime/capabilities/scheduling/tool-module.js +158 -0
  50. package/dist/src/runtime/capabilities/scheduling/update-operations.d.ts +2 -0
  51. package/dist/src/runtime/capabilities/scheduling/update-operations.js +49 -0
  52. package/dist/src/runtime/composition.d.ts +23 -3
  53. package/dist/src/runtime/composition.js +12 -17
  54. package/dist/src/runtime/config/environment-paths.d.ts +10 -0
  55. package/dist/src/runtime/config/environment-paths.js +31 -0
  56. package/dist/src/runtime/config/environment-storage.d.ts +9 -0
  57. package/dist/src/runtime/config/environment-storage.js +65 -0
  58. package/dist/src/runtime/config/fields.js +7 -0
  59. package/dist/src/runtime/config/long-term-memory.js +15 -0
  60. package/dist/src/runtime/config/schema.js +8 -0
  61. package/dist/src/runtime/config.js +9 -5
  62. package/dist/src/runtime/context/scheduled-execution-context.d.ts +10 -0
  63. package/dist/src/runtime/context/scheduled-execution-context.js +52 -0
  64. package/dist/src/runtime/default-adapters.d.ts +3 -32
  65. package/dist/src/runtime/default-adapters.js +3 -270
  66. package/dist/src/runtime/default-environment-adapters.d.ts +19 -0
  67. package/dist/src/runtime/default-environment-adapters.js +144 -0
  68. package/dist/src/runtime/index.d.ts +5 -0
  69. package/dist/src/runtime/index.js +4 -0
  70. package/dist/src/runtime/local-application.d.ts +22 -0
  71. package/dist/src/runtime/local-application.js +81 -0
  72. package/dist/src/runtime/local-host/app-memory-dispatch.d.ts +11 -0
  73. package/dist/src/runtime/local-host/app-memory-dispatch.js +103 -0
  74. package/dist/src/runtime/local-host/app-owner.d.ts +4 -0
  75. package/dist/src/runtime/local-host/app-owner.js +119 -0
  76. package/dist/src/runtime/local-host/app-request-control.d.ts +24 -0
  77. package/dist/src/runtime/local-host/app-request-control.js +135 -0
  78. package/dist/src/runtime/local-host/app-service-dispatch.d.ts +5 -0
  79. package/dist/src/runtime/local-host/app-service-dispatch.js +64 -0
  80. package/dist/src/runtime/local-host/client-identity.d.ts +3 -0
  81. package/dist/src/runtime/local-host/client-identity.js +17 -0
  82. package/dist/src/runtime/local-host/client-memory.d.ts +7 -0
  83. package/dist/src/runtime/local-host/client-memory.js +54 -0
  84. package/dist/src/runtime/local-host/client-requests.d.ts +19 -0
  85. package/dist/src/runtime/local-host/client-requests.js +145 -0
  86. package/dist/src/runtime/local-host/client-services.d.ts +10 -0
  87. package/dist/src/runtime/local-host/client-services.js +14 -0
  88. package/dist/src/runtime/local-host/contracts.d.ts +36 -0
  89. package/dist/src/runtime/local-host/contracts.js +1 -0
  90. package/dist/src/runtime/local-host/endpoint.d.ts +7 -0
  91. package/dist/src/runtime/local-host/endpoint.js +79 -0
  92. package/dist/src/runtime/local-host/owner-activity.d.ts +10 -0
  93. package/dist/src/runtime/local-host/owner-activity.js +30 -0
  94. package/dist/src/runtime/local-host/owner-retirement.d.ts +3 -0
  95. package/dist/src/runtime/local-host/owner-retirement.js +15 -0
  96. package/dist/src/runtime/local-host/owner-server.d.ts +6 -0
  97. package/dist/src/runtime/local-host/owner-server.js +88 -0
  98. package/dist/src/runtime/local-host/private-access.d.ts +2 -0
  99. package/dist/src/runtime/local-host/private-access.js +16 -0
  100. package/dist/src/runtime/local-host/private-directory.d.ts +1 -0
  101. package/dist/src/runtime/local-host/private-directory.js +57 -0
  102. package/dist/src/runtime/local-host/rpc-peer.d.ts +22 -0
  103. package/dist/src/runtime/local-host/rpc-peer.js +168 -0
  104. package/dist/src/runtime/local-host/rpc-protocol.d.ts +21 -0
  105. package/dist/src/runtime/local-host/rpc-protocol.js +46 -0
  106. package/dist/src/runtime/local-host/startup-connection.d.ts +5 -0
  107. package/dist/src/runtime/local-host/startup-connection.js +72 -0
  108. package/dist/src/runtime/local-host/transport.d.ts +3 -0
  109. package/dist/src/runtime/local-host/transport.js +88 -0
  110. package/dist/src/runtime/local-host/windows-private-access.d.ts +1 -0
  111. package/dist/src/runtime/local-host/windows-private-access.js +51 -0
  112. package/dist/src/runtime/long-term-memory/onboarding/configuration.js +6 -0
  113. package/dist/src/runtime/long-term-memory/recall-binding.d.ts +3 -0
  114. package/dist/src/runtime/long-term-memory/recall-binding.js +27 -0
  115. package/dist/src/runtime/long-term-memory/recall-context.d.ts +20 -0
  116. package/dist/src/runtime/long-term-memory/recall-context.js +101 -0
  117. package/dist/src/runtime/long-term-memory/recall-continuation.d.ts +8 -0
  118. package/dist/src/runtime/long-term-memory/recall-continuation.js +36 -0
  119. package/dist/src/runtime/long-term-memory/recall-policy.d.ts +7 -0
  120. package/dist/src/runtime/long-term-memory/recall-policy.js +14 -0
  121. package/dist/src/runtime/long-term-memory/recall-result.d.ts +5 -0
  122. package/dist/src/runtime/long-term-memory/recall-result.js +54 -0
  123. package/dist/src/runtime/long-term-memory/repository-state.d.ts +2 -1
  124. package/dist/src/runtime/long-term-memory/repository-state.js +2 -2
  125. package/dist/src/runtime/model/invoke-raw-step.d.ts +1 -0
  126. package/dist/src/runtime/model/invoke-raw-step.js +1 -0
  127. package/dist/src/runtime/model/invoke-step.js +6 -0
  128. package/dist/src/runtime/model/invoke-structured-step.d.ts +1 -0
  129. package/dist/src/runtime/model/invoke-structured-step.js +1 -0
  130. package/dist/src/runtime/model/model-step-port.d.ts +2 -0
  131. package/dist/src/runtime/model/model-step-steering.d.ts +8 -0
  132. package/dist/src/runtime/model/model-step-steering.js +19 -0
  133. package/dist/src/runtime/orchestration/final-response/authoring-contract.js +1 -1
  134. package/dist/src/runtime/orchestration/final-response/invoke.d.ts +1 -0
  135. package/dist/src/runtime/orchestration/final-response/invoke.js +1 -0
  136. package/dist/src/runtime/orchestration/role-calls/activation-budget.js +1 -0
  137. package/dist/src/runtime/orchestration/role-calls/candidate-validation.js +9 -49
  138. package/dist/src/runtime/orchestration/role-calls/capability-selection-reconsideration.d.ts +9 -0
  139. package/dist/src/runtime/orchestration/role-calls/capability-selection-reconsideration.js +17 -8
  140. package/dist/src/runtime/orchestration/role-calls/capability-selection-supervision-validation.d.ts +2 -0
  141. package/dist/src/runtime/orchestration/role-calls/capability-selection-supervision-validation.js +62 -0
  142. package/dist/src/runtime/orchestration/role-calls/command-decoder.js +4 -0
  143. package/dist/src/runtime/orchestration/role-calls/command-dispatch/memory-recall-transitions.d.ts +4 -0
  144. package/dist/src/runtime/orchestration/role-calls/command-dispatch/memory-recall-transitions.js +89 -0
  145. package/dist/src/runtime/orchestration/role-calls/command-dispatch.js +5 -0
  146. package/dist/src/runtime/orchestration/role-calls/contracts.d.ts +9 -7
  147. package/dist/src/runtime/orchestration/role-calls/contracts.js +2 -2
  148. package/dist/src/runtime/orchestration/role-calls/diagnostics.js +3 -0
  149. package/dist/src/runtime/orchestration/role-calls/index.d.ts +1 -0
  150. package/dist/src/runtime/orchestration/role-calls/index.js +1 -0
  151. package/dist/src/runtime/orchestration/role-calls/memory-recall-contract.d.ts +51 -0
  152. package/dist/src/runtime/orchestration/role-calls/memory-recall-contract.js +4 -0
  153. package/dist/src/runtime/orchestration/role-calls/memory-recall-decoder.d.ts +6 -0
  154. package/dist/src/runtime/orchestration/role-calls/memory-recall-decoder.js +147 -0
  155. package/dist/src/runtime/orchestration/role-calls/memory-recall-diagnostics.d.ts +5 -0
  156. package/dist/src/runtime/orchestration/role-calls/memory-recall-diagnostics.js +27 -0
  157. package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.d.ts +3 -0
  158. package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.js +121 -0
  159. package/dist/src/runtime/orchestration/role-calls/memory-recall-transactions.d.ts +3 -0
  160. package/dist/src/runtime/orchestration/role-calls/memory-recall-transactions.js +44 -0
  161. package/dist/src/runtime/orchestration/role-calls/reducer.js +1 -0
  162. package/dist/src/runtime/orchestration/role-calls/transaction-effect.d.ts +5 -0
  163. package/dist/src/runtime/orchestration/role-calls/transaction-effect.js +14 -0
  164. package/dist/src/runtime/orchestration/role-calls/transactions.js +3 -24
  165. package/dist/src/runtime/plugins/manifest-validator.js +4 -1
  166. package/dist/src/runtime/ports.d.ts +4 -0
  167. package/dist/src/runtime/request/bound-runtime-handler.d.ts +2 -0
  168. package/dist/src/runtime/request/bound-runtime-handler.js +25 -0
  169. package/dist/src/runtime/request/contracts.d.ts +6 -0
  170. package/dist/src/runtime/request/execution-agent-root-execution.js +12 -0
  171. package/dist/src/runtime/request/execution-facets.js +6 -0
  172. package/dist/src/runtime/request/execution-scope-surfaces.js +10 -0
  173. package/dist/src/runtime/request/execution-scope.d.ts +1 -1
  174. package/dist/src/runtime/request/handler.js +6 -0
  175. package/dist/src/runtime/request/root-contract.d.ts +7 -1
  176. package/dist/src/runtime/request/root-execution-kernel.js +33 -37
  177. package/dist/src/runtime/request/root-memory-recall.d.ts +11 -0
  178. package/dist/src/runtime/request/root-memory-recall.js +71 -0
  179. package/dist/src/runtime/request/root-observation-handoff.d.ts +17 -0
  180. package/dist/src/runtime/request/root-observation-handoff.js +44 -0
  181. package/dist/src/runtime/request/scheduled-execution.d.ts +9 -0
  182. package/dist/src/runtime/request/scheduled-execution.js +32 -0
  183. package/dist/src/runtime/request/session-admission.d.ts +17 -0
  184. package/dist/src/runtime/request/session-admission.js +88 -0
  185. package/dist/src/runtime/request/supervisor-root-execution-diagnostics.d.ts +1 -1
  186. package/dist/src/runtime/request/supervisor-root-execution.js +8 -0
  187. package/dist/src/runtime/runtime-environment.d.ts +31 -0
  188. package/dist/src/runtime/runtime-environment.js +102 -0
  189. package/dist/src/runtime/runtime-host-environment.d.ts +8 -0
  190. package/dist/src/runtime/runtime-host-environment.js +57 -0
  191. package/dist/src/runtime/runtime-host-lifecycle.d.ts +4 -0
  192. package/dist/src/runtime/runtime-host-lifecycle.js +64 -0
  193. package/dist/src/runtime/runtime-host-scheduler-ownership.d.ts +5 -0
  194. package/dist/src/runtime/runtime-host-scheduler-ownership.js +67 -0
  195. package/dist/src/runtime/runtime-host.d.ts +19 -0
  196. package/dist/src/runtime/runtime-host.js +63 -0
  197. package/dist/src/runtime/scheduler/calendar-time.d.ts +10 -0
  198. package/dist/src/runtime/scheduler/calendar-time.js +58 -0
  199. package/dist/src/runtime/scheduler/contracts.d.ts +143 -0
  200. package/dist/src/runtime/scheduler/contracts.js +1 -0
  201. package/dist/src/runtime/scheduler/file-store.d.ts +2 -0
  202. package/dist/src/runtime/scheduler/file-store.js +76 -0
  203. package/dist/src/runtime/scheduler/instant-validation.d.ts +4 -0
  204. package/dist/src/runtime/scheduler/instant-validation.js +69 -0
  205. package/dist/src/runtime/scheduler/interval-range.d.ts +8 -0
  206. package/dist/src/runtime/scheduler/interval-range.js +24 -0
  207. package/dist/src/runtime/scheduler/job-management.d.ts +8 -0
  208. package/dist/src/runtime/scheduler/job-management.js +212 -0
  209. package/dist/src/runtime/scheduler/journal-checkpoint.d.ts +9 -0
  210. package/dist/src/runtime/scheduler/journal-checkpoint.js +45 -0
  211. package/dist/src/runtime/scheduler/journal-durability.d.ts +8 -0
  212. package/dist/src/runtime/scheduler/journal-durability.js +59 -0
  213. package/dist/src/runtime/scheduler/journal-files.d.ts +14 -0
  214. package/dist/src/runtime/scheduler/journal-files.js +59 -0
  215. package/dist/src/runtime/scheduler/journal-head.d.ts +21 -0
  216. package/dist/src/runtime/scheduler/journal-head.js +81 -0
  217. package/dist/src/runtime/scheduler/journal-index-state.d.ts +31 -0
  218. package/dist/src/runtime/scheduler/journal-index-state.js +137 -0
  219. package/dist/src/runtime/scheduler/journal-index.d.ts +22 -0
  220. package/dist/src/runtime/scheduler/journal-index.js +195 -0
  221. package/dist/src/runtime/scheduler/journal-store.d.ts +21 -0
  222. package/dist/src/runtime/scheduler/journal-store.js +184 -0
  223. package/dist/src/runtime/scheduler/journal-transaction.d.ts +14 -0
  224. package/dist/src/runtime/scheduler/journal-transaction.js +104 -0
  225. package/dist/src/runtime/scheduler/next-occurrence.d.ts +3 -0
  226. package/dist/src/runtime/scheduler/next-occurrence.js +39 -0
  227. package/dist/src/runtime/scheduler/run-completion.d.ts +12 -0
  228. package/dist/src/runtime/scheduler/run-completion.js +77 -0
  229. package/dist/src/runtime/scheduler/run-list-query.d.ts +5 -0
  230. package/dist/src/runtime/scheduler/run-list-query.js +38 -0
  231. package/dist/src/runtime/scheduler/run-records.d.ts +6 -0
  232. package/dist/src/runtime/scheduler/run-records.js +41 -0
  233. package/dist/src/runtime/scheduler/schedule-update.d.ts +3 -0
  234. package/dist/src/runtime/scheduler/schedule-update.js +22 -0
  235. package/dist/src/runtime/scheduler/schedule-validation.d.ts +10 -0
  236. package/dist/src/runtime/scheduler/schedule-validation.js +132 -0
  237. package/dist/src/runtime/scheduler/scheduler-engine.d.ts +2 -0
  238. package/dist/src/runtime/scheduler/scheduler-engine.js +174 -0
  239. package/dist/src/runtime/scheduler/scheduler-service.d.ts +10 -0
  240. package/dist/src/runtime/scheduler/scheduler-service.js +115 -0
  241. package/dist/src/runtime/scheduler/service-context.d.ts +21 -0
  242. package/dist/src/runtime/scheduler/service-context.js +26 -0
  243. package/dist/src/runtime/scheduler/session-deletion-state.d.ts +9 -0
  244. package/dist/src/runtime/scheduler/session-deletion-state.js +30 -0
  245. package/dist/src/runtime/scheduler/snapshot-validation.d.ts +4 -0
  246. package/dist/src/runtime/scheduler/snapshot-validation.js +112 -0
  247. package/dist/src/runtime/scheduler/startup-recovery.d.ts +2 -0
  248. package/dist/src/runtime/scheduler/startup-recovery.js +38 -0
  249. package/dist/src/runtime/scheduler/validation-error.d.ts +4 -0
  250. package/dist/src/runtime/scheduler/validation-error.js +8 -0
  251. package/dist/src/runtime/scheduler/working-store.d.ts +3 -0
  252. package/dist/src/runtime/scheduler/working-store.js +8 -0
  253. package/dist/src/runtime/session/request-session.d.ts +1 -0
  254. package/dist/src/runtime/session/request-session.js +14 -1
  255. package/dist/src/runtime/session/session-attachment-deletion.d.ts +8 -0
  256. package/dist/src/runtime/session/session-attachment-deletion.js +87 -0
  257. package/dist/src/runtime/session/session-deletion-boundary.d.ts +10 -0
  258. package/dist/src/runtime/session/session-deletion-boundary.js +39 -0
  259. package/dist/src/runtime/session/session-deletion-cleanup.d.ts +7 -0
  260. package/dist/src/runtime/session/session-deletion-cleanup.js +62 -0
  261. package/dist/src/runtime/session/session-deletion-finalization.d.ts +7 -0
  262. package/dist/src/runtime/session/session-deletion-finalization.js +34 -0
  263. package/dist/src/runtime/session/session-deletion-receipts.d.ts +7 -0
  264. package/dist/src/runtime/session/session-deletion-receipts.js +18 -0
  265. package/dist/src/runtime/session/session-lifecycle-store.d.ts +21 -0
  266. package/dist/src/runtime/session/session-lifecycle-store.js +72 -0
  267. package/dist/src/runtime/session/session-mutation-queue.d.ts +3 -0
  268. package/dist/src/runtime/session/session-mutation-queue.js +15 -0
  269. package/dist/src/runtime/steps/execution-agent/capability-decision-parsing.d.ts +16 -0
  270. package/dist/src/runtime/steps/execution-agent/capability-decision-parsing.js +165 -0
  271. package/dist/src/runtime/steps/execution-agent/contracts.d.ts +3 -1
  272. package/dist/src/runtime/steps/execution-agent/decision-parsing.d.ts +2 -0
  273. package/dist/src/runtime/steps/execution-agent/decision-parsing.js +195 -0
  274. package/dist/src/runtime/steps/execution-agent/decision-validation.d.ts +30 -0
  275. package/dist/src/runtime/steps/execution-agent/decision-validation.js +127 -0
  276. package/dist/src/runtime/steps/execution-agent/format.d.ts +1 -0
  277. package/dist/src/runtime/steps/execution-agent/format.js +12 -0
  278. package/dist/src/runtime/steps/execution-agent/input.d.ts +2 -1
  279. package/dist/src/runtime/steps/execution-agent/input.js +17 -2
  280. package/dist/src/runtime/steps/execution-agent/parser.d.ts +1 -2
  281. package/dist/src/runtime/steps/execution-agent/parser.js +1 -472
  282. package/dist/src/runtime/steps/execution-agent/prompt.d.ts +2 -0
  283. package/dist/src/runtime/steps/execution-agent/prompt.js +2 -0
  284. package/dist/src/runtime/steps/execution-agent/reconsideration-context.js +4 -3
  285. package/dist/src/runtime/steps/execution-agent/response-input.js +5 -4
  286. package/dist/src/runtime/steps/execution-agent/response-run.d.ts +3 -0
  287. package/dist/src/runtime/steps/execution-agent/response-run.js +7 -3
  288. package/dist/src/runtime/steps/execution-agent/run.d.ts +2 -0
  289. package/dist/src/runtime/steps/execution-agent/run.js +2 -0
  290. package/dist/src/runtime/steps/execution-agent/state-context.d.ts +2 -1
  291. package/dist/src/runtime/steps/execution-agent/state-context.js +13 -5
  292. package/dist/src/runtime/steps/memory-recall-decision.d.ts +30 -0
  293. package/dist/src/runtime/steps/memory-recall-decision.js +101 -0
  294. package/dist/src/runtime/steps/memory-recall-prompt.d.ts +1 -0
  295. package/dist/src/runtime/steps/memory-recall-prompt.js +15 -0
  296. package/dist/src/runtime/steps/supervisor-decision/contracts.d.ts +4 -2
  297. package/dist/src/runtime/steps/supervisor-decision/diagnostics.d.ts +2 -0
  298. package/dist/src/runtime/steps/supervisor-decision/diagnostics.js +13 -6
  299. package/dist/src/runtime/steps/supervisor-decision/format.d.ts +2 -0
  300. package/dist/src/runtime/steps/supervisor-decision/format.js +41 -2
  301. package/dist/src/runtime/steps/supervisor-decision/input.d.ts +5 -1
  302. package/dist/src/runtime/steps/supervisor-decision/input.js +25 -5
  303. package/dist/src/runtime/steps/supervisor-decision/memory-recall-continuation.d.ts +10 -0
  304. package/dist/src/runtime/steps/supervisor-decision/memory-recall-continuation.js +32 -0
  305. package/dist/src/runtime/steps/supervisor-decision/parser.d.ts +2 -0
  306. package/dist/src/runtime/steps/supervisor-decision/parser.js +36 -1
  307. package/dist/src/runtime/steps/supervisor-decision/prompt.d.ts +3 -0
  308. package/dist/src/runtime/steps/supervisor-decision/prompt.js +16 -8
  309. package/dist/src/runtime/steps/supervisor-decision/response-recommendation.d.ts +13 -0
  310. package/dist/src/runtime/steps/supervisor-decision/response-recommendation.js +32 -0
  311. package/dist/src/runtime/steps/supervisor-decision/resume.d.ts +2 -0
  312. package/dist/src/runtime/steps/supervisor-decision/resume.js +13 -0
  313. package/dist/src/runtime/steps/supervisor-decision/run.d.ts +3 -0
  314. package/dist/src/runtime/steps/supervisor-decision/run.js +19 -0
  315. package/dist/src/runtime/steps/supervisor-decision/working-directory.js +7 -1
  316. package/dist/src/runtime/steps/supervisor-response/diagnostics.d.ts +1 -0
  317. package/dist/src/runtime/steps/supervisor-response/diagnostics.js +1 -0
  318. package/dist/src/runtime/steps/supervisor-response/input.d.ts +2 -1
  319. package/dist/src/runtime/steps/supervisor-response/input.js +17 -4
  320. package/dist/src/runtime/steps/supervisor-response/memory-authoring.d.ts +1 -0
  321. package/dist/src/runtime/steps/supervisor-response/memory-authoring.js +4 -0
  322. package/dist/src/runtime/steps/supervisor-response/prompt.d.ts +1 -0
  323. package/dist/src/runtime/steps/supervisor-response/prompt.js +8 -2
  324. package/dist/src/runtime/steps/supervisor-response/response-recommendation.d.ts +10 -0
  325. package/dist/src/runtime/steps/supervisor-response/response-recommendation.js +25 -0
  326. package/dist/src/runtime/steps/supervisor-response/run.d.ts +6 -1
  327. package/dist/src/runtime/steps/supervisor-response/run.js +26 -7
  328. package/dist/src/sessions/record/projection.js +1 -0
  329. package/dist/src/sessions/schedule-metadata.d.ts +8 -0
  330. package/dist/src/sessions/schedule-metadata.js +1 -0
  331. package/dist/src/sessions/session-service.d.ts +1 -0
  332. package/dist/src/sessions/session-service.js +1 -0
  333. package/dist/src/sessions/types.d.ts +2 -0
  334. package/dist/src/shared/http-server-shutdown.d.ts +4 -0
  335. package/dist/src/shared/http-server-shutdown.js +17 -0
  336. package/dist/src/shared/public-http/aggregate-gate.d.ts +3 -0
  337. package/dist/src/shared/public-http/aggregate-gate.js +87 -0
  338. package/dist/src/shared/public-http/deadline.d.ts +2 -0
  339. package/dist/src/shared/public-http/deadline.js +29 -0
  340. package/dist/src/shared/public-http/errors.d.ts +6 -0
  341. package/dist/src/shared/public-http/errors.js +11 -0
  342. package/dist/src/shared/public-http/limits.d.ts +8 -0
  343. package/dist/src/shared/public-http/limits.js +8 -0
  344. package/dist/src/shared/public-http/network-policy.d.ts +11 -0
  345. package/dist/src/shared/public-http/network-policy.js +178 -0
  346. package/dist/src/shared/public-http/public-http.d.ts +24 -0
  347. package/dist/src/shared/public-http/public-http.js +85 -0
  348. package/dist/src/shared/public-http/request-hop.d.ts +18 -0
  349. package/dist/src/shared/public-http/request-hop.js +140 -0
  350. package/dist/src/web-ui/app/ARCHITECTURE.md +66 -4
  351. package/dist/src/web-ui/app/app-bootstrap.js +53 -0
  352. package/dist/src/web-ui/app/app-dom.js +80 -0
  353. package/dist/src/web-ui/app/app.js +195 -212
  354. package/dist/src/web-ui/app/components/conversation-activity.d.ts +2 -0
  355. package/dist/src/web-ui/app/components/conversation-activity.js +34 -7
  356. package/dist/src/web-ui/app/components/conversation-role-cards.d.ts +1 -0
  357. package/dist/src/web-ui/app/components/conversation-role-cards.js +61 -5
  358. package/dist/src/web-ui/app/components/conversation-schedule.js +71 -0
  359. package/dist/src/web-ui/app/components/conversation-status.js +65 -0
  360. package/dist/src/web-ui/app/components/conversation-tools.d.ts +13 -0
  361. package/dist/src/web-ui/app/components/conversation-tools.js +284 -0
  362. package/dist/src/web-ui/app/components/conversation-view.js +39 -11
  363. package/dist/src/web-ui/app/components/dashboard/activity.js +61 -0
  364. package/dist/src/web-ui/app/components/dashboard/icons.js +23 -0
  365. package/dist/src/web-ui/app/components/dashboard/recent-conversations.js +64 -0
  366. package/dist/src/web-ui/app/components/dashboard/workspace.js +107 -0
  367. package/dist/src/web-ui/app/components/message-link-previews.d.ts +16 -0
  368. package/dist/src/web-ui/app/components/message-link-previews.js +179 -0
  369. package/dist/src/web-ui/app/components/schedules/details.js +101 -0
  370. package/dist/src/web-ui/app/components/schedules/form.d.ts +13 -0
  371. package/dist/src/web-ui/app/components/schedules/form.js +246 -0
  372. package/dist/src/web-ui/app/components/schedules/workspace-state.js +59 -0
  373. package/dist/src/web-ui/app/components/schedules/workspace.js +165 -0
  374. package/dist/src/web-ui/app/components/workspace-shell.js +48 -2
  375. package/dist/src/web-ui/app/configuration-feature.js +72 -0
  376. package/dist/src/web-ui/app/controllers/composer-attachments-controller.d.ts +1 -0
  377. package/dist/src/web-ui/app/controllers/composer-attachments-controller.js +17 -6
  378. package/dist/src/web-ui/app/controllers/composer-submit-controller.d.ts +2 -0
  379. package/dist/src/web-ui/app/controllers/composer-submit-controller.js +15 -1
  380. package/dist/src/web-ui/app/controllers/composer-surface-controller.js +58 -0
  381. package/dist/src/web-ui/app/controllers/composer-workspace-controller.d.ts +53 -0
  382. package/dist/src/web-ui/app/controllers/composer-workspace-controller.js +180 -0
  383. package/dist/src/web-ui/app/controllers/conversation-read-state-controller.d.ts +23 -0
  384. package/dist/src/web-ui/app/controllers/conversation-read-state-controller.js +82 -0
  385. package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +8 -0
  386. package/dist/src/web-ui/app/controllers/conversation-session-controller.js +28 -39
  387. package/dist/src/web-ui/app/controllers/dashboard-controller.js +127 -0
  388. package/dist/src/web-ui/app/controllers/home-composer-feature.d.ts +40 -0
  389. package/dist/src/web-ui/app/controllers/home-composer-feature.js +119 -0
  390. package/dist/src/web-ui/app/controllers/home-conversation-activation.js +37 -0
  391. package/dist/src/web-ui/app/controllers/realtime-event-controller.d.ts +1 -0
  392. package/dist/src/web-ui/app/controllers/realtime-event-controller.js +74 -3
  393. package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +2 -1
  394. package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +15 -14
  395. package/dist/src/web-ui/app/controllers/schedule-realtime.js +118 -0
  396. package/dist/src/web-ui/app/controllers/schedules-controller.js +421 -0
  397. package/dist/src/web-ui/app/controllers/session-controller.js +30 -3
  398. package/dist/src/web-ui/app/dashboard-feature.js +44 -0
  399. package/dist/src/web-ui/app/index.html +53 -1
  400. package/dist/src/web-ui/app/lib/composer-submission-scope.d.ts +21 -0
  401. package/dist/src/web-ui/app/lib/composer-submission-scope.js +13 -0
  402. package/dist/src/web-ui/app/lib/context-window-snapshot-order.d.ts +15 -0
  403. package/dist/src/web-ui/app/lib/context-window-snapshot-order.js +31 -0
  404. package/dist/src/web-ui/app/lib/conversation-role-model.d.ts +10 -1
  405. package/dist/src/web-ui/app/lib/conversation-role-model.js +97 -15
  406. package/dist/src/web-ui/app/lib/conversation-status-model.d.ts +12 -0
  407. package/dist/src/web-ui/app/lib/conversation-status-model.js +116 -0
  408. package/dist/src/web-ui/app/lib/dashboard-job-templates.js +41 -0
  409. package/dist/src/web-ui/app/lib/dashboard-presentation.js +126 -0
  410. package/dist/src/web-ui/app/lib/message-markdown.d.ts +5 -0
  411. package/dist/src/web-ui/app/lib/message-markdown.js +99 -0
  412. package/dist/src/web-ui/app/lib/message-url-policy.d.ts +1 -0
  413. package/dist/src/web-ui/app/lib/message-url-policy.js +13 -0
  414. package/dist/src/web-ui/app/lib/schedule-errors.js +29 -0
  415. package/dist/src/web-ui/app/lib/schedule-message.js +30 -0
  416. package/dist/src/web-ui/app/lib/schedule-presentation.js +81 -0
  417. package/dist/src/web-ui/app/lib/session-read-state.d.ts +22 -0
  418. package/dist/src/web-ui/app/lib/session-read-state.js +63 -0
  419. package/dist/src/web-ui/app/lib/text-format.js +2 -143
  420. package/dist/src/web-ui/app/lib/tool-activity-event.d.ts +26 -0
  421. package/dist/src/web-ui/app/lib/tool-activity-event.js +228 -0
  422. package/dist/src/web-ui/app/lib/tool-activity-model.d.ts +41 -0
  423. package/dist/src/web-ui/app/lib/tool-activity-model.js +255 -0
  424. package/dist/src/web-ui/app/lib/tool-timeline.d.ts +3 -0
  425. package/dist/src/web-ui/app/lib/tool-timeline.js +18 -0
  426. package/dist/src/web-ui/app/schedules-feature.js +87 -0
  427. package/dist/src/web-ui/app/services/message-link-preview-client.d.ts +14 -0
  428. package/dist/src/web-ui/app/services/message-link-preview-client.js +96 -0
  429. package/dist/src/web-ui/app/services/runtime-web-client/schedules.js +51 -0
  430. package/dist/src/web-ui/app/services/runtime-web-client.d.ts +37 -0
  431. package/dist/src/web-ui/app/services/runtime-web-client.js +13 -8
  432. package/dist/src/web-ui/app/styles/00-tokens-base.css +11 -11
  433. package/dist/src/web-ui/app/styles/18-dashboard.css +384 -0
  434. package/dist/src/web-ui/app/styles/20-chat-composer.css +1 -130
  435. package/dist/src/web-ui/app/styles/26-message-content.css +295 -0
  436. package/dist/src/web-ui/app/styles/27-conversation-tools.css +266 -0
  437. package/dist/src/web-ui/app/styles/28-conversation-status.css +52 -0
  438. package/dist/src/web-ui/app/styles/38-schedule-workspace.css +263 -0
  439. package/dist/src/web-ui/app/styles/38-schedules.css +352 -0
  440. package/dist/src/web-ui/app/styles/90-responsive.css +14 -0
  441. package/dist/src/web-ui/app/styles/91-schedules-responsive.css +72 -0
  442. package/dist/src/web-ui/app/styles/92-dashboard-responsive.css +88 -0
  443. package/dist/src/web-ui/app/styles.css +8 -0
  444. package/dist/src/web-ui/app/ui-behavior.d.ts +1 -1
  445. package/dist/src/web-ui/app/ui-behavior.js +3 -1
  446. package/dist/src/web-ui/app/vendor/README.md +15 -0
  447. package/dist/src/web-ui/app/vendor/markdown-it.LICENSE +22 -0
  448. package/dist/src/web-ui/app/vendor/markdown-it.js +3003 -0
  449. package/dist/src/web-ui/link-preview/metadata.d.ts +9 -0
  450. package/dist/src/web-ui/link-preview/metadata.js +97 -0
  451. package/dist/src/web-ui/link-preview/preview-cache.d.ts +4 -0
  452. package/dist/src/web-ui/link-preview/preview-cache.js +23 -0
  453. package/dist/src/web-ui/link-preview/raster-response.d.ts +9 -0
  454. package/dist/src/web-ui/link-preview/raster-response.js +49 -0
  455. package/dist/src/web-ui/link-preview/routes.d.ts +3 -0
  456. package/dist/src/web-ui/link-preview/routes.js +97 -0
  457. package/dist/src/web-ui/link-preview/service.d.ts +11 -0
  458. package/dist/src/web-ui/link-preview/service.js +117 -0
  459. package/dist/src/web-ui/local-runtime/api-router.d.ts +4 -1
  460. package/dist/src/web-ui/local-runtime/api-router.js +42 -73
  461. package/dist/src/web-ui/local-runtime/contracts.d.ts +2 -2
  462. package/dist/src/web-ui/local-runtime/environment-registry.d.ts +12 -1
  463. package/dist/src/web-ui/local-runtime/environment-registry.js +38 -3
  464. package/dist/src/web-ui/local-runtime/realtime-controller.js +3 -1
  465. package/dist/src/web-ui/local-runtime/request-execution.d.ts +5 -1
  466. package/dist/src/web-ui/local-runtime/request-execution.js +38 -2
  467. package/dist/src/web-ui/local-runtime/schedule-job-creation.d.ts +7 -0
  468. package/dist/src/web-ui/local-runtime/schedule-job-creation.js +62 -0
  469. package/dist/src/web-ui/local-runtime/schedule-management-routes.d.ts +30 -0
  470. package/dist/src/web-ui/local-runtime/schedule-management-routes.js +134 -0
  471. package/dist/src/web-ui/local-runtime/schedule-run-page.d.ts +5 -0
  472. package/dist/src/web-ui/local-runtime/schedule-run-page.js +23 -0
  473. package/dist/src/web-ui/local-runtime/session-routes.d.ts +17 -0
  474. package/dist/src/web-ui/local-runtime/session-routes.js +74 -0
  475. package/dist/src/web-ui/local-runtime-backend.d.ts +2 -0
  476. package/dist/src/web-ui/local-runtime-backend.js +11 -1
  477. package/dist/src/web-ui/schedule-creation-contract.d.ts +7 -0
  478. package/dist/src/web-ui/schedule-creation-contract.js +1 -0
  479. package/dist/src/web-ui/server-shutdown.d.ts +4 -0
  480. package/dist/src/web-ui/server-shutdown.js +32 -0
  481. package/dist/src/web-ui/server.js +13 -10
  482. package/dist/src/web-ui/session-read-state/availability.d.ts +16 -0
  483. package/dist/src/web-ui/session-read-state/availability.js +20 -0
  484. package/dist/src/web-ui/session-read-state/projection.d.ts +17 -0
  485. package/dist/src/web-ui/session-read-state/projection.js +71 -0
  486. package/dist/src/web-ui/session-read-state/service.d.ts +86 -0
  487. package/dist/src/web-ui/session-read-state/service.js +89 -0
  488. package/dist/src/web-ui/session-read-state/store.d.ts +22 -0
  489. package/dist/src/web-ui/session-read-state/store.js +110 -0
  490. package/docs/configuration.md +41 -1
  491. package/docs/long-term-memory.md +46 -5
  492. package/docs/runtime-invariant-coverage.md +1 -1
  493. package/docs/runtime-library.md +23 -0
  494. package/docs/runtime-public-contracts.md +32 -1
  495. package/package.json +3 -1
  496. package/plugins/code-outline/plugin.json +15 -0
  497. package/plugins/document-reader/plugin.json +17 -0
  498. package/plugins/filesystem/plugin.json +17 -2
  499. package/plugins/json-inspector/plugin.json +12 -0
  500. package/plugins/local-search/plugin.json +12 -0
  501. package/plugins/memory/plugin.json +26 -1
  502. package/plugins/memory/source/index.ts +10 -6
  503. package/plugins/memory/src/index.cjs +11 -7
  504. package/plugins/project-orientation/plugin.json +14 -0
  505. package/plugins/web/source/aggregate-gate.ts +8 -130
  506. package/plugins/web/source/deadline.ts +14 -50
  507. package/plugins/web/source/errors.ts +17 -11
  508. package/plugins/web/source/limits.ts +3 -6
  509. package/plugins/web/source/network-policy.ts +28 -226
  510. package/plugins/web/source/public-http.ts +17 -142
  511. package/plugins/web/source/request-hop.ts +11 -191
  512. package/plugins/web/src/index.cjs +119 -59
  513. package/runtime.config.schema.json +7 -0
  514. package/src/runtime/README.md +105 -1
  515. package/src/runtime/local-host/README.md +86 -0
  516. package/src/runtime/scheduler/README.md +166 -0
@@ -0,0 +1,31 @@
1
+ function positiveSequence(value) {
2
+ return Number.isSafeInteger(value) && value > 0 ? value : null;
3
+ }
4
+
5
+ function comparableSequenceDifference(previous, incoming) {
6
+ const previousOriginal = positiveSequence(previous?.eventSequence);
7
+ const incomingOriginal = positiveSequence(incoming?.eventSequence);
8
+ if (previousOriginal !== null && incomingOriginal !== null) {
9
+ return incomingOriginal - previousOriginal;
10
+ }
11
+ const previousTransport = positiveSequence(
12
+ previous?.seqNo ?? previous?.lastSeqNo,
13
+ );
14
+ const incomingTransport = positiveSequence(
15
+ incoming?.seqNo ?? incoming?.lastSeqNo,
16
+ );
17
+ if (previousTransport === null || incomingTransport === null) return null;
18
+ return incomingTransport - previousTransport;
19
+ }
20
+
21
+ export function canReplaceContextWindowEvidence(previous, incoming) {
22
+ const difference = comparableSequenceDifference(previous, incoming);
23
+ if (difference === null) return true;
24
+ return difference > 0;
25
+ }
26
+
27
+ export function isEventAfterContextWindowSnapshot(snapshot, event) {
28
+ const difference = comparableSequenceDifference(snapshot, event);
29
+ if (difference === null) return false;
30
+ return difference > 0;
31
+ }
@@ -1,4 +1,12 @@
1
- export type ConversationRole = "supervisor" | "planner" | "worker" | "reviewer";
1
+ import type { ConversationToolAction } from "./tool-activity-model.js";
2
+
3
+ export type ConversationRole =
4
+ | "supervisor"
5
+ | "planner"
6
+ | "worker"
7
+ | "researcher"
8
+ | "reviewer"
9
+ | "unknown";
2
10
 
3
11
  export interface ConversationRoleCard {
4
12
  id: string;
@@ -8,6 +16,7 @@ export interface ConversationRoleCard {
8
16
  phaseLabel: string;
9
17
  summary: string;
10
18
  facts: string[];
19
+ toolActions?: ConversationToolAction[];
11
20
  active: boolean;
12
21
  tone: "active" | "failed" | "recorded";
13
22
  }
@@ -6,22 +6,36 @@ import {
6
6
  } from "./event-presentation.js";
7
7
  import { textOf } from "./text-format.js";
8
8
  import { countToolInvocations } from "./tool-invocation-count.js";
9
+ import { projectToolActivityEvent } from "./tool-activity-event.js";
10
+ import {
11
+ buildConversationToolActions,
12
+ summarizeConversationTools,
13
+ } from "./tool-activity-model.js";
9
14
 
10
15
  const ROLE_TITLES = Object.freeze({
11
16
  supervisor: "Supervisor",
12
17
  planner: "Planner",
13
18
  worker: "Worker",
19
+ researcher: "Researcher",
14
20
  reviewer: "Reviewer",
21
+ unknown: "Unattributed actions",
15
22
  });
16
23
 
17
24
  const ROLE_RESPONSIBILITIES = Object.freeze({
18
25
  supervisor: "Coordinates the request",
19
26
  planner: "Plans the work",
20
27
  worker: "Performs assigned tasks",
28
+ researcher: "Investigates assigned questions",
21
29
  reviewer: "Reviews the result",
30
+ unknown: "Executor not recorded",
22
31
  });
23
32
 
24
33
  function latestRoleAction(group) {
34
+ if (group.toolActions.some((action) => !action.legacy)) {
35
+ return group.latestRoleEvent
36
+ ? roleActivitySummary(group.latestRoleEvent)
37
+ : "";
38
+ }
25
39
  const toolEvent = group.toolEvents.at(-1);
26
40
  return roleActivitySummary(toolEvent || group.latestEvent);
27
41
  }
@@ -89,6 +103,11 @@ function isToolActivityEvent(event) {
89
103
  return activityEventName(event).startsWith("tool.");
90
104
  }
91
105
 
106
+ function roleActivityStage(event) {
107
+ if (isToolActivityEvent(event)) return "";
108
+ return textOf(event.stage).trim();
109
+ }
110
+
92
111
  function hasSupportedRoleStage(stage) {
93
112
  return Object.hasOwn(ROLE_TITLES, stage);
94
113
  }
@@ -106,7 +125,14 @@ function roleActivitySummary(event) {
106
125
  }
107
126
 
108
127
  function createRoleGroup(role, event) {
109
- return { role, phase: "", latestEvent: event, toolEvents: [] };
128
+ return {
129
+ role,
130
+ phase: "",
131
+ latestEvent: event,
132
+ latestRoleEvent: null,
133
+ toolEvents: [],
134
+ toolActions: [],
135
+ };
110
136
  }
111
137
 
112
138
  function isActiveRoleActivity(group, activeRole, streaming) {
@@ -124,18 +150,24 @@ function buildRoleCard(group, activeRole, streaming) {
124
150
  const failed = isFailedRoleActivity(group.latestEvent);
125
151
  const active = isActiveRoleActivity(group, activeRole, streaming);
126
152
  const toolCount = countToolInvocations(group.toolEvents);
153
+ const toolSummary = summarizeConversationTools(group.toolActions);
127
154
  let tone = "recorded";
128
155
  if (active) tone = "active";
129
156
  if (failed) tone = "failed";
130
157
  return {
131
158
  id: group.role,
132
159
  role: group.role,
133
- title: ROLE_TITLES[group.role],
160
+ title:
161
+ group.role === "supervisor" && !group.latestRoleEvent
162
+ ? "Root agent"
163
+ : ROLE_TITLES[group.role],
134
164
  responsibility: ROLE_RESPONSIBILITIES[group.role],
135
165
  phaseLabel: titleCaseEventValue(group.phase),
136
166
  summary: latestRoleAction(group),
137
- facts:
138
- toolCount > 0
167
+ toolActions: group.toolActions,
168
+ facts: toolSummary
169
+ ? [toolSummary]
170
+ : toolCount > 0
139
171
  ? [`${toolCount} tool call${toolCount === 1 ? "" : "s"}`]
140
172
  : [],
141
173
  active,
@@ -155,32 +187,56 @@ export function buildConversationRoleCards({
155
187
  let activeRole = "";
156
188
  let terminalSeen = false;
157
189
  const activityEvents = Array.isArray(events) ? events : [];
158
- for (const event of orderedRequestActivity(
190
+ const orderedEvents = orderedRequestActivity(
159
191
  activityEvents,
160
192
  normalizedRequestId,
161
- )) {
193
+ );
194
+ const executionOwners = recordedExecutionOwners(orderedEvents);
195
+ const toolEvents = [];
196
+ for (const event of orderedEvents) {
162
197
  if (isRequestTerminalEvent(event)) {
163
198
  terminalSeen = true;
164
199
  activeRole = "";
165
200
  continue;
166
201
  }
167
202
 
168
- const stage = textOf(event.stage).trim();
203
+ const stage = roleActivityStage(event);
169
204
  if (stage) {
170
205
  activeRole = "";
171
- if (!hasSupportedRoleStage(stage)) continue;
172
- activeRole = stage;
173
- const group = groups.get(stage) || createRoleGroup(stage, event);
174
- group.phase = textOf(event.phase);
175
- group.latestEvent = event;
176
- groups.set(stage, group);
206
+ if (hasSupportedRoleStage(stage)) {
207
+ activeRole = stage;
208
+ const group = groups.get(stage) || createRoleGroup(stage, event);
209
+ group.phase = textOf(event.phase);
210
+ group.latestEvent = event;
211
+ group.latestRoleEvent = event;
212
+ groups.set(stage, group);
213
+ }
177
214
  }
178
215
 
179
- if (!activeRole) continue;
180
216
  if (!isToolActivityEvent(event)) continue;
181
- const group = groups.get(activeRole);
217
+ const evidence = event.toolActivity || projectToolActivityEvent(event);
218
+ const owner = toolExecutorRole(evidence, executionOwners, activeRole);
219
+ if (evidence)
220
+ toolEvents.push({
221
+ ...event,
222
+ toolActivity: { ...evidence, executorRole: owner },
223
+ });
224
+ if (!owner) continue;
225
+ const group = groups.get(owner) || createRoleGroup(owner, event);
182
226
  group.latestEvent = event;
183
227
  group.toolEvents.push({ ...event, eventName: activityEventName(event) });
228
+ groups.set(owner, group);
229
+ }
230
+
231
+ for (const action of buildConversationToolActions({
232
+ requestId: normalizedRequestId,
233
+ events: toolEvents,
234
+ streaming,
235
+ })) {
236
+ const owner = action.executorRole || "unknown";
237
+ const group = groups.get(owner) || createRoleGroup(owner, {});
238
+ group.toolActions.push(action);
239
+ groups.set(owner, group);
184
240
  }
185
241
 
186
242
  return [...groups.values()].map((group) =>
@@ -191,3 +247,29 @@ export function buildConversationRoleCards({
191
247
  ),
192
248
  );
193
249
  }
250
+
251
+ function recordedExecutionOwners(events) {
252
+ const owners = new Map();
253
+ for (const event of events) {
254
+ const evidence = event.toolActivity || projectToolActivityEvent(event);
255
+ if (!evidence?.executionId || !evidence.executorRole) continue;
256
+ const role = hasSupportedRoleStage(evidence.executorRole)
257
+ ? evidence.executorRole
258
+ : "unknown";
259
+ owners.set(evidence.executionId, role);
260
+ }
261
+ return owners;
262
+ }
263
+
264
+ function toolExecutorRole(evidence, executionOwners, activeRole) {
265
+ if (evidence?.executionId && executionOwners.has(evidence.executionId)) {
266
+ return executionOwners.get(evidence.executionId);
267
+ }
268
+ if (evidence?.executorRole) {
269
+ return hasSupportedRoleStage(evidence.executorRole)
270
+ ? evidence.executorRole
271
+ : "unknown";
272
+ }
273
+ if (evidence?.executionId) return "unknown";
274
+ return activeRole;
275
+ }
@@ -0,0 +1,12 @@
1
+ export interface ConversationStatus {
2
+ label: string;
3
+ animate: boolean;
4
+ }
5
+
6
+ export declare function buildConversationStatus(input?: {
7
+ requestId?: string;
8
+ streaming?: boolean;
9
+ connected?: boolean;
10
+ contextWindow?: Record<string, unknown> | null;
11
+ events?: Record<string, unknown>[];
12
+ }): ConversationStatus | null;
@@ -0,0 +1,116 @@
1
+ import { buildConversationToolActions } from "./tool-activity-model.js";
2
+ import { isEventAfterContextWindowSnapshot } from "./context-window-snapshot-order.js";
3
+ import { textOf } from "./text-format.js";
4
+
5
+ const MODEL_STEP_LABELS = Object.freeze({
6
+ "supervisor.decision": "Making a decision",
7
+ "execution.decision": "Making a decision",
8
+ "worker.decision": "Making a decision",
9
+ "capability.controls": "Making a decision",
10
+ "planner.decision": "Planning",
11
+ "planner.graph": "Planning",
12
+ "reviewer.decision": "Reviewing",
13
+ "auditor.decision": "Reviewing",
14
+ "worker.result": "Summarizing results",
15
+ "supervisor.response": "Preparing response",
16
+ "execution.response": "Preparing response",
17
+ "degraded.finalization": "Preparing response",
18
+ "context.compact": "Compacting context",
19
+ "tool_payload.raw": "Working",
20
+ });
21
+
22
+ const SETTLED_TOOL_EVENTS = new Set([
23
+ "tool.completed",
24
+ "tool.failed",
25
+ "tool.payload.failed",
26
+ "tool.approval.rejected",
27
+ ]);
28
+
29
+ function hasToolStatus(actions, status) {
30
+ return actions.some((action) => action.status === status);
31
+ }
32
+
33
+ function hasMatchingContextRequest(contextWindow, requestId) {
34
+ return textOf(contextWindow?.requestId) === requestId;
35
+ }
36
+
37
+ function hasPendingRequestCompaction(contextWindow, requestId) {
38
+ if (!hasMatchingContextRequest(contextWindow, requestId)) return false;
39
+ return Boolean(contextWindow.pendingCompaction);
40
+ }
41
+
42
+ function hasAcceptedRequestSnapshot(contextWindow, requestId) {
43
+ if (!hasMatchingContextRequest(contextWindow, requestId)) return false;
44
+ const snapshot = contextWindow.snapshot;
45
+ if (!snapshot) return false;
46
+ if (textOf(snapshot.requestId) !== requestId) return false;
47
+ return snapshot.admissionOutcome === "accepted";
48
+ }
49
+
50
+ function isSettledToolAfterSnapshot(event, snapshot) {
51
+ const name = textOf(
52
+ event.toolActivity?.name ||
53
+ event.eventName ||
54
+ event.name ||
55
+ event.rawType ||
56
+ event.type,
57
+ );
58
+ if (!SETTLED_TOOL_EVENTS.has(name)) return false;
59
+ return isEventAfterContextWindowSnapshot(snapshot, event);
60
+ }
61
+
62
+ function hasUsageForCurrentInvocation(contextWindow) {
63
+ const invocationId = textOf(contextWindow.snapshot?.invocationId);
64
+ if (!invocationId) return false;
65
+ return textOf(contextWindow.providerUsage?.invocationId) === invocationId;
66
+ }
67
+
68
+ function activeStatus(label) {
69
+ return { label, animate: true };
70
+ }
71
+
72
+ function modelStepLabel(modelStep) {
73
+ if (!Object.hasOwn(MODEL_STEP_LABELS, modelStep)) return "Working";
74
+ return MODEL_STEP_LABELS[modelStep];
75
+ }
76
+
77
+ export function buildConversationStatus({
78
+ requestId,
79
+ streaming = false,
80
+ connected = true,
81
+ contextWindow = null,
82
+ events = [],
83
+ } = {}) {
84
+ const activeRequestId = textOf(requestId).trim();
85
+ if (!activeRequestId) return null;
86
+ if (!streaming) return null;
87
+ if (!connected) return { label: "Reconnecting", animate: false };
88
+
89
+ const scopedEvents = events.filter(
90
+ (event) => event.requestId === activeRequestId,
91
+ );
92
+ const tools = buildConversationToolActions({
93
+ requestId: activeRequestId,
94
+ streaming: true,
95
+ events: scopedEvents,
96
+ });
97
+ if (hasToolStatus(tools, "awaiting_approval")) {
98
+ return { label: "Waiting for approval", animate: false };
99
+ }
100
+ if (hasToolStatus(tools, "running")) return activeStatus("Running tool");
101
+ if (hasPendingRequestCompaction(contextWindow, activeRequestId)) {
102
+ return activeStatus("Compacting context");
103
+ }
104
+ if (hasToolStatus(tools, "preparing")) return activeStatus("Working");
105
+ if (!hasAcceptedRequestSnapshot(contextWindow, activeRequestId)) {
106
+ return activeStatus("Working");
107
+ }
108
+ const snapshot = contextWindow.snapshot;
109
+ const settledAfterSnapshot = scopedEvents.some((event) =>
110
+ isSettledToolAfterSnapshot(event, snapshot),
111
+ );
112
+ if (settledAfterSnapshot) return activeStatus("Working");
113
+ if (hasUsageForCurrentInvocation(contextWindow))
114
+ return activeStatus("Working");
115
+ return activeStatus(modelStepLabel(snapshot.modelStep));
116
+ }
@@ -0,0 +1,41 @@
1
+ const templates = [
2
+ {
3
+ id: "briefing",
4
+ title: "Morning briefing",
5
+ description: "A concise roundup of the day's important news.",
6
+ timingLabel: "Daily · 08:00",
7
+ schedule: { kind: "daily", at: "08:00" },
8
+ prompt: "Find the five most significant world news developments from the past 24 hours. Give each a short headline, a two-sentence factual summary, and a link to a reliable source. Keep the briefing under 400 words.",
9
+ },
10
+ {
11
+ id: "learning",
12
+ title: "Learn something new",
13
+ description: "One useful idea, with an example to make it stick.",
14
+ timingLabel: "Weekdays · 12:00",
15
+ schedule: { kind: "weekly", at: "12:00", weekdays: [1, 2, 3, 4, 5] },
16
+ prompt: "Teach me one useful idea from science, history, technology, or everyday life in under 250 words. Explain it in plain language, give one concrete example, and finish with a question I can think about.",
17
+ },
18
+ {
19
+ id: "reflection",
20
+ title: "Weekly reflection",
21
+ description: "Pause, reflect, and choose a priority for next week.",
22
+ timingLabel: "Sunday · 18:00",
23
+ schedule: { kind: "weekly", at: "18:00", weekdays: [0] },
24
+ prompt: "Create a short weekly reflection exercise: three questions about what went well, what was difficult, and what to change next week. Finish with a simple template for choosing one priority. Do not assume anything about my work or personal circumstances.",
25
+ },
26
+ ];
27
+
28
+ export function getDashboardJobTemplates() {
29
+ return structuredClone(templates);
30
+ }
31
+
32
+ export function dashboardJobInitialValues(templateId, modelProfileId) {
33
+ const template = templates.find((item) => item.id === templateId);
34
+ return {
35
+ ...(template ? structuredClone(template) : {}),
36
+ newConversation: true,
37
+ modelProfileId,
38
+ agentMode: "reasoning",
39
+ timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
40
+ };
41
+ }
@@ -0,0 +1,126 @@
1
+ import { formatTime, textOf } from "./text-format.js";
2
+ import { isSessionReadStateUnavailable } from "./session-read-state.js";
3
+
4
+ function timestampValue(value) {
5
+ if (value === null || value === undefined || value === "") return 0;
6
+ const normalized =
7
+ typeof value === "string" && /^\d+$/u.test(value) ? Number(value) : value;
8
+ const timestamp = new Date(normalized).getTime();
9
+ return Number.isFinite(timestamp) ? timestamp : 0;
10
+ }
11
+
12
+ function dashboardKnownUnreadCount(session) {
13
+ const count = Number(session.unreadCount);
14
+ if (Number.isFinite(count) && count > 0) return Math.floor(count);
15
+ return session.hasUnread === true ? 1 : 0;
16
+ }
17
+
18
+ export function dashboardUnreadCount(session) {
19
+ if (isSessionReadStateUnavailable(session)) return null;
20
+ return dashboardKnownUnreadCount(session);
21
+ }
22
+
23
+ function compareConversationRecency(left, right) {
24
+ return timestampValue(right.updatedAt) - timestampValue(left.updatedAt);
25
+ }
26
+
27
+ export function projectDashboardConversations(sessions = [], recentLimit = 6) {
28
+ const unique = new Map();
29
+ for (const session of [...sessions].sort(compareConversationRecency)) {
30
+ const id = textOf(session.id);
31
+ if (!id || unique.has(id)) continue;
32
+ unique.set(id, {
33
+ id,
34
+ title: textOf(session.displayName || session.title || id),
35
+ preview: textOf(session.lastMessagePreview),
36
+ updatedAt: session.updatedAt,
37
+ unreadCount: dashboardUnreadCount(session),
38
+ readStateUnavailable: isSessionReadStateUnavailable(session),
39
+ hasKnownUnreadMessages: dashboardKnownUnreadCount(session) > 0,
40
+ });
41
+ }
42
+ const conversations = [...unique.values()];
43
+ const unread = conversations.filter(
44
+ (session) => session.hasKnownUnreadMessages,
45
+ );
46
+ const read = conversations.filter(
47
+ (session) => !session.hasKnownUnreadMessages,
48
+ );
49
+ const availableReadSlots = Math.max(0, recentLimit - unread.length);
50
+ return {
51
+ conversations: [...unread, ...read.slice(0, availableReadSlots)],
52
+ totalCount: conversations.length,
53
+ hasUnavailableReadState: conversations.some(
54
+ (session) => session.readStateUnavailable,
55
+ ),
56
+ unreadCount: unread.reduce(
57
+ (total, session) => total + (session.unreadCount ?? 0),
58
+ 0,
59
+ ),
60
+ };
61
+ }
62
+
63
+ const runOutcomes = {
64
+ pending: { label: "Waiting to run", tone: "neutral" },
65
+ running: { label: "Running", tone: "active" },
66
+ succeeded: { label: "Completed", tone: "success" },
67
+ failed: { label: "Failed", tone: "failed" },
68
+ cancelled: { label: "Cancelled", tone: "neutral" },
69
+ interrupted: { label: "Interrupted", tone: "failed" },
70
+ missed: { label: "Missed", tone: "neutral" },
71
+ };
72
+
73
+ function activityTimestamp(run) {
74
+ return run.scheduledAt;
75
+ }
76
+
77
+ export function projectDashboardActivity(runs = [], limit = 6) {
78
+ const ordered = [...runs].sort(
79
+ (left, right) =>
80
+ timestampValue(activityTimestamp(right)) -
81
+ timestampValue(activityTimestamp(left)),
82
+ );
83
+ const unique = new Map();
84
+ for (const run of ordered) {
85
+ const id = textOf(run.id);
86
+ if (!id || unique.has(id)) continue;
87
+ const outcome = runOutcomes[run.status] || {
88
+ label: "Status unavailable",
89
+ tone: "neutral",
90
+ };
91
+ unique.set(id, {
92
+ id,
93
+ title: textOf(run.title) || "Scheduled task",
94
+ sessionId: textOf(run.sessionId),
95
+ requestId: textOf(run.requestId),
96
+ timestamp: activityTimestamp(run),
97
+ statusLabel: outcome.label,
98
+ tone: outcome.tone,
99
+ });
100
+ }
101
+ return [...unique.values()].slice(0, limit);
102
+ }
103
+
104
+ export function dashboardTimePresentation(value, now = Date.now()) {
105
+ const timestamp = timestampValue(value);
106
+ if (!timestamp) return null;
107
+ const elapsed = now - timestamp;
108
+ const date = new Date(timestamp);
109
+ const presentation = {
110
+ dateTime: date.toISOString(),
111
+ title: formatTime(timestamp),
112
+ label: date.toLocaleDateString(undefined, {
113
+ month: "short",
114
+ day: "numeric",
115
+ }),
116
+ };
117
+ if (elapsed < 0) return { ...presentation, label: formatTime(timestamp) };
118
+ if (elapsed < 60000) return { ...presentation, label: "Just now" };
119
+ if (elapsed < 3600000)
120
+ return { ...presentation, label: `${Math.floor(elapsed / 60000)}m ago` };
121
+ if (elapsed < 86400000)
122
+ return { ...presentation, label: `${Math.floor(elapsed / 3600000)}h ago` };
123
+ if (elapsed < 604800000)
124
+ return { ...presentation, label: `${Math.floor(elapsed / 86400000)}d ago` };
125
+ return presentation;
126
+ }
@@ -0,0 +1,5 @@
1
+ export declare function renderMarkdown(raw: unknown): string;
2
+ export declare function extractMessageLinks(raw: unknown): Array<{
3
+ url: string;
4
+ label: string;
5
+ }>;
@@ -0,0 +1,99 @@
1
+ import MarkdownIt from "../vendor/markdown-it.js";
2
+ import { safeLinkHref } from "./message-url-policy.js";
3
+ import { parseWebSourceUrl } from "./source-url-policy.js";
4
+
5
+ const markdown = new MarkdownIt({
6
+ html: false,
7
+ breaks: true,
8
+ linkify: true,
9
+ typographer: false,
10
+ });
11
+
12
+ markdown.linkify.set({ fuzzyLink: true });
13
+
14
+ // Leave parsing to the Markdown grammar, then apply the stricter display
15
+ // policy. Rejecting a valid Markdown token during parsing can make linkify
16
+ // reinterpret only a fragment of its destination as an unrelated URL.
17
+ markdown.renderer.rules.link_open = (tokens, index, options, env, renderer) => {
18
+ const token = tokens[index];
19
+ if (!safeLinkHref(token.attrGet("href"))) {
20
+ const closing = tokens
21
+ .slice(index + 1)
22
+ .find((item) => item.type === "link_close");
23
+ if (closing) closing.hidden = true;
24
+ return "";
25
+ }
26
+ token.attrSet("target", "_blank");
27
+ token.attrSet("rel", "noopener noreferrer");
28
+ return renderer.renderToken(tokens, index, options);
29
+ };
30
+ markdown.renderer.rules.table_open = () =>
31
+ '<div class="markdown-table-scroll" role="region" aria-label="Message table" tabindex="0"><table>\n';
32
+ markdown.renderer.rules.table_close = () => "</table></div>\n";
33
+
34
+ function isImageInsideLink(tokens, index) {
35
+ const boundary = tokens
36
+ .slice(0, index)
37
+ .findLast(
38
+ (token) => token.type === "link_open" || token.type === "link_close",
39
+ );
40
+ return boundary?.type === "link_open";
41
+ }
42
+
43
+ // Remote images use the bounded preview path too: rendering a message must
44
+ // never issue an unchecked image request to an arbitrary host.
45
+ markdown.renderer.rules.image = (tokens, index) => {
46
+ const token = tokens[index];
47
+ const label = markdown.utils.escapeHtml(token.content || "Image");
48
+ if (isImageInsideLink(tokens, index)) return label;
49
+ const href = safeLinkHref(token.attrGet("src"));
50
+ if (!href) return label;
51
+ return `<a href="${markdown.utils.escapeHtml(href)}" target="_blank" rel="noopener noreferrer">${label}</a>`;
52
+ };
53
+
54
+ function messageSource(raw) {
55
+ if (typeof raw === "string") return raw;
56
+ if (typeof raw === "number" || typeof raw === "boolean") return String(raw);
57
+ return "";
58
+ }
59
+
60
+ export function renderMarkdown(raw) {
61
+ return markdown.render(messageSource(raw));
62
+ }
63
+
64
+ function inlineLinkLabel(tokens, start) {
65
+ const label = [];
66
+ for (let index = start + 1; index < tokens.length; index += 1) {
67
+ const token = tokens[index];
68
+ if (token.type === "link_close") break;
69
+ if (token.content) label.push(token.content);
70
+ }
71
+ return label.join("");
72
+ }
73
+
74
+ export function extractMessageLinks(raw) {
75
+ const links = [];
76
+ const seen = new Set();
77
+ const blocks = markdown.parse(messageSource(raw), {});
78
+ for (const block of blocks) {
79
+ if (block.type !== "inline") continue;
80
+ const tokens = block.children || [];
81
+ for (const [index, token] of tokens.entries()) {
82
+ const isImage = token.type === "image";
83
+ if (token.type !== "link_open" && !isImage) continue;
84
+ if (isImage && isImageInsideLink(tokens, index)) continue;
85
+ const url = parseWebSourceUrl(token.attrGet(isImage ? "src" : "href"));
86
+ if (!url) continue;
87
+ const key = new URL(url.href);
88
+ key.hash = "";
89
+ if (seen.has(key.href)) continue;
90
+ seen.add(key.href);
91
+ links.push({
92
+ url: url.href,
93
+ label: isImage ? token.content : inlineLinkLabel(tokens, index),
94
+ });
95
+ if (links.length === 3) return links;
96
+ }
97
+ }
98
+ return links;
99
+ }
@@ -0,0 +1 @@
1
+ export declare function safeLinkHref(value: unknown, baseHref?: string): string;
@@ -0,0 +1,13 @@
1
+ export function safeLinkHref(value, baseHref = globalThis.location?.href) {
2
+ if (typeof value !== "string" || !value.trim()) return "";
3
+ if (value.length > 4_096 || /[\u0000-\u0020\u007f]/u.test(value)) return "";
4
+ try {
5
+ const url = new URL(value, baseHref);
6
+ if (url.username || url.password) return "";
7
+ if (url.protocol === "http:" || url.protocol === "https:") return url.href;
8
+ if (url.protocol === "mailto:") return url.href;
9
+ return "";
10
+ } catch {
11
+ return "";
12
+ }
13
+ }