@maudecode/talaria-web 1.13.0 → 1.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_release.json +4 -4
- package/dist/api/automation-router.d.ts +102 -0
- package/dist/api/automation-router.js +2 -0
- package/dist/api/automation-router.js.map +1 -1
- package/dist/api/chat-router.d.ts +589 -52
- package/dist/api/chat-router.js +111 -121
- package/dist/api/chat-router.js.map +1 -1
- package/dist/api/router.d.ts +2 -1
- package/dist/api/router.js +3 -1
- package/dist/api/router.js.map +1 -1
- package/dist/api/sessions-router.d.ts +1918 -299
- package/dist/api/sessions-router.js +39 -24
- package/dist/api/sessions-router.js.map +1 -1
- package/dist/api/settings-router.d.ts +45 -8
- package/dist/api/settings-router.js +14 -10
- package/dist/api/settings-router.js.map +1 -1
- package/dist/api/sse-routes.js +1 -1
- package/dist/api/sse-routes.js.map +1 -1
- package/dist/app.d.ts +2728 -416
- package/dist/config/agent-config.js +20 -15
- package/dist/config/agent-config.js.map +1 -1
- package/dist/http/context.d.ts +4 -2
- package/dist/http/context.js.map +1 -1
- package/dist/onboarding.d.ts +1 -1
- package/dist/onboarding.js +2 -1
- package/dist/onboarding.js.map +1 -1
- package/dist/providers/catalog.d.ts +11 -0
- package/dist/providers/catalog.js +32 -1
- package/dist/providers/catalog.js.map +1 -1
- package/dist/runtime.js +56 -17
- package/dist/runtime.js.map +1 -1
- package/dist/server.js +3 -0
- package/dist/server.js.map +1 -1
- package/dist/sessions/background-tasks.d.ts +137 -0
- package/dist/sessions/background-tasks.js +349 -0
- package/dist/sessions/background-tasks.js.map +1 -0
- package/dist/sessions/background-updates.d.ts +56 -0
- package/dist/sessions/background-updates.js +152 -0
- package/dist/sessions/background-updates.js.map +1 -0
- package/dist/sessions/cli-sessions.d.ts +6 -0
- package/dist/sessions/cli-sessions.js +20 -7
- package/dist/sessions/cli-sessions.js.map +1 -1
- package/dist/sessions/completions.d.ts +17 -1
- package/dist/sessions/completions.js +83 -12
- package/dist/sessions/completions.js.map +1 -1
- package/dist/sessions/compress.d.ts +33 -0
- package/dist/sessions/compress.js +66 -0
- package/dist/sessions/compress.js.map +1 -0
- package/dist/sessions/journal.d.ts +27 -12
- package/dist/sessions/journal.js +115 -40
- package/dist/sessions/journal.js.map +1 -1
- package/dist/sessions/list.d.ts +14 -0
- package/dist/sessions/list.js +89 -16
- package/dist/sessions/list.js.map +1 -1
- package/dist/sessions/merge.d.ts +19 -1
- package/dist/sessions/merge.js +75 -7
- package/dist/sessions/merge.js.map +1 -1
- package/dist/sessions/relay.d.ts +17 -1
- package/dist/sessions/relay.js +74 -13
- package/dist/sessions/relay.js.map +1 -1
- package/dist/sessions/service.d.ts +61 -3
- package/dist/sessions/service.js +244 -16
- package/dist/sessions/service.js.map +1 -1
- package/dist/sessions/session.d.ts +16 -0
- package/dist/sessions/session.js +23 -2
- package/dist/sessions/session.js.map +1 -1
- package/dist/sessions/source-kind.d.ts +22 -0
- package/dist/sessions/source-kind.js +54 -0
- package/dist/sessions/source-kind.js.map +1 -0
- package/dist/sessions/state-db.d.ts +10 -1
- package/dist/sessions/state-db.js +48 -17
- package/dist/sessions/state-db.js.map +1 -1
- package/dist/sessions/store.d.ts +2 -0
- package/dist/sessions/store.js +23 -4
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/streams.d.ts +3 -0
- package/dist/sessions/streams.js +0 -5
- package/dist/sessions/streams.js.map +1 -1
- package/dist/sessions/titles.d.ts +4 -0
- package/dist/sessions/titles.js +16 -0
- package/dist/sessions/titles.js.map +1 -1
- package/dist/sessions/turn-context.d.ts +1 -0
- package/dist/sessions/turn-context.js +3 -0
- package/dist/sessions/turn-context.js.map +1 -1
- package/dist/sessions/turn.d.ts +66 -6
- package/dist/sessions/turn.js +306 -63
- package/dist/sessions/turn.js.map +1 -1
- package/dist/settings.d.ts +2 -0
- package/dist/settings.js +6 -0
- package/dist/settings.js.map +1 -1
- package/dist/tools/crons.d.ts +34 -3
- package/dist/tools/crons.js +271 -31
- package/dist/tools/crons.js.map +1 -1
- package/dist/tools/hygiene.d.ts +11 -3
- package/dist/tools/hygiene.js +32 -14
- package/dist/tools/hygiene.js.map +1 -1
- package/package.json +2 -2
- package/sidecar/talaria_sidecar/__init__.py +1 -1
- package/sidecar/talaria_sidecar/methods/chat.py +233 -6
- package/sidecar/talaria_sidecar/methods/cron.py +22 -14
- package/sidecar/talaria_sidecar/methods/process.py +318 -0
- package/static/dist/FILES.txt +120 -119
- package/static/dist/assets/AppShell-orat1s43.js +1 -0
- package/static/dist/assets/ChatPage-ojhka3hy.js +22 -0
- package/static/dist/assets/HubRoute-gxgw1t33.js +2 -0
- package/static/dist/assets/{Markdown-bx4n7qs4.js → Markdown-dy8t4dy7.js} +7 -7
- package/static/dist/assets/{RightPanel-ds4majj3.js → RightPanel-c66ani1s.js} +1 -1
- package/static/dist/assets/Select-fswf66up.js +1 -0
- package/static/dist/assets/SessionListPanel-goh5mtt8.js +1 -0
- package/static/dist/assets/{SettingsLayout-oigbg9rl.js → SettingsLayout-n5d4wq4m.js} +1 -1
- package/static/dist/assets/States-kxyu50at.js +1 -0
- package/static/dist/assets/Toaster-6zmbcqgg.js +1 -0
- package/static/dist/assets/_app-fowyruiu.js +1 -0
- package/static/dist/assets/_app.ext._extensionId-nvjyrwhy.js +1 -0
- package/static/dist/assets/_app.index-c9zv4y7w.js +1 -0
- package/static/dist/assets/_app.insights-jf12nofo.js +1 -0
- package/static/dist/assets/_app.kanban-lri5a4yu.js +1 -0
- package/static/dist/assets/_app.logs-md1p0zqo.js +1 -0
- package/static/dist/assets/_app.memory-bzvf2e28.js +1 -0
- package/static/dist/assets/_app.profiles-jpg7zmbn.js +1 -0
- package/static/dist/assets/{_app.session._sessionId-ciix6itb.js → _app.session._sessionId-gyoh5ylx.js} +1 -1
- package/static/dist/assets/_app.settings-mpuwlx4j.js +1 -0
- package/static/dist/assets/_app.settings._section-knz8rwoj.js +1 -0
- package/static/dist/assets/_app.skills-fwu1dkir.js +1 -0
- package/static/dist/assets/_app.tasks-h9gphtl3.js +2 -0
- package/static/dist/assets/_app.todos-hd1dnvrh.js +1 -0
- package/static/dist/assets/_app.workspaces-l8toyn5f.js +1 -0
- package/static/dist/assets/{abnfDiagram-VCTEODGH-krt0yaru.js → abnfDiagram-VCTEODGH-cjqletra.js} +1 -1
- package/static/dist/assets/architecture-7GRP2DOG-cavnusaw.js +1 -0
- package/static/dist/assets/{architectureDiagram-5GKGNRK7-i54t9ywl.js → architectureDiagram-5GKGNRK7-k5a7v36n.js} +1 -1
- package/static/dist/assets/back-e4m6nsnm.js +1 -0
- package/static/dist/assets/{blockDiagram-I7D4REHJ-fevbz4mz.js → blockDiagram-I7D4REHJ-b195z021.js} +1 -1
- package/static/dist/assets/{c4Diagram-7LVT6UL2-np8eclmc.js → c4Diagram-7LVT6UL2-olu212k1.js} +1 -1
- package/static/dist/assets/channel-gozy3dp3.js +1 -0
- package/static/dist/assets/{chunk-4HAMMTFA-owoi036m.js → chunk-4HAMMTFA-b8o1nufs.js} +1 -1
- package/static/dist/assets/{chunk-75Z2AOVW-md44zf1n.js → chunk-75Z2AOVW-l1seddto.js} +1 -1
- package/static/dist/assets/{chunk-DU6HZSFF-ka3rw8d6.js → chunk-DU6HZSFF-lo5zg15v.js} +3 -3
- package/static/dist/assets/{chunk-F27PBJKO-iasnjsky.js → chunk-F27PBJKO-dsdzrp16.js} +1 -1
- package/static/dist/assets/{chunk-GMAD6QVW-ex1up6tz.js → chunk-GMAD6QVW-f3fxqq8b.js} +1 -1
- package/static/dist/assets/{chunk-GVQU2GXP-d4kmmg9p.js → chunk-GVQU2GXP-h8egxtf6.js} +1 -1
- package/static/dist/assets/{chunk-IMKFNOWR-mwy42t85.js → chunk-IMKFNOWR-iolwd8s0.js} +1 -1
- package/static/dist/assets/{chunk-L3NEJ4N5-fv7ry213.js → chunk-L3NEJ4N5-b88bbtwi.js} +1 -1
- package/static/dist/assets/{chunk-OSK3NFVY-jg9ir8ac.js → chunk-OSK3NFVY-e3e7nr6s.js} +1 -1
- package/static/dist/assets/{chunk-P2QGCYS3-pe9ms3ua.js → chunk-P2QGCYS3-mdc46rt1.js} +1 -1
- package/static/dist/assets/{chunk-POPQ4Y6H-dimsjrn1.js → chunk-POPQ4Y6H-kqlllrrm.js} +1 -1
- package/static/dist/assets/{chunk-PWAF6VOD-m4hv98dy.js → chunk-PWAF6VOD-he585k2x.js} +1 -1
- package/static/dist/assets/{chunk-SHT3W25Y-gkjgl6qe.js → chunk-SHT3W25Y-gh94y9a4.js} +1 -1
- package/static/dist/assets/{chunk-SVP7TREG-bc8qss5l.js → chunk-SVP7TREG-euxp9y7e.js} +1 -1
- package/static/dist/assets/{chunk-TICWLB2K-k9wzw38w.js → chunk-TICWLB2K-c8cxes1q.js} +1 -1
- package/static/dist/assets/classDiagram-ZZMXUADV-n0vs2f2q.js +1 -0
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-n0vs2f2q.js +1 -0
- package/static/dist/assets/{copied-d5joolw7.js → copied-kq0u3ht7.js} +1 -1
- package/static/dist/assets/{cynefin-OW5HDTMX-hueklikk.js → cynefin-OW5HDTMX-lxd44ux4.js} +1 -1
- package/static/dist/assets/{cynefinDiagram-5FMLGOSQ-e83o1wr1.js → cynefinDiagram-5FMLGOSQ-njpiwat8.js} +1 -1
- package/static/dist/assets/{dagre-GXQ25YYZ-ir1tj2ar.js → dagre-GXQ25YYZ-nvgy6yju.js} +1 -1
- package/static/dist/assets/{diagram-S7CK7UJ4-o5218p2q.js → diagram-S7CK7UJ4-g98nyv72.js} +1 -1
- package/static/dist/assets/{diagram-UQ7AKVKN-ciad4o1i.js → diagram-UQ7AKVKN-ovgm6lvv.js} +1 -1
- package/static/dist/assets/{diagram-VSXAHHWV-oharqjbt.js → diagram-VSXAHHWV-pb2bn2e4.js} +1 -1
- package/static/dist/assets/{diagram-VX7I27RA-wkwy62iv.js → diagram-VX7I27RA-6j4mvfqo.js} +1 -1
- package/static/dist/assets/{diagram-Z3DM3KII-bl252i7r.js → diagram-Z3DM3KII-dqmb982r.js} +1 -1
- package/static/dist/assets/{ebnfDiagram-PWID7BFC-nm0rcly7.js → ebnfDiagram-PWID7BFC-ozbpzb6d.js} +1 -1
- package/static/dist/assets/endpoints-k8agnro8.js +9 -0
- package/static/dist/assets/{erDiagram-RLTQ6QDP-m1w0vta2.js → erDiagram-RLTQ6QDP-hl7m8vua.js} +1 -1
- package/static/dist/assets/eventmodeling-NTZA5JFV-j1y2ekec.js +1 -0
- package/static/dist/assets/flowDiagram-HODETNUW-g2cvcbm5.js +1 -0
- package/static/dist/assets/{ganttDiagram-EL5Y4UJY-czxo6iew.js → ganttDiagram-EL5Y4UJY-ompixqmh.js} +1 -1
- package/static/dist/assets/{gitGraph-4MIJSDKK-ip9j1rph.js → gitGraph-4MIJSDKK-b6vxwp9q.js} +1 -1
- package/static/dist/assets/{gitGraphDiagram-WWUBYQGX-kalxdole.js → gitGraphDiagram-WWUBYQGX-k98f57on.js} +1 -1
- package/static/dist/assets/{highlighted-body-KPVGNVTW-lgsj6fsk.js → highlighted-body-KPVGNVTW-cd3ff6ge.js} +1 -1
- package/static/dist/assets/index-nfy0ezs6.css +2 -0
- package/static/dist/assets/index-nqed3oum.js +11 -0
- package/static/dist/assets/{info-A6RAGUB7-fv4fbc5m.js → info-A6RAGUB7-hjcwjami.js} +1 -1
- package/static/dist/assets/{infoDiagram-27XIBGKW-kinx5jsl.js → infoDiagram-27XIBGKW-fm06rj36.js} +1 -1
- package/static/dist/assets/{ishikawaDiagram-5VMMS53U-kozvlqdv.js → ishikawaDiagram-5VMMS53U-bxak4mwu.js} +1 -1
- package/static/dist/assets/{journeyDiagram-3NMN7TZE-lgpouxoe.js → journeyDiagram-3NMN7TZE-khmihclr.js} +1 -1
- package/static/dist/assets/{kanban-definition-UXKFOSKX-b320wo7b.js → kanban-definition-UXKFOSKX-h1r32wdx.js} +1 -1
- package/static/dist/assets/{lazyRouteComponent-hy8doeye.js → lazyRouteComponent-b2eg0fws.js} +1 -1
- package/static/dist/assets/{line-gxfwyhjq.js → line-friyjof3.js} +1 -1
- package/static/dist/assets/link-m90ahx3n.js +1 -0
- package/static/dist/assets/login-bw7m2fzo.js +1 -0
- package/static/dist/assets/mermaid-HWGCJPDP-njwcl62n.js +1 -0
- package/static/dist/assets/{mermaid-parser.core-loxeqsu3.js → mermaid-parser.core-f1gvpwrt.js} +3 -3
- package/static/dist/assets/{mindmap-definition-YA3MSWOX-edi534gc.js → mindmap-definition-YA3MSWOX-mt2oxwue.js} +1 -1
- package/static/dist/assets/onboarding-ret37j1e.js +1 -0
- package/static/dist/assets/{packet-AYTQ26CC-gmb3yy71.js → packet-AYTQ26CC-jik4ixlf.js} +1 -1
- package/static/dist/assets/{pegDiagram-XKGWAZYB-fxy5j8cx.js → pegDiagram-XKGWAZYB-erxlv6cc.js} +1 -1
- package/static/dist/assets/{pie-WAS4IAKB-do2pm4s6.js → pie-WAS4IAKB-mnkoldfl.js} +1 -1
- package/static/dist/assets/{pieDiagram-E7YTZNPT-mgjvb365.js → pieDiagram-E7YTZNPT-i7lwrada.js} +1 -1
- package/static/dist/assets/{quadrantDiagram-AXDQQJYC-dhok6m1j.js → quadrantDiagram-AXDQQJYC-fr8ejdoy.js} +1 -1
- package/static/dist/assets/{radar-RG4KPBEZ-n5giw3vb.js → radar-RG4KPBEZ-otarjte2.js} +1 -1
- package/static/dist/assets/{railroad-74A4TZTK-h6nfs9bj.js → railroad-74A4TZTK-lw362oto.js} +1 -1
- package/static/dist/assets/railroad-abnf-HS5TGJTU-m741owar.js +1 -0
- package/static/dist/assets/railroad-ebnf-LZEXJU2U-noa4fbia.js +1 -0
- package/static/dist/assets/railroad-peg-WCYAUIDC-o4bpw4nb.js +1 -0
- package/static/dist/assets/{railroadDiagram-O6MQD6OU-lfwg92r4.js → railroadDiagram-O6MQD6OU-esyn75pw.js} +1 -1
- package/static/dist/assets/{refresh-cw-bg6oc499.js → refresh-cw-k66keho6.js} +1 -1
- package/static/dist/assets/{requirementDiagram-BXWQKSXE-c5k5pg07.js → requirementDiagram-BXWQKSXE-cyhi5u29.js} +1 -1
- package/static/dist/assets/{sankeyDiagram-P5KCCOFB-o9auio4y.js → sankeyDiagram-P5KCCOFB-jljpbo0h.js} +1 -1
- package/static/dist/assets/{saved-j5wyhbik.js → saved-do49si3v.js} +1 -1
- package/static/dist/assets/{search-ipa17zlr.js → search-j5ki6a9o.js} +1 -1
- package/static/dist/assets/{sequenceDiagram-WJ2MYXX4-pfgodnmk.js → sequenceDiagram-WJ2MYXX4-fz0dhlu7.js} +1 -1
- package/static/dist/assets/{settings_section_extensions_title-fcfjf6l8.js → settings_section_extensions_title-b7lojn0o.js} +1 -1
- package/static/dist/assets/share._token-kg8w647b.js +2 -0
- package/static/dist/assets/{sliders-horizontal-bfrh4rch.js → sliders-horizontal-c4wya4dy.js} +1 -1
- package/static/dist/assets/{stateDiagram-D77RDMKH-m1y2cr3q.js → stateDiagram-D77RDMKH-kdnithdx.js} +1 -1
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-k2wg2645.js +1 -0
- package/static/dist/assets/{swimlanes-42K2YHIH-hzai6fwo.js → swimlanes-42K2YHIH-esd6gmz3.js} +1 -1
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-n5kvjtgr.js +8 -0
- package/static/dist/assets/tabBuild-bjmyvmn5.js +56 -0
- package/static/dist/assets/{timeline-definition-24CTP7MA-gwefy9gi.js → timeline-definition-24CTP7MA-g0qygccv.js} +1 -1
- package/static/dist/assets/todoStore-kjk5l0sy.js +1 -0
- package/static/dist/assets/{treeView-Q6P3EWNA-7q91p0dn.js → treeView-Q6P3EWNA-ndchzkuu.js} +1 -1
- package/static/dist/assets/{treemap-WGGIJYW6-occom39a.js → treemap-WGGIJYW6-hwjxj0zz.js} +1 -1
- package/static/dist/assets/{untitled-cgw2enra.js → untitled-mbr6tuhu.js} +1 -1
- package/static/dist/assets/useForm-ocxu460f.js +1 -0
- package/static/dist/assets/useLocale-fzy5jhg6.js +1 -0
- package/static/dist/assets/{useParams-gpbjxj8s.js → useParams-lo9u33d1.js} +1 -1
- package/static/dist/assets/{useSearch-bhdptos7.js → useSearch-lq1mr090.js} +1 -1
- package/static/dist/assets/{vennDiagram-4TSXK5OY-ew4bhldi.js → vennDiagram-4TSXK5OY-gubovd1r.js} +1 -1
- package/static/dist/assets/{wardley-WFR3VGLG-njdacy0u.js → wardley-WFR3VGLG-ir3om65j.js} +1 -1
- package/static/dist/assets/{wardleyDiagram-VM6X3IG4-mkvxx7u9.js → wardleyDiagram-VM6X3IG4-ce0or1ie.js} +1 -1
- package/static/dist/assets/{xychartDiagram-S5SC5T6Z-8uriotdw.js → xychartDiagram-S5SC5T6Z-dexylcjg.js} +1 -1
- package/static/dist/index.html +1 -1
- package/static/dist/sw.js +1 -1
- package/static/dist/assets/AppShell-irdqom6e.js +0 -1
- package/static/dist/assets/ChatPage-ldhqevjn.js +0 -20
- package/static/dist/assets/HubRoute-hq24vhj8.js +0 -2
- package/static/dist/assets/Select-gpqmt6x1.js +0 -1
- package/static/dist/assets/SessionListPanel-hkvipik4.js +0 -1
- package/static/dist/assets/States-fn4o2wdf.js +0 -1
- package/static/dist/assets/Toaster-cwnut53k.js +0 -1
- package/static/dist/assets/_app-h6ago6y6.js +0 -1
- package/static/dist/assets/_app.ext._extensionId-erqnfff5.js +0 -1
- package/static/dist/assets/_app.index-cq2fxmda.js +0 -1
- package/static/dist/assets/_app.insights-nzhld9gu.js +0 -1
- package/static/dist/assets/_app.kanban-m5uggety.js +0 -1
- package/static/dist/assets/_app.logs-d2kk9lza.js +0 -1
- package/static/dist/assets/_app.memory-gcmop1e7.js +0 -1
- package/static/dist/assets/_app.profiles-e9b2my7x.js +0 -1
- package/static/dist/assets/_app.settings-kcjum3c1.js +0 -1
- package/static/dist/assets/_app.settings._section-bi4jjex0.js +0 -1
- package/static/dist/assets/_app.skills-e4e61l23.js +0 -1
- package/static/dist/assets/_app.tasks-f1evdhbl.js +0 -2
- package/static/dist/assets/_app.todos-o7ijtk42.js +0 -1
- package/static/dist/assets/_app.workspaces-o18voh0w.js +0 -1
- package/static/dist/assets/architecture-7GRP2DOG-notdhmpv.js +0 -1
- package/static/dist/assets/channel-jpk1nas2.js +0 -1
- package/static/dist/assets/classDiagram-ZZMXUADV-hld301gc.js +0 -1
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-hld301gc.js +0 -1
- package/static/dist/assets/endpoints-d8n28yf3.js +0 -64
- package/static/dist/assets/eventmodeling-NTZA5JFV-eaqs19mj.js +0 -1
- package/static/dist/assets/flowDiagram-HODETNUW-eli5764n.js +0 -1
- package/static/dist/assets/index-l08181vr.js +0 -11
- package/static/dist/assets/index-pdtcl20t.css +0 -2
- package/static/dist/assets/link-ib4prsn5.js +0 -1
- package/static/dist/assets/login-llplsuey.js +0 -1
- package/static/dist/assets/mermaid-HWGCJPDP-f3scrlds.js +0 -1
- package/static/dist/assets/onboarding-n1xhlgym.js +0 -1
- package/static/dist/assets/railroad-abnf-HS5TGJTU-d5gaaud9.js +0 -1
- package/static/dist/assets/railroad-ebnf-LZEXJU2U-ihudnbec.js +0 -1
- package/static/dist/assets/railroad-peg-WCYAUIDC-lgpvhel7.js +0 -1
- package/static/dist/assets/share._token-i339gqj4.js +0 -2
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-hehvfv55.js +0 -1
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-nfk9mtst.js +0 -8
- package/static/dist/assets/todoStore-fhvdsen0.js +0 -1
- package/static/dist/assets/useForm-jwbfla68.js +0 -1
- package/static/dist/assets/useLocale-gieo1fn7.js +0 -1
- package/static/dist/assets/useSelector-f2aak1ol.js +0 -1
|
@@ -4,8 +4,13 @@ routing; the sidecar drains and formats registry events."""
|
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
7
|
+
import json
|
|
7
8
|
import logging
|
|
8
9
|
import queue
|
|
10
|
+
import sqlite3
|
|
11
|
+
import time
|
|
12
|
+
from contextlib import closing
|
|
13
|
+
from pathlib import Path
|
|
9
14
|
|
|
10
15
|
from ..errors import InvalidParams
|
|
11
16
|
from ..home import profile_home_param, scoped_home
|
|
@@ -89,6 +94,62 @@ def mark_consumed(process_id: str) -> bool:
|
|
|
89
94
|
return False
|
|
90
95
|
|
|
91
96
|
|
|
97
|
+
def _delivery_api():
|
|
98
|
+
"""The Agent's durable delivery ledger (``tools.async_delegation``), or None on an Agent without it."""
|
|
99
|
+
try:
|
|
100
|
+
from tools import async_delegation
|
|
101
|
+
except Exception: # noqa: BLE001
|
|
102
|
+
return None
|
|
103
|
+
names = ("claim_event_delivery", "complete_event_delivery", "release_event_delivery")
|
|
104
|
+
return async_delegation if all(callable(getattr(async_delegation, n, None)) for n in names) else None
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def _ledger_event(evt: dict) -> dict:
|
|
108
|
+
return {k: v for k, v in evt.items() if k not in ("process_id", "consumed")}
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def claim_delivery(evt: dict, consumer: str) -> str | None:
|
|
112
|
+
"""Claim a durable delegation completion before delivering it (TAL-459).
|
|
113
|
+
|
|
114
|
+
``None``: another consumer holds it, or the ledger already delivered or dropped it, so do not deliver.
|
|
115
|
+
``""``: nothing durable to acknowledge (interim notice, legacy event, or an Agent without the ledger)."""
|
|
116
|
+
api = _delivery_api()
|
|
117
|
+
if api is None:
|
|
118
|
+
return ""
|
|
119
|
+
claim_id = api.claim_event_delivery(_ledger_event(evt), consumer)
|
|
120
|
+
return None if claim_id is None else str(claim_id)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def complete_delivery(evt: dict, claim_id: str) -> bool:
|
|
124
|
+
api = _delivery_api()
|
|
125
|
+
if api is None or not claim_id:
|
|
126
|
+
return False
|
|
127
|
+
api.complete_event_delivery(_ledger_event(evt), claim_id)
|
|
128
|
+
return True
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def release_delivery(evt: dict, claim_id: str) -> bool:
|
|
132
|
+
api = _delivery_api()
|
|
133
|
+
if api is None or not claim_id:
|
|
134
|
+
return False
|
|
135
|
+
api.release_event_delivery(_ledger_event(evt), claim_id)
|
|
136
|
+
return True
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def defer_delivery(evt: dict, claim_id: str) -> bool:
|
|
140
|
+
"""Hand back a claim the target never admitted (its session was busy) without spending a delivery attempt;
|
|
141
|
+
the Agent drops a row for good after its attempt budget, so a busy session must not burn it."""
|
|
142
|
+
api = _delivery_api()
|
|
143
|
+
if api is None or not claim_id:
|
|
144
|
+
return False
|
|
145
|
+
defer = getattr(api, "defer_completion_delivery", None)
|
|
146
|
+
if not callable(defer) or evt.get("type") != "async_delegation" or not evt.get("delegation_id"):
|
|
147
|
+
api.release_event_delivery(_ledger_event(evt), claim_id)
|
|
148
|
+
return True
|
|
149
|
+
defer(str(evt["delegation_id"]), claim_id)
|
|
150
|
+
return True
|
|
151
|
+
|
|
152
|
+
|
|
92
153
|
def format_notification(evt: dict) -> str:
|
|
93
154
|
if evt.get("type") == "async_delegation":
|
|
94
155
|
try:
|
|
@@ -122,6 +183,210 @@ def list_sessions() -> list[dict]:
|
|
|
122
183
|
return out
|
|
123
184
|
|
|
124
185
|
|
|
186
|
+
_LEDGER_COLUMNS = "delegation_id, origin_ui_session_id, state, dispatched_at, completed_at, updated_at, task_json, result_json, event_json IS NOT NULL"
|
|
187
|
+
_LEDGER_LIMIT = 200
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def _json(text) -> dict:
|
|
191
|
+
try:
|
|
192
|
+
value = json.loads(text) if text else {}
|
|
193
|
+
except (TypeError, ValueError):
|
|
194
|
+
return {}
|
|
195
|
+
return value if isinstance(value, dict) else {}
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def _unit_goals(task: dict) -> list[str]:
|
|
199
|
+
goals = task.get("goals") if isinstance(task.get("goals"), list) else None
|
|
200
|
+
indexes = task.get("task_indexes") if isinstance(task.get("task_indexes"), list) else None
|
|
201
|
+
if goals and indexes:
|
|
202
|
+
return [str(goals[i]) for i in indexes if isinstance(i, int) and 0 <= i < len(goals)]
|
|
203
|
+
if goals:
|
|
204
|
+
return [str(g) for g in goals]
|
|
205
|
+
return [str(task.get("goal") or "")]
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def _child_statuses(result: dict) -> list[str]:
|
|
209
|
+
"""Per-subagent outcome of a finished unit: a batch carries ``results``, a single task is its own result."""
|
|
210
|
+
if isinstance(result.get("results"), list):
|
|
211
|
+
return [str(r.get("status") or "") for r in result["results"] if isinstance(r, dict)]
|
|
212
|
+
return [str(result.get("status") or "")] if result else []
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def _ledger_rows(home: Path, session_ids: list[str]) -> list[dict]:
|
|
216
|
+
db_path = home / "state.db"
|
|
217
|
+
if not db_path.exists() or not session_ids:
|
|
218
|
+
return []
|
|
219
|
+
marks = ",".join("?" * len(session_ids))
|
|
220
|
+
with closing(sqlite3.connect(f"{db_path.resolve().as_uri()}?mode=ro", uri=True, timeout=5)) as conn:
|
|
221
|
+
try:
|
|
222
|
+
rows = conn.execute(f"SELECT {_LEDGER_COLUMNS} FROM async_delegations WHERE origin_ui_session_id IN ({marks}) ORDER BY dispatched_at DESC LIMIT ?", [*session_ids, _LEDGER_LIMIT]).fetchall()
|
|
223
|
+
except sqlite3.OperationalError: # an Agent that never delegated has no ledger table yet
|
|
224
|
+
return []
|
|
225
|
+
out = []
|
|
226
|
+
for delegation_id, origin, state, dispatched_at, completed_at, updated_at, task_json, result_json, has_event in rows:
|
|
227
|
+
task, result = _json(task_json), _json(result_json)
|
|
228
|
+
goals = _unit_goals(task)
|
|
229
|
+
out.append({
|
|
230
|
+
"delegation_id": delegation_id, "origin_ui_session_id": origin, "state": state, "dispatched_at": dispatched_at,
|
|
231
|
+
"completed_at": completed_at, "updated_at": updated_at, "goals": goals,
|
|
232
|
+
"child_statuses": _child_statuses(result), "has_result": bool(has_event),
|
|
233
|
+
})
|
|
234
|
+
return out
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
def _live_delegations() -> dict[str, dict]:
|
|
238
|
+
try:
|
|
239
|
+
from tools.async_delegation import list_async_delegations
|
|
240
|
+
items = list_async_delegations()
|
|
241
|
+
except Exception: # noqa: BLE001 - an Agent without the live registry reports from the ledger alone
|
|
242
|
+
return {}
|
|
243
|
+
return {str(i.get("delegation_id")): {"status": str(i.get("status") or "")} for i in items if isinstance(i, dict) and i.get("delegation_id")}
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def _owned_processes(session_ids: set[str]) -> list[dict]:
|
|
247
|
+
"""Notified or watched processes a WebUI session started (``session_key`` is the WebUI session id)."""
|
|
248
|
+
registry = _registry()
|
|
249
|
+
if registry is None:
|
|
250
|
+
return []
|
|
251
|
+
try:
|
|
252
|
+
with registry._lock:
|
|
253
|
+
sessions = [*registry._running.values(), *registry._finished.values()]
|
|
254
|
+
except Exception: # noqa: BLE001
|
|
255
|
+
return []
|
|
256
|
+
out = []
|
|
257
|
+
for proc in sessions:
|
|
258
|
+
if str(getattr(proc, "session_key", "") or "") not in session_ids:
|
|
259
|
+
continue
|
|
260
|
+
watched = bool(getattr(proc, "watch_patterns", None))
|
|
261
|
+
if not (getattr(proc, "notify_on_complete", False) or watched):
|
|
262
|
+
continue
|
|
263
|
+
exited = bool(getattr(proc, "exited", False))
|
|
264
|
+
out.append({
|
|
265
|
+
"process_id": str(proc.id), "session_key": str(proc.session_key), "command": str(getattr(proc, "command", "") or "")[:200],
|
|
266
|
+
"started_at": float(getattr(proc, "started_at", 0) or 0) or None, "exited": exited,
|
|
267
|
+
"exited_at": float(getattr(proc, "exited_at", 0) or 0) or None, "exit_code": getattr(proc, "exit_code", None),
|
|
268
|
+
"completion_reason": str(getattr(proc, "completion_reason", "") or ""), "watched": watched,
|
|
269
|
+
})
|
|
270
|
+
return out
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
_CHILD_WINDOW_S = 5
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
def _live_children() -> list[dict]:
|
|
277
|
+
"""Running subagents from the Agent's in-process registry: the only place a child's session id sits next to its
|
|
278
|
+
delegation id. An Agent without the registry reports none."""
|
|
279
|
+
try:
|
|
280
|
+
from tools.delegate_tool_registry import _active_subagents, _active_subagents_lock
|
|
281
|
+
with _active_subagents_lock:
|
|
282
|
+
records = list(_active_subagents.values())
|
|
283
|
+
except Exception: # noqa: BLE001
|
|
284
|
+
return []
|
|
285
|
+
out = []
|
|
286
|
+
for r in records:
|
|
287
|
+
sid = getattr(r.get("agent"), "session_id", None)
|
|
288
|
+
if isinstance(sid, str) and sid:
|
|
289
|
+
out.append({"delegation_id": str(r.get("delegation_id") or ""), "goal": str(r.get("goal") or ""), "owner": str(r.get("owner_agent_session_id") or ""), "session_id": sid})
|
|
290
|
+
return out
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
def _ledger_children(home: Path, owners: list[str]) -> list[dict]:
|
|
294
|
+
"""Finished subagents' own sessions in state.db: ``source = subagent`` rows tagged ``_delegate_from`` with their
|
|
295
|
+
parent's session, each with its start time and first user message (the child's goal, sent verbatim)."""
|
|
296
|
+
db_path = home / "state.db"
|
|
297
|
+
if not db_path.exists() or not owners:
|
|
298
|
+
return []
|
|
299
|
+
marks = ",".join("?" * len(owners))
|
|
300
|
+
with closing(sqlite3.connect(f"{db_path.resolve().as_uri()}?mode=ro", uri=True, timeout=5)) as conn:
|
|
301
|
+
try:
|
|
302
|
+
# Only these chats' children: a long-lived profile keeps every subagent session it ever ran.
|
|
303
|
+
rows = conn.execute(
|
|
304
|
+
"SELECT s.id, s.model_config, s.started_at, (SELECT m.content FROM messages m WHERE m.session_id = s.id AND m.role = 'user' ORDER BY m.id LIMIT 1)"
|
|
305
|
+
f" FROM sessions s WHERE s.source = 'subagent' AND json_extract(s.model_config, '$._delegate_from') IN ({marks})", owners).fetchall()
|
|
306
|
+
except sqlite3.OperationalError:
|
|
307
|
+
return []
|
|
308
|
+
out = []
|
|
309
|
+
for sid, model_config, started_at, first in rows:
|
|
310
|
+
owner = _json(model_config).get("_delegate_from")
|
|
311
|
+
goal = _goal_text(first)
|
|
312
|
+
if owner in owners and goal:
|
|
313
|
+
out.append({"owner": owner, "session_id": sid, "started_at": started_at, "goal": goal})
|
|
314
|
+
return out
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
_CONTENT_JSON_PREFIX = "\x00json:"
|
|
318
|
+
_IMAGE_HINTS = "\n\n[Image attached"
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
def _goal_text(content) -> str:
|
|
322
|
+
"""The goal a child was sent, from its stored first message: a task with images is stored as multimodal parts
|
|
323
|
+
(native image input; the goal is the text part) or as the goal followed by image hints (text input)."""
|
|
324
|
+
if not isinstance(content, str):
|
|
325
|
+
return ""
|
|
326
|
+
if content.startswith(_CONTENT_JSON_PREFIX):
|
|
327
|
+
try:
|
|
328
|
+
parts = json.loads(content[len(_CONTENT_JSON_PREFIX):])
|
|
329
|
+
except ValueError:
|
|
330
|
+
return ""
|
|
331
|
+
texts = [p.get("text") for p in parts if isinstance(p, dict) and p.get("type") == "text"] if isinstance(parts, list) else []
|
|
332
|
+
return str(texts[0]) if texts and texts[0] else ""
|
|
333
|
+
return content.split(_IMAGE_HINTS, 1)[0]
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
def unit_children(unit: dict, owner: str, live: list[dict], finished: list[dict], now: float) -> list[dict]:
|
|
337
|
+
"""The subagent sessions one delegation unit ran, as ``{goal, session_id}`` per task, in task order. A live registry
|
|
338
|
+
record is exact (same owner, the unit's call id, the task's goal) and is used once. Without one, finished sessions
|
|
339
|
+
of that owner whose goal matches, started in the unit's window, count only when there are exactly as many as tasks
|
|
340
|
+
with that goal; anything else stays unlinked rather than guessed."""
|
|
341
|
+
unit_id, goals = unit["delegation_id"], [g for g in unit["goals"] if g]
|
|
342
|
+
pool = [r for r in live if r["owner"] == owner and r["delegation_id"] and (unit_id == r["delegation_id"] or unit_id.startswith(f"{r['delegation_id']}-"))]
|
|
343
|
+
linked: list[str | None] = []
|
|
344
|
+
used: set[str] = set()
|
|
345
|
+
for goal in goals:
|
|
346
|
+
record = next((r for r in pool if r["goal"] == goal and r["session_id"] not in used), None)
|
|
347
|
+
if record:
|
|
348
|
+
used.add(record["session_id"])
|
|
349
|
+
linked.append(record["session_id"] if record else None)
|
|
350
|
+
start = (unit.get("dispatched_at") or 0) - _CHILD_WINDOW_S
|
|
351
|
+
end = (unit.get("completed_at") or now) + _CHILD_WINDOW_S
|
|
352
|
+
for goal in {g for g, sid in zip(goals, linked) if sid is None}:
|
|
353
|
+
slots = [i for i, (g, sid) in enumerate(zip(goals, linked)) if g == goal and sid is None]
|
|
354
|
+
matches = sorted((c for c in finished if c["owner"] == owner and c["goal"] == goal and c["session_id"] not in used and start <= (c["started_at"] or 0) <= end), key=lambda c: c["started_at"] or 0)
|
|
355
|
+
if len(matches) == len(slots):
|
|
356
|
+
for i, c in zip(slots, matches):
|
|
357
|
+
linked[i] = c["session_id"]
|
|
358
|
+
return [{"goal": g, "session_id": sid} for g, sid in zip(goals, linked) if sid]
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
def background_list(home: Path, session_ids: list[str]) -> dict:
|
|
362
|
+
"""TAL-372: what the Agent knows about the background work of these WebUI sessions: delegations from the durable
|
|
363
|
+
ledger (with the live registry's status while they run) and notified processes from the process registry.
|
|
364
|
+
TAL-494: each delegation also names the subagent sessions it ran."""
|
|
365
|
+
live = _live_delegations()
|
|
366
|
+
delegations = _ledger_rows(home, session_ids)
|
|
367
|
+
live_children = _live_children()
|
|
368
|
+
finished = _ledger_children(home, session_ids) if delegations else []
|
|
369
|
+
now = time.time()
|
|
370
|
+
for row in delegations:
|
|
371
|
+
row["live_status"] = live.get(row["delegation_id"], {}).get("status")
|
|
372
|
+
row["children"] = unit_children(row, row["origin_ui_session_id"], live_children, finished, now)
|
|
373
|
+
return {"delegations": delegations, "processes": _owned_processes(set(session_ids))}
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
def delegation_result(home: Path, session_id: str, delegation_id: str) -> str:
|
|
377
|
+
"""The full result of a finished delegation unit, as the Agent words it for its own notification."""
|
|
378
|
+
db_path = home / "state.db"
|
|
379
|
+
if not db_path.exists():
|
|
380
|
+
return ""
|
|
381
|
+
with closing(sqlite3.connect(f"{db_path.resolve().as_uri()}?mode=ro", uri=True, timeout=5)) as conn:
|
|
382
|
+
try:
|
|
383
|
+
row = conn.execute("SELECT event_json FROM async_delegations WHERE delegation_id = ? AND origin_ui_session_id = ?", (delegation_id, session_id)).fetchone()
|
|
384
|
+
except sqlite3.OperationalError:
|
|
385
|
+
return ""
|
|
386
|
+
event = _json(row[0]) if row else {}
|
|
387
|
+
return format_notification(event) if event else ""
|
|
388
|
+
|
|
389
|
+
|
|
125
390
|
def register(registry_) -> None:
|
|
126
391
|
@registry_.method("process.drain")
|
|
127
392
|
def drain_(ctx: CallContext, params: dict) -> dict:
|
|
@@ -142,6 +407,39 @@ def register(registry_) -> None:
|
|
|
142
407
|
raise InvalidParams("process_id is required")
|
|
143
408
|
return {"ok": mark_consumed(process_id)}
|
|
144
409
|
|
|
410
|
+
def _delivery_params(params: dict) -> dict:
|
|
411
|
+
evt = params.get("event")
|
|
412
|
+
if not isinstance(evt, dict):
|
|
413
|
+
raise InvalidParams("event must be an object")
|
|
414
|
+
return evt
|
|
415
|
+
|
|
416
|
+
@registry_.method("process.claim_delivery")
|
|
417
|
+
def claim_(ctx: CallContext, params: dict) -> dict:
|
|
418
|
+
evt = _delivery_params(params)
|
|
419
|
+
consumer = str(params.get("consumer") or "").strip()
|
|
420
|
+
if not consumer:
|
|
421
|
+
raise InvalidParams("consumer is required")
|
|
422
|
+
with scoped_home(profile_home_param(params)):
|
|
423
|
+
return {"claim_id": claim_delivery(evt, consumer)}
|
|
424
|
+
|
|
425
|
+
@registry_.method("process.complete_delivery")
|
|
426
|
+
def complete_(ctx: CallContext, params: dict) -> dict:
|
|
427
|
+
evt = _delivery_params(params)
|
|
428
|
+
with scoped_home(profile_home_param(params)):
|
|
429
|
+
return {"ok": complete_delivery(evt, str(params.get("claim_id") or ""))}
|
|
430
|
+
|
|
431
|
+
@registry_.method("process.release_delivery")
|
|
432
|
+
def release_(ctx: CallContext, params: dict) -> dict:
|
|
433
|
+
evt = _delivery_params(params)
|
|
434
|
+
with scoped_home(profile_home_param(params)):
|
|
435
|
+
return {"ok": release_delivery(evt, str(params.get("claim_id") or ""))}
|
|
436
|
+
|
|
437
|
+
@registry_.method("process.defer_delivery")
|
|
438
|
+
def defer_(ctx: CallContext, params: dict) -> dict:
|
|
439
|
+
evt = _delivery_params(params)
|
|
440
|
+
with scoped_home(profile_home_param(params)):
|
|
441
|
+
return {"ok": defer_delivery(evt, str(params.get("claim_id") or ""))}
|
|
442
|
+
|
|
145
443
|
@registry_.method("process.format_notification")
|
|
146
444
|
def format_(ctx: CallContext, params: dict) -> dict:
|
|
147
445
|
evt = params.get("event")
|
|
@@ -149,6 +447,26 @@ def register(registry_) -> None:
|
|
|
149
447
|
raise InvalidParams("event must be an object")
|
|
150
448
|
return {"text": format_notification(evt)}
|
|
151
449
|
|
|
450
|
+
def _session_ids(params: dict) -> list[str]:
|
|
451
|
+
ids = params.get("session_ids")
|
|
452
|
+
if not isinstance(ids, list) or not all(isinstance(i, str) and i for i in ids):
|
|
453
|
+
raise InvalidParams("session_ids must be a list of session ids")
|
|
454
|
+
return ids
|
|
455
|
+
|
|
456
|
+
@registry_.method("process.background_list")
|
|
457
|
+
def background_list_(ctx: CallContext, params: dict) -> dict:
|
|
458
|
+
ids = _session_ids(params)
|
|
459
|
+
with scoped_home(profile_home_param(params)) as home:
|
|
460
|
+
return background_list(home, ids)
|
|
461
|
+
|
|
462
|
+
@registry_.method("process.delegation_result")
|
|
463
|
+
def delegation_result_(ctx: CallContext, params: dict) -> dict:
|
|
464
|
+
sid, did = str(params.get("session_id") or ""), str(params.get("delegation_id") or "")
|
|
465
|
+
if not sid or not did:
|
|
466
|
+
raise InvalidParams("session_id and delegation_id are required")
|
|
467
|
+
with scoped_home(profile_home_param(params)) as home:
|
|
468
|
+
return {"text": delegation_result(home, sid, did)}
|
|
469
|
+
|
|
152
470
|
@registry_.method("process.list")
|
|
153
471
|
def list_(ctx: CallContext, params: dict) -> dict:
|
|
154
472
|
with scoped_home(profile_home_param(params)):
|