chainlesschain 0.162.197 → 0.162.200
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/bin/chainlesschain.js +14 -6
- package/package.json +4 -1
- package/scripts/command-lifecycle-report.mjs +94 -0
- package/src/assets/web-panel/assets/{AIOps-D3Gu1a5d.js → AIOps-DcQ0bWKy.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DrwAoKaz.js → ActionButton-GecwfFPt.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-C7Q-gd_3.js → Analytics-CD6iSt9v.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DgBtae-n.js → AppLayout-CDEtuEYf.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-pQ6LcA-W.js → Artifacts-DS3jAjeW.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-DK61tocB.js → Audit-CcSJA048.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BOKgDFRh.js → BackgroundAgents-DRo9Morb.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-Bo9G4vTP.js → Backup-Vw5MrWft.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-Do_dE9_v.js → BaseInput-DNHIu823.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-COVvZzOL.js → Chat-DvAsO8-b.js} +4 -4
- package/src/assets/web-panel/assets/ChatBubbleRenderer-9aDuObay.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-Z9MJMolt.js → Checkbox-CKCa7tvn.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-BVzWKVbf.js → Codegen-CIFvZdaT.js} +1 -1
- package/src/assets/web-panel/assets/{Col-C8MnYcbT.js → Col-C79yz7bK.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DQxqw15l.js → Community-DVvZskLJ.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BAUmrh3y.js → Compact-oaew61hV.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-jPAkQ3zK.js → Compliance-DqA7wmRx.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BBQyxbh8.js → Cowork-B-qGadxa.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-W5koq8Z5.js → Cron-CUlCl4sS.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BQhnu5hS.js → Crosschain-CNOlr9DU.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DD7PlI18.js → DID-DJqFCT_3.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-w_ILuwKI.js → Dashboard-CznGpphf.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-qiDUAyAo.js → Dropdown-_cJw218E.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-PDeBcI5H.js → EmailListRenderer-Dr-1BZ9C.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-SuArscRM.js → FamilyGuardDashboard-Dxf4xtSk.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BCovZaUn.js → Federation-DOiG3i_1.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DjlFdVFk.js → FormItemContext-BzbMcFB9.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DoEZ7fcS.js → GenericCardRenderer-VbBrYttP.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CV0-6GPI.js → Git-CLG8E6ED.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-B_SFN50w.js → Governance-LGJQfk_q.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-heI0Eo6k.js → Inference-DlQKx9lF.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-Cz5INS5p.js → KnowledgeGraph-DU8vEouV.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BSFxiHkg.js → Logs-FZIQOdln.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-BJNWIrbw.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-0TWTpE7k.js → Marketplace-C_xd-zZI.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CV4-wBLm.js → McpTools-q-YktphS.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-x5bH5rw5.js → Memory-Cq9OhDin.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DaBmUu9G.js → MobileBridge-B03_R98T.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-DZrk-qmF.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-B_zKEBif.js → Mtc-BidCKW28.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-BCfKD2yg.js → MtcAudit-r-iaMVM7.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-DgYfj6c_.js → Multisig-CgTUFvff.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Dz09lFUm.js → NLProgramming-B7NvzfAV.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Cuj6ugBE.js → Notes-80CWNqJI.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DK2WXjhg.js → NotificationSettings-0H6xdiY3.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-D1IAOQoo.js → OrderTableRenderer-CKP4AFWy.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-9fqnPvTw.js → Organization-B8sxCV_h.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-n5xHkhow.js → Overflow-CW9JBBhQ.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-B5AUWwH-.js → P2P-bdSQV7oZ.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CoUDV6dy.js → PdhVaultBrowser-DQad42nW.js} +4 -4
- package/src/assets/web-panel/assets/{Permissions-DPRmQf_H.js → Permissions-CueexxTR.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-B37bsbEN.js → PersonalDataHub-fqxflhR8.js} +6 -6
- package/src/assets/web-panel/assets/{Pipeline-CCAuPqu9.js → Pipeline-KFwwnIMC.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-B81msZdv.js → Privacy-ClnD9buY.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-B-Py2NbF.js → ProjectInit-CZEz6sm3.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CYsneiRB.js → ProjectSettings-B6NzpmOI.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-Y975Mh6R.js → Projects-DYyuwPCs.js} +1 -1
- package/src/assets/web-panel/assets/Providers-C3tz_jdh.js +1 -0
- package/src/assets/web-panel/assets/{QrScannerModal-Bj_6gJ0l.js → QrScannerModal-BzuOBbqB.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BgpBCMPE.js → QuickAsk-CmNO9qSj.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DhUW3YUA.js → Recommend-VJNj3_NF.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DdeyfbkA.js → RemoteSession-CrbdbSBF.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-fxW421xd.js → Reputation-DTyMd45j.js} +1 -1
- package/src/assets/web-panel/assets/{Row-De73w1og.js → Row-DHrQ-Icz.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-3US_Q_lj.js → RssFeed-DqWxY9c5.js} +2 -2
- package/src/assets/web-panel/assets/{Search-DbZ_DU74.js → Search-ctF1Ks3J.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DoIU1vMF.js → Security-BrQz8uo5.js} +4 -4
- package/src/assets/web-panel/assets/{Services-DB_RGqpc.js → Services-D4scVFar.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DnzLaayC.js → Skeleton-oUScaOjv.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-VzVXHENF.js → Skills-CL-y0eLt.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DMfvjCAI.js → Sla-DQExhwXj.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DQQOYWbF.js → SpeechSettings-iNp_I7kN.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-Bmx3FG1P.js → SyncSettings-CTDlMo0A.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DOQyfb-2.js → Tasks-4kb8l3sc.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-D6hTRT7c.js → Templates-BXcL9oXW.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CTPQZAzs.js → Tenant-DLE8eS0D.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-B7vII3oH.js → Terminal-DGpUZPPK.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BkiFJeXV.js → TimelineRenderer-C1pWXGPC.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BPPdQMNo.js → Tokens-BYfbfqhZ.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BxG8JAEI.js → Trigger-K9YfLOCw.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DHD7nMpM.js → Trust-Ctkq77Hy.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-B4BJpU47.js → UkeySign-C6_CSe9J.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CRiGpFx2.js → VideoEditing-Be3rpOWs.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BSDSNiem.js → Wallet-D0UIplxk.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DLTUh5Zv.js → WebAuthn-CF9bM9I3.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-tW2MwjhD.js → WorkflowEditor-D0H1XVPY.js} +1 -1
- package/src/assets/web-panel/assets/{chat-SgsLQ3FC.js → chat-Cgzzbe0o.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BHjjLIKO.js → colors-BwNxEVS0.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-VceErdKq.js → compact-item-D60Z4Hhs.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BZ332MYl.js → createContext-MFk58XB0.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BJiw369i.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CBTjJOjn.js → hasIn-CRj2SvGO.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaCCy6lq.js → index--s45_1cb.js} +1 -1
- package/src/assets/web-panel/assets/{index-CMVvxIS8.js → index--tquQ2ZG.js} +1 -1
- package/src/assets/web-panel/assets/{index-BhXZEUAc.js → index-1T1rhokn.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQSmZGgs.js → index-B-M82_rx.js} +1 -1
- package/src/assets/web-panel/assets/{index-BeiqkxJG.js → index-BE_el1Zs.js} +1 -1
- package/src/assets/web-panel/assets/{index-29wVzi-k.js → index-BhRkR7IO.js} +1 -1
- package/src/assets/web-panel/assets/{index-iYQNU9za.js → index-Bo0y96-K.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRWhLbWF.js → index-CJgu5JUK.js} +1 -1
- package/src/assets/web-panel/assets/{index-BPXFLYdW.js → index-CLWwdebO.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cr4rjlW5.js → index-CNAK5QG_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaIS_TNX.js → index-CQjJjPRD.js} +1 -1
- package/src/assets/web-panel/assets/{index-1n7xjKDU.js → index-CTDbAfae.js} +1 -1
- package/src/assets/web-panel/assets/{index-BETEjuNr.js → index-CVI_9sRK.js} +1 -1
- package/src/assets/web-panel/assets/{index-By5jBtkV.js → index-CY14oMQK.js} +1 -1
- package/src/assets/web-panel/assets/{index-DgPvuIn2.js → index-CbiTJkZf.js} +1 -1
- package/src/assets/web-panel/assets/index-CiMouosn.js +1 -0
- package/src/assets/web-panel/assets/{index-CawpdGTW.js → index-CqWpxMqx.js} +1 -1
- package/src/assets/web-panel/assets/{index-_PHrIO4O.js → index-CvB8lYUR.js} +1 -1
- package/src/assets/web-panel/assets/{index-BOtvPdHt.js → index-D51XwtCY.js} +1 -1
- package/src/assets/web-panel/assets/{index-CrUgDQkf.js → index-D6HvK_1O.js} +1 -1
- package/src/assets/web-panel/assets/{index-BY1wexYG.js → index-D9jVIwLJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-C_B9rFQE.js → index-DA4tE98u.js} +1 -1
- package/src/assets/web-panel/assets/{index-B5KAGxNo.js → index-DBwOtXw0.js} +1 -1
- package/src/assets/web-panel/assets/{index-BC1xuQgX.js → index-DKdNzTIb.js} +1 -1
- package/src/assets/web-panel/assets/{index-B2u26AS3.js → index-DRySdmvN.js} +1 -1
- package/src/assets/web-panel/assets/{index-DePOeMDM.js → index-DWzyTev7.js} +1 -1
- package/src/assets/web-panel/assets/index-DXcKlwy7.js +1 -0
- package/src/assets/web-panel/assets/{index-BTlc-Bve.js → index-DYjs7jAP.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLc19alH.js → index-DbROzMBp.js} +1 -1
- package/src/assets/web-panel/assets/{index-fU7wNHDB.js → index-DhFtk5PR.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_SePDWj.js → index-Di2AbMLg.js} +1 -1
- package/src/assets/web-panel/assets/{index-vIXOpcjD.js → index-DvmocQsM.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcUenmCX.js → index-Dw-o0zEF.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUkVN794.js → index-DysPoP38.js} +1 -1
- package/src/assets/web-panel/assets/{index-CtjLcCNU.js → index-LX9pJxm_.js} +1 -1
- package/src/assets/web-panel/assets/{index-B40dQn0G.js → index-OI_fXWx0.js} +3 -3
- package/src/assets/web-panel/assets/{index-FJ3zC9LK.js → index-eDTOX8Xj.js} +1 -1
- package/src/assets/web-panel/assets/{index-DdefYBSw.js → index-gWKDsTzF.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpumS98o.js → index-q_GDUVAA.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-D1oZNz0D.js → initDefaultProps-C61kZqEd.js} +1 -1
- package/src/assets/web-panel/assets/{motion-C8k6doMO.js → motion-DZnT5U1L.js} +1 -1
- package/src/assets/web-panel/assets/{move-DJ4qSbYt.js → move-L8wzwbel.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-CdpJD85j.js → mtc-parser-DLdYSejc.js} +1 -1
- package/src/assets/web-panel/assets/{omit-B0V4slKA.js → omit-D53cbS59.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-Di5NiW1F.js → pickAttrs-Bbc5HPtu.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-B5OMHgEM.js → placementArrow-BkvmO860.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-C6U9IWql.js → responsiveObserve-u2y1ryS1.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BMyTH3rN.js → slide-BBqj7svU.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-C7d6BG7Z.js → statusUtils-GN0mqu2d.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CR50QnQy.js → styleChecker-BvwPKoBT.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DBEeoMb8.js → useFlexGapSupport-CCt8tnfY.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-3r099cjv.js → useFs-DXAxl2SV.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-C5IYNdTK.js → usePersonalDataHub-DihlR2dj.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DmEOLRHf.js → vnode-D7BOX2gi.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DnpUiVCB.js → zoom-CVbO-nL7.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +4 -4
- package/src/commands/agent.js +3 -3
- package/src/commands/background-session.js +145 -0
- package/src/commands/mcp.js +244 -7
- package/src/commands/serve.js +1 -1
- package/src/commands/session-show.js +129 -0
- package/src/commands/session.js +97 -145
- package/src/commands/skill.js +87 -50
- package/src/data/changelog.json +40 -1
- package/src/gateways/ws/session-protocol.js +14 -4
- package/src/gateways/ws/ws-agent-handler.js +39 -1
- package/src/harness/jsonl-session-store.js +1547 -127
- package/src/harness/mcp-client.js +2690 -409
- package/src/harness/session-index.js +80 -80
- package/src/harness/session-list-index.js +210 -7
- package/src/lazy-dispatch.js +76 -8
- package/src/lib/abort-utils.js +68 -0
- package/src/lib/agent-core.js +1 -59
- package/src/lib/background-interaction-journal.js +2 -2
- package/src/lib/chat-core.js +24 -6
- package/src/lib/command-lifecycle-report.js +516 -0
- package/src/lib/cowork-mcp-tools.js +47 -2
- package/src/lib/cowork-task-runner.js +11 -3
- package/src/lib/doctor-checkup.js +9 -7
- package/src/lib/learning/skill-improver.js +21 -2
- package/src/lib/mcp-call-ledger-store.js +116 -3
- package/src/lib/mcp-call-ledger.js +59 -14
- package/src/lib/mcp-client.js +1 -0
- package/src/lib/mcp-stdio-environment.js +48 -0
- package/src/lib/mcp-stdio-executable-identity.js +1133 -0
- package/src/lib/mcp-stdio-execution-authority.js +363 -0
- package/src/lib/mcp-stdio-package-materialization.js +1424 -0
- package/src/lib/mcp-tool-metadata.js +436 -0
- package/src/lib/mcp-tool-result.js +367 -0
- package/src/lib/observability/index.js +71 -0
- package/src/lib/packer/native-update-state.js +979 -1
- package/src/lib/packer/pack-update-applier.js +1050 -125
- package/src/lib/packer/pkg-config-generator.js +1 -0
- package/src/lib/paths.js +53 -0
- package/src/lib/pr-link-ledger.js +8 -27
- package/src/lib/pr-link-store.js +26 -0
- package/src/lib/process-execution-broker/index.js +192 -35
- package/src/lib/process-execution-broker/platform-sandbox.js +291 -24
- package/src/lib/process-tree-termination.js +253 -0
- package/src/lib/recent-session.js +17 -17
- package/src/lib/secure-file-identity.js +47 -0
- package/src/lib/secure-fs.js +21 -2
- package/src/lib/session-anti-rollback-anchor.js +766 -0
- package/src/lib/session-host-lease.js +492 -0
- package/src/lib/session-host-snapshot.js +9 -5
- package/src/lib/session-persistence-failure.js +109 -0
- package/src/lib/session-picker.js +26 -3
- package/src/lib/session-projection.js +5 -1
- package/src/lib/session-search.js +25 -11
- package/src/lib/session-tail.js +31 -1
- package/src/lib/side-effect-ledger-store.js +2 -2
- package/src/lib/skill-budget.js +222 -0
- package/src/lib/skill-execution-authority.js +385 -0
- package/src/lib/skill-execution-identity.js +39 -2
- package/src/lib/skill-loader.js +322 -86
- package/src/lib/skill-mcp.js +43 -1
- package/src/lib/turn-binding-store.js +2 -2
- package/src/repl/agent-repl.js +483 -77
- package/src/repl/bg-dashboard.js +81 -28
- package/src/repl/chat-repl.js +77 -12
- package/src/runtime/agent-core.js +428 -113
- package/src/runtime/agent-runtime.js +26 -3
- package/src/runtime/cleanup-deadline.js +143 -0
- package/src/runtime/headless-runner.js +494 -149
- package/src/runtime/headless-stream.js +504 -75
- package/src/runtime/mcp-config.js +157 -10
- package/src/runtime/mcp-tool-search.js +0 -0
- package/src/runtime/output-backpressure.js +419 -0
- package/src/runtime/pipe-safety.js +56 -21
- package/src/assets/web-panel/assets/ChatBubbleRenderer-BUUyJ5QO.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-1mNozZ8v.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-DqnoFPgR.js +0 -1
- package/src/assets/web-panel/assets/Providers-uO-10aP1.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DosMaL-k.js +0 -1
- package/src/assets/web-panel/assets/index-0O5ePnUq.js +0 -1
- package/src/assets/web-panel/assets/index-ChAzPigF.js +0 -1
- package/src/lib/skill-process-broker.js +0 -85
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import {
|
|
14
|
-
|
|
14
|
+
readVerifiedEvents,
|
|
15
15
|
listJsonlSessions,
|
|
16
16
|
} from "../harness/jsonl-session-store.js";
|
|
17
17
|
|
|
@@ -54,7 +54,7 @@ export class SessionSearchIndex {
|
|
|
54
54
|
* @returns {Array<{role: string, content: string, timestamp: number}>}
|
|
55
55
|
*/
|
|
56
56
|
extractMessages(sessionId) {
|
|
57
|
-
const events =
|
|
57
|
+
const events = readVerifiedEvents(sessionId);
|
|
58
58
|
const messages = [];
|
|
59
59
|
|
|
60
60
|
for (const event of events) {
|
|
@@ -86,13 +86,22 @@ export class SessionSearchIndex {
|
|
|
86
86
|
if (!this._db) return { indexed: 0 };
|
|
87
87
|
if (!this._initialized) this.ensureTables();
|
|
88
88
|
|
|
89
|
-
const
|
|
90
|
-
|
|
89
|
+
const deleteExisting = () =>
|
|
90
|
+
this._db.exec(
|
|
91
|
+
`DELETE FROM session_fts WHERE session_id = '${sessionId.replace(/'/g, "''")}'`,
|
|
92
|
+
);
|
|
93
|
+
let messages;
|
|
94
|
+
try {
|
|
95
|
+
messages = this.extractMessages(sessionId);
|
|
96
|
+
} catch (error) {
|
|
97
|
+
deleteExisting();
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
91
100
|
|
|
92
|
-
// Remove existing entries
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
);
|
|
101
|
+
// Remove existing entries before publishing the newly verified sample.
|
|
102
|
+
// Empty and damaged sessions must not leave older searchable content.
|
|
103
|
+
deleteExisting();
|
|
104
|
+
if (messages.length === 0) return { indexed: 0 };
|
|
96
105
|
|
|
97
106
|
const insert = this._db.prepare(
|
|
98
107
|
`INSERT INTO session_fts (session_id, role, content, timestamp) VALUES (?, ?, ?, ?)`,
|
|
@@ -164,13 +173,18 @@ export class SessionSearchIndex {
|
|
|
164
173
|
|
|
165
174
|
const sessions = listJsonlSessions({ limit: 10000 });
|
|
166
175
|
let totalMessages = 0;
|
|
176
|
+
let rejected = 0;
|
|
167
177
|
|
|
168
178
|
for (const session of sessions) {
|
|
169
|
-
|
|
170
|
-
|
|
179
|
+
try {
|
|
180
|
+
const result = this.indexSession(session.id);
|
|
181
|
+
totalMessages += result.indexed;
|
|
182
|
+
} catch {
|
|
183
|
+
rejected += 1;
|
|
184
|
+
}
|
|
171
185
|
}
|
|
172
186
|
|
|
173
|
-
return { sessions: sessions.length, messages: totalMessages };
|
|
187
|
+
return { sessions: sessions.length, messages: totalMessages, rejected };
|
|
174
188
|
}
|
|
175
189
|
|
|
176
190
|
/**
|
package/src/lib/session-tail.js
CHANGED
|
@@ -10,7 +10,31 @@
|
|
|
10
10
|
|
|
11
11
|
import { promises as fsp } from "node:fs";
|
|
12
12
|
import { existsSync, statSync } from "node:fs";
|
|
13
|
-
import {
|
|
13
|
+
import {
|
|
14
|
+
getSessionPresence,
|
|
15
|
+
SESSION_PRESENCE,
|
|
16
|
+
sessionPath,
|
|
17
|
+
} from "../harness/jsonl-session-store.js";
|
|
18
|
+
|
|
19
|
+
function assertLiveTranscriptReadable(sessionId) {
|
|
20
|
+
const presence = getSessionPresence(sessionId);
|
|
21
|
+
if (
|
|
22
|
+
presence === SESSION_PRESENCE.PRESENT ||
|
|
23
|
+
presence === SESSION_PRESENCE.ABSENT
|
|
24
|
+
) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const error = new Error(
|
|
28
|
+
presence === SESSION_PRESENCE.TOMBSTONED
|
|
29
|
+
? `Session ${sessionId} has been deleted`
|
|
30
|
+
: `Session ${sessionId} transcript cannot be verified for live tailing`,
|
|
31
|
+
);
|
|
32
|
+
error.code =
|
|
33
|
+
presence === SESSION_PRESENCE.TOMBSTONED
|
|
34
|
+
? "SESSION_DELETED"
|
|
35
|
+
: "SESSION_TRANSCRIPT_UNVERIFIED";
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
14
38
|
|
|
15
39
|
function parseLine(line) {
|
|
16
40
|
const trimmed = line.trim();
|
|
@@ -53,6 +77,7 @@ function matchesFilter(event, { types, sinceMs }) {
|
|
|
53
77
|
* - fromEnd (default): current EOF, so only new events are yielded
|
|
54
78
|
*/
|
|
55
79
|
export function initialOffset(sessionId, { fromStart = false } = {}) {
|
|
80
|
+
assertLiveTranscriptReadable(sessionId);
|
|
56
81
|
const p = sessionPath(sessionId);
|
|
57
82
|
if (!existsSync(p)) return 0;
|
|
58
83
|
if (fromStart) return 0;
|
|
@@ -98,6 +123,11 @@ export async function* followSession(sessionId, options = {}) {
|
|
|
98
123
|
while (true) {
|
|
99
124
|
if (signal?.aborted) return;
|
|
100
125
|
|
|
126
|
+
// A long-lived tail is a live canonical reader. Re-check the durable
|
|
127
|
+
// sidecar witness on every poll so external deletion or a tombstoned path
|
|
128
|
+
// restoration cannot silently turn into empty output or stale replay.
|
|
129
|
+
assertLiveTranscriptReadable(sessionId);
|
|
130
|
+
|
|
101
131
|
if (existsSync(filePath)) {
|
|
102
132
|
const stat = await fsp.stat(filePath);
|
|
103
133
|
if (stat.size < offset) {
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
import {
|
|
13
|
-
|
|
13
|
+
appendAuthorityEvent as storeAppendAuthorityEvent,
|
|
14
14
|
readEvents as storeReadEvents,
|
|
15
15
|
findLatestEvent as storeFindLatestEvent,
|
|
16
16
|
} from "../harness/jsonl-session-store.js";
|
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
export const SIDE_EFFECT_LEDGER_EVENT = "side_effect_ledger";
|
|
24
24
|
|
|
25
25
|
export const _deps = {
|
|
26
|
-
appendEvent:
|
|
26
|
+
appendEvent: storeAppendAuthorityEvent,
|
|
27
27
|
readEvents: storeReadEvents,
|
|
28
28
|
findLatestEvent: storeFindLatestEvent,
|
|
29
29
|
};
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host-owned admission limits for file-backed CLI skills.
|
|
3
|
+
*
|
|
4
|
+
* These are security ceilings, not defaults that callers may raise. Loader
|
|
5
|
+
* options can only tighten them through resolveSkillLimits().
|
|
6
|
+
*/
|
|
7
|
+
export const HOST_SKILL_LIMITS = Object.freeze({
|
|
8
|
+
maxSkillFileBytes: 256 * 1024,
|
|
9
|
+
maxSkillTotalBytes: 512 * 1024,
|
|
10
|
+
maxSkillDiscoveryEntries: 16_384,
|
|
11
|
+
maxSkillDiscoveryFiles: 4096,
|
|
12
|
+
maxSkillDiscoveryBytes: 64 * 1024 * 1024,
|
|
13
|
+
maxSkillNestDepth: 5,
|
|
14
|
+
maxSkillPromptBytes: 48_000,
|
|
15
|
+
// Provider-neutral conservative ceiling: one token cannot require fewer
|
|
16
|
+
// than zero bytes, and byte-level tokenizers cannot produce more tokens than
|
|
17
|
+
// the UTF-8 byte sequence. Hosts with a smaller context may tighten this.
|
|
18
|
+
maxSkillPromptTokens: 48_000,
|
|
19
|
+
maxSkillPromptTotalBytes: 192_000,
|
|
20
|
+
maxSkillPromptTotalTokens: 192_000,
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
const LIMIT_KEYS = Object.freeze(Object.keys(HOST_SKILL_LIMITS));
|
|
24
|
+
|
|
25
|
+
function tighteningLimit(value, hardLimit) {
|
|
26
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
|
|
27
|
+
return hardLimit;
|
|
28
|
+
}
|
|
29
|
+
return Math.min(hardLimit, Math.max(1, Math.floor(value)));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function resolveSkillLimits(options = {}) {
|
|
33
|
+
const limits = {};
|
|
34
|
+
for (const key of LIMIT_KEYS) {
|
|
35
|
+
limits[key] = tighteningLimit(options?.[key], HOST_SKILL_LIMITS[key]);
|
|
36
|
+
}
|
|
37
|
+
return Object.freeze(limits);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function skillBudgetError(code, message, details = {}) {
|
|
41
|
+
const error = new Error(message);
|
|
42
|
+
error.name = "SkillBudgetError";
|
|
43
|
+
error.code = code;
|
|
44
|
+
if (Number.isFinite(details.limit)) error.limit = details.limit;
|
|
45
|
+
if (Number.isFinite(details.actual)) error.actual = details.actual;
|
|
46
|
+
if (details.component) error.component = details.component;
|
|
47
|
+
return error;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function isSkillBudgetError(error) {
|
|
51
|
+
return error?.name === "SkillBudgetError";
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function assertSkillFileSize(component, size, limitsInput = {}) {
|
|
55
|
+
const limits = resolveSkillLimits(limitsInput);
|
|
56
|
+
if (!Number.isSafeInteger(size) || size < 0) {
|
|
57
|
+
throw skillBudgetError(
|
|
58
|
+
"CC_SKILL_FILE_SIZE_INVALID",
|
|
59
|
+
`Skill component size is invalid: ${component}`,
|
|
60
|
+
{ component },
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
if (size > limits.maxSkillFileBytes) {
|
|
64
|
+
throw skillBudgetError(
|
|
65
|
+
"CC_SKILL_FILE_TOO_LARGE",
|
|
66
|
+
`Skill component exceeds the host byte limit: ${component}`,
|
|
67
|
+
{ component, limit: limits.maxSkillFileBytes, actual: size },
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
return size;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function assertSkillTotalSize(size, limitsInput = {}) {
|
|
74
|
+
const limits = resolveSkillLimits(limitsInput);
|
|
75
|
+
if (!Number.isSafeInteger(size) || size < 0) {
|
|
76
|
+
throw skillBudgetError(
|
|
77
|
+
"CC_SKILL_TOTAL_SIZE_INVALID",
|
|
78
|
+
"Skill component total is invalid.",
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
if (size > limits.maxSkillTotalBytes) {
|
|
82
|
+
throw skillBudgetError(
|
|
83
|
+
"CC_SKILL_TOTAL_BYTES_EXCEEDED",
|
|
84
|
+
"Skill components exceed the host aggregate byte limit.",
|
|
85
|
+
{ limit: limits.maxSkillTotalBytes, actual: size },
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
return size;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function createSkillDiscoveryBudget(limitsInput = {}) {
|
|
92
|
+
return {
|
|
93
|
+
limits: resolveSkillLimits(limitsInput),
|
|
94
|
+
entries: 0,
|
|
95
|
+
files: 0,
|
|
96
|
+
bytes: 0,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export function debitSkillDiscoveryEntry(budget) {
|
|
101
|
+
const nextEntries = budget.entries + 1;
|
|
102
|
+
if (
|
|
103
|
+
!Number.isSafeInteger(nextEntries) ||
|
|
104
|
+
nextEntries > budget.limits.maxSkillDiscoveryEntries
|
|
105
|
+
) {
|
|
106
|
+
throw skillBudgetError(
|
|
107
|
+
"CC_SKILL_DISCOVERY_ENTRIES_EXCEEDED",
|
|
108
|
+
"Recursive skill discovery exceeds the host directory-entry limit.",
|
|
109
|
+
{
|
|
110
|
+
limit: budget.limits.maxSkillDiscoveryEntries,
|
|
111
|
+
actual: nextEntries,
|
|
112
|
+
},
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
budget.entries = nextEntries;
|
|
116
|
+
return budget;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export function debitSkillDiscoveryBudget(budget, fileCount, byteCount) {
|
|
120
|
+
const nextFiles = budget.files + fileCount;
|
|
121
|
+
const nextBytes = budget.bytes + byteCount;
|
|
122
|
+
if (
|
|
123
|
+
!Number.isSafeInteger(nextFiles) ||
|
|
124
|
+
nextFiles > budget.limits.maxSkillDiscoveryFiles
|
|
125
|
+
) {
|
|
126
|
+
throw skillBudgetError(
|
|
127
|
+
"CC_SKILL_DISCOVERY_FILES_EXCEEDED",
|
|
128
|
+
"Recursive skill discovery exceeds the host file-count limit.",
|
|
129
|
+
{
|
|
130
|
+
limit: budget.limits.maxSkillDiscoveryFiles,
|
|
131
|
+
actual: nextFiles,
|
|
132
|
+
},
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
if (
|
|
136
|
+
!Number.isSafeInteger(nextBytes) ||
|
|
137
|
+
nextBytes > budget.limits.maxSkillDiscoveryBytes
|
|
138
|
+
) {
|
|
139
|
+
throw skillBudgetError(
|
|
140
|
+
"CC_SKILL_DISCOVERY_BYTES_EXCEEDED",
|
|
141
|
+
"Recursive skill discovery exceeds the host aggregate byte limit.",
|
|
142
|
+
{
|
|
143
|
+
limit: budget.limits.maxSkillDiscoveryBytes,
|
|
144
|
+
actual: nextBytes,
|
|
145
|
+
},
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
budget.files = nextFiles;
|
|
149
|
+
budget.bytes = nextBytes;
|
|
150
|
+
return budget;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export function measureSkillPrompt(body) {
|
|
154
|
+
if (typeof body !== "string") {
|
|
155
|
+
throw skillBudgetError(
|
|
156
|
+
"CC_SKILL_PROMPT_INVALID",
|
|
157
|
+
"Skill instructions must be a string before model projection.",
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
const bytes = Buffer.byteLength(body, "utf8");
|
|
161
|
+
return Object.freeze({
|
|
162
|
+
bytes,
|
|
163
|
+
// Conservative provider-neutral upper bound for text-derived tokens. This
|
|
164
|
+
// intentionally does not trust a configurable estimator that could return
|
|
165
|
+
// zero or NaN.
|
|
166
|
+
tokenUpperBound: bytes,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export function admitSkillPrompt(body, limitsInput = {}) {
|
|
171
|
+
const limits = resolveSkillLimits(limitsInput);
|
|
172
|
+
const measured = measureSkillPrompt(body);
|
|
173
|
+
if (measured.bytes > limits.maxSkillPromptBytes) {
|
|
174
|
+
throw skillBudgetError(
|
|
175
|
+
"CC_SKILL_PROMPT_BYTES_EXCEEDED",
|
|
176
|
+
"Skill instructions exceed the host model-projection byte limit.",
|
|
177
|
+
{ limit: limits.maxSkillPromptBytes, actual: measured.bytes },
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
if (measured.tokenUpperBound > limits.maxSkillPromptTokens) {
|
|
181
|
+
throw skillBudgetError(
|
|
182
|
+
"CC_SKILL_PROMPT_TOKENS_EXCEEDED",
|
|
183
|
+
"Skill instructions exceed the host model-projection token limit.",
|
|
184
|
+
{ limit: limits.maxSkillPromptTokens, actual: measured.tokenUpperBound },
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
return measured;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export function debitSkillPromptBudget(budget, measured) {
|
|
191
|
+
const nextBytes = budget.bytes + measured.bytes;
|
|
192
|
+
const nextTokens = budget.tokens + measured.tokenUpperBound;
|
|
193
|
+
if (
|
|
194
|
+
!Number.isSafeInteger(nextBytes) ||
|
|
195
|
+
nextBytes > budget.limits.maxSkillPromptTotalBytes
|
|
196
|
+
) {
|
|
197
|
+
throw skillBudgetError(
|
|
198
|
+
"CC_SKILL_PROMPT_TOTAL_BYTES_EXCEEDED",
|
|
199
|
+
"Skill instructions exceed the host aggregate model-projection byte limit.",
|
|
200
|
+
{
|
|
201
|
+
limit: budget.limits.maxSkillPromptTotalBytes,
|
|
202
|
+
actual: nextBytes,
|
|
203
|
+
},
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
if (
|
|
207
|
+
!Number.isSafeInteger(nextTokens) ||
|
|
208
|
+
nextTokens > budget.limits.maxSkillPromptTotalTokens
|
|
209
|
+
) {
|
|
210
|
+
throw skillBudgetError(
|
|
211
|
+
"CC_SKILL_PROMPT_TOTAL_TOKENS_EXCEEDED",
|
|
212
|
+
"Skill instructions exceed the host aggregate model-projection token limit.",
|
|
213
|
+
{
|
|
214
|
+
limit: budget.limits.maxSkillPromptTotalTokens,
|
|
215
|
+
actual: nextTokens,
|
|
216
|
+
},
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
budget.bytes = nextBytes;
|
|
220
|
+
budget.tokens = nextTokens;
|
|
221
|
+
return budget;
|
|
222
|
+
}
|