@makaio/framework 1.0.0-dev-1779046984397
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/LICENSE +21 -0
- package/README.md +363 -0
- package/dist/account-identity-Ce1Bwrqi.mjs +1 -0
- package/dist/adapter-CbyjCE2d.mjs +1 -0
- package/dist/adapters/acp-client/index.d.mts +209 -0
- package/dist/adapters/acp-client/index.mjs +1 -0
- package/dist/adapters/config/index.d.mts +429 -0
- package/dist/adapters/config/index.mjs +1 -0
- package/dist/adapters/index.d.mts +4175 -0
- package/dist/adapters/index.mjs +11 -0
- package/dist/adapters/node.d.mts +263 -0
- package/dist/adapters/node.mjs +4 -0
- package/dist/adapters/stream-session/index.d.mts +1384 -0
- package/dist/adapters/stream-session/index.mjs +1 -0
- package/dist/adapters/stream-session/testing/index.d.mts +29 -0
- package/dist/adapters/stream-session/testing/index.mjs +1 -0
- package/dist/base-orchestrator-9z8TuA5a.d.mts +772 -0
- package/dist/bus/index.d.mts +3331 -0
- package/dist/bus/index.mjs +1 -0
- package/dist/bus-B1seC4M_.mjs +2 -0
- package/dist/capability-service-tnpR_TaB.mjs +1 -0
- package/dist/chunk-Dc06z0qk.mjs +1 -0
- package/dist/chunk-cpUYaJdV.mjs +1 -0
- package/dist/cleanEnvForAdapter-DvcIGXTG.mjs +1 -0
- package/dist/client-Dh4x4GQN.mjs +1 -0
- package/dist/clients/index.d.mts +2786 -0
- package/dist/clients/index.mjs +1 -0
- package/dist/clients-namespace-B0xAPZ6J.d.mts +332 -0
- package/dist/config-namespace-DLSs83zr.d.mts +638 -0
- package/dist/config-namespace-MJT8P0Ud.mjs +1 -0
- package/dist/contracts/adapter/index.d.mts +3 -0
- package/dist/contracts/adapter/index.mjs +1 -0
- package/dist/contracts/adapter/schemas/session-lineage.d.mts +2 -0
- package/dist/contracts/adapter/schemas/session-lineage.mjs +1 -0
- package/dist/contracts/client/index.d.mts +3 -0
- package/dist/contracts/client/index.mjs +1 -0
- package/dist/contracts/common/index.d.mts +2 -0
- package/dist/contracts/common/index.mjs +1 -0
- package/dist/contracts/config/index.d.mts +455 -0
- package/dist/contracts/config/index.mjs +1 -0
- package/dist/contracts/extension/index.d.mts +3 -0
- package/dist/contracts/extension/index.mjs +1 -0
- package/dist/contracts/harness/index.d.mts +2 -0
- package/dist/contracts/harness/index.mjs +1 -0
- package/dist/contracts/host/index.d.mts +2 -0
- package/dist/contracts/host/index.mjs +1 -0
- package/dist/contracts/index.d.mts +12665 -0
- package/dist/contracts/index.mjs +1 -0
- package/dist/contracts/model-registry/index.d.mts +2 -0
- package/dist/contracts/model-registry/index.mjs +1 -0
- package/dist/contracts/native-session-supervisor/index.d.mts +2 -0
- package/dist/contracts/native-session-supervisor/index.mjs +1 -0
- package/dist/contracts/platform/index.d.mts +2 -0
- package/dist/contracts/platform/index.mjs +1 -0
- package/dist/contracts/provider/index.d.mts +3 -0
- package/dist/contracts/provider/index.mjs +1 -0
- package/dist/contracts/session/index.d.mts +3 -0
- package/dist/contracts/session/index.mjs +1 -0
- package/dist/contracts/shared/index.d.mts +2 -0
- package/dist/contracts/shared/index.mjs +1 -0
- package/dist/contracts/skill/index.d.mts +2 -0
- package/dist/contracts/skill/index.mjs +1 -0
- package/dist/contracts/toast/index.d.mts +198 -0
- package/dist/contracts/toast/index.mjs +1 -0
- package/dist/contracts/variant/index.d.mts +2 -0
- package/dist/contracts/variant/index.mjs +1 -0
- package/dist/core/index.d.mts +1001 -0
- package/dist/core/index.mjs +1 -0
- package/dist/credential-ref-DLCsoKVZ.mjs +1 -0
- package/dist/cursor-storage-DOQdvo9j.mjs +1 -0
- package/dist/definition-DkYy1PZz.mjs +1 -0
- package/dist/definition-DtUNiGom.d.mts +158 -0
- package/dist/definition-DxvZ9e22.d.mts +376 -0
- package/dist/drizzle-CWVVw7Er.mjs +1 -0
- package/dist/execution-target-BW_uiBVe.mjs +1 -0
- package/dist/extension-COqwS-2Q.mjs +1 -0
- package/dist/extension-Cbrl4YGX.mjs +1 -0
- package/dist/extension-namespace-zaGKi6Qj.mjs +1 -0
- package/dist/handlers-iGKUJ380.mjs +41 -0
- package/dist/harness-CEq1Zkf9.mjs +1 -0
- package/dist/hooks/index.d.mts +423 -0
- package/dist/hooks/index.mjs +1 -0
- package/dist/host-CXAUGGN0.mjs +1 -0
- package/dist/identity-B_A0mE63.mjs +1 -0
- package/dist/index-6lyShOoU.d.mts +225 -0
- package/dist/index-7sXlairn2.d.mts +43 -0
- package/dist/index-BAKM2GMH2.d.mts +535 -0
- package/dist/index-BB419vv-.d.mts +3897 -0
- package/dist/index-BJOfdtbw.d.mts +729 -0
- package/dist/index-BXP9GK5q.d.mts +1075 -0
- package/dist/index-BdPwu6c0.d.mts +1730 -0
- package/dist/index-BePI0ckL.d.mts +40 -0
- package/dist/index-Bigx81Kr.d.mts +37 -0
- package/dist/index-BnNqbx2I.d.mts +134 -0
- package/dist/index-Bv15sNLn.d.mts +389 -0
- package/dist/index-C-myW_aK.d.mts +412 -0
- package/dist/index-C9F3Fc1A.d.mts +2938 -0
- package/dist/index-CNxS4Tlu.d.mts +1 -0
- package/dist/index-CVA0m1g9.d.mts +995 -0
- package/dist/index-C_kS2aqV2.d.mts +438 -0
- package/dist/index-Ch3ph52M2.d.mts +40 -0
- package/dist/index-CnZOKNjU.d.mts +89 -0
- package/dist/index-D1T-PPqF.d.mts +67 -0
- package/dist/index-D7T8XCku.d.mts +341 -0
- package/dist/index-DBQtpFLE.d.mts +4843 -0
- package/dist/index-DEw90pa2.d.mts +183 -0
- package/dist/index-DQRsGXb5.d.mts +109 -0
- package/dist/index-Dd5s4MSm.d.mts +72 -0
- package/dist/index-DubqLGH8.d.mts +1002 -0
- package/dist/index-ESSDWIB7.d.mts +11 -0
- package/dist/index-N5K1NOYs.d.mts +184 -0
- package/dist/index-PdUSmPT2.d.mts +180 -0
- package/dist/index-SzSiyG61.d.mts +117 -0
- package/dist/index-T0471kWA.d.mts +6760 -0
- package/dist/index-WKjrpcA_.d.mts +218 -0
- package/dist/index-hapw9_En.d.mts +13592 -0
- package/dist/index-iID2R9G1.d.mts +1490 -0
- package/dist/kernel/cli/index.d.mts +141 -0
- package/dist/kernel/cli/index.mjs +1 -0
- package/dist/kernel/cli/schemas.d.mts +63 -0
- package/dist/kernel/cli/schemas.mjs +1 -0
- package/dist/kernel/extension/index.d.mts +2 -0
- package/dist/kernel/extension/index.mjs +1 -0
- package/dist/kernel/index.d.mts +296 -0
- package/dist/kernel/index.mjs +1 -0
- package/dist/kernel/namespace/index.d.mts +2 -0
- package/dist/kernel/namespace/index.mjs +1 -0
- package/dist/kernel/observability/index.d.mts +2 -0
- package/dist/kernel/observability/index.mjs +1 -0
- package/dist/kernel/providers/index.d.mts +2 -0
- package/dist/kernel/providers/index.mjs +1 -0
- package/dist/kernel/window/index.d.mts +2 -0
- package/dist/kernel/window/index.mjs +1 -0
- package/dist/model-registry-BNzpR6TU.mjs +1 -0
- package/dist/model-registry-CIscwC52.mjs +1 -0
- package/dist/namespace-0yuzAKlr.mjs +1 -0
- package/dist/namespace-8cNguvIp.mjs +1 -0
- package/dist/namespace-BK2erxpV.d.mts +921 -0
- package/dist/namespace-Bmc7AW4J2.mjs +1 -0
- package/dist/namespace-C2ufjgaQ.d.mts +767 -0
- package/dist/namespace-C54Oj025.d.mts +159 -0
- package/dist/namespace-CCDEOwmW.d.mts +1313 -0
- package/dist/namespace-CfEWMXBx.mjs +1 -0
- package/dist/namespace-CkLUtc0g.d.mts +580 -0
- package/dist/namespace-D5Wrt7YU.mjs +1 -0
- package/dist/namespace-DZcuLwEA.d.mts +51 -0
- package/dist/namespace-Db-p67Rg.mjs +1 -0
- package/dist/namespace-FWx6HxaW.d.mts +611 -0
- package/dist/namespace-GLGGcWPH.d.mts +43 -0
- package/dist/namespace-N0dfwSg6.mjs +1 -0
- package/dist/namespace-O5SNY-LV.d.mts +2226 -0
- package/dist/namespace-ZbthBQVt.d.mts +142 -0
- package/dist/namespace-bq4Prtzn.d.mts +2046 -0
- package/dist/namespace-pNcSglBS.mjs +1 -0
- package/dist/namespace-ptv-pw_g.d.mts +3019 -0
- package/dist/namespace-xkvVw3hf2.d.mts +189 -0
- package/dist/native-session-supervisor-L-UIaEfd.mjs +1 -0
- package/dist/node/bus-server/index.d.mts +178 -0
- package/dist/node/bus-server/index.mjs +1 -0
- package/dist/node/bus-server/server-lifecycle.d.mts +2 -0
- package/dist/node/bus-server/server-lifecycle.mjs +1 -0
- package/dist/node/machine-identity/index.d.mts +85 -0
- package/dist/node/machine-identity/index.mjs +3 -0
- package/dist/node/transports/index.d.mts +1752 -0
- package/dist/node/transports/index.mjs +2 -0
- package/dist/orchestrator-shared-DrjtTXYh.d.mts +249 -0
- package/dist/orchestrator-shared-Wv1GI2mW.mjs +1 -0
- package/dist/platform-BbSLVg5b.mjs +1 -0
- package/dist/profile-4StaDQW0.mjs +1 -0
- package/dist/provider-context-CNRQ4d5m.mjs +1 -0
- package/dist/providers/index.d.mts +135 -0
- package/dist/providers/index.mjs +1 -0
- package/dist/providers-Cr4Za8a1.mjs +1 -0
- package/dist/providers-namespace-CDwxY_DV.d.mts +583 -0
- package/dist/schema-BwzXEtT2.d.mts +837 -0
- package/dist/schema-CAw_BqaG.mjs +1 -0
- package/dist/schema-introspection-D61TT_7b.mjs +1 -0
- package/dist/schema-uSGW-6oM.mjs +1 -0
- package/dist/schemas-BXstpWVp.mjs +1 -0
- package/dist/schemas-BdMU-gew.d.mts +160 -0
- package/dist/schemas-C40ZAJ33.mjs +1 -0
- package/dist/schemas-C5xtVqdb.d.mts +46 -0
- package/dist/schemas-CGZy_rU6.d.mts +13 -0
- package/dist/schemas-CLxtoKFy.mjs +1 -0
- package/dist/schemas-Co_sVhzz.mjs +1 -0
- package/dist/schemas-D9108Iv1.d.mts +182 -0
- package/dist/schemas-DENVYyds.d.mts +463 -0
- package/dist/schemas-DbWs_hj8.d.mts +174 -0
- package/dist/schemas-Di0XnnMX.d.mts +73 -0
- package/dist/schemas-KMA1efQg.d.mts +944 -0
- package/dist/schemas-qmn5SWPU.d.mts +312 -0
- package/dist/schemas-sshQEF3l.d.mts +237 -0
- package/dist/server-lifecycle-Cf_SZ27k.d.mts +160 -0
- package/dist/server-lifecycle-DbFwlrTW.mjs +1 -0
- package/dist/service-base/index.d.mts +98 -0
- package/dist/service-base/index.mjs +1 -0
- package/dist/services/adapter-runtime/index.d.mts +4 -0
- package/dist/services/adapter-runtime/index.mjs +1 -0
- package/dist/services/adapter-runtime/namespace.d.mts +2 -0
- package/dist/services/adapter-runtime/namespace.mjs +1 -0
- package/dist/services/adapter-runtime/schemas.d.mts +2 -0
- package/dist/services/adapter-runtime/schemas.mjs +1 -0
- package/dist/services/adapter-subsystem/index.d.mts +3 -0
- package/dist/services/adapter-subsystem/index.mjs +1 -0
- package/dist/services/adapter-subsystem/namespace.d.mts +2 -0
- package/dist/services/adapter-subsystem/namespace.mjs +1 -0
- package/dist/services/agent-runtime/index.d.mts +3 -0
- package/dist/services/agent-runtime/index.mjs +1 -0
- package/dist/services/agent-runtime/namespace.d.mts +2 -0
- package/dist/services/agent-runtime/namespace.mjs +1 -0
- package/dist/services/agent-runtime/schemas.d.mts +2 -0
- package/dist/services/agent-runtime/schemas.mjs +1 -0
- package/dist/services/capability/index.d.mts +2 -0
- package/dist/services/capability/index.mjs +1 -0
- package/dist/services/cli-detection/namespace.d.mts +56 -0
- package/dist/services/cli-detection/namespace.mjs +1 -0
- package/dist/services/codebase/index.d.mts +3 -0
- package/dist/services/codebase/index.mjs +1 -0
- package/dist/services/codebase/namespace.d.mts +2 -0
- package/dist/services/codebase/namespace.mjs +1 -0
- package/dist/services/codebase/schemas.d.mts +2 -0
- package/dist/services/codebase/schemas.mjs +1 -0
- package/dist/services/compression/index.d.mts +3 -0
- package/dist/services/compression/index.mjs +1 -0
- package/dist/services/compression/namespace.d.mts +2 -0
- package/dist/services/compression/namespace.mjs +1 -0
- package/dist/services/compression/schemas.d.mts +2 -0
- package/dist/services/compression/schemas.mjs +1 -0
- package/dist/services/context-rules/index.d.mts +412 -0
- package/dist/services/context-rules/index.mjs +1 -0
- package/dist/services/credential-change/index.d.mts +17 -0
- package/dist/services/credential-change/index.mjs +1 -0
- package/dist/services/definition/index.d.mts +2 -0
- package/dist/services/definition/index.mjs +1 -0
- package/dist/services/definition/namespace.d.mts +71 -0
- package/dist/services/definition/namespace.mjs +1 -0
- package/dist/services/definition/schemas.d.mts +38 -0
- package/dist/services/definition/schemas.mjs +1 -0
- package/dist/services/dialog/namespace.d.mts +105 -0
- package/dist/services/dialog/namespace.mjs +1 -0
- package/dist/services/dialog/schemas.d.mts +109 -0
- package/dist/services/dialog/schemas.mjs +1 -0
- package/dist/services/execution-target/index.d.mts +4 -0
- package/dist/services/execution-target/index.mjs +1 -0
- package/dist/services/execution-target/namespace.d.mts +2 -0
- package/dist/services/execution-target/namespace.mjs +1 -0
- package/dist/services/execution-target/schemas.d.mts +2 -0
- package/dist/services/execution-target/schemas.mjs +1 -0
- package/dist/services/filesystem/namespace.d.mts +432 -0
- package/dist/services/filesystem/namespace.mjs +1 -0
- package/dist/services/filesystem/schemas.d.mts +240 -0
- package/dist/services/filesystem/schemas.mjs +1 -0
- package/dist/services/harness/index.d.mts +861 -0
- package/dist/services/harness/index.mjs +1 -0
- package/dist/services/harness/storage/schema.d.mts +424 -0
- package/dist/services/harness/storage/schema.mjs +1 -0
- package/dist/services/index.d.mts +5703 -0
- package/dist/services/index.mjs +1 -0
- package/dist/services/local-notification/index.d.mts +25 -0
- package/dist/services/local-notification/index.mjs +1 -0
- package/dist/services/local-notification/namespace.d.mts +73 -0
- package/dist/services/local-notification/namespace.mjs +1 -0
- package/dist/services/local-notification/schemas.d.mts +88 -0
- package/dist/services/local-notification/schemas.mjs +1 -0
- package/dist/services/log-import/browser.d.mts +3 -0
- package/dist/services/log-import/browser.mjs +1 -0
- package/dist/services/log-import/index.d.mts +275 -0
- package/dist/services/log-import/index.mjs +2 -0
- package/dist/services/log-import/log-import.d.mts +3 -0
- package/dist/services/log-import/log-import.mjs +1 -0
- package/dist/services/log-import/namespace.d.mts +327 -0
- package/dist/services/log-import/namespace.mjs +1 -0
- package/dist/services/log-import/schemas.d.mts +217 -0
- package/dist/services/log-import/schemas.mjs +1 -0
- package/dist/services/model-registry/index.d.mts +2 -0
- package/dist/services/model-registry/index.mjs +1 -0
- package/dist/services/preferences/index.d.mts +3 -0
- package/dist/services/preferences/index.mjs +1 -0
- package/dist/services/preferences/schemas.d.mts +2 -0
- package/dist/services/preferences/schemas.mjs +1 -0
- package/dist/services/preferences/storage-namespace.d.mts +3 -0
- package/dist/services/preferences/storage-namespace.mjs +1 -0
- package/dist/services/provider-context/index.d.mts +2 -0
- package/dist/services/provider-context/index.mjs +1 -0
- package/dist/services/provider-runtime/index.d.mts +136 -0
- package/dist/services/provider-runtime/index.mjs +1 -0
- package/dist/services/session/handlers/index.d.mts +2 -0
- package/dist/services/session/handlers/index.mjs +1 -0
- package/dist/services/session/index.d.mts +10 -0
- package/dist/services/session/index.mjs +1 -0
- package/dist/services/session/messages/namespace.d.mts +2 -0
- package/dist/services/session/messages/namespace.mjs +1 -0
- package/dist/services/session/orchestrator-testing/index.d.mts +2 -0
- package/dist/services/session/orchestrator-testing/index.mjs +1 -0
- package/dist/services/session/session-events/namespace.d.mts +2 -0
- package/dist/services/session/session-events/namespace.mjs +1 -0
- package/dist/services/session/storage/namespace.d.mts +2 -0
- package/dist/services/session/storage/namespace.mjs +1 -0
- package/dist/services/session/storage/schema.d.mts +2 -0
- package/dist/services/session/storage/schema.mjs +1 -0
- package/dist/services/session/testing/index.d.mts +35 -0
- package/dist/services/session/testing/index.mjs +52 -0
- package/dist/services/session/testing/orchestrator-shared.d.mts +2 -0
- package/dist/services/session/testing/orchestrator-shared.mjs +1 -0
- package/dist/services/session/turns/namespace.d.mts +2 -0
- package/dist/services/session/turns/namespace.mjs +1 -0
- package/dist/services/session-editor/index.d.mts +119 -0
- package/dist/services/session-editor/index.mjs +1 -0
- package/dist/services/settings/index.d.mts +47 -0
- package/dist/services/settings/index.mjs +1 -0
- package/dist/services/settings/namespace.d.mts +662 -0
- package/dist/services/settings/namespace.mjs +1 -0
- package/dist/services/settings/storage/clients-namespace.d.mts +2 -0
- package/dist/services/settings/storage/clients-namespace.mjs +1 -0
- package/dist/services/settings/storage/extension-configs/namespace.d.mts +184 -0
- package/dist/services/settings/storage/extension-configs/namespace.mjs +1 -0
- package/dist/services/settings/storage/index.d.mts +4 -0
- package/dist/services/settings/storage/index.mjs +1 -0
- package/dist/services/settings/storage/providers-namespace.d.mts +2 -0
- package/dist/services/settings/storage/providers-namespace.mjs +1 -0
- package/dist/services/tool-approval/index.d.mts +2 -0
- package/dist/services/tool-approval/index.mjs +1 -0
- package/dist/services/tools/index.d.mts +2 -0
- package/dist/services/tools/index.mjs +1 -0
- package/dist/services/tray-menu/index.d.mts +4 -0
- package/dist/services/tray-menu/index.mjs +1 -0
- package/dist/services/tray-menu/namespace.d.mts +2 -0
- package/dist/services/tray-menu/namespace.mjs +1 -0
- package/dist/services/tray-menu/schemas.d.mts +2 -0
- package/dist/services/tray-menu/schemas.mjs +1 -0
- package/dist/services/turn/index.d.mts +2 -0
- package/dist/services/turn/index.mjs +1 -0
- package/dist/services/turn/namespace.d.mts +2 -0
- package/dist/services/turn/namespace.mjs +1 -0
- package/dist/services/turn/schemas.d.mts +335 -0
- package/dist/services/turn/schemas.mjs +1 -0
- package/dist/services/worker/index.d.mts +3 -0
- package/dist/services/worker/index.mjs +1 -0
- package/dist/services/worker/namespace.d.mts +2 -0
- package/dist/services/worker/namespace.mjs +1 -0
- package/dist/services/worker/schemas.d.mts +2 -0
- package/dist/services/worker/schemas.mjs +1 -0
- package/dist/session-Do6lDZM4.mjs +123 -0
- package/dist/session-lineage-Eev4uo4I.d.mts +65 -0
- package/dist/session-piI1R5rP.mjs +1 -0
- package/dist/shared-DxHLl9UP.mjs +1 -0
- package/dist/shared-schemas-BgQv_tnu.mjs +1 -0
- package/dist/skill-CB5h-ZFQ.mjs +1 -0
- package/dist/storage/drizzle/client.d.mts +78 -0
- package/dist/storage/drizzle/client.mjs +1 -0
- package/dist/storage/drizzle/index.d.mts +98 -0
- package/dist/storage/drizzle/index.mjs +1 -0
- package/dist/storage/handlers/drizzle/index.d.mts +2 -0
- package/dist/storage/handlers/drizzle/index.mjs +1 -0
- package/dist/storage/handlers/index.d.mts +33 -0
- package/dist/storage/handlers/index.mjs +1 -0
- package/dist/storage/index.d.mts +192 -0
- package/dist/storage/index.mjs +1 -0
- package/dist/storage-namespace-ADwyijoe.mjs +1 -0
- package/dist/storage-namespace-DAm8iWEj.d.mts +221 -0
- package/dist/storage-namespace-definition-CHu2k14q.mjs +1 -0
- package/dist/storage-namespace-definition-CJgqyXH1.d.mts +17 -0
- package/dist/style.css +3782 -0
- package/dist/testing/drizzle-harness.d.mts +130 -0
- package/dist/testing/drizzle-harness.mjs +1 -0
- package/dist/testing/index.d.mts +106 -0
- package/dist/testing/index.mjs +1 -0
- package/dist/tool-approval-service-BcBSUZCO.mjs +1 -0
- package/dist/tools/index.d.mts +825 -0
- package/dist/tools/index.mjs +1 -0
- package/dist/tools/testing/index.d.mts +53 -0
- package/dist/tools/testing/index.mjs +1 -0
- package/dist/tools-CDSgj0ee.mjs +1 -0
- package/dist/tray-menu-service-CTXC1Elg.mjs +1 -0
- package/dist/types-6WxLfoM3.d.mts +31 -0
- package/dist/types-BjToUrHp.d.mts +6619 -0
- package/dist/types-CD1LJwPc.d.mts +1009 -0
- package/dist/types-Cvrj2ogm.d.mts +305 -0
- package/dist/types-DYF5LxZY.d.mts +233 -0
- package/dist/types-t295YC6T.d.mts +262 -0
- package/dist/types-vNpkAe4Y.d.mts +128 -0
- package/dist/ui-components/index.d.mts +2342 -0
- package/dist/ui-components/index.mjs +8 -0
- package/dist/ui-config-CXmbsqZV.mjs +1 -0
- package/dist/ui-hooks/index.d.mts +1805 -0
- package/dist/ui-hooks/index.mjs +1 -0
- package/dist/ui-kernel/index.d.mts +2793 -0
- package/dist/ui-kernel/index.mjs +1 -0
- package/dist/ui-kernel/pages/namespace.d.mts +88 -0
- package/dist/ui-kernel/pages/namespace.mjs +1 -0
- package/dist/ui-kernel/pages/schemas.d.mts +2 -0
- package/dist/ui-kernel/pages/schemas.mjs +1 -0
- package/dist/ui-views/index.d.mts +487 -0
- package/dist/ui-views/index.mjs +30 -0
- package/dist/utils/health-probe.d.mts +26 -0
- package/dist/utils/health-probe.mjs +1 -0
- package/dist/utils/index.d.mts +227 -0
- package/dist/utils/index.mjs +2 -0
- package/dist/utils/keychain.d.mts +31 -0
- package/dist/utils/keychain.mjs +1 -0
- package/dist/utils/resolve-package-root.d.mts +12 -0
- package/dist/utils/resolve-package-root.mjs +1 -0
- package/dist/utils/workspace-root.d.mts +27 -0
- package/dist/utils/workspace-root.mjs +2 -0
- package/dist/variant-D5kSrL3m.mjs +1 -0
- package/dist/version-CjS20oXi.mjs +1 -0
- package/dist/visibility-CZu8ooOA.mjs +1 -0
- package/dist/window-registry-CUftmDr3.mjs +1 -0
- package/dist/window-registry-C_IJmY8_.d.mts +130 -0
- package/package.json +346 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import{t as e}from"../cleanEnvForAdapter-DvcIGXTG.mjs";import{n as t,r as n,t as r}from"../cursor-storage-DOQdvo9j.mjs";import{z as i}from"zod";import*as a from"node:fs";import{AuthenticationError as o,DirectoryNotFoundError as s,ModelUnavailableError as c,QuotaExceededError as l,RateLimitError as u,createBusNamespace as d}from"@makaio/framework/core";import{MakaioBus as f,NoHandlerError as p,RequestError as m}from"@makaio/framework/bus";import{AdapterSubjects as h,AgentSubjects as g,AgentToolApproveSchema as _,HarnessSubjects as v,MCP_CALL_TOOL_NAME as ee,McpSubjects as y,SessionContextSchema as b,SessionSubjects as x}from"@makaio/framework/contracts";import{TurnStorageSubjects as te}from"@makaio/framework/services/turn";import{CredentialRefSchema as ne}from"@makaio/framework/contracts/config";import{runPostUserMessageHooks as re,runPreUserMessageHooks as ie}from"@makaio/framework/hooks";import{activateProviderContextStrict as ae,buildProviderContext as S}from"@makaio/framework/services/provider-context";import oe from"node:os";import{AgentStorageSubjects as C}from"@makaio/framework/services/session";import{DeferredPromise as w,resolveTimeouts as se}from"@makaio/framework/utils";import ce from"emittery";import*as le from"node:process";function ue(e,t,n){return f.registerNamespace(d(e,t,n))}function T(e){let t=[];try{return JSON.stringify(e,function(e,n){if(typeof n==`bigint`)return n.toString();if(typeof n==`object`&&n){for(;t.length>0&&t[t.length-1]!==this;)t.pop();if(t.includes(n))return`[Circular]`;t.push(n)}return n},2)??`[Non-serializable value]`}catch{try{return String(e)}catch{return`[Non-serializable value]`}}}function de(e){return e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`'`,`'`)}function fe(e){let t=e.replace(/[^a-zA-Z0-9_-]/g,`_`);return t.length===0?`context`:/^[A-Za-z_]/.test(t)?t:`context_${t}`}function E(e,t){let n=fe(e);return`<${n}>\n${de(t)}\n</${n}>`}function pe(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.name==`string`&&typeof t.description==`string`&&(t.compatibility===void 0||typeof t.compatibility==`string`)}function me(e){if(typeof e!=`object`||!e)return!1;let t=e,n=t.metadata,r=n;return typeof t.name==`string`&&typeof t.content==`string`&&(t.license===void 0||typeof t.license==`string`)&&(t.compatibility===void 0||typeof t.compatibility==`string`)&&(t.allowedTools===void 0||typeof t.allowedTools==`string`)&&(n===void 0||typeof n==`object`&&!!n&&Object.values(r??{}).every(e=>typeof e==`string`))}function he(e){if(!Array.isArray(e))return;let t=e.filter(pe).sort((e,t)=>e.name.localeCompare(t.name)).map(e=>e.compatibility?`- ${e.name}: ${e.description} Compatibility: ${e.compatibility}`:`- ${e.name}: ${e.description}`);return t.length>0?t.join(`
|
|
2
|
+
`):void 0}function ge(e){if(!Array.isArray(e))return;let t=e.filter(me).sort((e,t)=>e.name.localeCompare(t.name)).map(e=>{let t=[`## ${e.name}`];return e.compatibility&&t.push(`Compatibility: ${e.compatibility}`),t.push(e.content),t.join(`
|
|
3
|
+
`)});return t.length>0?t.join(`
|
|
4
|
+
|
|
5
|
+
`):void 0}function _e(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.id==`string`&&typeof t.name==`string`&&typeof t.priority==`number`&&typeof t.renderedContent==`string`}function ve(e){if(!Array.isArray(e))return;let t=e.filter(_e).map(e=>`## ${e.name}\n${e.renderedContent}`);return t.length>0?t.join(`
|
|
6
|
+
|
|
7
|
+
`):void 0}const D=[`skillCatalog`,`skills`,`contextRules`];function ye(e){if(!e)return[];let t=[],n={skillCatalog:he,skills:ge,contextRules:ve};for(let r of D)be(t,r,e[r],n[r]);let r=new Set(D),i=Object.keys(e).filter(t=>e[t]==null?!1:!r.has(t)).sort();for(let n of i)t.push({tag:n,content:T(e[n])});return t}function be(e,t,n,r){if(n==null)return;let i=r(n);if(i!==void 0){e.push({tag:t,content:i});return}Array.isArray(n)&&n.length===0||e.push({tag:t,content:T(n)})}function xe(e){return e.length===0?``:e.map(e=>E(e.tag,e.content)).join(`
|
|
8
|
+
|
|
9
|
+
`)}function Se(e){let t=new Set(e),n={hasAll:e=>e.every(e=>t.has(e)),hasAny:e=>e.some(e=>t.has(e))};for(let t of e){let e=t.split(`:`).map((e,t)=>t===0?e:e.charAt(0).toUpperCase()+e.slice(1)).join(``);n[e]=!0}return n}function O(e){if(typeof e==`string`)return{role:`user`,blocks:[{type:`text`,content:e}],message:e};let t=Array.isArray(e.blocks)?e.blocks:[e.blocks],n=t.find(e=>e.type===`text`);return{role:e.role??`user`,blocks:t,message:n?.content}}function Ce(e,t){return{discriminator:e,handlers:t}}function we(e,t){return{discriminator:e,handlers:t}}async function k(e,t,n){let r=Array.isArray(e)?e:[e];for(let e of r){let r=e[t.discriminator],i=t.handlers[r];i&&await i(e,n)}}function Te(e,t,n){let r=Array.isArray(e)?e:[e];for(let e of r){let r=e[t.discriminator],i=t.handlers[r];if(i&&i(e,n)instanceof Promise)throw Error(`processDiscriminatedItemsSync: Handler for '${r}' returned a Promise. Use processDiscriminatedItems (async) instead, or ensure all handlers are synchronous.`)}}function A(e){return e?.trim()||void 0}function Ee(e){return[...new Set(e.flatMap(e=>e.credentialEnvVars?Object.values(e.credentialEnvVars):[]))]}function j(e,t=e?[e]:[]){let n={},r=Ee(t);if(e?.credentialEnvVars)for(let[t,r]of Object.entries(e.credentialEnvVars))n[t]=ne.parse(`env:${r}`);return{providerConfigId:`test-provider-config-id`,definitionId:e?.id??`test`,credentialRefs:n,...e?.credentialEnvVars?{credentialEnvVars:{...e.credentialEnvVars}}:void 0,...r.length>0?{ambientCredentialEnvVars:r}:{},...e?.endpoints?{endpointOverrides:{...e.endpoints}}:{}}}function De(e,t,n,r=n?[n]:[]){return{...e,bus:t,agentId:crypto.randomUUID(),adapterId:crypto.randomUUID(),adapterName:e?.adapterName??`test-adapter`,providerContext:e?.providerContext??j(n,r)}}const Oe=`MAKAIO_CONFORMANCE_PROVIDER`,ke=`MAKAIO_CONFORMANCE_PRIMARY_MODEL`,Ae=`MAKAIO_CONFORMANCE_SECONDARY_MODEL`,M=`MAKAIO_CONFORMANCE_PROVIDER_DEFINITIONS`;function je(e){let t=[],n=new Set;for(let r of e)n.has(r.id)||(n.add(r.id),t.push(r));return t}function Me(e){let t=A(e);if(!t)return[];let n;try{n=JSON.parse(t)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`${M} must contain valid JSON: ${t}`,{cause:e})}if(!Array.isArray(n))throw Error(`${M} must be a JSON array`);for(let[e,t]of n.entries())if(!t||typeof t!=`object`||typeof t.id!=`string`)throw Error(`${M}[${e}] must be a provider object with an id`);return n}function Ne(e,t,n,r){let i=new Map;for(let e of[...r,...n])i.set(e.id,e);let a=t.map(e=>i.get(e)).filter(e=>!!e),o=t.filter(e=>!i.has(e));if(o.length>0)throw Error(`[${e}] Conformance provider catalog is missing provider definitions: ${o.join(`, `)}. Run through yarn test:conformance so provider contributions are loaded.`);return je(a)}function N(e,t,n,r,i){if(r)return r;let a=n===`primary`?`fastModel/defaultModel`:`defaultModel`;throw Error(`[${e}] Provider '${t.id}' cannot be used for conformance tests: missing ${a}. Set ${i} or add a model to the provider definition.`)}function Pe(e){let t=e.readEnv??(e=>process.env[e]),n=e.providerEnvVar??`MAKAIO_CONFORMANCE_PROVIDER`,r=e.primaryModelEnvVar??`MAKAIO_CONFORMANCE_PRIMARY_MODEL`,i=e.secondaryModelEnvVar??`MAKAIO_CONFORMANCE_SECONDARY_MODEL`,a=Me(t(M)),o=Ne(e.adapterName,e.providerIds,e.providerDefinitions??[],a),s=A(t(n)),c=s??e.defaultProviderId,l=o.find(e=>e.id===c);if(!l){let t=o.map(e=>e.id).join(`, `);throw Error(`[${e.adapterName}] Unknown conformance provider '${c}' from ${s?n:`defaultProviderId`}. Available providers: ${t}`)}let u=N(e.adapterName,l,`primary`,A(t(r))??l.primaryTestModel??l.fastModel??l.defaultModel,r),d=N(e.adapterName,l,`secondary`,A(t(i))??l.secondaryTestModel??l.defaultModel,i);return{provider:l,providers:o,providerContext:j(l,o),primaryModel:{definitionId:l.id,modelName:u,...e.reasoningEffort?{reasoningEffort:e.reasoningEffort}:void 0},secondaryModel:{definitionId:l.id,modelName:d,...e.reasoningEffort?{reasoningEffort:e.reasoningEffort}:void 0}}}async function Fe(e,t,n,r){let i=n===void 0?await e.requestOptional(v.getDefault,{adapterName:t,clientId:r}):await e.requestOptional(v.get,{id:n});return i.handled?i.data.nativeTools.disabled:[]}function Ie(e){switch(e.type){case`text`:return e.content;case`image`:return`[Image]`;case`document`:return`[Document]`;case`attachment`:return`[Attachment: ${e.displayName??e.fileName}]`;case`reasoning`:return`[Reasoning]\n${e.content}`;case`tool_call`:return`[Tool: ${e.name}]\n${JSON.stringify(e.args,null,2)}`;case`tool_output`:return`[Tool ${e.isError?`Error`:`Result`}]\n${e.output}`}}function Le(e){return e.map(e=>{let t=e.role??`user`;return`${t.charAt(0).toUpperCase()+t.slice(1)}: ${(Array.isArray(e.blocks)?e.blocks:[e.blocks]).map(Ie).join(`
|
|
10
|
+
`)}`}).join(`
|
|
11
|
+
`)}function Re(e){throw Error(`Unhandled MessageBlock variant: ${JSON.stringify(e)}`)}function ze(e){switch(e.type){case`text`:return e.content;case`reasoning`:return e.content;case`tool_call`:return`[Tool: ${e.name}]\n${JSON.stringify(e.args)}`;case`tool_output`:return`[Tool ${e.isError?`Error`:`Result`} ${e.toolCallId}]\n${e.output}`;case`image`:return`[Image]`;case`document`:return`[Document]`;case`attachment`:return`[Attachment: ${e.displayName?.trim()?e.displayName:e.fileName||`Attachment`}]`;default:return Re(e)}}function P(e,t,n,r,i){let a=e??(i?t:void 0);if(!a)throw Error(`[${r}] toGlobalToolApproval: ${n} must come from tool approval context`+(i?` or trusted payload`:``));return a}function F(e,t,n,r=!1){return P(e,t,`sessionId`,n,r)}function Be(e,t,n,r={}){let i=r.allowPayloadIdentityFallback??!1;if(i){let e=[t.agentId,t.adapterId,t.adapterName,t.adapterSessionId],r=e.filter(Boolean).length;if(r>0&&r<e.length)throw Error(`[${n}] toGlobalToolApproval: context must supply all four identity fields (agentId, adapterId, adapterName, adapterSessionId) or none — partial context with allowPayloadIdentityFallback creates a mixed-source identity tuple`)}let a=F(t.sessionId,e.sessionId,n,r.allowPayloadSessionFallback??!1);return{...e,agentId:P(t.agentId,e.agentId,`agentId`,n,i),adapterId:P(t.adapterId,e.adapterId,`adapterId`,n,i),adapterName:P(t.adapterName,e.adapterName,`adapterName`,n,i),adapterSessionId:P(t.adapterSessionId,e.adapterSessionId,`adapterSessionId`,n,i),sessionId:a}}const Ve={request:_.request.extend({sessionId:i.string().optional()}),response:_.response};function He(e,t,n){return function(r,i){return r.on(e,async e=>{try{let r=typeof i==`function`?await i():i,a=t(e.payload,r),o=await f.request(g.toolApprove,a);e.setResult(n(o))}catch(t){console.error(`[createToolApprovalHandler] Tool approval request failed:`,t);let r=t instanceof Error?`: ${t.message}`:``;e.setResult(n({action:`deny`,message:`Tool approval request failed${r}`,shouldAbort:!0}))}})}}function I(e){return e&&e.split(`;`)[0].trim().toLowerCase()||`application/octet-stream`}function Ue(e){let t=I(e);return t.startsWith(`text/`)?!0:[`application/json`,`application/xml`,`application/sql`,`application/graphql`,`application/javascript`,`application/typescript`,`application/x-yaml`,`application/toml`].includes(t)}function We(e){if(!e.credentialEnvVars)return;let t={};for(let[n,r]of Object.entries(e.credentialEnvVars)){let e=process.env[r];e!==void 0&&(t[n]=e)}return Object.keys(t).length>0?t:void 0}function L(){return{providerConfigId:`sentinel`,definitionId:`unresolved`,credentialRefs:{}}}var Ge=class{abortController;terminated=!1;constructor(e){this.abortController=e??new AbortController}get signal(){return this.abortController.signal}get isTerminated(){return this.terminated}abort(e){this.terminated||(this.terminated=!0,this.abortController.abort(),e&&Promise.resolve(e()).catch(e=>{console.error(`Error during session cleanup:`,e)}))}onAbort(e){this.abortController.signal.addEventListener(`abort`,e)}},Ke=class{queue=[];enqueue(e){if(e.deliveryMode===`replace`){for(let t of this.queue)t.state===`queued`&&(t.supersededBy=e.messageId,t.markCompleted({outcome:`superseded`,supersededBy:e.messageId}));this.removeSuperseded()}this.queue.push(e)}removeSuperseded(){for(let e=this.queue.length-1;e>=0;e--)this.queue[e].supersededBy&&this.queue.splice(e,1)}dequeue(){return this.queue.shift()}peek(){return this.queue[0]}isEmpty(){return this.queue.length===0}size(){return this.queue.length}clear(){this.queue.length=0}findImmediate(){return this.queue.find(e=>e.deliveryMode===`immediate`)}removeImmediate(e){let t=this.queue.indexOf(e);t>=0&&this.queue.splice(t,1)}drainEnqueued(){let e=[];for(let t=this.queue.length-1;t>=0;t--)this.queue[t].deliveryMode===`enqueue`&&e.unshift(this.queue.splice(t,1)[0]);return e}};async function R(e,t){let n=t.getCurrentTurn(),r=t.extractContent??qe;if(n?.canAcceptImmediate()){let i=e.findImmediate();if(i)if(e.removeImmediate(i),(await n.pause()).turnEnded)i.markCompleted({outcome:`rejected`});else{let a=n.getMessageHandle(),o=e.drainEnqueued(),s=[];a&&!a.isProcessed&&(s.push(r(a)),a.supersededBy=i.messageId,a.markCompleted({outcome:`superseded`,supersededBy:i.messageId}));for(let e of o)s.push(r(e)),e.supersededBy=i.messageId,e.markCompleted({outcome:`merged`,mergedInto:i.messageId});let c=t.collectMergeExtra?.(a,o);return await t.onBeforeImmediateTurn?.(),await t.startNewTurn(i,s,c),!0}}if(!n||n.isCompleted()){let r=e.peek();if(r)return r.deliveryMode===`immediate`&&n?.isCompleted()?(e.dequeue(),r.markCompleted({outcome:`rejected`}),R(e,t)):(e.dequeue(),await t.startNewTurn(r),!0)}return!1}function qe(e){return e.message.message}const Je=[`active`,`step_finished`,`turn_finished`,`processing_finished`];function Ye(e,t){if(e===t)return null;let n=[];switch(t){case`processing_started`:break;case`turn_started`:([`idle`,`processing_finished`,`paused`].includes(e)||e===`active`)&&n.push(`processing_started`);break;case`step_started`:[`idle`,`processing_finished`,`paused`].includes(e)||e===`active`?n.push(`processing_started`,`turn_started`):[`processing_started`,`turn_finished`].includes(e)&&n.push(`turn_started`);break;case`step_finished`:break;case`turn_finished`:e===`step_started`&&n.push(`step_finished`);break;case`processing_finished`:e===`step_started`?n.push(`step_finished`,`turn_finished`):[`turn_started`,`step_finished`].includes(e)&&n.push(`turn_finished`);break}return{isCompletionState:Je.includes(t),statesToEmit:[...n,t]}}var z=class{messageId;message;deliveryMode;deferredCompletion;deferredAcknowledgement;state;isAcknowledged=void 0;completionResult=void 0;mergedInto;mergedFrom;supersededBy;deferredAdapterSessionId=new w;_adapterSessionId;_messageHistory;_turnContext;constructor(e,t,n,r,i){this.messageId=e,this.message=t,this.deliveryMode=n,this.deferredCompletion=new w,this.deferredAcknowledgement=new w,this.state=`queued`,this._messageHistory=r,this._turnContext=i}get messageHistory(){return this._messageHistory}set messageHistory(e){this._messageHistory=e}get turnContext(){return this._turnContext}set turnContext(e){this._turnContext=e}get adapterSessionId(){return this._adapterSessionId}set adapterSessionId(e){e&&!this._adapterSessionId&&(this._adapterSessionId=e,this.deferredAdapterSessionId.resolve(e))}waitForAdapterSessionId(){return this._adapterSessionId?Promise.resolve(this._adapterSessionId):this.deferredAdapterSessionId.getPromise()}get isProcessed(){return this.state===`completed`||this.state===`cancelled`}getState(){return this.state}updateState(e){this.state=e}async cancel(){return this.updateState(`cancelled`),this.deferredAcknowledgement.reject(Error(`Message cancelled`)),this.deferredCompletion.resolve({outcome:`cancelled`}),!0}markAcknowledged(e=!0){this.isAcknowledged===void 0&&(this.isAcknowledged=e,this.updateState(`acknowledged`),this.deferredAcknowledgement.resolve(e))}markCompleted(e){this.completionResult===void 0?(this.updateState(`completed`),this.completionResult=e,this.deferredCompletion.resolve(e),this.isAcknowledged===void 0&&(this.isAcknowledged=!1,this.deferredAcknowledgement.resolve(!1))):console.warn(`markCompleted called for messageId: ${this.messageId} but already completed.`)}async waitForAcknowledgment(e){if(this.isAcknowledged!==void 0)return this.isAcknowledged;if(e){let t=await Promise.race([this.deferredAcknowledgement.getPromise(),new Promise(t=>setTimeout(()=>t(Error(`Acknowledgment timeout`)),e))]);if(t instanceof Error)throw this.markCompleted({outcome:`error`,error:t}),t;return t}return this.deferredAcknowledgement.getPromise()}async waitForCompletion(e){if(this.completionResult)return this.completionResult;if(e){let t=await Promise.race([this.deferredCompletion.getPromise(),new Promise(t=>setTimeout(()=>t(Error(`Completion timeout`)),e))]);if(t instanceof Error)throw t;return t}return this.deferredCompletion.getPromise()}},B=class{agentId;adapterSessionId;sessionId;pendingMessageHandle;scopedBus;filteredBus;errorHandler;deferredInterrupt;emittery=new ce;processingState=`idle`;adapterId;timeouts;lastResult=null;config;model;providerConfigId;cwd;currentReasoningEffort;supportedReasoningLevels;env;_currentTurnNumber=0;_pendingCanonicalTurnNumber;adapterName;systemPrompt;constructor(t){let n=t.cwd??oe.tmpdir();if(!a.existsSync(n))throw new s(n);this.agentId=t.agentId??crypto.randomUUID(),this.scopedBus=t.bus,this.filteredBus=t.bus.withFilter({agentId:this.agentId}),this.adapterId=t.adapterId,this.adapterName=t.adapterName,this.adapterSessionId=t.adapterSessionId,this.sessionId=t.sessionId,this.timeouts=t.timeouts??se([]),this.errorHandler=t.errorHandler,this.model=t.model,this.providerConfigId=t.providerConfigId,this.cwd=n,this.currentReasoningEffort=t.reasoningEffort,this.supportedReasoningLevels=t.supportedReasoningLevels,this.config=t,this.env=e(t?.env??le.env)}getProcessingState(){return this.processingState}handlePause(e){this.updateProcessingState(`paused`)}captureSystemPrompt(e){e!==void 0&&(this.systemPrompt=e)}async updateProcessingState(e){let t=Ye(this.processingState,e);if(!t)return;let{statesToEmit:n}=t;this.processingState=e;for(let e of n)await this.emittery.emit(`processingStateChanged`,e)}onProcessingStateChanged(e){return this.emittery.on(`processingStateChanged`,e)}async onceProcessingStateChanged(e){return this.emittery.once(`processingStateChanged`,e)}createMessageHandle(e,t){let n=new z(t?.messageId??crypto.randomUUID(),e,t?.deliveryMode??`enqueue`,t?.messageHistory,t?.turnContext);return n.adapterSessionId=this.adapterSessionId,this.config.onMessageSent?.(n),n}markToolRefreshPending(){}setCanonicalTurnNumber(e){if(!Number.isInteger(e)||e<1)throw RangeError(`setCanonicalTurnNumber: expected positive integer, got ${e}`);if(e<=this._currentTurnNumber)throw RangeError(`setCanonicalTurnNumber: ${e} ≤ current (${this._currentTurnNumber})`);if(this._pendingCanonicalTurnNumber!==void 0&&e<this._pendingCanonicalTurnNumber)throw RangeError(`setCanonicalTurnNumber: ${e} < pending (${this._pendingCanonicalTurnNumber})`);this._pendingCanonicalTurnNumber=e}consumeTurnNumber(){return this._pendingCanonicalTurnNumber===void 0?(this._currentTurnNumber+=1,this._currentTurnNumber):(this._currentTurnNumber=this._pendingCanonicalTurnNumber,this._pendingCanonicalTurnNumber=void 0,this._currentTurnNumber)}get currentTurnNumber(){return this._currentTurnNumber}get pendingTurnNumber(){return this._pendingCanonicalTurnNumber}async changeModelInPlace(e){return!1}async changeCwdInPlace(e){return!1}async changeReasoningInPlace(e){return!1}handleError(e,t=!1){let n=e instanceof Error?e:Error(String(e));console.warn(`[AIAgentConnector:handleError] pendingMessageHandle=${this.pendingMessageHandle?.messageId}, errorType=${n.name}, terminate=${t}`),this.errorHandler?.(n,t),this.pendingMessageHandle&&(this.pendingMessageHandle.markCompleted({outcome:`error`,error:n}),this.pendingMessageHandle=void 0,this.handlePause(`error`)),t&&this.abort()}handleToolApprovalDenied(e,t){e!==`not_requested`&&queueMicrotask(()=>{this.handleError(Error(`Tool use denied by approval handler: ${t}`),!1)})}getAgentId(){return this.agentId}getAdapterName(){return this.adapterName}getTimeoutMs(e){return this.timeouts.values[e]}requestToolApproval(e,t){return this.scopedBus.request(e,{...t,adapterName:this.adapterName,agentId:this.agentId,adapterId:this.adapterId,adapterSessionId:this.adapterSessionId,sessionId:this.sessionId})}async requestToolApprovalWithHandling(e,t){return this.requestToolApproval(e,t).catch(e=>{let t=e;throw(e instanceof m||e instanceof p)&&(t=Error(`Tool approval request failed, make sure that there's a handler registered: `+e.message)),this.handleError(t,!1),e})}emit(e,t){return this.scopedBus.emit(e,{...t,adapterName:this.adapterName,agentId:this.agentId,adapterId:this.adapterId,adapterSessionId:this.adapterSessionId})}on(e,t,n){return this.filteredBus.on(e,t,n)}once(e,t){return this.filteredBus.once(e,t)}logLowLevelEvent(e){}},Xe=class{config;bus;sessionId;currentTurn;constructor(e){this.config=e,this.bus=e.bus}async abort(){await this.currentTurn?.pause()}async sendMessage(e,t){throw Error(`Use processQueue instead`)}async getAdapterSessionId(){return this.sessionId}},V=class{state;bus;adapterId;adapterName;stateChangedCallback;constructor(e,t,n,r){this.bus=e,this.adapterId=t,this.adapterName=n,this.state=r}onStateChanged(e){this.stateChangedCallback=e}async transitionTo(e){let t=this.state;this.state=e,await this.emitStateChange(t,e),await this.stateChangedCallback?.(t,e)}getState(){return this.state}getMessageHandle(){return this.activeMessageHandle}markAcknowledged(){this.activeMessageHandle.markAcknowledged()}markCompleted(e){this.activeMessageHandle.markCompleted(e)}},Ze=class extends V{activeMessageHandle;connectorBus;agentId;turnSubjects;aborted=!1;constructor(e,t){super(e.bus,e.adapterId,e.adapterName,t),this.connectorBus=e.bus,this.agentId=e.agentId,this.activeMessageHandle=e.messageHandle,this.turnSubjects=e.turnSubjects}async emitStateChange(e,t){let n={adapterId:this.adapterId,agentId:this.agentId,oldState:e,newState:t,timestamp:Date.now()};switch(await this.connectorBus.emit(this.turnSubjects.state_changed,n),t){case`turn_started`:await this.connectorBus.emit(this.turnSubjects.turn_started,n);break;case`step_started`:await this.connectorBus.emit(this.turnSubjects.step_started,n);break;case`step_finished`:await this.connectorBus.emit(this.turnSubjects.step_finished,n);break;case`turn_finished`:await this.connectorBus.emit(this.turnSubjects.turn_finished,n);break}}async start(){await this.transitionTo(`turn_started`)}async markStepStarted(){(this.state===`turn_started`||this.state===`step_finished`)&&await this.transitionTo(`step_started`)}async markStepFinished(){this.state===`step_started`&&await this.transitionTo(`step_finished`)}async markTurnFinished(){await this.transitionTo(`turn_finished`)}async pause(){if(this.state===`turn_finished`)return{stateBeforePause:this.state,turnEnded:!0};let e=this.state;return this.aborted=!0,{stateBeforePause:e,turnEnded:!1}}async resume(e){throw Error(`${this.adapterName} does not support resume - create new turn with merged content`)}isPaused(){return this.aborted}isCompleted(){return this.state===`turn_finished`}canAcceptImmediate(){return this.state!==`turn_finished`&&!this.aborted}},Qe=class extends B{turnEventsWired=!1;getWireSessionConfig(){}wireSessionEvents(){if(this.turnEventsWired)return;this.turnEventsWired=!0;let e=this.getTurnSubjects(),t=this.getWireSessionConfig();this.on(e.turn_started,(async()=>{try{await t?.onTurnStarted?.()}catch(e){console.error(`[ProceduralAgentConnector] onTurnStarted hook failed:`,e)}await this.updateProcessingState(`turn_started`)})),this.on(e.step_started,(async()=>{await this.updateProcessingState(`step_started`)})),this.on(e.step_finished,(async()=>{await this.updateProcessingState(`step_finished`);let e=this.getSession(),t=this.getSessionQueue();e&&!t.isEmpty()&&await e.processQueue(t)})),this.on(e.turn_finished,(async()=>{await this.updateProcessingState(`turn_finished`);let e=async()=>{await this.updateProcessingState(`processing_finished`);let e=this.getSession(),t=this.getSessionQueue();e&&!t.isEmpty()?await e.processQueue(t):await this.updateProcessingState(`idle`)};t?.onTurnFinished?await t.onTurnFinished(e):await e()}))}async processUserMessages(e){let[t]=e,n=await this.ensureSession(),r=this.getSessionQueue();return r.enqueue(t),t.adapterSessionId=this.adapterSessionId,(this.getProcessingState()===`idle`||this.getProcessingState()===`paused`)&&await this.updateProcessingState(`active`),await n.processQueue(r),new Set([t])}async initialize(e){this.getSession()||(this.captureSystemPrompt(e?.systemPrompt),await this.ensureSession())}async start(e,t){this.captureSystemPrompt(t?.systemPrompt);let n=await this.sendMessage(e,t);return{adapterSessionId:await this.getAdapterSessionId(),messageHandle:n,agentId:this.agentId}}async complete(){for(;this.getProcessingState()!==`idle`&&this.getProcessingState()!==`paused`;)await this.onceProcessingStateChanged();return this.lastResult}acceptsImmediate(){return this.getSession()?.getCurrentTurn()?.canAcceptImmediate()??!1}};function $e(e,t,n,r,i,a,o){let s=t=>async(n,r)=>{let i=t,a={...r,agentId:i.agentId,adapterId:i.adapterId,adapterName:i.adapterName,adapterSessionId:i.adapterSessionId,messageId:i.messageId};await e.emit(n,a)};return t.on(n,(async t=>{let n=r?t.payload[r]:t.payload;if(!n||typeof n!=`object`)return;let c=a[n[i]];if(!c)return;let l=await o(n),u=s(l);if(typeof c==`function`)await c(l,u);else{let{sessionId:t,...n}=l;await e.emit(c,n)}}))}var H=class{currentMessageId;currentTurnId;emitGlobal;constructor(e){this.emitGlobal=e.emitGlobal}getCurrentMessageId(){return this.currentMessageId}setCurrentTurnId(e){this.currentTurnId=e}clearCurrentTurnId(){this.currentTurnId=void 0}getCurrentTurnId(){return this.currentTurnId}acknowledge(e){let{messageId:t,message:n,mergedFrom:r}=e;this.currentMessageId=t,this.emitGlobal(g.user_message.acknowledged,{messageId:t,mergedFrom:r}),this.emitGlobal(g.turn.started,{messageId:t,content:n,mergedFrom:r})}complete(e,t){let{messageId:n}=e;this.currentMessageId===n&&(this.currentMessageId=void 0,this.currentTurnId=void 0),this.emitGlobal(g.turn.completed,{messageId:n,message:t.result?.message,outcome:t.outcome,error:t.error instanceof Error?t.error.message:typeof t.error==`string`?t.error:void 0}),this.emitGlobal(g.user_message.completed,{messageId:n,outcome:t.outcome,supersededBy:t.supersededBy,mergedInto:t.mergedInto})}track(e,t){e.waitForAcknowledgment().then(()=>{this.acknowledge(e)}),e.waitForCompletion().then(n=>{this.complete(e,n),t&&t(e.messageId,n)})}},U=class{pending=[];register(e,t,n){let r=n??crypto.randomUUID();return this.pending.push({correlationId:r,toolName:e,args:t,nativeId:n,registeredAt:Date.now()}),r}resolve(e){if(e.nativeId){let t=this.pending.findIndex(t=>t.nativeId===e.nativeId);if(t>=0){let[e]=this.pending.splice(t,1);return{correlationId:e.correlationId,strategy:`nativeId`,toolName:e.toolName,args:e.args}}}if(e.toolName){let t=this.pending.findIndex(t=>t.toolName===e.toolName);if(t>=0){let[e]=this.pending.splice(t,1);return{correlationId:e.correlationId,strategy:`toolName`,toolName:e.toolName,args:e.args}}}if(!e.nativeId&&!e.toolName&&this.pending.length>0){let[e]=this.pending.splice(0,1);return{correlationId:e.correlationId,strategy:`oldest`,toolName:e.toolName,args:e.args}}return{correlationId:null,strategy:`none`}}clear(){this.pending=[]}};function W(e){let t=e.globalBus.withFilter({agentId:e.agentId});return[t.on(g.sendMessage,e.onSendMessage),t.on(g.interrupt,e.onInterrupt),t.on(g.getCapabilities,t=>{t.setResult(e.getCapabilities())}),t.on(g.cwd.change,e.onCwdChange),t.on(g.model.change,e.onModelChange),t.on(g.mcp.servers.set,e.onMcpServersSet),t.on(g.credential.change,e.onCredentialChange)]}var G=class{sessionClosedEmitted=!1;agentStartedEmitted=!1;agentCompleteEmitted=!1;pendingErrorCategory;config;constructor(e){this.config=e}async emitStart(e){this.agentStartedEmitted=!0,this.agentCompleteEmitted=!1,this.pendingErrorCategory=void 0,await this.config.emitStarted(e)}resetTurnState(){this.agentCompleteEmitted=!1,this.pendingErrorCategory=void 0}async emitCompletion(e){if(this.agentCompleteEmitted)return;await this.config.onBeforeEmitCompletion(),this.agentCompleteEmitted=!0,this.config.clearToolCallTracker();let t=this.pendingErrorCategory;this.pendingErrorCategory=void 0,this.config.globalBus.requestOptional(C.updateStatus,{agentId:this.config.agentId,status:`idle`}),await this.config.emitComplete({...e,...t&&{errorCategory:t}})}emitError(e){this.config.clearToolCallTracker(),this.pendingErrorCategory=e.errorCategory}emitSessionClosed(e){this.sessionClosedEmitted||(this.sessionClosedEmitted=!0,this.config.emitSessionClosed({reason:e}).catch(e=>{console.warn(`[AIAgent] Failed to emit session.closed for agent ${this.config.agentId}:`,e)}))}},K=class{emitUsagePayload;emitContextWindowUpdatedPayload;emitToolUsePayload;emitToolOutputPayload;emitAdapterLogPayload;emitStepStartedPayload;emitStepFinishedPayload;toolCallTracker;getBlockIndex;incrementBlockIndex;getUsageModel;constructor(e){this.emitUsagePayload=e.emitUsage,this.emitContextWindowUpdatedPayload=e.emitContextWindowUpdated,this.emitToolUsePayload=e.emitToolUse,this.emitToolOutputPayload=e.emitToolOutput,this.emitAdapterLogPayload=e.emitAdapterLog,this.emitStepStartedPayload=e.emitStepStarted,this.emitStepFinishedPayload=e.emitStepFinished,this.toolCallTracker=e.toolCallTracker,this.getBlockIndex=e.getBlockIndex,this.incrementBlockIndex=e.incrementBlockIndex,this.getUsageModel=e.getUsageModel}async trackUsage(e){await this.emitUsagePayload({...e,model:this.getUsageModel()??`unknown`})}async emitContextWindowUpdate(e){let{currentTokens:t,maxTokens:n,cachedTokens:r}=e,i=n>0&&Number.isFinite(n)&&Number.isFinite(t),a=i?Math.min(100,t/n*100):0,o=i?a>=80?`critical`:a>=60?`warn`:`ok`:`critical`;await this.emitContextWindowUpdatedPayload({currentTokens:t,maxTokens:n,cachedTokens:r,percentage:a,level:o})}async emitToolUse(e,t,n){let r=this.toolCallTracker.register(e,t,n);return await this.emitToolUsePayload({toolName:e,args:t,toolCallId:r}),r}async emitToolOutput(e,t){let{correlationId:n,strategy:r,toolName:i,args:a}=this.toolCallTracker.resolve(t);if(!n){await this.emitAdapterLogPayload({level:`warn`,message:`Tool output arrived with no pending tool calls. Hints: ${JSON.stringify(t)}`,timestamp:Date.now()});let n=crypto.randomUUID();return await this.emitToolOutputPayload({output:e,toolCallId:n,toolName:t.toolName??i}),{toolCallId:n,toolName:t.toolName??i??`unknown`}}return r===`oldest`&&await this.emitAdapterLogPayload({level:`warn`,message:`Tool output correlation used fallback. Hints: ${JSON.stringify(t)}`,timestamp:Date.now()}),await this.emitToolOutputPayload({output:e,toolCallId:n,toolName:i,args:a}),{toolCallId:n,toolName:i??`unknown`,args:a}}async emitStepStarted(e,t,n){await this.emitStepStartedPayload({stepType:e,blockIndex:this.getBlockIndex(),blockData:t,content:n})}async emitStepFinished(e,t){await this.emitStepFinishedPayload({stepType:e,blockIndex:this.getBlockIndex(),content:t}),this.incrementBlockIndex()}},q=class{config;constructor(e){this.config=e}async enrichPayload(e,t,n){let r=t??this.config.getCurrentMessageId(),i=this.config.getCurrentTurnId(),a=e,o=n?.includeEventMetadata??!0,s=o?this.config.getEventMetadataDefaults():{},c=this.config.getConnectorAdapterSessionId()??this.config.getLastKnownAdapterSessionId()??await this.config.getAdapterSessionId(),l=o?a.clientId??s.clientId:void 0,u=o?a.providerConfigId??s.providerConfigId:void 0,d=o?a.occurredAt??s.occurredAt:void 0;this.config.setLastKnownAdapterSessionId(c);let f=this.config.getAgentContextBase();return{...e,agentId:f.agentId,adapterId:f.adapterId,adapterName:f.adapterName,adapterSessionId:c,...r!==void 0&&{messageId:r},...i!==void 0&&{turnId:i},...f.sessionId!==void 0&&{sessionId:f.sessionId},...l!==void 0&&{clientId:l},...u!==void 0&&{providerConfigId:u},...d!==void 0&&{occurredAt:d}}}async emitGlobal(e,t,n){let r=await this.enrichPayload(t,t.messageId,n);await this.config.globalBus.emit(e,r)}},J=class{agentId;adapterId;sessionId;globalBus;getConnector;shouldUseNativeResume;onMessageHandle;onBeforeDispatch;ephemeral;constructor(e){this.agentId=e.agentId,this.adapterId=e.adapterId,this.sessionId=e.sessionId,this.globalBus=e.globalBus,this.getConnector=e.getConnector,this.shouldUseNativeResume=e.shouldUseNativeResume,this.onMessageHandle=e.onMessageHandle,this.onBeforeDispatch=e.onBeforeDispatch,this.ephemeral=e.ephemeral??!1}async executeSendMessage(e){await this.onBeforeDispatch?.();let t=this.getConnector(),n=e.sessionContext?b.parse(e.sessionContext):void 0,r=await this.resolvePreUserMessageTurn({message:e.message,sessionContext:n,cwd:t.cwd,messageId:e.messageId}),i=this.shouldUseNativeResume(r.sessionContext),a=O(r.message),o=await t.sendMessage(a,{deliveryMode:e.deliveryMode,messageId:e.messageId,messageHistory:i?void 0:r.sessionContext?.messageHistory,turnContext:r.sessionContext?.turnContext,...e.responseSchema!==void 0&&{responseSchema:e.responseSchema}});return this.firePostUserMessageHooks(o.messageId),await this.onMessageHandle(o),{messageId:o.messageId}}async executeStart(e,t,n,r){await this.onBeforeDispatch?.();let i=this.getConnector(),a=t?.sessionContext?b.parse(t.sessionContext):void 0,o=await this.resolvePreUserMessageTurn({message:e,sessionContext:a,cwd:i.cwd}),s=this.shouldUseNativeResume(o.sessionContext),c=O(o.message),l={systemPrompt:n,messageHistory:s?void 0:o.sessionContext?.messageHistory,turnContext:o.sessionContext?.turnContext,...r!==void 0&&{responseSchema:r}},u=await i.start(c,l);return this.firePostUserMessageHooks(u.messageHandle.messageId),await this.onMessageHandle(u.messageHandle),u}async resolvePreUserMessageTurn(e){return this.ephemeral?{message:e.message,sessionContext:e.sessionContext}:ie({agentId:this.agentId,adapterId:this.adapterId,message:e.message,sessionId:this.sessionId,cwd:e.cwd,sessionContext:e.sessionContext,messageId:e.messageId},this.globalBus)}firePostUserMessageHooks(e){re({agentId:this.agentId,adapterId:this.adapterId,sessionId:this.sessionId,messageId:e},this.globalBus).catch(e=>{console.error(`[AIAgent] PostUserMessage hook error:`,e)})}},et=class{queuedSequences=new Map;appliedSequences=new Map;barrier=Promise.resolve();queue(e,t){if(!Number.isSafeInteger(t)||t<0)return!1;let n=this.appliedSequences.get(e);if(n!==void 0&&t<=n)return!1;let r=this.queuedSequences.get(e);return r!==void 0&&t<=r?!1:(this.queuedSequences.set(e,t),!0)}isLatest(e,t){return this.queuedSequences.get(e)===t}markApplied(e,t){let n=this.appliedSequences.get(e);(n===void 0||t>n)&&this.appliedSequences.set(e,t),this.queuedSequences.get(e)===t&&this.queuedSequences.delete(e)}release(e,t){if(this.queuedSequences.get(e)!==t)return;let n=this.appliedSequences.get(e);(n===void 0||t>n)&&this.queuedSequences.delete(e)}clear(e){this.queuedSequences.delete(e),this.appliedSequences.delete(e)}async runExclusive(e){let t=this.barrier,n;this.barrier=new Promise(e=>{n=e}),await t;try{return await e()}finally{n?.()}}};async function tt(e){let{bus:t,agentId:n,currentModel:r,nextModel:i,skipWarning:a}=e;if(a)return{proceed:!0,requestEditHistory:!1};let o=await t.requestOptional(g.validateModelChange,{agentId:n,currentModel:r,nextModel:i});return o.handled?{proceed:o.data.proceed,requestEditHistory:o.data.requestEditHistory??!1}:{proceed:!0,requestEditHistory:!1}}var nt=class{getConnector;swapConnector;setMcpSessionContext;stagedMcpServersSet;constructor(e){this.getConnector=e.getConnector,this.swapConnector=e.swapConnector,this.setMcpSessionContext=e.setMcpSessionContext}async applyStagedMutation(){let e=this.stagedMcpServersSet;if(e===void 0)return;this.stagedMcpServersSet=void 0;let t=await this.handleMcpServersSet(e);if(!t.success)throw Error(`Failed to apply staged MCP server replacement: ${t.reason??`unknown error`}`)}async handleMcpServersSet(e){if(this.getConnector().getProcessingState()!==`idle`)return e.turnActiveBehavior===`stageForNextTurn`?(this.stagedMcpServersSet={...e,turnActiveBehavior:`reject`},{success:!0,swapped:!1,staged:!0}):{success:!1,reason:`turn_active`};try{return await this.swapConnector({mcpSessionContext:e.mcpSessionContext}),this.setMcpSessionContext(e.mcpSessionContext),{success:!0,swapped:!0}}catch(e){return{success:!1,reason:`mcp_servers_set_failed: ${e.message}`}}}},Y=class{agentId;sessionId;globalBus;getConnector;swapConnector;emitCwdChanged;emitModelChanged;getProviderContext;setProviderContext;setReasoningEffort;setMcpSessionContext;resolveSupportedReasoningLevels;mcpServersMutationManager;credentialChangeSequencer=new et;stagedModelChange;constructor(e){this.agentId=e.agentId,this.sessionId=e.sessionId,this.globalBus=e.globalBus,this.getConnector=e.getConnector,this.swapConnector=e.swapConnector,this.emitCwdChanged=e.emitCwdChanged,this.emitModelChanged=e.emitModelChanged,this.getProviderContext=e.getProviderContext,this.setProviderContext=e.setProviderContext,this.setReasoningEffort=e.setReasoningEffort,this.setMcpSessionContext=e.setMcpSessionContext,this.resolveSupportedReasoningLevels=e.resolveSupportedReasoningLevels,this.mcpServersMutationManager=new nt({getConnector:this.getConnector,swapConnector:this.swapConnector,setMcpSessionContext:this.setMcpSessionContext})}async handleCwdChange(e){let t=this.getConnector(),{newCwd:n}=e;if(t.cwd===n)return{success:!0};if(t.getProcessingState()!==`idle`)return{success:!1,reason:`turn_active`};try{let e=t.cwd;return await t.changeCwdInPlace(n).catch(()=>!1)?t.cwd=n:await this.swapConnector({cwd:n}),await this.persistRuntimeMutation({cwd:n}),await this.emitCwdChanged({previousCwd:e,newCwd:n}),{success:!0,previousCwd:e}}catch(e){return{success:!1,reason:`cwd_change_failed: ${e.message}`}}}async applyStagedMutations(){if(this.getConnector().getProcessingState()!==`idle`)return;let e=this.stagedModelChange;if(e!==void 0){this.stagedModelChange=void 0;let t=await this.handleModelChange(e);if(!t.success)throw Error(`Failed to apply staged model change: ${t.reason??`unknown error`}`)}await this.mcpServersMutationManager.applyStagedMutation()}async handleMcpServersSet(e){return this.mcpServersMutationManager.handleMcpServersSet(e)}async handleModelChange(e){let t=this.getConnector(),{newModel:n,reasoningEffort:r,skipWarning:i}=e,a=e.providerContext,o=t.model,s=t.currentReasoningEffort,c=this.getProviderContext(),l=this.hasProviderContextChanged(c,a);if(!n&&!r&&!l)return{success:!0,swapped:!1};if(t.getProcessingState()!==`idle`)return e.turnActiveBehavior===`stageForNextTurn`?(this.stagedModelChange={...e,turnActiveBehavior:`reject`},{success:!0,swapped:!1,staged:!0,...n!==void 0&&{model:n}}):{success:!1,reason:`turn_active`};if(!n&&!l)return this.handleReasoningOnlyChange(t,o,s,r);let u=n??o;return o===u&&!l?r===void 0?{success:!0,swapped:!1}:this.handleReasoningOnlyChange(t,o,s,r):this.handleModelSwap({connector:t,currentModel:o,newModel:u,reasoningEffort:r,previousReasoningEffort:s,providerContext:a,isProviderChange:l,skipWarning:i})}async handleReasoningOnlyChange(e,t,n,r){if(e.getProcessingState()!==`idle`)return{success:!1,reason:`turn_active`};try{let i=await e.changeReasoningInPlace(r).catch(()=>!1);i||await this.swapConnector({model:e.model});let a=this.getConnector(),o=this.resolveReasoningEffort(r,n,a.supportedReasoningLevels);return a.currentReasoningEffort=o,this.setReasoningEffort(o),await this.emitModelChanged({previousModel:t,newModel:t,previousReasoningEffort:n,newReasoningEffort:o}),{success:!0,swapped:!i,model:t,appliedReasoningEffort:o,supportedReasoningLevels:a.supportedReasoningLevels}}catch(e){return{success:!1,reason:`reasoning_change_failed: ${e.message}`}}}async handleModelSwap(e){let{connector:t,currentModel:n,newModel:r,reasoningEffort:i,previousReasoningEffort:a,providerContext:o,isProviderChange:s,skipWarning:c}=e;try{let e=!s&&await t.changeModelInPlace(r).catch(()=>!1);if(e)t.model=r,t.supportedReasoningLevels=this.resolveSupportedReasoningLevels(r);else{let e=await this.confirmConnectorSwap(n,r,c);if(!e.proceed)return e.result;await this.swapConnector({model:r,...o&&{providerContext:o}}),o&&this.setProviderContext(o);let t=this.getConnector();t.supportedReasoningLevels=this.resolveSupportedReasoningLevels(r),e.requestEditHistory&&this.sessionId&&await this.globalBus.emit(x.connectorSwap.editRequested,{sessionId:this.sessionId,agentId:this.agentId,previousModel:n,newModel:r})}let l=this.getConnector(),u=l.supportedReasoningLevels,d=this.resolveReasoningEffort(i,a,u);l.currentReasoningEffort=d,this.setReasoningEffort(d),d!==void 0&&await l.changeReasoningInPlace(d).catch(()=>{});let f=n!==r||d!==a;return(n!==r||s)&&await this.persistRuntimeMutation({...n!==r&&{model:r},...s&&o&&{providerConfigId:o.providerConfigId}}),f&&await this.emitModelChanged({previousModel:n,newModel:r,previousReasoningEffort:a,newReasoningEffort:d}),{success:!0,swapped:!e,model:r,appliedReasoningEffort:d,supportedReasoningLevels:u}}catch(e){return{success:!1,reason:`model_change_failed: ${e.message}`}}}resolveReasoningEffort(e,t,n){if(!n||Object.keys(n).length===0)return;let r=e=>e in n;return e!==void 0&&r(e)?e:t!==void 0&&r(t)?t:r(`medium`)?`medium`:Object.keys(n)[0]}async confirmConnectorSwap(e,t,n){if(e===t)return{proceed:!0,requestEditHistory:!1};let r=await tt({bus:this.globalBus,agentId:this.agentId,currentModel:e,nextModel:t,skipWarning:n});return r.proceed?{proceed:!0,requestEditHistory:r.requestEditHistory}:{proceed:!1,result:{success:!1,reason:`cancelled`}}}hasProviderContextChanged(e,t){return t===void 0?!1:e===void 0?!0:e.providerConfigId!==t.providerConfigId||e.definitionId!==t.definitionId||!this.haveEqualStringRecords(e.endpointOverrides,t.endpointOverrides)||!this.haveEqualStringRecords(e.credentialEnvVars,t.credentialEnvVars)||!this.haveEqualStringRecords(e.credentialRefs,t.credentialRefs)}haveEqualStringRecords(e,t){if(e===t)return!0;let n=e?Object.keys(e):[],r=t?Object.keys(t):[];return n.length===r.length?n.every(n=>e[n]===t[n]):!1}async handleCredentialChanged(e){let t=this.getProviderContext()?.providerConfigId;return t&&t!==e.providerConfigId?{success:!1,reason:`provider_mismatch`}:this.credentialChangeSequencer.queue(e.providerConfigId,e.changeSequence)?this.credentialChangeSequencer.runExclusive(async()=>{let t=this.getProviderContext()?.providerConfigId;if(t&&t!==e.providerConfigId)return this.credentialChangeSequencer.release(e.providerConfigId,e.changeSequence),{success:!1,reason:`provider_mismatch`};if(!this.credentialChangeSequencer.isLatest(e.providerConfigId,e.changeSequence))return{success:!1,reason:`stale_change`};let n=this.getConnector();if(n.getProcessingState()!==`idle`)return this.credentialChangeSequencer.release(e.providerConfigId,e.changeSequence),{success:!1,reason:`turn_active`};let r=e.credentialRefs;try{let t=await S(this.globalBus,e.providerConfigId);return t.credentialRefs=r,!this.credentialChangeSequencer.isLatest(e.providerConfigId,e.changeSequence)||(await ae(this.globalBus,t),!this.credentialChangeSequencer.isLatest(e.providerConfigId,e.changeSequence))?{success:!1,reason:`stale_change`}:n.getProcessingState()===`idle`?(await this.swapConnector({providerContext:t}),this.setProviderContext(t),this.credentialChangeSequencer.markApplied(e.providerConfigId,e.changeSequence),await this.persistRuntimeMutation({providerConfigId:t.providerConfigId}),{success:!0,swapped:!0}):(this.credentialChangeSequencer.release(e.providerConfigId,e.changeSequence),{success:!1,reason:`turn_active`})}catch(t){return this.credentialChangeSequencer.release(e.providerConfigId,e.changeSequence),{success:!1,reason:`credential_swap_failed: ${t instanceof Error?t.message:String(t)}`}}}):{success:!1,reason:`stale_change`}}async persistRuntimeMutation(e){await this.globalBus.requestOptional(C.updateRuntime,{agentId:this.agentId,cwd:e.cwd,model:e.model,providerConfigId:e.providerConfigId})}},X=class{connectorWiringCleanups=[];config;constructor(e){this.config=e}addConnectorWiringCleanup(e){this.connectorWiringCleanups.push(e)}clearConnectorWiring(){for(let e of this.connectorWiringCleanups)try{e()}catch(e){console.warn(`[AIAgent] Connector wiring cleanup failed for agent ${this.config.agentId}:`,e)}this.connectorWiringCleanups=[]}async wireAllConnectorEvents(e){let t=e.onProcessingStateChanged(e=>{e===`idle`&&this.config.emitIdle().catch(e=>{console.warn(`[AIAgent] Failed to emit idle for agent ${this.config.agentId}:`,e)})});this.addConnectorWiringCleanup(t),await this.config.wireEvents(e)}async swapConnector(e){let t=this.config.getConnector();if(t.getProcessingState()!==`idle`)throw Error(`Cannot swap connector while processing (state: ${t.getProcessingState()})`);let n=this.config.buildConfigInput({cwd:e?.cwd??t.cwd,model:e?.model??t.model,...e?.providerContext&&{providerContext:e.providerContext},...e?.mcpSessionContext&&{mcpSessionContext:e.mcpSessionContext},adapterSessionId:crypto.randomUUID()}),r=await this.config.configFactory(n),i=await this.config.connectorFactory({...r,onMessageSent:this.config.createOnMessageSent()}),a=this.connectorWiringCleanups;this.connectorWiringCleanups=[];try{await this.wireAllConnectorEvents(i);let e=this.config.getRuntimeResponseSchema();await i.initialize({systemPrompt:this.config.getRuntimeSystemPrompt(),...e!==void 0&&{responseSchema:e}})}catch(e){try{await i.close()}catch(e){console.warn(`[AIAgent] Failed to close newly-created connector for agent ${this.config.agentId}:`,e)}throw this.connectorWiringCleanups=a,e}this.config.setLastKnownAdapterSessionId(i.adapterSessionId);for(let e of a)try{e()}catch(e){console.warn(`[AIAgent] Previous connector cleanup failed during swap for agent ${this.config.agentId}:`,e)}let o=t;this.config.setConnector(i);try{await o.close()}catch(e){console.warn(`[AIAgent] Failed to close previous connector for agent ${this.config.agentId}:`,e)}}};function rt(e){return new q({globalBus:e.globalBus,getAgentContextBase:e.getAgentContextBase,getCurrentMessageId:()=>e.lifecycleTracker.getCurrentMessageId(),getCurrentTurnId:()=>e.lifecycleTracker.getCurrentTurnId(),getConnectorAdapterSessionId:e.getConnectorAdapterSessionId,getLastKnownAdapterSessionId:e.getLastKnownAdapterSessionId,setLastKnownAdapterSessionId:e.setLastKnownAdapterSessionId,getAdapterSessionId:e.getAdapterSessionId,getEventMetadataDefaults:e.getEventMetadataDefaults})}function it(e){return new K({emitUsage:async t=>{await e.emitGlobal(g.usage,t)},emitContextWindowUpdated:async t=>{await e.emitGlobal(g.contextWindow.updated,t)},emitToolUse:async t=>{await e.emitGlobal(g.tool.use,t)},emitToolOutput:async t=>{await e.emitGlobal(g.tool.output,t)},emitAdapterLog:async t=>{await e.emitGlobal(h.log,t,{includeEventMetadata:!1})},emitStepStarted:async t=>{await e.emitGlobal(g.step.started,t)},emitStepFinished:async t=>{await e.emitGlobal(g.step.finished,t)},toolCallTracker:e.toolCallTracker,getBlockIndex:e.getBlockIndex,incrementBlockIndex:e.incrementBlockIndex,getUsageModel:e.getUsageModel})}function at(e){return new J(e)}function ot(e){return new Y({agentId:e.agentId,sessionId:e.sessionId,globalBus:e.globalBus,getConnector:e.getConnector,swapConnector:e.swapConnector,emitCwdChanged:async t=>{await e.emitGlobal(g.cwd.changed,t)},emitModelChanged:async t=>{await e.emitGlobal(g.model.changed,t)},getProviderContext:e.getProviderContext,setProviderContext:e.setProviderContext,setReasoningEffort:e.setReasoningEffort,setMcpSessionContext:e.setMcpSessionContext,resolveSupportedReasoningLevels:e.resolveSupportedReasoningLevels})}function st(e){return new X({agentId:e.agentId,buildConfigInput:e.buildConfigInput,configFactory:e.configFactory,connectorFactory:e.connectorFactory,createOnMessageSent:e.createOnMessageSent,wireEvents:e.wireEvents,emitIdle:async()=>{await e.emitGlobal(g.idle,{})},getConnector:e.getConnector,setConnector:e.setConnector,getRuntimeSystemPrompt:e.getRuntimeSystemPrompt,getRuntimeResponseSchema:e.getRuntimeResponseSchema,setLastKnownAdapterSessionId:e.setLastKnownAdapterSessionId})}function ct(e){if(e instanceof u||e instanceof o||e instanceof c||e instanceof l)return e.code}var lt=class{connector;confirmedModel;initialModel;lastKnownAdapterSessionId;busHandlerCleanups=[];initialized=!1;runtimeSystemPrompt;runtimeResponseSchema;lifecycleTracker;toolCallTracker=new U;eventBridge;turnExecutor;runtimeMutationManager;connectorLifecycleManager;payloadEmitter;lifecycleEmitter;currentBlockIndex=0;config;availableModels;constructor(e){this.config={...e,globalBus:e.globalBus??f},this.availableModels=e.availableModels,this.lifecycleTracker=new H({emitGlobal:this.emitGlobal.bind(this)}),this.payloadEmitter=rt({globalBus:this.globalBus,getAgentContextBase:()=>({agentId:this.agentId,adapterId:this.adapterId,adapterName:this.adapterName,sessionId:this.sessionId}),lifecycleTracker:this.lifecycleTracker,getConnectorAdapterSessionId:()=>this.connector?.adapterSessionId,getLastKnownAdapterSessionId:()=>this.lastKnownAdapterSessionId,setLastKnownAdapterSessionId:e=>{this.lastKnownAdapterSessionId=e},getAdapterSessionId:this.getAdapterSessionId.bind(this),getEventMetadataDefaults:this.getEventMetadataDefaults.bind(this)}),this.eventBridge=it({emitGlobal:this.payloadEmitter.emitGlobal.bind(this.payloadEmitter),toolCallTracker:this.toolCallTracker,getBlockIndex:this.getBlockIndex.bind(this),incrementBlockIndex:this.incrementBlockIndex.bind(this),getUsageModel:()=>this.confirmedModel??this.initialModel}),this.turnExecutor=at({agentId:this.agentId,adapterId:this.adapterId,sessionId:this.sessionId,globalBus:this.globalBus,getConnector:()=>this.connector,shouldUseNativeResume:this.shouldUseNativeResume.bind(this),onMessageHandle:this.onMessageHandle.bind(this),onBeforeDispatch:()=>this.runtimeMutationManager.applyStagedMutations(),ephemeral:this.config.ephemeral}),this.runtimeMutationManager=ot({agentId:this.agentId,sessionId:this.sessionId,globalBus:this.globalBus,getConnector:()=>this.connector,swapConnector:this.swapConnector.bind(this),emitGlobal:this.payloadEmitter.emitGlobal.bind(this.payloadEmitter),getProviderContext:()=>this.config.providerContext,setProviderContext:e=>void(this.config.providerContext=e),setReasoningEffort:e=>void(this.config.reasoningEffort=e),setMcpSessionContext:e=>this.config.mcpSessionContext=e,resolveSupportedReasoningLevels:e=>this.getSupportedReasoningLevels(e)}),this.connectorLifecycleManager=st({agentId:this.agentId,buildConfigInput:this.buildConfigInput.bind(this),configFactory:this.config.configFactory,connectorFactory:this.config.connectorFactory,createOnMessageSent:this.createOnMessageSent.bind(this),wireEvents:this.wireEvents.bind(this),emitGlobal:this.payloadEmitter.emitGlobal.bind(this.payloadEmitter),getConnector:()=>this.connector,setConnector:e=>{this.connector=e},getRuntimeSystemPrompt:()=>this.runtimeSystemPrompt,getRuntimeResponseSchema:()=>this.runtimeResponseSchema,setLastKnownAdapterSessionId:e=>{this.lastKnownAdapterSessionId=e}}),this.lifecycleEmitter=this.createLifecycleEmitter()}getEventMetadataDefaults(){return{clientId:this.config.clientId,providerConfigId:this.connector?.providerConfigId??this.config.providerContext?.providerConfigId,occurredAt:Date.now()}}createLifecycleEmitter(){return new G({agentId:this.agentId,globalBus:this.globalBus,emitStarted:async e=>{await this.payloadEmitter.emitGlobal(g.started,e)},emitComplete:async e=>{await this.payloadEmitter.emitGlobal(g.complete,e)},emitSessionClosed:async e=>{await this.payloadEmitter.emitGlobal(g.session.closed,e)},onBeforeEmitCompletion:this.onBeforeEmitCompletion.bind(this),clearToolCallTracker:()=>this.toolCallTracker.clear()})}get agentId(){return this.config.agentId}get adapterId(){return this.config.adapterId}get adapterName(){return this.config.adapterName}get capabilities(){return this.config.capabilities}get nativeTools(){return this.config.nativeTools}get sessionId(){return this.config.sessionId}get adapterSessionId(){return this.config.adapterSessionId}get globalBus(){return this.config.globalBus}async init(){if(this.initialized)throw Error(`AIAgent ${this.agentId} already initialized. init() can only be called once.`);let e=this.buildConfigInput(),t=await this.config.configFactory(e);this.connector=await this.config.connectorFactory({...t,onMessageSent:this.createOnMessageSent()}),this.busHandlerCleanups.push(...W({globalBus:this.globalBus,agentId:this.agentId,onSendMessage:async e=>{await this.sendMessage(e)},onInterrupt:async e=>{await this.handleInterrupt(e)},getCapabilities:()=>({capabilities:this.capabilities,nativeTools:this.nativeTools,model:this.connector?.model??this.confirmedModel??this.initialModel}),onCwdChange:async e=>{await this.handleCwdChange(e)},onModelChange:async e=>{await this.handleModelChange(e)},onMcpServersSet:async e=>{await this.handleMcpServersSet(e)},onCredentialChange:async e=>{await this.handleCredentialChanged(e)}})),this.sessionId&&this.busHandlerCleanups.push(this.globalBus.on(x.turn.started,e=>{e.payload.agentIds.includes(this.agentId)&&this.connector.setCanonicalTurnNumber(e.payload.turnNumber)},{filter:{sessionId:this.sessionId}})),this.busHandlerCleanups.push(this.globalBus.on(y.tools.updated,()=>{this.connector.markToolRefreshPending()}),this.globalBus.on(y.tools.enabled,()=>{this.connector.markToolRefreshPending()})),await this.connectorLifecycleManager.wireAllConnectorEvents(this.connector),this.initialized=!0}async emitStart(e){this.currentBlockIndex=0,await this.lifecycleEmitter.emitStart({model:this.connector.model,cwd:this.connector.cwd,...e})}async emitCompletion(e){await this.lifecycleEmitter.emitCompletion(e)}emitError(e){this.lifecycleEmitter.emitError(e)}emitSessionClosed(e){this.lifecycleEmitter.emitSessionClosed(e)}async enrichPayload(e){return this.payloadEmitter.enrichPayload(e)}async emitGlobal(e,t){await this.payloadEmitter.emitGlobal(e,t)}async trackUsage(e){await this.eventBridge.trackUsage(e)}getContextWindowSize(e){let t=e??this.confirmedModel??this.initialModel;if(!(!t||!this.availableModels))return this.availableModels.find(e=>e.name===t)?.contextWindowSize}async emitContextWindowUpdate(e){await this.eventBridge.emitContextWindowUpdate(e)}async emitToolUse(e,t,n){return this.eventBridge.emitToolUse(e,t,n)}async emitToolOutput(e,t){return this.eventBridge.emitToolOutput(e,t)}async emitStepStarted(e,t,n){await this.eventBridge.emitStepStarted(e,t,n)}async emitStepFinished(e,t){await this.eventBridge.emitStepFinished(e,t)}getBlockIndex(){return this.currentBlockIndex}incrementBlockIndex(){this.currentBlockIndex++}async sendMessage(e){this.globalBus.requestOptional(C.updateStatus,{agentId:this.agentId,status:`active`}),this.lifecycleTracker.setCurrentTurnId(e.payload.turnId);try{let t=await this.turnExecutor.executeSendMessage(e.payload);e.setResult(t)}catch(e){throw this.lifecycleTracker.clearCurrentTurnId(),e}}async handleInterrupt(e){try{await this.ensureConnector().interrupt(),e.setResult({success:!0})}catch(t){e.setResult({success:!1,reason:t instanceof Error?t.message:String(t)})}}addConnectorWiringCleanup(e){this.connectorLifecycleManager.addConnectorWiringCleanup(e)}addBusHandlerCleanup(e){this.busHandlerCleanups.push(e)}async swapConnector(e){await this.connectorLifecycleManager.swapConnector(e),e?.providerContext!==void 0&&(this.config.providerContext=e.providerContext),e?.mcpSessionContext!==void 0&&(this.config.mcpSessionContext=e.mcpSessionContext)}getSupportedReasoningLevels(e){if(e)return this.availableModels?.find(t=>t.name===e)?.supportedReasoningLevels}buildConfigInput(e){let t=this.config,n=this.connector?.currentReasoningEffort??t.reasoningEffort,r=e?.providerContext??t.providerContext;r===void 0&&console.warn(`[AIAgent] No providerContext available for agent "${t.agentId}" — falling back to sentinel. This indicates the orchestrator did not populate a provider context before calling startAgent.`);let i=r??L();return{bus:t.adapterBus,agentId:t.agentId,adapterId:t.adapterId,adapterName:t.adapterName,providerContext:i,model:e?.model??t.model,cwd:e?.cwd??t.cwd,env:t.env,adapterSessionId:e?.adapterSessionId??t.adapterSessionId,sessionId:t.sessionId,resumeAdapterSessionId:t.resumeAdapterSessionId,reasoningEffort:n,supportedReasoningLevels:this.getSupportedReasoningLevels(e?.model??t.model),allowedTools:t.allowedTools,disallowedTools:t.disallowedTools,allowedDirectories:t.allowedDirectories,mcpSessionContext:e?.mcpSessionContext??t.mcpSessionContext,toolLedger:t.toolLedger,clientId:t.clientId,clientProfileName:t.clientProfileName,errorHandler:(e,t)=>{let n=ct(e);this.emitError({error:e.message,...n&&{errorCategory:n}})}}}createOnMessageSent(){return e=>{this.emitGlobal(g.user_message.sent,{messageId:e.messageId,content:e.message,deliveryMode:e.deliveryMode})}}async handleCwdChange(e){let t=await this.runtimeMutationManager.handleCwdChange(e.payload);e.setResult(t)}async handleModelChange(e){let t=await this.runtimeMutationManager.handleModelChange(e.payload);e.setResult(t)}async handleMcpServersSet(e){let t=await this.runtimeMutationManager.handleMcpServersSet(e.payload);e.setResult(t)}async handleCredentialChanged(e){let t=await this.runtimeMutationManager.handleCredentialChanged(e.payload);e.setResult(t)}subscribeConnector(e,t,n,r){let i=e.on(t,n,r);this.connectorLifecycleManager.addConnectorWiringCleanup(i)}async close(e={}){(e.emitSessionClosed??!0)&&this.emitSessionClosed(`closed`);for(let e of this.busHandlerCleanups)try{e()}catch(e){console.warn(`[AIAgent] Bus handler cleanup failed:`,e)}this.busHandlerCleanups=[],this.connectorLifecycleManager.clearConnectorWiring(),await this.connector.close()}ensureConnector(){if(!this.connector)throw Error(`AIAgent ${this.agentId} connector not initialized. Call init() or start() first.`);return this.connector}shouldUseNativeResume(e){return this.supportsNativeResume()?e?!(e.isFirstTurn||e.hasCompression||e.hasNewTransforms||e.hasConnectorSwap):!0:!1}supportsNativeResume(){return!1}async start(e,t){return this.initialized||await this.init(),t?.systemPrompt!==void 0&&this.runtimeSystemPrompt===void 0&&(this.runtimeSystemPrompt=t.systemPrompt),t?.responseSchema!==void 0&&this.runtimeResponseSchema===void 0&&(this.runtimeResponseSchema=t.responseSchema),this.turnExecutor.executeStart(e,t,this.runtimeSystemPrompt,this.runtimeResponseSchema)}async initialize(e){e?.systemPrompt!==void 0&&this.runtimeSystemPrompt===void 0&&(this.runtimeSystemPrompt=e.systemPrompt),e?.responseSchema!==void 0&&this.runtimeResponseSchema===void 0&&(this.runtimeResponseSchema=e.responseSchema),this.initialized||await this.init(),await this.ensureConnector().initialize(e)}async onBeforeEmitCompletion(){}async onMessageHandle(e){this.lifecycleEmitter.resetTurnState(),this.lifecycleTracker.track(e,(e,t)=>{let n=t.error instanceof Error?t.error.message:t.error;this.emitCompletion({message:t.result?.message,messageId:e,outcome:t.outcome,...n&&{error:n}})})}abort(){this.emitSessionClosed(`aborted`),this.ensureConnector().abort()}async getAdapterSessionId(){return this.ensureConnector().getAdapterSessionId()}async complete(){return this.ensureConnector().complete()}createConnectorEventMapping(e,t,n,r){let i=$e(this.globalBus,this.connector,e,r,t,n,this.enrichPayload.bind(this));return this.connectorLifecycleManager.addConnectorWiringCleanup(i),i}};function ut(e){let t=e.indexOf(`__`);return t===-1?{serverName:``,originalName:e}:{serverName:e.slice(0,t),originalName:e.slice(t+2)}}function dt(e){let{serverName:t,originalName:n}=ut(e);return{fullName:e,originalName:n,serverName:t,injected:!1,lastInjectedAtTurn:void 0,discovered:!1,firstDiscoveredAtTurn:void 0,callCount:0,lastCalledAtTurn:void 0}}var Z=class{entries=new Map;upsert(e){let t=this.entries.get(e);return t||(t=dt(e),this.entries.set(e,t)),t}recordInjection(e,t){let n=new Set(e.map(e=>e.name));for(let n of e){let e=this.upsert(n.name);e.injected=!0,e.lastInjectedAtTurn=t}for(let[e,t]of this.entries)t.injected&&!n.has(e)&&(t.injected=!1)}recordDiscovery(e,t){let n=this.upsert(e);n.discovered=!0,n.firstDiscoveredAtTurn===void 0&&(n.firstDiscoveredAtTurn=t)}recordCall(e,t){let n=this.upsert(e);n.discovered=!0,n.firstDiscoveredAtTurn===void 0&&(n.firstDiscoveredAtTurn=t),n.callCount+=1,n.lastCalledAtTurn=t}getInjectedTools(){return Array.from(this.entries.values()).filter(e=>e.injected)}getCallCount(e){return this.entries.get(e)?.callCount??0}getEntry(e){return this.entries.get(e)}getAllEntries(){return Array.from(this.entries.values())}async suggestInjectionSet(e,t){return e.directTools.map(e=>({name:e.fullName,description:e.description??``,toolsetName:e.serverName,inputSchema:e.inputSchema}))}};function ft(e){return typeof e.tool==`string`?e.tool:void 0}function pt(e){return e===ee}var mt=class{entries=new Map;globalBus;adapterName;constructor(e){this.globalBus=e.globalBus,this.adapterName=e.adapterName}set(e,t){this.entries.set(e,t)}get(e){return this.entries.get(e)}values(){return this.entries.values()}clear(){this.entries.clear()}async evict(e,t={}){let n=this.entries.get(e);this.entries.delete(e);let r;if(n)try{await n.agent.close({emitSessionClosed:t.emitSessionClosed})}catch(e){r=e}try{await this.globalBus.requestOptional(C.updateStatus,{agentId:e,status:`dead`})}catch(t){if(r===void 0)throw t;console.warn(`[AgentRegistry:${this.adapterName}] Failed to mark agent ${e} as dead:`,t)}if(r!==void 0)throw r}async evictSilently(e){let t=this.entries.get(e);if(this.entries.delete(e),t)try{await t.agent.close({emitSessionClosed:!1})}catch(t){console.warn(`[AgentRegistry:${this.adapterName}] Agent ${e} close error during silent eviction:`,t)}}dispose(e){let t=this.entries.get(e);return t?(t.agent.close().catch(t=>{console.warn(`[AgentRegistry:${this.adapterName}] Agent ${e} close error during dispose:`,t)}),this.entries.delete(e),this.globalBus.requestOptional(C.updateStatus,{agentId:e,status:`disposed`}).catch(t=>{console.warn(`[AgentRegistry:${this.adapterName}] Failed to mark agent ${e} as disposed:`,t)}),!0):!1}accumulateUsage(e,t,n){let r=this.entries.get(e);if(r)return r.usage.totalInputTokens+=t.inputTokens,r.usage.totalOutputTokens+=t.outputTokens,r.usage.totalCalls++,n&&n!==r.adapterSessionId&&(r.adapterSessionId=n),r}agentIdsBySession(e){return[...this.entries.entries()].filter(([,t])=>t.sessionId===e).map(([e])=>e)}};async function ht(e,t,n){let r={totalInputTokens:0,totalOutputTokens:0,totalCalls:0},i=await e.requestOptional(te.getBySession,{sessionId:t,status:`completed`});if(!i.handled)return r;for(let e of i.data.turns){let t=e.usage?.byAgent?.[n];t&&(r.totalInputTokens+=t.inputTokens,r.totalOutputTokens+=t.outputTokens)}return r}var gt=class{inFlight=new Map;globalBus;registry;createAgentFn;constructor(e){this.globalBus=e.globalBus,this.registry=e.registry,this.createAgentFn=e.createAgent}handleRehydrateAgent=async e=>{let{agentId:t,cwd:n,model:r}=e.payload,i=this.inFlight.get(t);if(i){await i,e.setResult({});return}let a=(async()=>{let e=this.registry.get(t);if(e){await e.agent.swapConnector({cwd:n,model:r});let i=await e.agent.getAdapterSessionId();i&&(e.adapterSessionId=i),(n!==void 0||r!==void 0)&&await this.globalBus.requestOptional(C.updateRuntime,{agentId:t,cwd:n,model:r}),await this.globalBus.requestOptional(C.updateStatus,{agentId:t,status:`idle`});return}let i=await this.globalBus.requestOptional(C.get,{agentId:t});if(!i.handled||!i.data.agent)throw Error(`Agent ${t} not found in storage`);let a=i.data.agent;if(a.status===`disposed`)throw Error(`Agent ${t} is disposed and cannot be rehydrated`);let o=await this.resolveMcpSessionContext(a.sessionId,a.profileId),s=a.providerConfigId===void 0?void 0:await S(this.globalBus,a.providerConfigId).catch(()=>L()),c={model:r??a.model,cwd:n??a.cwd,...s!==void 0&&{providerContext:s},...o!==void 0&&{mcpSessionContext:o}},l=await this.createAgentFn(t,a.sessionId,c),u=await this.resolvePersistedSystemPrompt(a.sessionId,a.personaId,a.profileId);await l.initialize({...u!==void 0&&{systemPrompt:u}}),(n!==void 0||r!==void 0)&&await this.globalBus.requestOptional(C.updateRuntime,{agentId:t,cwd:n,model:r});let d=await l.getAdapterSessionId()||a.adapterSessionId;if(!d)throw Error(`Recovered agent ${t} has no adapterSessionId`);let f=await ht(this.globalBus,a.sessionId,t);this.registry.set(t,{agent:l,sessionId:a.sessionId,adapterSessionId:d,usage:f}),await this.globalBus.requestOptional(C.updateStatus,{agentId:t,status:`idle`})})().catch(e=>{let n=e instanceof Error?e.message:String(e);throw Error(`Failed to recover agent ${t}: ${n}`)});this.inFlight.set(t,a);try{await a}finally{this.inFlight.delete(t)}e.setResult({})};async resolveMcpSessionContext(e,t){let n=await this.globalBus.requestOptional(x.get,{sessionId:e});if(!n.handled||!n.data.session)return;let r=await this.globalBus.requestOptional(y.session.resolve,{sessionId:e,projectId:null,profileId:t??null});return r.handled?r.data:void 0}async resolvePersistedSystemPrompt(e,t,n){if(!(!t&&!n))try{let r=await this.globalBus.requestOptional(x.resolveSystemPrompt,{sessionId:e,personaId:t,profileId:n});return r.handled?r.data.systemPrompt:void 0}catch{return}}};async function _t(e,t){let{prompt:n,model:r,systemPrompt:i}=e.payload,a=e.payload.providerContext??L(),o=crypto.randomUUID(),s={bus:t.adapterBus,agentId:o,adapterId:t.adapterId,adapterName:t.adapterName,providerContext:a,...r!==void 0&&{model:r},...t.platformDefaults?.cwd!==void 0&&{cwd:t.platformDefaults.cwd},...t.platformDefaults?.env!==void 0&&{env:t.platformDefaults.env},errorHandler:e=>{console.warn(`[handleInfer:${t.adapterName}] Ephemeral connector error: ${e.message}`)}},c=await t.configFactory(s),l=await t.connectorFactory(c);try{await l.initialize({...i!==void 0&&{systemPrompt:i}});let t=O(n),r=(await(await l.start(t,{...i!==void 0&&{systemPrompt:i}})).messageHandle.waitForCompletion()).result?.message??``;e.setResult({text:r})}finally{try{await l.close()}catch(e){console.warn(`[handleInfer:${t.adapterName}] Connector cleanup error:`,e)}}}function vt(e){return{...e.platformCwd!==void 0&&{cwd:e.platformCwd},...e.platformEnv!==void 0&&{env:e.platformEnv},...e.model!==void 0&&{model:e.model},...e.cwd!==void 0&&{cwd:e.cwd},...e.env!==void 0&&{env:e.env},...e.allowedTools!==void 0&&{allowedTools:e.allowedTools},...e.disallowedTools!==void 0&&{disallowedTools:e.disallowedTools},...e.reasoningEffort!==void 0&&{reasoningEffort:e.reasoningEffort},...e.resumeAdapterSessionId!==void 0&&{resumeAdapterSessionId:e.resumeAdapterSessionId},...e.harnessId!==void 0&&{harnessId:e.harnessId},...e.clientId!==void 0&&{clientId:e.clientId},...e.clientProfileName!==void 0&&{clientProfileName:e.clientProfileName},...e.mcpSessionContext!==void 0&&{mcpSessionContext:e.mcpSessionContext},...e.toolLedger!==void 0&&{toolLedger:e.toolLedger},...e.ephemeral!==void 0&&{ephemeral:e.ephemeral}}}function yt(e,t,n){if(e.length===0)return;if(n&&n!==`unresolved`)return e.find(e=>e.definition.id===n)?.definition.availableModels;if(e.length===1)return e[0]?.definition.availableModels;if(!t)return;let r=e.filter(e=>(e.definition.availableModels??[]).some(e=>e.name===t));if(r.length===1)return r[0]?.definition.availableModels}async function bt(e,t,n,r,i){let{adapterId:a,name:o,clientId:s,getPlatformDefaults:c,globalBus:l}=i,u=r.role,d=Date.now(),f=c(),p=r.cwd??f?.cwd,m=r.clientId??s;try{await l.requestOptional(C.set,{agentId:e,agent:{agentId:e,adapterId:a,adapterName:o,sessionId:t,adapterSessionId:n,model:r.model,cwd:p,role:u,status:`idle`,createdAt:d,lastActivityAt:d,...m!==void 0&&{clientId:m}}})}catch(n){console.error(`[AIAdapter:${o}] Optional agent persistence failed:`,{agentId:e,adapterId:a,sessionId:t,error:n})}l.emit(x.agent.added,{sessionId:t,agentId:e,adapterId:a,adapterName:o,adapterSessionId:n,role:u,model:r.model,cwd:p}),l.emit(h.session.created,{adapterId:a,adapterName:o,adapterSessionId:n,sessionId:t,model:r.model??`unknown`})}async function Q(e,t,n,r){try{await e.evict(t)}catch(e){throw AggregateError([r,e],`[AIAdapter:${n}] startAgent persistence failed and live agent cleanup also failed.`,{cause:e})}}async function xt(e,t,n,r){try{if(t.initialMessage!==void 0){let r=O(t.initialMessage),i=await e.start(r,{systemPrompt:t.systemPrompt,sessionContext:n});return{adapterSessionId:i.adapterSessionId,messageId:String(i.messageHandle.messageId),messageHandle:i.messageHandle}}return await e.initialize({systemPrompt:t.systemPrompt,sessionContext:n}),{adapterSessionId:await e.getAdapterSessionId()}}catch(n){try{await e.close({emitSessionClosed:!t.ephemeral})}catch(e){console.warn(`[AIAdapter:${r}] Agent cleanup failed after startAgent error:`,e)}throw n}}async function St(e,t,n,r){try{await r?.waitForCompletion(3e5)}finally{await e.evictSilently(t)}}function Ct(e){if(e.ephemeral&&e.initialMessage===void 0)throw Error(`ephemeral startAgent requires initialMessage`)}function wt(e){let{adapterId:t,name:n,clientId:r,getPlatformDefaults:i,registry:a,globalBus:o,createAgent:s}=e;return async function(e){let c=e.payload,l=crypto.randomUUID(),u=c.providerContext??L();Ct(c);let d;if(c.ephemeral)d=c.sessionId??crypto.randomUUID();else if((c.mode??`create`)===`create`){let e=await o.requestOptional(x.create,{...c.sessionId?{sessionId:c.sessionId}:{}});d=e.handled?e.data.sessionId:c.sessionId??crypto.randomUUID()}else if(c.sessionId)d=c.sessionId;else throw Error(`startAgent ${c.mode} mode requires sessionId`);let f=await s(l,d,{...c,providerContext:u}),{adapterSessionId:p,messageId:m,messageHandle:h}=await xt(f,c,c.sessionContext?b.parse(c.sessionContext):void 0,n);if(a.set(l,{agent:f,sessionId:d,adapterSessionId:p,usage:{totalInputTokens:0,totalOutputTokens:0,totalCalls:0}}),!c.ephemeral)try{await bt(l,d,p,{...c,providerContext:u},{adapterId:t,name:n,clientId:r,getPlatformDefaults:i,globalBus:o})}catch(e){throw await Q(a,l,n,e),e}e.setResult({success:!0,agentId:l,adapterId:t,sessionId:d,adapterSessionId:p,...m!==void 0&&{messageId:m}}),c.ephemeral&&St(a,l,n,h).catch(e=>{console.warn(`[AIAdapter:${n}] Ephemeral agent cleanup failed:`,e)})}}var Tt=class{adapterId;name;capabilities;nativeTools;namespace;globalBus;adapterBus;registry;cleanupFns=[];rehydrationManager;initialized=!1;clientId;platformDefaults;definitionProviders;agentFactory;configFactory;connectorFactory;constructor(e){this.adapterId=e.adapterId??crypto.randomUUID(),this.name=e.name,this.capabilities=e.capabilities,this.nativeTools=e.nativeTools??[],this.globalBus=e.globalBus??f,this.adapterBus=e.scopedBus,this.namespace=e.namespace,this.agentFactory=e.agentFactory,this.configFactory=e.configFactory,this.connectorFactory=e.connectorFactory,this.clientId=e.clientId,this.platformDefaults=e.platformDefaults,this.definitionProviders=e.definitionProviders??[],this.registry=new mt({globalBus:this.globalBus,adapterName:this.name}),this.rehydrationManager=new gt({globalBus:this.globalBus,registry:this.registry,createAgent:this.createAgent.bind(this)})}setupHandlers(){let e=this.globalBus.withFilter({adapterId:this.adapterId});this.cleanupFns.push(e.on(h.startAgent,wt({adapterId:this.adapterId,name:this.name,clientId:this.clientId,getPlatformDefaults:()=>this.platformDefaults,registry:this.registry,globalBus:this.globalBus,createAgent:this.createAgent.bind(this)})),e.on(h.rehydrateAgent,this.rehydrationManager.handleRehydrateAgent),e.on(h.infer,e=>_t(e,{adapterBus:this.adapterBus,adapterId:this.adapterId,adapterName:this.name,platformDefaults:this.platformDefaults,configFactory:this.configFactory,connectorFactory:this.connectorFactory})),e.on(g.session.closed,this.handleSessionClosed),e.on(g.usage,this.handleUsage),this.globalBus.on(x.closed,this.handleSessionClosedByService),e.on(h.listAgents,e=>{e.setResult({agents:Array.from(this.registry.values()).map(e=>({agentId:e.agent.agentId,sessionId:e.adapterSessionId,adapterSessionId:e.adapterSessionId}))})}),e.on(h.getAgent,e=>{let t=this.registry.get(e.payload.agentId);e.setResult({agent:t?{agentId:t.agent.agentId,sessionId:t.sessionId,adapterSessionId:t.adapterSessionId}:null})}),e.on(h.stopAgent,e=>{e.setResult({success:this.disposeAgent(e.payload.agentId)})}),e.on(h.getCapabilities,e=>{e.setResult({capabilities:this.capabilities,nativeTools:this.nativeTools})}))}handleSessionClosed=e=>{let{agentId:t,adapterSessionId:n,reason:r}=e.payload,i=this.registry.get(t);if(!i){console.warn(`Agent ${t} not found, can't emit AgentSubjects.session.closed`);return}this.registry.evict(t).catch(e=>{console.error(`[AIAdapter:${this.name}] Failed to evict agent ${t} after session.closed:`,e)}),this.globalBus.emit(h.session.closed,{adapterId:this.adapterId,adapterName:this.name,agentId:t,sessionId:i.sessionId,adapterSessionId:n,reason:r})};handleSessionClosedByService=async e=>{let{sessionId:t}=e.payload,n=this.registry.agentIdsBySession(t);await Promise.all(n.map(e=>this.registry.evict(e,{emitSessionClosed:!1}).catch(t=>console.error(`[AIAdapter:${this.name}] Failed to evict agent ${e} after session.closed:`,t))))};handleUsage=e=>{let{agentId:t,adapterSessionId:n,inputTokens:r,outputTokens:i}=e.payload,a=this.registry.accumulateUsage(t,{inputTokens:r,outputTokens:i},n);a&&this.globalBus.emit(h.session.usage,{adapterId:this.adapterId,adapterName:this.name,sessionId:a.sessionId,adapterSessionId:a.adapterSessionId,...a.usage})};async init(){this.initialized||(this.adapterBus??=await this.namespace.scopedBus(),this.setupHandlers(),await this.onInit(),this.initialized=!0,await this.globalBus.emit(h.initialized,{adapterId:this.adapterId,adapterName:this.name,capabilities:this.capabilities,nativeTools:this.nativeTools}))}async onInit(){}async createAgent(e,t,n){if(!this.adapterBus)throw Error(`Adapter bus not initialized. Did you forget to call init()?`);let{model:r,cwd:i,env:a,allowedTools:o,disallowedTools:s,reasoningEffort:c,mcpSessionContext:l,harnessId:u,ephemeral:d}=n,f=n.clientId??this.clientId,p=`adapterSessionId`in n&&`mode`in n&&n.mode===`resume`?n.adapterSessionId:void 0,m=yt(this.definitionProviders,r,n.providerContext?.definitionId),h=l===void 0?void 0:new Z,g={agentId:e,adapterId:this.adapterId,adapterName:this.name,adapterBus:this.adapterBus,capabilities:this.capabilities,nativeTools:this.nativeTools,availableModels:m,configFactory:this.configFactory,connectorFactory:this.connectorFactory,sessionId:t,...n.providerContext!==void 0&&{providerContext:n.providerContext},...vt({platformCwd:this.platformDefaults?.cwd,platformEnv:this.platformDefaults?.env,model:r,cwd:i,env:a,allowedTools:o,disallowedTools:s,reasoningEffort:c,resumeAdapterSessionId:p,harnessId:u,clientId:f,clientProfileName:n.clientProfileName,mcpSessionContext:l,toolLedger:h,ephemeral:d})};return this.agentFactory(g)}async closeAsync(){try{let e=await Promise.allSettled([...this.registry.values()].map(e=>e.agent.close()));this.registry.clear(),await this.onClose();let t=e.filter(e=>e.status===`rejected`).map(e=>e.reason instanceof Error?e.reason:Error(String(e.reason)));t.length>0&&console.warn(`[AIAdapter] ${t.length} agent(s) failed to close:`,t)}finally{for(let e of this.cleanupFns)try{e()}catch(e){console.warn(`[AIAdapter] Cleanup function failed:`,e)}this.cleanupFns=[],this.initialized=!1}}close(){this.closeAsync()}async onClose(){}getAgent(e){let t=this.registry.get(e);if(t)return Object.assign({},t.agent,{sessionId:t.sessionId,adapterSessionId:t.adapterSessionId})}disposeAgent(e){return this.registry.dispose(e)}getActiveAgents(){return Array.from(this.registry.values()).map(e=>Object.assign({},e.agent,{sessionId:e.sessionId,adapterSessionId:e.adapterSessionId}))}isInitialized(){return this.initialized}};function $(e){let t={adapterSessionId:e.adapterSessionId,lineage:e.lineage,messages:e.messagePayloads};return e.compactionMetadata&&(t.compaction=e.compactionMetadata),e.compressChildren?.length&&(t.children=e.compressChildren.map($)),t}var Et=class{processLogFile(e){let t=Array.isArray(e)?e:[e],n=this.extractSessionContext(t),r=this.processRecords(t,n);return{adapterSessionId:n.adapterSessionId,sessionEvent:n.sessionEvent,messageEvents:[n.startedEvent,...r],messagePayloads:[],lineage:{kind:`root`,parentAdapterSessionId:null,forkPointMessageId:null}}}};function Dt(e){let t=new Map,r=[];return r.push(e.on(n.get,e=>{let{filePath:n}=e.payload,r=t.get(n)??null;e.setResult({cursor:r})})),r.push(e.on(n.set,e=>{let{filePath:n,bytesRead:r,lastModified:i}=e.payload;t.set(n,{filePath:n,bytesRead:r,lastModified:i}),e.setResult({success:!0})})),r.push(e.on(n.delete,e=>{let{filePath:n}=e.payload,r=t.delete(n);e.setResult({success:r})})),()=>{r.forEach(e=>e()),t.clear()}}const Ot=i.object({sessions:i.record(i.string(),i.object({state:i.enum([`idle`,`active`]),currentTurnId:i.string().optional()}))}).default({sessions:{}});var kt=class{options;sessions=new Map;generateTurnId;constructor(e){this.options=e,this.generateTurnId=e.generateTurnId??(()=>crypto.randomUUID())}processRecord(e){let t=this.options.getSessionId(e),n=this.getOrCreateSessionState(t),r=[],i=this.options.detectTurnStart(e),a=this.options.detectTurnComplete(e);if(i){n.state===`active`&&n.currentTurnId&&r.push({type:`turn.completed`,sessionId:t,turnId:n.currentTurnId});let e=this.generateTurnId(t);n.state=`active`,n.currentTurnId=e,r.push({type:`turn.started`,sessionId:t,turnId:e})}else a&&n.state===`active`&&n.currentTurnId&&(r.push({type:`turn.completed`,sessionId:t,turnId:n.currentTurnId}),n.state=`idle`,n.currentTurnId=void 0);return r}getState(e){return this.sessions.get(e)?.state??`idle`}getCurrentTurnId(e){return this.sessions.get(e)?.currentTurnId}hasActiveTurn(e){return this.getState(e)===`active`}resetSession(e){return this.sessions.delete(e)}resetAll(){this.sessions.clear()}serialize(){let e={};for(let[t,n]of this.sessions)e[t]={state:n.state,currentTurnId:n.currentTurnId};return{sessions:e}}restore(e){this.sessions.clear();for(let[t,n]of Object.entries(e.sessions))this.sessions.set(t,{state:n.state,currentTurnId:n.currentTurnId})}getTrackedSessions(){return Array.from(this.sessions.keys())}forceCompleteTurn(e){let t=this.sessions.get(e);if(!t||t.state!==`active`||!t.currentTurnId)return;let n={type:`turn.completed`,sessionId:e,turnId:t.currentTurnId};return t.state=`idle`,t.currentTurnId=void 0,n}getOrCreateSessionState(e){let t=this.sessions.get(e);return t||(t={state:`idle`,currentTurnId:void 0},this.sessions.set(e,t)),t}};const At=i.object({eventType:i.literal(`agent_started`),model:i.string().optional()}),jt=i.object({eventType:i.literal(`agent_complete`),message:i.string().optional(),error:i.string().optional()}),Mt=i.object({eventType:i.literal(`error`),message:i.string(),code:i.string().or(i.number()).optional(),type:i.string().optional()}),Nt=i.object({eventType:i.literal(`tool_started`),toolName:i.string(),toolCallId:i.string()}),Pt=i.object({eventType:i.literal(`tool_completed`),toolName:i.string(),toolCallId:i.string(),result:i.string(),success:i.boolean()});export{Tt as AIAdapter,lt as AIAgent,B as AIAgentConnector,jt as AgentCompleteEventSchema,X as AgentConnectorLifecycleManager,K as AgentEventBridge,G as AgentLifecycleEmitter,q as AgentPayloadEmitter,Y as AgentRuntimeMutationManager,At as AgentStartedEventSchema,J as AgentTurnExecutor,Xe as BaseConnectorSession,V as BaseConnectorTurn,Et as BaseLogImporter,Mt as ErrorEventSchema,r as ImportCursorPositionSchema,t as ImportCursorStorageNamespace,n as ImportCursorStorageSubjects,ke as MAKAIO_CONFORMANCE_PRIMARY_MODEL_ENV,M as MAKAIO_CONFORMANCE_PROVIDER_DEFINITIONS_ENV,Oe as MAKAIO_CONFORMANCE_PROVIDER_ENV,Ae as MAKAIO_CONFORMANCE_SECONDARY_MODEL_ENV,z as MessageHandle,H as MessageLifecycleTracker,Qe as ProceduralAgentConnector,Ze as ProceduralConnectorTurn,Ve as ScopedToolApprovalSchema,Ge as SessionLifecycle,Z as SessionToolLedger,U as ToolCallTracker,Pt as ToolCompletedEventSchema,Nt as ToolStartedEventSchema,kt as TurnTracker,Ot as TurnTrackerSerializedStateSchema,Ke as UserMessageQueue,e as cleanEnvForAdapter,ue as createAdapterNamespace,j as createTestProviderContext,He as createToolApprovalHandler,Ce as defineDiscriminatedHandlers,we as defineDiscriminatedHandlersSync,ft as extractMcpCallTarget,E as formatContextBlockAsText,xe as formatContextBlocksAsText,Le as formatMessageHistoryAsTranscript,pt as isMcpCallTool,Ue as isTextLikeMimeType,Be as mergeScopedToolApproval,A as normalizeEnvValue,O as normalizeMessageInput,I as normalizeMimeType,Se as parseAIAdapterCapabilities,k as processDiscriminatedItems,Te as processDiscriminatedItemsSync,R as processQueueMessages,W as registerAgentBusHandlers,Dt as registerMemoryImportCursorStorage,Pe as resolveConformanceTestPreset,Fe as resolveDisabledNativeTools,We as resolvePresetCredentials,F as resolveRequiredSessionId,De as resolveTestConfig,T as safeJsonStringify,ze as serializeBlockToText,ye as serializeTurnContext,$ as toImportSegment};
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { g as LogImporter, i as LogFileChangeEvent, n as LogOrchestratorConfig, t as BaseLogOrchestrator } from "../base-orchestrator-9z8TuA5a.mjs";
|
|
2
|
+
|
|
3
|
+
//#region adapters/core/src/log-importer/jsonl-parser.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Error encountered while parsing a JSONL line.
|
|
6
|
+
* @remarks
|
|
7
|
+
* Errors include the line number (1-indexed), the error message, and the
|
|
8
|
+
* raw content of the line for debugging purposes. Content is truncated
|
|
9
|
+
* at 200 characters to prevent large payloads from bloating error logs.
|
|
10
|
+
* @see {@link JsonlParseResult} - Contains array of parse errors
|
|
11
|
+
*/
|
|
12
|
+
interface JsonlParseError {
|
|
13
|
+
/** 1-indexed line number relative to the file start (not the offset) */
|
|
14
|
+
line: number;
|
|
15
|
+
/** Error message describing why parsing failed */
|
|
16
|
+
error: string;
|
|
17
|
+
/** Raw content of the malformed line (truncated at 200 chars) */
|
|
18
|
+
content: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Result of parsing a JSONL file.
|
|
22
|
+
* @typeParam T - The expected type of each parsed record
|
|
23
|
+
* @remarks
|
|
24
|
+
* Contains successfully parsed records, the new byte offset for cursor updates,
|
|
25
|
+
* and any errors encountered. Errors don't prevent successful records from being
|
|
26
|
+
* returned - the parser continues after malformed lines.
|
|
27
|
+
* @see {@link parseJsonlFile} - Function that produces this result
|
|
28
|
+
*/
|
|
29
|
+
interface JsonlParseResult<T> {
|
|
30
|
+
/**
|
|
31
|
+
* Successfully parsed records.
|
|
32
|
+
* @remarks
|
|
33
|
+
* Records are returned in file order. Each record is the result of
|
|
34
|
+
* `JSON.parse()` on a complete line. Type safety is the caller's
|
|
35
|
+
* responsibility via validation or type guards.
|
|
36
|
+
*/
|
|
37
|
+
records: T[];
|
|
38
|
+
/**
|
|
39
|
+
* Byte offset for cursor update.
|
|
40
|
+
* @remarks
|
|
41
|
+
* This is the position immediately after the last complete line
|
|
42
|
+
* (the last `\n` character processed). Use this value to update
|
|
43
|
+
* the cursor for resuming later reads.
|
|
44
|
+
*
|
|
45
|
+
* If the file ends without a trailing newline, `bytesRead` points
|
|
46
|
+
* to the end of the last complete line, leaving incomplete content
|
|
47
|
+
* for the next read when it becomes complete.
|
|
48
|
+
*/
|
|
49
|
+
bytesRead: number;
|
|
50
|
+
/**
|
|
51
|
+
* Parse errors encountered.
|
|
52
|
+
* @remarks
|
|
53
|
+
* One entry per malformed line. Lines that fail `JSON.parse()` are
|
|
54
|
+
* logged here but don't stop processing. The caller should log these
|
|
55
|
+
* for debugging while continuing to process valid records.
|
|
56
|
+
*/
|
|
57
|
+
errors: JsonlParseError[];
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Options for parsing a JSONL file.
|
|
61
|
+
* @see {@link parseJsonlFile} - Function that accepts these options
|
|
62
|
+
*/
|
|
63
|
+
interface JsonlParserOptions {
|
|
64
|
+
/**
|
|
65
|
+
* Absolute path to the JSONL file to parse.
|
|
66
|
+
*/
|
|
67
|
+
filePath: string;
|
|
68
|
+
/**
|
|
69
|
+
* Byte offset to start reading from.
|
|
70
|
+
* @defaultValue 0 (start of file)
|
|
71
|
+
* @remarks
|
|
72
|
+
* Use this to resume reading from a previously stored cursor position.
|
|
73
|
+
* The parser will seek to this position before reading.
|
|
74
|
+
*/
|
|
75
|
+
startOffset?: number;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Parse a JSONL file starting from a byte offset.
|
|
79
|
+
* @typeParam T - The expected type of each parsed JSON record
|
|
80
|
+
* @param options - Parser configuration including file path and start offset
|
|
81
|
+
* @returns Parse result with records, new byte offset, and any errors
|
|
82
|
+
* @throws Error if the file cannot be opened or read
|
|
83
|
+
* @remarks
|
|
84
|
+
* ## Partial Line Handling
|
|
85
|
+
*
|
|
86
|
+
* JSONL files may be actively written to, leaving incomplete lines at the end.
|
|
87
|
+
* This parser only processes complete lines (lines ending with `\n`). Incomplete
|
|
88
|
+
* trailing content is left for the next read cycle.
|
|
89
|
+
*
|
|
90
|
+
* ## Error Handling
|
|
91
|
+
*
|
|
92
|
+
* Malformed JSON lines don't stop parsing. The parser logs the error and
|
|
93
|
+
* continues to the next line. Callers should check the `errors` array and
|
|
94
|
+
* log/alert as appropriate.
|
|
95
|
+
*
|
|
96
|
+
* ## Type Safety
|
|
97
|
+
*
|
|
98
|
+
* The generic type `T` is not validated at runtime. Callers should either:
|
|
99
|
+
* 1. Use Zod or similar to validate each record
|
|
100
|
+
* 2. Use type guards before accessing properties
|
|
101
|
+
* 3. Trust the source format (e.g., known tool log format)
|
|
102
|
+
* @example
|
|
103
|
+
* ```typescript
|
|
104
|
+
* interface LogRecord {
|
|
105
|
+
* type: string;
|
|
106
|
+
* timestamp: string;
|
|
107
|
+
* data: unknown;
|
|
108
|
+
* }
|
|
109
|
+
*
|
|
110
|
+
* // First read (from beginning)
|
|
111
|
+
* const result = await parseJsonlFile<LogRecord>({
|
|
112
|
+
* filePath: '/path/to/logs.jsonl',
|
|
113
|
+
* });
|
|
114
|
+
*
|
|
115
|
+
* // Process records
|
|
116
|
+
* for (const record of result.records) {
|
|
117
|
+
* console.log(record.type);
|
|
118
|
+
* }
|
|
119
|
+
*
|
|
120
|
+
* // Store cursor for next read
|
|
121
|
+
* await saveCursor(result.bytesRead);
|
|
122
|
+
*
|
|
123
|
+
* // Later: resume from cursor
|
|
124
|
+
* const cursor = await loadCursor();
|
|
125
|
+
* const nextResult = await parseJsonlFile<LogRecord>({
|
|
126
|
+
* filePath: '/path/to/logs.jsonl',
|
|
127
|
+
* startOffset: cursor,
|
|
128
|
+
* });
|
|
129
|
+
* ```
|
|
130
|
+
*/
|
|
131
|
+
declare function parseJsonlFile<T>(options: JsonlParserOptions): Promise<JsonlParseResult<T>>;
|
|
132
|
+
/**
|
|
133
|
+
* Read the first N JSON records from a JSONL file.
|
|
134
|
+
*
|
|
135
|
+
* Optimized for discovery: reads only enough bytes to find `maxRecords`
|
|
136
|
+
* complete JSON lines, then stops. Uses a small buffer to avoid reading
|
|
137
|
+
* entire large files.
|
|
138
|
+
* @param filePath - Absolute path to the JSONL file
|
|
139
|
+
* @param maxRecords - Maximum number of records to return
|
|
140
|
+
* @returns Array of parsed JSON records (skips malformed lines)
|
|
141
|
+
*/
|
|
142
|
+
declare function readFirstJsonlRecords<T>(filePath: string, maxRecords: number): Promise<T[]>;
|
|
143
|
+
/**
|
|
144
|
+
* Determine whether any parsed JSONL record matches a predicate.
|
|
145
|
+
*
|
|
146
|
+
* Stops reading as soon as a matching record is found, which keeps discovery
|
|
147
|
+
* checks bounded even for very large log files.
|
|
148
|
+
* @typeParam T - The expected type of each parsed record
|
|
149
|
+
* @param filePath - Absolute path to the JSONL file
|
|
150
|
+
* @param predicate - Record matcher evaluated in file order
|
|
151
|
+
* @returns True on the first matching record, otherwise false
|
|
152
|
+
*/
|
|
153
|
+
declare function someJsonlRecord<T>(filePath: string, predicate: (record: T) => boolean): Promise<boolean>;
|
|
154
|
+
//#endregion
|
|
155
|
+
//#region adapters/core/src/log-importer/discovery-orchestrator.d.ts
|
|
156
|
+
/**
|
|
157
|
+
* Abstract discovery orchestrator for shallow session discovery.
|
|
158
|
+
*
|
|
159
|
+
* Overrides `handleFileChange` to call `importer.extractDiscoveryMetadata(filePath)`
|
|
160
|
+
* directly, bypassing the parseFile → validateRecords → extractSessionContext pipeline.
|
|
161
|
+
* Emits only `adapter.session.discovered` and saves a stub cursor (bytesRead: 0)
|
|
162
|
+
* so the full import starts from byte 0 when the user triggers lazy-load pick-up.
|
|
163
|
+
*
|
|
164
|
+
* For files that have already been imported, the orchestrator delegates `'modified'`
|
|
165
|
+
* events to the base class for incremental processing and manages the
|
|
166
|
+
* `'imported' ↔ 'tracking'` status lifecycle.
|
|
167
|
+
* @typeParam TRecord - The adapter's native log record type
|
|
168
|
+
* @typeParam TState - The adapter's resumable state type (default: unknown)
|
|
169
|
+
* @see {@link BaseLogOrchestrator} - Parent class with full import behavior
|
|
170
|
+
*/
|
|
171
|
+
declare abstract class DiscoveryOrchestrator<TRecord, TState = unknown> extends BaseLogOrchestrator<TRecord, TState> {
|
|
172
|
+
/**
|
|
173
|
+
* Paths of files whose adapter sessions are currently in `'tracking'` status.
|
|
174
|
+
* Maintained locally to avoid per-poll DB lookups.
|
|
175
|
+
*/
|
|
176
|
+
protected readonly trackingFilePaths: Set<string>;
|
|
177
|
+
/**
|
|
178
|
+
* Per-file count of consecutive poll cycles with no mtime change while in
|
|
179
|
+
* `'tracking'` status. Reset on each `'modified'` event; incremented by the
|
|
180
|
+
* `polled` handler when mtime is unchanged.
|
|
181
|
+
*/
|
|
182
|
+
protected readonly trackingInactiveCount: Map<string, number>;
|
|
183
|
+
/**
|
|
184
|
+
* Last observed mtime (ms) per tracked file path.
|
|
185
|
+
* Used by the `polled` handler to detect inactivity without re-reading disk.
|
|
186
|
+
*/
|
|
187
|
+
protected readonly lastSeenMtimeMs: Map<string, number>;
|
|
188
|
+
/** Cleanup for the `polled` event subscription. */
|
|
189
|
+
private unsubscribePolled?;
|
|
190
|
+
protected constructor(config: LogOrchestratorConfig, importer: LogImporter<TRecord, TState>);
|
|
191
|
+
/**
|
|
192
|
+
* Clear all in-memory tracking collections for a single file path.
|
|
193
|
+
* @param filePath - File path to remove from local tracking state
|
|
194
|
+
*/
|
|
195
|
+
protected clearTrackingState(filePath: string): void;
|
|
196
|
+
/**
|
|
197
|
+
* Persist the steady-state imported status for a tracked file.
|
|
198
|
+
* @param filePath - Absolute path to the tracked log file
|
|
199
|
+
* @returns `true` when the file can be removed from local tracking state
|
|
200
|
+
*/
|
|
201
|
+
protected persistImportedStatus(filePath: string): Promise<boolean>;
|
|
202
|
+
start(): Promise<void>;
|
|
203
|
+
stop(): Promise<void>;
|
|
204
|
+
dispose(): Promise<void>;
|
|
205
|
+
/**
|
|
206
|
+
* Simplified file change handler for discovery mode.
|
|
207
|
+
*
|
|
208
|
+
* Dispatches to two paths:
|
|
209
|
+
* 1. No cursor exists → lightweight discovery (emit `adapter.session.discovered`,
|
|
210
|
+
* write stub cursor).
|
|
211
|
+
* 2. Cursor exists + `changeType === 'modified'` + session status is `'imported'`
|
|
212
|
+
* or `'tracking'` → delegate to base class for incremental import, then
|
|
213
|
+
* transition status to `'tracking'` if it was `'imported'`.
|
|
214
|
+
*
|
|
215
|
+
* All other cases (e.g., cursor exists but status is `'discovered'`, or
|
|
216
|
+
* `changeType` is not `'modified'`) are silently skipped.
|
|
217
|
+
* @param event - File change event from the watcher
|
|
218
|
+
*/
|
|
219
|
+
protected handleFileChange(event: LogFileChangeEvent): Promise<void>;
|
|
220
|
+
/**
|
|
221
|
+
* Rehydrate `tracking` file state from persisted adapter-session rows after startup.
|
|
222
|
+
*
|
|
223
|
+
* The watcher state is process-local, but adapter-session status is persisted.
|
|
224
|
+
* Without this rehydration, a restart can strand sessions in `'tracking'` forever
|
|
225
|
+
* because no in-memory file state exists to drive the inactivity timeout.
|
|
226
|
+
*/
|
|
227
|
+
protected restorePersistedTrackingState(): Promise<void>;
|
|
228
|
+
/**
|
|
229
|
+
* Perform shallow discovery for a newly seen file.
|
|
230
|
+
*
|
|
231
|
+
* Calls `importer.extractDiscoveryMetadata`, skips Makaio-managed sessions,
|
|
232
|
+
* emits `adapter.session.discovered`, and writes a stub cursor (bytesRead=0).
|
|
233
|
+
* @param event - File change event for the new file
|
|
234
|
+
*/
|
|
235
|
+
private discoverNewFile;
|
|
236
|
+
/**
|
|
237
|
+
* Handle a `'modified'` event for a file whose session is already imported.
|
|
238
|
+
*
|
|
239
|
+
* Looks up the adapter session by file path. If the session status is
|
|
240
|
+
* `'imported'` or `'tracking'`, delegates to the base class for incremental
|
|
241
|
+
* processing. Transitions status from `'imported'` to `'tracking'` on success.
|
|
242
|
+
*
|
|
243
|
+
* Sessions with status `'discovered'` (not yet fully imported) are skipped —
|
|
244
|
+
* the cursor only has `bytesRead=0` and no `sessionContext`, so incremental
|
|
245
|
+
* import cannot resume.
|
|
246
|
+
* @param filePath - Absolute path to the log file
|
|
247
|
+
* @param event - Full file change event (passed to super)
|
|
248
|
+
* @param mtime - Current file modification time
|
|
249
|
+
*/
|
|
250
|
+
private handleModifiedImportedFile;
|
|
251
|
+
/**
|
|
252
|
+
* React to a completed poll cycle for inactivity-based `tracking → imported` transitions.
|
|
253
|
+
*
|
|
254
|
+
* For each file in `trackingFilePaths`, checks if the watcher's last-known mtime
|
|
255
|
+
* matches our stored `lastSeenMtimeMs`. If unchanged, increments the inactive
|
|
256
|
+
* counter. When the counter reaches the tracking inactivity threshold, the
|
|
257
|
+
* adapter session reverts to `'imported'` and the file is removed from tracking.
|
|
258
|
+
* @param trackedFilePaths - All file paths observed by the watcher in this cycle
|
|
259
|
+
*/
|
|
260
|
+
protected onPollCycle(trackedFilePaths: ReadonlySet<string>): Promise<void>;
|
|
261
|
+
}
|
|
262
|
+
//#endregion
|
|
263
|
+
export { BaseLogOrchestrator, DiscoveryOrchestrator, type JsonlParseError, type JsonlParseResult, type JsonlParserOptions, type LogFileChangeEvent, parseJsonlFile, readFirstJsonlRecords, someJsonlRecord };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{r as e}from"../cursor-storage-DOQdvo9j.mjs";import*as t from"node:path";import{MakaioBus as n}from"@makaio/framework/bus";import{AdapterSubjects as r,SessionSubjects as i}from"@makaio/framework/contracts";import*as a from"node:fs/promises";import{AdapterSessionStorageSubjects as o}from"@makaio/framework/services/session";import s from"emittery";import c from"p-queue";import{globby as l}from"globby";const u=65536;async function d(e){let{filePath:t,startOffset:n=0}=e,r=[],i=[],o=n,s;try{s=await a.open(t,`r`);let e=await s.stat();if(n>=e.size)return{records:r,bytesRead:n,errors:i};let c=Buffer.alloc(u),l=``,d=n,f=0;for(n>0&&(f=await g(s,n));d<e.size;){let{bytesRead:e}=await s.read(c,0,u,d);if(e===0)break;l+=c.toString(`utf8`,0,e),d+=e;let t=l.split(`
|
|
2
|
+
`),n=t.pop();for(let e of t){if(f++,e.trim()===``){o+=Buffer.byteLength(e,`utf8`)+1;continue}let t=m(e,f);t.success?r.push(t.record):i.push(t.error),o+=Buffer.byteLength(e,`utf8`)+1}l=n??``}return{records:r,bytesRead:o,errors:i}}finally{s&&await s.close()}}async function f(e,t){let n=[],r;try{r=await a.open(e,`r`);let i=Buffer.alloc(u),o=``,s=0;for(;n.length<t;){let{bytesRead:e}=await r.read(i,0,u,s);if(e===0)break;o+=i.toString(`utf8`,0,e),s+=e;let a=o.split(`
|
|
3
|
+
`);o=a.pop()??``;for(let e of a){if(n.length>=t)break;let r=e.trim();if(r!==``)try{n.push(JSON.parse(r))}catch{}}}return n}finally{r&&await r.close()}}async function p(e,t){let n;try{n=await a.open(e,`r`);let r=Buffer.alloc(u),i=``,o=0;for(;;){let{bytesRead:e}=await n.read(r,0,u,o);if(e===0)break;i+=r.toString(`utf8`,0,e),o+=e;let a=i.split(`
|
|
4
|
+
`);i=a.pop()??``;for(let e of a){let n=e.trim();if(n!==``)try{if(t(JSON.parse(n)))return!0}catch{}}}return!1}finally{n&&await n.close()}}function m(e,t){try{return{success:!0,record:JSON.parse(e)}}catch(n){return{success:!1,error:{line:t,error:n instanceof Error?n.message:String(n),content:h(e)}}}}function h(e){return e.length<=200?e:e.slice(0,200)+`...`}async function g(e,t){let n=0,r=Buffer.alloc(u),i=0;for(;i<t;){let a=Math.min(u,t-i),{bytesRead:o}=await e.read(r,0,a,i);if(o===0)break;for(let e=0;e<o;e++)r[e]===10&&n++;i+=o}return n}var _=class{eventQueue;cursorQueue;onEventEmitted;constructor(e){this.onEventEmitted=e.onEventEmitted,this.eventQueue=new c({concurrency:1,interval:1e3,intervalCap:e.eventsPerSecond}),this.cursorQueue=new c({concurrency:1})}queueEvent(e){return this.eventQueue.add(async()=>{await n.emit(e.subject,e.payload),this.onEventEmitted()})}queueAfterEvents(e,t=[]){let n=Promise.all(t);return n.catch(()=>void 0),this.cursorQueue.add(async()=>{await n,await e()})}async drain(){await Promise.all([this.eventQueue.onIdle(),this.cursorQueue.onIdle()])}async onIdle(){await this.drain()}},v=class{options;emittery=new s;trackedFiles=new Map;pollTimer;isPolling=!1;isDisposed=!1;inFlightChecks=new Map;constructor(e){if(!t.isAbsolute(e.directory))throw Error(`Directory must be an absolute path: ${e.directory}`);this.options={directory:e.directory,pattern:e.pattern,pollIntervalMs:e.pollIntervalMs??1e4}}on(e,t){return this.emittery.on(e,t)}once(e,t){return this.emittery.once(e,t)}async start(){this.isDisposed||this.pollTimer===void 0&&(await this.poll(),this.pollTimer=setInterval(()=>{this.poll()},this.options.pollIntervalMs))}stop(){this.pollTimer!==void 0&&(clearInterval(this.pollTimer),this.pollTimer=void 0)}dispose(){this.isDisposed=!0,this.stop(),this.emittery.clearListeners(),this.trackedFiles.clear(),this.inFlightChecks.clear()}isRunning(){return this.pollTimer!==void 0}getTrackedFiles(){return this.trackedFiles}seedFromCursors(e){for(let t of e)this.trackedFiles.set(t.filePath,{size:t.bytesRead,mtimeMs:new Date(t.lastModified).getTime()})}async poll(){if(!this.isDisposed&&!this.isPolling){this.isPolling=!0;try{let e=await this.discoverFiles(),t=new Set(e);for(let e of this.trackedFiles.keys())if(!t.has(e)){if(this.isDisposed)return;this.trackedFiles.delete(e),await this.emittery.emit(`deleted`,{filePath:e})}for(let t of e)try{await this.runFileCheck(t)}catch(e){await this.emitWatcherError(e,t)}if(this.isDisposed)return;await this.emittery.emit(`polled`,{trackedFilePaths:new Set(this.trackedFiles.keys())})}catch(e){await this.emitWatcherError(e)}finally{this.isPolling=!1}}}async discoverFiles(){return l(this.options.pattern,{cwd:this.options.directory,absolute:!0,onlyFiles:!0})}async checkFile(e){if(this.isDisposed)return;let t=await a.stat(e);if(this.isDisposed)return;let n={size:t.size,mtimeMs:t.mtimeMs},r=this.trackedFiles.get(e);if(!r){if(this.trackedFiles.set(e,n),this.isDisposed){this.trackedFiles.delete(e);return}await this.emittery.emit(`change`,{filePath:e,stat:{size:t.size,mtime:t.mtime},changeType:`created`});return}if(n.mtimeMs!==r.mtimeMs){let i=n.size<r.size?`rotated`:`modified`;if(this.trackedFiles.set(e,n),this.isDisposed)return;await this.emittery.emit(`change`,{filePath:e,stat:{size:t.size,mtime:t.mtime},changeType:i})}}clearTrackedFile(e){return this.trackedFiles.delete(e)}clearAllTrackedFiles(){this.trackedFiles.clear()}triggerImmediatePoll(e){this.runFileCheck(e).catch(t=>{this.emitWatcherError(t,e)})}async runFileCheck(e){if(this.isDisposed)return;let t=this.inFlightChecks.get(e);if(t){await t;return}let n=(async()=>{try{await this.checkFile(e)}finally{this.inFlightChecks.delete(e)}})();this.inFlightChecks.set(e,n),await n}async emitWatcherError(e,t){let n=e instanceof Error?e:Error(String(e));try{await this.emittery.emit(`error`,{error:n,filePath:t})}catch(e){console.error(`[LogFileWatcher] Error listener failed:`,e instanceof Error?e.message:String(e))}}},y=class{watcher;constructor(e){this.watcher=new v(e)}isRunning(){return this.watcher.isRunning()}async start(){await this.watcher.start()}stop(){this.watcher.stop()}dispose(){this.watcher.dispose()}onChange(e){return this.watcher.on(`change`,e)}onError(e){return this.watcher.on(`error`,e)}onDeleted(e){return this.watcher.on(`deleted`,e)}onPolled(e){return this.watcher.on(`polled`,({trackedFilePaths:t})=>e(t))}getTrackedFileMtimeMs(e){return this.watcher.getTrackedFiles().get(e)?.mtimeMs}triggerImmediatePoll(e){this.watcher.triggerImmediatePoll(e)}seedFromCursors(e){this.watcher.seedFromCursors(e)}},b=class{filesProcessed=0;eventsEmitted=0;sessionsImported=new Set;sessionsSkipped=new Set;lastLoggedEventCount=0;lastLoggedSnapshot=``;reset(){this.filesProcessed=0,this.eventsEmitted=0,this.sessionsImported.clear(),this.sessionsSkipped.clear(),this.lastLoggedEventCount=0,this.lastLoggedSnapshot=``}recordFileProcessed(){this.filesProcessed++}recordEventEmitted(e){this.eventsEmitted++,!(this.eventsEmitted-this.lastLoggedEventCount<1e3)&&(console.info(`${e} Imported ${this.eventsEmitted} events (${this.sessionsImported.size} sessions)...`),this.lastLoggedEventCount=this.eventsEmitted)}recordSessionImported(e){this.sessionsImported.add(e)}recordSessionSkipped(e){this.sessionsSkipped.add(e)}hasActivity(){return this.eventsEmitted>0||this.filesProcessed>0}stoppedMessage(e){return`${e} Stopped - ${this.eventsEmitted} events from ${this.sessionsImported.size} sessions (${this.sessionsSkipped.size} skipped)`}logProgress(e){if(!this.hasActivity())return;let t=JSON.stringify({eventsEmitted:this.eventsEmitted,filesProcessed:this.filesProcessed,sessionsImported:this.sessionsImported.size,sessionsSkipped:this.sessionsSkipped.size});t!==this.lastLoggedSnapshot&&(this.lastLoggedSnapshot=t,console.info(`${e} Progress: ${this.eventsEmitted} events, ${this.sessionsImported.size} sessions, ${this.filesProcessed} files, ${this.sessionsSkipped.size} skipped`))}};function x(){return async e=>{try{let t=await n.request(i.getByAdapterSessionId,{adapterSessionId:e});return t.session!==null&&!t.session.isImported}catch{return!1}}}var S=class{checkedSessions=new Map;inFlight=new Map;async isSkipped(e,t,n){let r=this.checkedSessions.get(e);if(r!==void 0)return r;let i=this.inFlight.get(e);return i||(i=t(e).then(t=>(this.checkedSessions.set(e,t),t&&n(e),t)).finally(()=>{this.inFlight.delete(e)}),this.inFlight.set(e,i)),i}clear(){this.checkedSessions.clear(),this.inFlight.clear()}};function C(e,t,n,r){return!n||!e||r===`rotated`?!1:new Date(e)>=t}function w(e,t,n){for(let r of n??[]){let n=r.line===void 0?``:` at line ${r.line}`;console.warn(`${e} Parse error in ${t}${n}: ${r.error}`)}}async function T(t,r,i,a){let{cursor:o}=await n.request(e.get,{filePath:t});return o&&o.bytesRead>0&&!o.sessionContext&&!r?(await n.request(e.delete,{filePath:t}).catch(()=>{}),a(i),`retry`):o}async function E(e,t,n,r,i,a){let o=await a.parseFile(e,0);w(i,e,o.errors);let s=a.validateRecords(o.records);s.length>0&&await a.handleFirstRead(e,s,o.bytesRead??0,t,n,0,r)}function D(e,t,n,r,i){let a=[];n&&(a.push(i(t.sessionEvent)),a.push(i(t.startedEvent)));let o=r(e,t);for(let e of o)a.push(i(e));return a}function O(e,t){let n=[];for(let r of e)n.push(t(r));return n}function k(e){return typeof e==`object`&&!!e&&`compactionDetected`in e&&e.compactionDetected===!0}function A(e,t,n){return{...e,state:n(t)}}var j=class{tasks=new Set;track(e){this.tasks.add(e),e.finally(()=>{this.tasks.delete(e)})}async drain(){for(;this.tasks.size>0;)await Promise.allSettled([...this.tasks])}},M=class{config;watcher;eventQueue;importer;managedSessionCache=new S;unsubscribeChange;unsubscribeError;unsubscribeDeleted;stats=new b;watcherTasks=new j;progressTimer;constructor(e,t){this.importer=t;let n=e.directory??t.getLogDirectory();this.config={enabled:e.enabled,directory:e.directory,pollIntervalMs:e.pollIntervalMs??1e4,eventsPerSecond:e.eventsPerSecond??100,adapterId:e.adapterId,adapterName:e.adapterName,checkMakaioManaged:e.checkMakaioManaged},this.watcher=new y({directory:n,pattern:this.getLogFilePattern(),pollIntervalMs:this.config.pollIntervalMs}),this.eventQueue=new _({eventsPerSecond:this.config.eventsPerSecond,onEventEmitted:()=>{this.stats.recordEventEmitted(this.logPrefix)}})}shouldSkipFile(e){return!1}validateRecords(e){return e}getMaxRecords(){}buildCursorSessionContext(e){let{adapterSessionId:t,sessionEvent:n,startedEvent:r,state:i,...a}=e;return{...a,adapterSessionId:t,sessionEvent:n,startedEvent:r,state:this.importer.serializeState(i)}}usesJsonFormat(){let e=this.getLogFilePattern();return e.includes(`.json`)&&!e.includes(`.jsonl`)}isEnabled(){return this.config.enabled}isRunning(){return this.watcher.isRunning()}async start(){if(!this.config.enabled||this.isRunning())return;let t=this.config.directory??this.importer.getLogDirectory();console.info(`${this.logPrefix} Starting - watching ${t}`),this.stats.reset(),this.managedSessionCache.clear(),this.progressTimer=setInterval(()=>this.stats.logProgress(this.logPrefix),1e4),this.unsubscribeChange=this.watcher.onChange(e=>{this.trackFileChange(e)}),this.unsubscribeError=this.watcher.onError(({error:e,filePath:t})=>{console.warn(`${this.logPrefix} Error${t?` for ${t}`:``}: ${e.message}`)}),this.unsubscribeDeleted=this.watcher.onDeleted(({filePath:t})=>{this.watcherTasks.track(n.request(e.delete,{filePath:t}).then(()=>void 0).catch(()=>{}))}),await this.watcher.start()}async stop(){this.progressTimer&&=(clearInterval(this.progressTimer),void 0),this.unsubscribeChange?.(),this.unsubscribeError?.(),this.unsubscribeDeleted?.(),this.unsubscribeChange=void 0,this.unsubscribeError=void 0,this.unsubscribeDeleted=void 0,this.watcher.stop(),await this.watcherTasks.drain(),await this.eventQueue.drain(),this.stats.hasActivity()&&console.info(this.stats.stoppedMessage(this.logPrefix))}async dispose(){await this.stop(),this.watcher.dispose(),this.managedSessionCache.clear()}static createDefaultCheckMakaioManaged(){return x()}async updateCursor(t,r,i,a){await n.request(e.set,{filePath:t,bytesRead:r,lastModified:i.toISOString(),sessionContext:a})}async handleFileChange(t){let{filePath:r,changeType:i,stat:a}=t;if(this.shouldSkipFile(r))return;let o=this.usesJsonFormat();i===`rotated`&&await n.request(e.delete,{filePath:r}).catch(()=>{});let s=await T(r,o,t,e=>this.trackFileChange(e));if(s===`retry`)return;let c=s?.sessionContext!==void 0,l=c?s?.bytesRead??0:0;if(C(s?.lastModified,a.mtime,o,i))return;let u=await this.parseFile(r,o?0:l,this.getMaxRecords());w(this.logPrefix,r,u.errors),this.stats.recordFileProcessed();let d=this.validateRecords(u.records),f=u.bytesRead??0;if(d.length===0){await this.maybeUpdateCursor(r,f,l,a.mtime,o,s?.sessionContext);return}c&&s?.sessionContext?await this.handleIncrementalRead(r,d,s.sessionContext,f,a.mtime,o,l):await this.handleFirstRead(r,d,f,a.mtime,o,l)}trackFileChange(e){let t=this.handleFileChange(e).catch(e=>{console.error(`${this.logPrefix} Error handling file change:`,e instanceof Error?e.message:String(e))});this.watcherTasks.track(t)}async handleFirstRead(e,t,n,r,i,a,o=!0){let s=this.importer.extractSessionContext(t);if(await this.isSessionSkipped(s.adapterSessionId)){await this.maybeUpdateCursor(e,n,a,r,i,this.buildCursorSessionContext(s));return}let c=D(t,s,o,(e,t)=>this.importer.processRecords(e,t),e=>this.queueEvent(e));this.trackImportedSession(s.adapterSessionId),await this.queueCursorUpdate(e,n,a,r,i,this.buildCursorSessionContext(s),c)}trackImportedSession(e){this.stats.recordSessionImported(e)}async handleIncrementalRead(t,r,i,a,o,s,c){if(await this.isSessionSkipped(i.adapterSessionId)){await this.maybeUpdateCursor(t,a,c,o,s,i);return}let l;try{l=this.importer.deserializeState(i.state)}catch(r){console.warn(`${this.logPrefix} Corrupted cursor state for ${t}, deleting cursor and re-importing.`,r instanceof Error?r.message:String(r)),await n.request(e.delete,{filePath:t}).catch(e=>{console.warn(`${this.logPrefix} Failed to delete corrupted cursor for ${t}.`,e instanceof Error?e.message:String(e))}),await E(t,o,s,!0,this.logPrefix,{parseFile:(e,t)=>this.parseFile(e,t),validateRecords:e=>this.validateRecords(e),handleFirstRead:(e,t,n,r,i,a,o)=>this.handleFirstRead(e,t,n,r,i,a,o)});return}let u={adapterSessionId:i.adapterSessionId,model:i.model,cwd:i.cwd,sessionEvent:i.sessionEvent,startedEvent:i.startedEvent,state:l},d=this.importer.processRecords(r,u);if(k(u.state)){await E(t,o,s,!1,this.logPrefix,{parseFile:(e,t)=>this.parseFile(e,t),validateRecords:e=>this.validateRecords(e),handleFirstRead:(e,t,n,r,i,a,o)=>this.handleFirstRead(e,t,n,r,i,a,o)});return}let f=O(d,e=>this.queueEvent(e)),p=A(i,u.state,e=>this.importer.serializeState(e));await this.queueCursorUpdate(t,a,c,o,s,p,f)}async maybeUpdateCursor(e,t,n,r,i,a){(t>n||i)&&await this.updateCursor(e,t,r,a)}async isSessionSkipped(e){return this.managedSessionCache.isSkipped(e,e=>this.importer.isMakaioManaged(e),e=>this.stats.recordSessionSkipped(e))}queueEvent(e){return this.eventQueue.queueEvent(e)}queueCursorUpdate(e,t,n,r,i,a,o=[]){return this.eventQueue.queueAfterEvents(()=>this.maybeUpdateCursor(e,t,n,r,i,a),o)}},N=class extends M{trackingFilePaths=new Set;trackingInactiveCount=new Map;lastSeenMtimeMs=new Map;unsubscribePolled;constructor(e,t){super(e,t)}clearTrackingState(e){this.trackingFilePaths.delete(e),this.trackingInactiveCount.delete(e),this.lastSeenMtimeMs.delete(e)}async persistImportedStatus(e){let{session:t}=await n.request(o.getByLogFilePath,{logFilePath:e});return!t||t.status!==`tracking`||(await n.request(o.updateStatus,{adapterSessionId:t.adapterSessionId,status:`imported`})).success?!0:(console.warn(`${this.logPrefix} Failed to persist imported status for ${e}`),!1)}async start(){!this.isEnabled()||this.isRunning()||(await super.start(),this.unsubscribePolled=this.watcher.onPolled(e=>{this.onPollCycle(e).catch(e=>{console.error(`${this.logPrefix} Error handling poll cycle:`,e instanceof Error?e.message:String(e))})}),await this.restorePersistedTrackingState())}async stop(){this.unsubscribePolled?.(),this.unsubscribePolled=void 0,await super.stop()}async dispose(){this.trackingFilePaths.clear(),this.trackingInactiveCount.clear(),this.lastSeenMtimeMs.clear(),await super.dispose()}async handleFileChange(t){let{filePath:r,changeType:i,stat:a}=t;if(this.shouldSkipFile(r))return;let{cursor:o}=await n.request(e.get,{filePath:r});if(!o){await this.discoverNewFile(t);return}i===`modified`&&await this.handleModifiedImportedFile(r,t,a.mtime)}async restorePersistedTrackingState(){this.trackingFilePaths.clear(),this.trackingInactiveCount.clear(),this.lastSeenMtimeMs.clear();try{let{sessions:e}=await n.request(o.list,{});for(let t of e){if(t.status!==`tracking`||!t.logFilePath)continue;let e=this.watcher.getTrackedFileMtimeMs(t.logFilePath);e!==void 0&&(this.trackingFilePaths.add(t.logFilePath),this.trackingInactiveCount.set(t.logFilePath,0),this.lastSeenMtimeMs.set(t.logFilePath,e))}}catch(e){console.warn(`[DiscoveryOrchestrator] Failed to restore persisted tracking state:`,e instanceof Error?e.message:String(e))}}async discoverNewFile(e){let{filePath:t,stat:n}=e,i=await this.importer.extractDiscoveryMetadata(t);if(!(i.hasMessages??!1)){await this.updateCursor(t,0,n.mtime);return}if(await this.isSessionSkipped(i.adapterSessionId)){await this.updateCursor(t,0,n.mtime);return}let a=this.queueEvent({subject:r.session.discovered,payload:{adapterId:this.config.adapterId,adapterName:this.config.adapterName,adapterSessionId:i.adapterSessionId,model:i.model??null,cwd:i.cwd??null,title:i.title,parentAdapterSessionId:i.parentAdapterSessionId??null,forkPointMessageId:i.forkPointMessageId??null,kind:i.kind??`root`,startedAt:i.startedAt,logFilePath:t}});await this.eventQueue.queueAfterEvents(()=>this.updateCursor(t,0,n.mtime),[a])}async handleModifiedImportedFile(e,t,r){let{session:i}=await n.request(o.getByLogFilePath,{logFilePath:e});if(!i){await this.discoverNewFile(t);return}if(!(i.status!==`imported`&&i.status!==`tracking`)){if(await super.handleFileChange(t),i.status===`imported`&&!(await n.request(o.updateStatus,{adapterSessionId:i.adapterSessionId,status:`tracking`})).success){console.warn(`${this.logPrefix} Failed to persist tracking status for ${e}`);return}this.trackingFilePaths.add(e),this.lastSeenMtimeMs.set(e,r.getTime()),this.trackingInactiveCount.delete(e),this.watcher.triggerImmediatePoll(e)}}async onPollCycle(e){for(let t of[...this.trackingFilePaths]){if(!e.has(t)){await this.persistImportedStatus(t)&&this.clearTrackingState(t);continue}let n=this.watcher.getTrackedFileMtimeMs(t),r=this.lastSeenMtimeMs.get(t);if(!(n===void 0||r===void 0))try{if(n===r){let e=(this.trackingInactiveCount.get(t)??0)+1;e>=3?await this.persistImportedStatus(t)&&this.clearTrackingState(t):this.trackingInactiveCount.set(t,e)}else this.lastSeenMtimeMs.set(t,n),this.trackingInactiveCount.delete(t)}catch(e){console.warn(`${this.logPrefix} Failed to process tracked file ${t}:`,e instanceof Error?e.message:String(e))}}}};export{M as BaseLogOrchestrator,N as DiscoveryOrchestrator,d as parseJsonlFile,f as readFirstJsonlRecords,p as someJsonlRecord};
|