@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.
- package/README.md +14 -0
- package/dist/src/bridge/request-steering.d.ts +2 -1
- package/dist/src/bridge/request-steering.js +4 -2
- package/dist/src/bridge/runtime-replay.js +2 -19
- package/dist/src/bridge/start-agent-bridge.js +1 -1
- package/dist/src/capabilities/normal-invocation/validator.js +1 -1
- package/dist/src/capabilities/tool-definition-validator/event-presentation.js +3 -0
- package/dist/src/capabilities/tool-definition-validator/event-result-metadata.d.ts +2 -0
- package/dist/src/capabilities/tool-definition-validator/event-result-metadata.js +74 -0
- package/dist/src/capabilities/tool-event-metadata.js +3 -0
- package/dist/src/capabilities/tool-result-event-projection.d.ts +3 -0
- package/dist/src/capabilities/tool-result-event-projection.js +82 -0
- package/dist/src/capabilities/tool-types.d.ts +5 -0
- package/dist/src/cli/abot.js +2 -11
- package/dist/src/runtime/adapters/in-memory-session-store.js +1 -0
- package/dist/src/runtime/adapters/long-term-memory/file-lock/acquisition.js +11 -2
- package/dist/src/runtime/adapters/long-term-memory/file-lock/contracts.d.ts +2 -0
- package/dist/src/runtime/adapters/long-term-memory/file-lock/synchronous-release.d.ts +2 -0
- package/dist/src/runtime/adapters/long-term-memory/file-lock/synchronous-release.js +40 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/approval.d.ts +3 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/approval.js +9 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/rejection-event.d.ts +13 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/rejection-event.js +25 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/run.js +18 -2
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/executor.js +8 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/payload/lifecycle.js +7 -3
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/shared/contracts.d.ts +17 -2
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/shared/event-metadata.d.ts +9 -0
- package/dist/src/runtime/adapters/registered-tool-normal-invocations/shared/event-metadata.js +8 -0
- package/dist/src/runtime/adapters/registered-tool-worker-capabilities/execution.js +16 -1
- package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-observability.js +2 -2
- package/dist/src/runtime/adapters/scheduled-request-outcome.d.ts +11 -0
- package/dist/src/runtime/adapters/scheduled-request-outcome.js +41 -0
- package/dist/src/runtime/adapters/scheduler-runtime.d.ts +19 -0
- package/dist/src/runtime/adapters/scheduler-runtime.js +138 -0
- package/dist/src/runtime/capabilities/scheduling/create-operations.d.ts +55 -0
- package/dist/src/runtime/capabilities/scheduling/create-operations.js +30 -0
- package/dist/src/runtime/capabilities/scheduling/create-time-zone.d.ts +1 -0
- package/dist/src/runtime/capabilities/scheduling/create-time-zone.js +11 -0
- package/dist/src/runtime/capabilities/scheduling/job-list-page.d.ts +25 -0
- package/dist/src/runtime/capabilities/scheduling/job-list-page.js +40 -0
- package/dist/src/runtime/capabilities/scheduling/model-validation.d.ts +2 -0
- package/dist/src/runtime/capabilities/scheduling/model-validation.js +15 -0
- package/dist/src/runtime/capabilities/scheduling/tool-contract.d.ts +2 -0
- package/dist/src/runtime/capabilities/scheduling/tool-contract.js +35 -0
- package/dist/src/runtime/capabilities/scheduling/tool-input-properties.d.ts +43 -0
- package/dist/src/runtime/capabilities/scheduling/tool-input-properties.js +27 -0
- package/dist/src/runtime/capabilities/scheduling/tool-module.d.ts +4 -0
- package/dist/src/runtime/capabilities/scheduling/tool-module.js +158 -0
- package/dist/src/runtime/capabilities/scheduling/update-operations.d.ts +2 -0
- package/dist/src/runtime/capabilities/scheduling/update-operations.js +49 -0
- package/dist/src/runtime/composition.d.ts +23 -3
- package/dist/src/runtime/composition.js +12 -17
- package/dist/src/runtime/config/environment-paths.d.ts +10 -0
- package/dist/src/runtime/config/environment-paths.js +31 -0
- package/dist/src/runtime/config/environment-storage.d.ts +9 -0
- package/dist/src/runtime/config/environment-storage.js +65 -0
- package/dist/src/runtime/config/fields.js +7 -0
- package/dist/src/runtime/config/long-term-memory.js +15 -0
- package/dist/src/runtime/config/schema.js +8 -0
- package/dist/src/runtime/config.js +9 -5
- package/dist/src/runtime/context/scheduled-execution-context.d.ts +10 -0
- package/dist/src/runtime/context/scheduled-execution-context.js +52 -0
- package/dist/src/runtime/default-adapters.d.ts +3 -32
- package/dist/src/runtime/default-adapters.js +3 -270
- package/dist/src/runtime/default-environment-adapters.d.ts +19 -0
- package/dist/src/runtime/default-environment-adapters.js +144 -0
- package/dist/src/runtime/index.d.ts +5 -0
- package/dist/src/runtime/index.js +4 -0
- package/dist/src/runtime/local-application.d.ts +22 -0
- package/dist/src/runtime/local-application.js +81 -0
- package/dist/src/runtime/local-host/app-memory-dispatch.d.ts +11 -0
- package/dist/src/runtime/local-host/app-memory-dispatch.js +103 -0
- package/dist/src/runtime/local-host/app-owner.d.ts +4 -0
- package/dist/src/runtime/local-host/app-owner.js +119 -0
- package/dist/src/runtime/local-host/app-request-control.d.ts +24 -0
- package/dist/src/runtime/local-host/app-request-control.js +135 -0
- package/dist/src/runtime/local-host/app-service-dispatch.d.ts +5 -0
- package/dist/src/runtime/local-host/app-service-dispatch.js +64 -0
- package/dist/src/runtime/local-host/client-identity.d.ts +3 -0
- package/dist/src/runtime/local-host/client-identity.js +17 -0
- package/dist/src/runtime/local-host/client-memory.d.ts +7 -0
- package/dist/src/runtime/local-host/client-memory.js +54 -0
- package/dist/src/runtime/local-host/client-requests.d.ts +19 -0
- package/dist/src/runtime/local-host/client-requests.js +145 -0
- package/dist/src/runtime/local-host/client-services.d.ts +10 -0
- package/dist/src/runtime/local-host/client-services.js +14 -0
- package/dist/src/runtime/local-host/contracts.d.ts +36 -0
- package/dist/src/runtime/local-host/contracts.js +1 -0
- package/dist/src/runtime/local-host/endpoint.d.ts +7 -0
- package/dist/src/runtime/local-host/endpoint.js +79 -0
- package/dist/src/runtime/local-host/owner-activity.d.ts +10 -0
- package/dist/src/runtime/local-host/owner-activity.js +30 -0
- package/dist/src/runtime/local-host/owner-retirement.d.ts +3 -0
- package/dist/src/runtime/local-host/owner-retirement.js +15 -0
- package/dist/src/runtime/local-host/owner-server.d.ts +6 -0
- package/dist/src/runtime/local-host/owner-server.js +88 -0
- package/dist/src/runtime/local-host/private-access.d.ts +2 -0
- package/dist/src/runtime/local-host/private-access.js +16 -0
- package/dist/src/runtime/local-host/private-directory.d.ts +1 -0
- package/dist/src/runtime/local-host/private-directory.js +57 -0
- package/dist/src/runtime/local-host/rpc-peer.d.ts +22 -0
- package/dist/src/runtime/local-host/rpc-peer.js +168 -0
- package/dist/src/runtime/local-host/rpc-protocol.d.ts +21 -0
- package/dist/src/runtime/local-host/rpc-protocol.js +46 -0
- package/dist/src/runtime/local-host/startup-connection.d.ts +5 -0
- package/dist/src/runtime/local-host/startup-connection.js +72 -0
- package/dist/src/runtime/local-host/transport.d.ts +3 -0
- package/dist/src/runtime/local-host/transport.js +88 -0
- package/dist/src/runtime/local-host/windows-private-access.d.ts +1 -0
- package/dist/src/runtime/local-host/windows-private-access.js +51 -0
- package/dist/src/runtime/long-term-memory/onboarding/configuration.js +6 -0
- package/dist/src/runtime/long-term-memory/recall-binding.d.ts +3 -0
- package/dist/src/runtime/long-term-memory/recall-binding.js +27 -0
- package/dist/src/runtime/long-term-memory/recall-context.d.ts +20 -0
- package/dist/src/runtime/long-term-memory/recall-context.js +101 -0
- package/dist/src/runtime/long-term-memory/recall-continuation.d.ts +8 -0
- package/dist/src/runtime/long-term-memory/recall-continuation.js +36 -0
- package/dist/src/runtime/long-term-memory/recall-policy.d.ts +7 -0
- package/dist/src/runtime/long-term-memory/recall-policy.js +14 -0
- package/dist/src/runtime/long-term-memory/recall-result.d.ts +5 -0
- package/dist/src/runtime/long-term-memory/recall-result.js +54 -0
- package/dist/src/runtime/long-term-memory/repository-state.d.ts +2 -1
- package/dist/src/runtime/long-term-memory/repository-state.js +2 -2
- package/dist/src/runtime/model/invoke-raw-step.d.ts +1 -0
- package/dist/src/runtime/model/invoke-raw-step.js +1 -0
- package/dist/src/runtime/model/invoke-step.js +6 -0
- package/dist/src/runtime/model/invoke-structured-step.d.ts +1 -0
- package/dist/src/runtime/model/invoke-structured-step.js +1 -0
- package/dist/src/runtime/model/model-step-port.d.ts +2 -0
- package/dist/src/runtime/model/model-step-steering.d.ts +8 -0
- package/dist/src/runtime/model/model-step-steering.js +19 -0
- package/dist/src/runtime/orchestration/final-response/authoring-contract.js +1 -1
- package/dist/src/runtime/orchestration/final-response/invoke.d.ts +1 -0
- package/dist/src/runtime/orchestration/final-response/invoke.js +1 -0
- package/dist/src/runtime/orchestration/role-calls/activation-budget.js +1 -0
- package/dist/src/runtime/orchestration/role-calls/candidate-validation.js +9 -49
- package/dist/src/runtime/orchestration/role-calls/capability-selection-reconsideration.d.ts +9 -0
- package/dist/src/runtime/orchestration/role-calls/capability-selection-reconsideration.js +17 -8
- package/dist/src/runtime/orchestration/role-calls/capability-selection-supervision-validation.d.ts +2 -0
- package/dist/src/runtime/orchestration/role-calls/capability-selection-supervision-validation.js +62 -0
- package/dist/src/runtime/orchestration/role-calls/command-decoder.js +4 -0
- package/dist/src/runtime/orchestration/role-calls/command-dispatch/memory-recall-transitions.d.ts +4 -0
- package/dist/src/runtime/orchestration/role-calls/command-dispatch/memory-recall-transitions.js +89 -0
- package/dist/src/runtime/orchestration/role-calls/command-dispatch.js +5 -0
- package/dist/src/runtime/orchestration/role-calls/contracts.d.ts +9 -7
- package/dist/src/runtime/orchestration/role-calls/contracts.js +2 -2
- package/dist/src/runtime/orchestration/role-calls/diagnostics.js +3 -0
- package/dist/src/runtime/orchestration/role-calls/index.d.ts +1 -0
- package/dist/src/runtime/orchestration/role-calls/index.js +1 -0
- package/dist/src/runtime/orchestration/role-calls/memory-recall-contract.d.ts +51 -0
- package/dist/src/runtime/orchestration/role-calls/memory-recall-contract.js +4 -0
- package/dist/src/runtime/orchestration/role-calls/memory-recall-decoder.d.ts +6 -0
- package/dist/src/runtime/orchestration/role-calls/memory-recall-decoder.js +147 -0
- package/dist/src/runtime/orchestration/role-calls/memory-recall-diagnostics.d.ts +5 -0
- package/dist/src/runtime/orchestration/role-calls/memory-recall-diagnostics.js +27 -0
- package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.d.ts +3 -0
- package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.js +121 -0
- package/dist/src/runtime/orchestration/role-calls/memory-recall-transactions.d.ts +3 -0
- package/dist/src/runtime/orchestration/role-calls/memory-recall-transactions.js +44 -0
- package/dist/src/runtime/orchestration/role-calls/reducer.js +1 -0
- package/dist/src/runtime/orchestration/role-calls/transaction-effect.d.ts +5 -0
- package/dist/src/runtime/orchestration/role-calls/transaction-effect.js +14 -0
- package/dist/src/runtime/orchestration/role-calls/transactions.js +3 -24
- package/dist/src/runtime/plugins/manifest-validator.js +4 -1
- package/dist/src/runtime/ports.d.ts +4 -0
- package/dist/src/runtime/request/bound-runtime-handler.d.ts +2 -0
- package/dist/src/runtime/request/bound-runtime-handler.js +25 -0
- package/dist/src/runtime/request/contracts.d.ts +6 -0
- package/dist/src/runtime/request/execution-agent-root-execution.js +12 -0
- package/dist/src/runtime/request/execution-facets.js +6 -0
- package/dist/src/runtime/request/execution-scope-surfaces.js +10 -0
- package/dist/src/runtime/request/execution-scope.d.ts +1 -1
- package/dist/src/runtime/request/handler.js +6 -0
- package/dist/src/runtime/request/root-contract.d.ts +7 -1
- package/dist/src/runtime/request/root-execution-kernel.js +33 -37
- package/dist/src/runtime/request/root-memory-recall.d.ts +11 -0
- package/dist/src/runtime/request/root-memory-recall.js +71 -0
- package/dist/src/runtime/request/root-observation-handoff.d.ts +17 -0
- package/dist/src/runtime/request/root-observation-handoff.js +44 -0
- package/dist/src/runtime/request/scheduled-execution.d.ts +9 -0
- package/dist/src/runtime/request/scheduled-execution.js +32 -0
- package/dist/src/runtime/request/session-admission.d.ts +17 -0
- package/dist/src/runtime/request/session-admission.js +88 -0
- package/dist/src/runtime/request/supervisor-root-execution-diagnostics.d.ts +1 -1
- package/dist/src/runtime/request/supervisor-root-execution.js +8 -0
- package/dist/src/runtime/runtime-environment.d.ts +31 -0
- package/dist/src/runtime/runtime-environment.js +102 -0
- package/dist/src/runtime/runtime-host-environment.d.ts +8 -0
- package/dist/src/runtime/runtime-host-environment.js +57 -0
- package/dist/src/runtime/runtime-host-lifecycle.d.ts +4 -0
- package/dist/src/runtime/runtime-host-lifecycle.js +64 -0
- package/dist/src/runtime/runtime-host-scheduler-ownership.d.ts +5 -0
- package/dist/src/runtime/runtime-host-scheduler-ownership.js +67 -0
- package/dist/src/runtime/runtime-host.d.ts +19 -0
- package/dist/src/runtime/runtime-host.js +63 -0
- package/dist/src/runtime/scheduler/calendar-time.d.ts +10 -0
- package/dist/src/runtime/scheduler/calendar-time.js +58 -0
- package/dist/src/runtime/scheduler/contracts.d.ts +143 -0
- package/dist/src/runtime/scheduler/contracts.js +1 -0
- package/dist/src/runtime/scheduler/file-store.d.ts +2 -0
- package/dist/src/runtime/scheduler/file-store.js +76 -0
- package/dist/src/runtime/scheduler/instant-validation.d.ts +4 -0
- package/dist/src/runtime/scheduler/instant-validation.js +69 -0
- package/dist/src/runtime/scheduler/interval-range.d.ts +8 -0
- package/dist/src/runtime/scheduler/interval-range.js +24 -0
- package/dist/src/runtime/scheduler/job-management.d.ts +8 -0
- package/dist/src/runtime/scheduler/job-management.js +212 -0
- package/dist/src/runtime/scheduler/journal-checkpoint.d.ts +9 -0
- package/dist/src/runtime/scheduler/journal-checkpoint.js +45 -0
- package/dist/src/runtime/scheduler/journal-durability.d.ts +8 -0
- package/dist/src/runtime/scheduler/journal-durability.js +59 -0
- package/dist/src/runtime/scheduler/journal-files.d.ts +14 -0
- package/dist/src/runtime/scheduler/journal-files.js +59 -0
- package/dist/src/runtime/scheduler/journal-head.d.ts +21 -0
- package/dist/src/runtime/scheduler/journal-head.js +81 -0
- package/dist/src/runtime/scheduler/journal-index-state.d.ts +31 -0
- package/dist/src/runtime/scheduler/journal-index-state.js +137 -0
- package/dist/src/runtime/scheduler/journal-index.d.ts +22 -0
- package/dist/src/runtime/scheduler/journal-index.js +195 -0
- package/dist/src/runtime/scheduler/journal-store.d.ts +21 -0
- package/dist/src/runtime/scheduler/journal-store.js +184 -0
- package/dist/src/runtime/scheduler/journal-transaction.d.ts +14 -0
- package/dist/src/runtime/scheduler/journal-transaction.js +104 -0
- package/dist/src/runtime/scheduler/next-occurrence.d.ts +3 -0
- package/dist/src/runtime/scheduler/next-occurrence.js +39 -0
- package/dist/src/runtime/scheduler/run-completion.d.ts +12 -0
- package/dist/src/runtime/scheduler/run-completion.js +77 -0
- package/dist/src/runtime/scheduler/run-list-query.d.ts +5 -0
- package/dist/src/runtime/scheduler/run-list-query.js +38 -0
- package/dist/src/runtime/scheduler/run-records.d.ts +6 -0
- package/dist/src/runtime/scheduler/run-records.js +41 -0
- package/dist/src/runtime/scheduler/schedule-update.d.ts +3 -0
- package/dist/src/runtime/scheduler/schedule-update.js +22 -0
- package/dist/src/runtime/scheduler/schedule-validation.d.ts +10 -0
- package/dist/src/runtime/scheduler/schedule-validation.js +132 -0
- package/dist/src/runtime/scheduler/scheduler-engine.d.ts +2 -0
- package/dist/src/runtime/scheduler/scheduler-engine.js +174 -0
- package/dist/src/runtime/scheduler/scheduler-service.d.ts +10 -0
- package/dist/src/runtime/scheduler/scheduler-service.js +115 -0
- package/dist/src/runtime/scheduler/service-context.d.ts +21 -0
- package/dist/src/runtime/scheduler/service-context.js +26 -0
- package/dist/src/runtime/scheduler/session-deletion-state.d.ts +9 -0
- package/dist/src/runtime/scheduler/session-deletion-state.js +30 -0
- package/dist/src/runtime/scheduler/snapshot-validation.d.ts +4 -0
- package/dist/src/runtime/scheduler/snapshot-validation.js +112 -0
- package/dist/src/runtime/scheduler/startup-recovery.d.ts +2 -0
- package/dist/src/runtime/scheduler/startup-recovery.js +38 -0
- package/dist/src/runtime/scheduler/validation-error.d.ts +4 -0
- package/dist/src/runtime/scheduler/validation-error.js +8 -0
- package/dist/src/runtime/scheduler/working-store.d.ts +3 -0
- package/dist/src/runtime/scheduler/working-store.js +8 -0
- package/dist/src/runtime/session/request-session.d.ts +1 -0
- package/dist/src/runtime/session/request-session.js +14 -1
- package/dist/src/runtime/session/session-attachment-deletion.d.ts +8 -0
- package/dist/src/runtime/session/session-attachment-deletion.js +87 -0
- package/dist/src/runtime/session/session-deletion-boundary.d.ts +10 -0
- package/dist/src/runtime/session/session-deletion-boundary.js +39 -0
- package/dist/src/runtime/session/session-deletion-cleanup.d.ts +7 -0
- package/dist/src/runtime/session/session-deletion-cleanup.js +62 -0
- package/dist/src/runtime/session/session-deletion-finalization.d.ts +7 -0
- package/dist/src/runtime/session/session-deletion-finalization.js +34 -0
- package/dist/src/runtime/session/session-deletion-receipts.d.ts +7 -0
- package/dist/src/runtime/session/session-deletion-receipts.js +18 -0
- package/dist/src/runtime/session/session-lifecycle-store.d.ts +21 -0
- package/dist/src/runtime/session/session-lifecycle-store.js +72 -0
- package/dist/src/runtime/session/session-mutation-queue.d.ts +3 -0
- package/dist/src/runtime/session/session-mutation-queue.js +15 -0
- package/dist/src/runtime/steps/execution-agent/capability-decision-parsing.d.ts +16 -0
- package/dist/src/runtime/steps/execution-agent/capability-decision-parsing.js +165 -0
- package/dist/src/runtime/steps/execution-agent/contracts.d.ts +3 -1
- package/dist/src/runtime/steps/execution-agent/decision-parsing.d.ts +2 -0
- package/dist/src/runtime/steps/execution-agent/decision-parsing.js +195 -0
- package/dist/src/runtime/steps/execution-agent/decision-validation.d.ts +30 -0
- package/dist/src/runtime/steps/execution-agent/decision-validation.js +127 -0
- package/dist/src/runtime/steps/execution-agent/format.d.ts +1 -0
- package/dist/src/runtime/steps/execution-agent/format.js +12 -0
- package/dist/src/runtime/steps/execution-agent/input.d.ts +2 -1
- package/dist/src/runtime/steps/execution-agent/input.js +17 -2
- package/dist/src/runtime/steps/execution-agent/parser.d.ts +1 -2
- package/dist/src/runtime/steps/execution-agent/parser.js +1 -472
- package/dist/src/runtime/steps/execution-agent/prompt.d.ts +2 -0
- package/dist/src/runtime/steps/execution-agent/prompt.js +2 -0
- package/dist/src/runtime/steps/execution-agent/reconsideration-context.js +4 -3
- package/dist/src/runtime/steps/execution-agent/response-input.js +5 -4
- package/dist/src/runtime/steps/execution-agent/response-run.d.ts +3 -0
- package/dist/src/runtime/steps/execution-agent/response-run.js +7 -3
- package/dist/src/runtime/steps/execution-agent/run.d.ts +2 -0
- package/dist/src/runtime/steps/execution-agent/run.js +2 -0
- package/dist/src/runtime/steps/execution-agent/state-context.d.ts +2 -1
- package/dist/src/runtime/steps/execution-agent/state-context.js +13 -5
- package/dist/src/runtime/steps/memory-recall-decision.d.ts +30 -0
- package/dist/src/runtime/steps/memory-recall-decision.js +101 -0
- package/dist/src/runtime/steps/memory-recall-prompt.d.ts +1 -0
- package/dist/src/runtime/steps/memory-recall-prompt.js +15 -0
- package/dist/src/runtime/steps/supervisor-decision/contracts.d.ts +4 -2
- package/dist/src/runtime/steps/supervisor-decision/diagnostics.d.ts +2 -0
- package/dist/src/runtime/steps/supervisor-decision/diagnostics.js +13 -6
- package/dist/src/runtime/steps/supervisor-decision/format.d.ts +2 -0
- package/dist/src/runtime/steps/supervisor-decision/format.js +41 -2
- package/dist/src/runtime/steps/supervisor-decision/input.d.ts +5 -1
- package/dist/src/runtime/steps/supervisor-decision/input.js +25 -5
- package/dist/src/runtime/steps/supervisor-decision/memory-recall-continuation.d.ts +10 -0
- package/dist/src/runtime/steps/supervisor-decision/memory-recall-continuation.js +32 -0
- package/dist/src/runtime/steps/supervisor-decision/parser.d.ts +2 -0
- package/dist/src/runtime/steps/supervisor-decision/parser.js +36 -1
- package/dist/src/runtime/steps/supervisor-decision/prompt.d.ts +3 -0
- package/dist/src/runtime/steps/supervisor-decision/prompt.js +16 -8
- package/dist/src/runtime/steps/supervisor-decision/response-recommendation.d.ts +13 -0
- package/dist/src/runtime/steps/supervisor-decision/response-recommendation.js +32 -0
- package/dist/src/runtime/steps/supervisor-decision/resume.d.ts +2 -0
- package/dist/src/runtime/steps/supervisor-decision/resume.js +13 -0
- package/dist/src/runtime/steps/supervisor-decision/run.d.ts +3 -0
- package/dist/src/runtime/steps/supervisor-decision/run.js +19 -0
- package/dist/src/runtime/steps/supervisor-decision/working-directory.js +7 -1
- package/dist/src/runtime/steps/supervisor-response/diagnostics.d.ts +1 -0
- package/dist/src/runtime/steps/supervisor-response/diagnostics.js +1 -0
- package/dist/src/runtime/steps/supervisor-response/input.d.ts +2 -1
- package/dist/src/runtime/steps/supervisor-response/input.js +17 -4
- package/dist/src/runtime/steps/supervisor-response/memory-authoring.d.ts +1 -0
- package/dist/src/runtime/steps/supervisor-response/memory-authoring.js +4 -0
- package/dist/src/runtime/steps/supervisor-response/prompt.d.ts +1 -0
- package/dist/src/runtime/steps/supervisor-response/prompt.js +8 -2
- package/dist/src/runtime/steps/supervisor-response/response-recommendation.d.ts +10 -0
- package/dist/src/runtime/steps/supervisor-response/response-recommendation.js +25 -0
- package/dist/src/runtime/steps/supervisor-response/run.d.ts +6 -1
- package/dist/src/runtime/steps/supervisor-response/run.js +26 -7
- package/dist/src/sessions/record/projection.js +1 -0
- package/dist/src/sessions/schedule-metadata.d.ts +8 -0
- package/dist/src/sessions/schedule-metadata.js +1 -0
- package/dist/src/sessions/session-service.d.ts +1 -0
- package/dist/src/sessions/session-service.js +1 -0
- package/dist/src/sessions/types.d.ts +2 -0
- package/dist/src/shared/http-server-shutdown.d.ts +4 -0
- package/dist/src/shared/http-server-shutdown.js +17 -0
- package/dist/src/shared/public-http/aggregate-gate.d.ts +3 -0
- package/dist/src/shared/public-http/aggregate-gate.js +87 -0
- package/dist/src/shared/public-http/deadline.d.ts +2 -0
- package/dist/src/shared/public-http/deadline.js +29 -0
- package/dist/src/shared/public-http/errors.d.ts +6 -0
- package/dist/src/shared/public-http/errors.js +11 -0
- package/dist/src/shared/public-http/limits.d.ts +8 -0
- package/dist/src/shared/public-http/limits.js +8 -0
- package/dist/src/shared/public-http/network-policy.d.ts +11 -0
- package/dist/src/shared/public-http/network-policy.js +178 -0
- package/dist/src/shared/public-http/public-http.d.ts +24 -0
- package/dist/src/shared/public-http/public-http.js +85 -0
- package/dist/src/shared/public-http/request-hop.d.ts +18 -0
- package/dist/src/shared/public-http/request-hop.js +140 -0
- package/dist/src/web-ui/app/ARCHITECTURE.md +66 -4
- package/dist/src/web-ui/app/app-bootstrap.js +53 -0
- package/dist/src/web-ui/app/app-dom.js +80 -0
- package/dist/src/web-ui/app/app.js +195 -212
- package/dist/src/web-ui/app/components/conversation-activity.d.ts +2 -0
- package/dist/src/web-ui/app/components/conversation-activity.js +34 -7
- package/dist/src/web-ui/app/components/conversation-role-cards.d.ts +1 -0
- package/dist/src/web-ui/app/components/conversation-role-cards.js +61 -5
- package/dist/src/web-ui/app/components/conversation-schedule.js +71 -0
- package/dist/src/web-ui/app/components/conversation-status.js +65 -0
- package/dist/src/web-ui/app/components/conversation-tools.d.ts +13 -0
- package/dist/src/web-ui/app/components/conversation-tools.js +284 -0
- package/dist/src/web-ui/app/components/conversation-view.js +39 -11
- package/dist/src/web-ui/app/components/dashboard/activity.js +61 -0
- package/dist/src/web-ui/app/components/dashboard/icons.js +23 -0
- package/dist/src/web-ui/app/components/dashboard/recent-conversations.js +64 -0
- package/dist/src/web-ui/app/components/dashboard/workspace.js +107 -0
- package/dist/src/web-ui/app/components/message-link-previews.d.ts +16 -0
- package/dist/src/web-ui/app/components/message-link-previews.js +179 -0
- package/dist/src/web-ui/app/components/schedules/details.js +101 -0
- package/dist/src/web-ui/app/components/schedules/form.d.ts +13 -0
- package/dist/src/web-ui/app/components/schedules/form.js +246 -0
- package/dist/src/web-ui/app/components/schedules/workspace-state.js +59 -0
- package/dist/src/web-ui/app/components/schedules/workspace.js +165 -0
- package/dist/src/web-ui/app/components/workspace-shell.js +48 -2
- package/dist/src/web-ui/app/configuration-feature.js +72 -0
- package/dist/src/web-ui/app/controllers/composer-attachments-controller.d.ts +1 -0
- package/dist/src/web-ui/app/controllers/composer-attachments-controller.js +17 -6
- package/dist/src/web-ui/app/controllers/composer-submit-controller.d.ts +2 -0
- package/dist/src/web-ui/app/controllers/composer-submit-controller.js +15 -1
- package/dist/src/web-ui/app/controllers/composer-surface-controller.js +58 -0
- package/dist/src/web-ui/app/controllers/composer-workspace-controller.d.ts +53 -0
- package/dist/src/web-ui/app/controllers/composer-workspace-controller.js +180 -0
- package/dist/src/web-ui/app/controllers/conversation-read-state-controller.d.ts +23 -0
- package/dist/src/web-ui/app/controllers/conversation-read-state-controller.js +82 -0
- package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +8 -0
- package/dist/src/web-ui/app/controllers/conversation-session-controller.js +28 -39
- package/dist/src/web-ui/app/controllers/dashboard-controller.js +127 -0
- package/dist/src/web-ui/app/controllers/home-composer-feature.d.ts +40 -0
- package/dist/src/web-ui/app/controllers/home-composer-feature.js +119 -0
- package/dist/src/web-ui/app/controllers/home-conversation-activation.js +37 -0
- package/dist/src/web-ui/app/controllers/realtime-event-controller.d.ts +1 -0
- package/dist/src/web-ui/app/controllers/realtime-event-controller.js +74 -3
- package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +2 -1
- package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +15 -14
- package/dist/src/web-ui/app/controllers/schedule-realtime.js +118 -0
- package/dist/src/web-ui/app/controllers/schedules-controller.js +421 -0
- package/dist/src/web-ui/app/controllers/session-controller.js +30 -3
- package/dist/src/web-ui/app/dashboard-feature.js +44 -0
- package/dist/src/web-ui/app/index.html +53 -1
- package/dist/src/web-ui/app/lib/composer-submission-scope.d.ts +21 -0
- package/dist/src/web-ui/app/lib/composer-submission-scope.js +13 -0
- package/dist/src/web-ui/app/lib/context-window-snapshot-order.d.ts +15 -0
- package/dist/src/web-ui/app/lib/context-window-snapshot-order.js +31 -0
- package/dist/src/web-ui/app/lib/conversation-role-model.d.ts +10 -1
- package/dist/src/web-ui/app/lib/conversation-role-model.js +97 -15
- package/dist/src/web-ui/app/lib/conversation-status-model.d.ts +12 -0
- package/dist/src/web-ui/app/lib/conversation-status-model.js +116 -0
- package/dist/src/web-ui/app/lib/dashboard-job-templates.js +41 -0
- package/dist/src/web-ui/app/lib/dashboard-presentation.js +126 -0
- package/dist/src/web-ui/app/lib/message-markdown.d.ts +5 -0
- package/dist/src/web-ui/app/lib/message-markdown.js +99 -0
- package/dist/src/web-ui/app/lib/message-url-policy.d.ts +1 -0
- package/dist/src/web-ui/app/lib/message-url-policy.js +13 -0
- package/dist/src/web-ui/app/lib/schedule-errors.js +29 -0
- package/dist/src/web-ui/app/lib/schedule-message.js +30 -0
- package/dist/src/web-ui/app/lib/schedule-presentation.js +81 -0
- package/dist/src/web-ui/app/lib/session-read-state.d.ts +22 -0
- package/dist/src/web-ui/app/lib/session-read-state.js +63 -0
- package/dist/src/web-ui/app/lib/text-format.js +2 -143
- package/dist/src/web-ui/app/lib/tool-activity-event.d.ts +26 -0
- package/dist/src/web-ui/app/lib/tool-activity-event.js +228 -0
- package/dist/src/web-ui/app/lib/tool-activity-model.d.ts +41 -0
- package/dist/src/web-ui/app/lib/tool-activity-model.js +255 -0
- package/dist/src/web-ui/app/lib/tool-timeline.d.ts +3 -0
- package/dist/src/web-ui/app/lib/tool-timeline.js +18 -0
- package/dist/src/web-ui/app/schedules-feature.js +87 -0
- package/dist/src/web-ui/app/services/message-link-preview-client.d.ts +14 -0
- package/dist/src/web-ui/app/services/message-link-preview-client.js +96 -0
- package/dist/src/web-ui/app/services/runtime-web-client/schedules.js +51 -0
- package/dist/src/web-ui/app/services/runtime-web-client.d.ts +37 -0
- package/dist/src/web-ui/app/services/runtime-web-client.js +13 -8
- package/dist/src/web-ui/app/styles/00-tokens-base.css +11 -11
- package/dist/src/web-ui/app/styles/18-dashboard.css +384 -0
- package/dist/src/web-ui/app/styles/20-chat-composer.css +1 -130
- package/dist/src/web-ui/app/styles/26-message-content.css +295 -0
- package/dist/src/web-ui/app/styles/27-conversation-tools.css +266 -0
- package/dist/src/web-ui/app/styles/28-conversation-status.css +52 -0
- package/dist/src/web-ui/app/styles/38-schedule-workspace.css +263 -0
- package/dist/src/web-ui/app/styles/38-schedules.css +352 -0
- package/dist/src/web-ui/app/styles/90-responsive.css +14 -0
- package/dist/src/web-ui/app/styles/91-schedules-responsive.css +72 -0
- package/dist/src/web-ui/app/styles/92-dashboard-responsive.css +88 -0
- package/dist/src/web-ui/app/styles.css +8 -0
- package/dist/src/web-ui/app/ui-behavior.d.ts +1 -1
- package/dist/src/web-ui/app/ui-behavior.js +3 -1
- package/dist/src/web-ui/app/vendor/README.md +15 -0
- package/dist/src/web-ui/app/vendor/markdown-it.LICENSE +22 -0
- package/dist/src/web-ui/app/vendor/markdown-it.js +3003 -0
- package/dist/src/web-ui/link-preview/metadata.d.ts +9 -0
- package/dist/src/web-ui/link-preview/metadata.js +97 -0
- package/dist/src/web-ui/link-preview/preview-cache.d.ts +4 -0
- package/dist/src/web-ui/link-preview/preview-cache.js +23 -0
- package/dist/src/web-ui/link-preview/raster-response.d.ts +9 -0
- package/dist/src/web-ui/link-preview/raster-response.js +49 -0
- package/dist/src/web-ui/link-preview/routes.d.ts +3 -0
- package/dist/src/web-ui/link-preview/routes.js +97 -0
- package/dist/src/web-ui/link-preview/service.d.ts +11 -0
- package/dist/src/web-ui/link-preview/service.js +117 -0
- package/dist/src/web-ui/local-runtime/api-router.d.ts +4 -1
- package/dist/src/web-ui/local-runtime/api-router.js +42 -73
- package/dist/src/web-ui/local-runtime/contracts.d.ts +2 -2
- package/dist/src/web-ui/local-runtime/environment-registry.d.ts +12 -1
- package/dist/src/web-ui/local-runtime/environment-registry.js +38 -3
- package/dist/src/web-ui/local-runtime/realtime-controller.js +3 -1
- package/dist/src/web-ui/local-runtime/request-execution.d.ts +5 -1
- package/dist/src/web-ui/local-runtime/request-execution.js +38 -2
- package/dist/src/web-ui/local-runtime/schedule-job-creation.d.ts +7 -0
- package/dist/src/web-ui/local-runtime/schedule-job-creation.js +62 -0
- package/dist/src/web-ui/local-runtime/schedule-management-routes.d.ts +30 -0
- package/dist/src/web-ui/local-runtime/schedule-management-routes.js +134 -0
- package/dist/src/web-ui/local-runtime/schedule-run-page.d.ts +5 -0
- package/dist/src/web-ui/local-runtime/schedule-run-page.js +23 -0
- package/dist/src/web-ui/local-runtime/session-routes.d.ts +17 -0
- package/dist/src/web-ui/local-runtime/session-routes.js +74 -0
- package/dist/src/web-ui/local-runtime-backend.d.ts +2 -0
- package/dist/src/web-ui/local-runtime-backend.js +11 -1
- package/dist/src/web-ui/schedule-creation-contract.d.ts +7 -0
- package/dist/src/web-ui/schedule-creation-contract.js +1 -0
- package/dist/src/web-ui/server-shutdown.d.ts +4 -0
- package/dist/src/web-ui/server-shutdown.js +32 -0
- package/dist/src/web-ui/server.js +13 -10
- package/dist/src/web-ui/session-read-state/availability.d.ts +16 -0
- package/dist/src/web-ui/session-read-state/availability.js +20 -0
- package/dist/src/web-ui/session-read-state/projection.d.ts +17 -0
- package/dist/src/web-ui/session-read-state/projection.js +71 -0
- package/dist/src/web-ui/session-read-state/service.d.ts +86 -0
- package/dist/src/web-ui/session-read-state/service.js +89 -0
- package/dist/src/web-ui/session-read-state/store.d.ts +22 -0
- package/dist/src/web-ui/session-read-state/store.js +110 -0
- package/docs/configuration.md +41 -1
- package/docs/long-term-memory.md +46 -5
- package/docs/runtime-invariant-coverage.md +1 -1
- package/docs/runtime-library.md +23 -0
- package/docs/runtime-public-contracts.md +32 -1
- package/package.json +3 -1
- package/plugins/code-outline/plugin.json +15 -0
- package/plugins/document-reader/plugin.json +17 -0
- package/plugins/filesystem/plugin.json +17 -2
- package/plugins/json-inspector/plugin.json +12 -0
- package/plugins/local-search/plugin.json +12 -0
- package/plugins/memory/plugin.json +26 -1
- package/plugins/memory/source/index.ts +10 -6
- package/plugins/memory/src/index.cjs +11 -7
- package/plugins/project-orientation/plugin.json +14 -0
- package/plugins/web/source/aggregate-gate.ts +8 -130
- package/plugins/web/source/deadline.ts +14 -50
- package/plugins/web/source/errors.ts +17 -11
- package/plugins/web/source/limits.ts +3 -6
- package/plugins/web/source/network-policy.ts +28 -226
- package/plugins/web/source/public-http.ts +17 -142
- package/plugins/web/source/request-hop.ts +11 -191
- package/plugins/web/src/index.cjs +119 -59
- package/runtime.config.schema.json +7 -0
- package/src/runtime/README.md +105 -1
- package/src/runtime/local-host/README.md +86 -0
- 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
|
-
|
|
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 {
|
|
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:
|
|
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
|
-
|
|
138
|
-
|
|
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
|
-
|
|
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 =
|
|
203
|
+
const stage = roleActivityStage(event);
|
|
169
204
|
if (stage) {
|
|
170
205
|
activeRole = "";
|
|
171
|
-
if (
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
|
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,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
|
+
}
|