chainlesschain 0.163.7 → 0.163.8
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/package.json +2 -1
- package/src/assets/web-panel/assets/{AIOps-axqQfwv8.js → AIOps-CavM7W3k.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DV-Ro0By.js → ActionButton-CUvZGabQ.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-Bt72WEVu.js → Analytics-DeBnWnbe.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-BtepG55E.js → AppLayout-DbI5kxvd.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-B7KaJ7S_.js → Artifacts-D93bigKm.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-FNFaUg7A.js → Audit-CBNvfUZa.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-DFb6J2wQ.js → BackgroundAgents-CJLyh_YU.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-CC7YBhyj.js → Backup-D_0yoehD.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-RkgTNVtj.js → BaseInput-TJxmbObW.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-hHEmGZy-.js → Chat-CE0dto1q.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CAP9YhHv.js → ChatBubbleRenderer-CZ5-yYiD.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-z5wXOQP1.js → Checkbox-Ck1RVIVo.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DVaDJnxy.js → Codegen-qpoyf6DK.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CJmaRDR5.js → Col-DUyPWjIE.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DF29_2bI.js → Community-D_S1BemS.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DtkQkBzn.js → Compact-BjxeK-Gc.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-xoHDxp7I.js → Compliance-Dd3CEJsu.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BUm-R7ht.js → Cowork-B4QG7-ad.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-Cgl14ZkB.js → Cron-BtZnids5.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BNcbmoqh.js → Crosschain-CHPfCBFD.js} +1 -1
- package/src/assets/web-panel/assets/{DID-Bwja0Zo9.js → DID-DT8DCEOK.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-Bk5XjEdJ.js → Dashboard-COQab5_U.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-Ci36Oitq.js → Dropdown-BY1PsQuU.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer--U04ZN4q.js → EmailListRenderer-CsuAuaq3.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-B2gNPR2s.js → FamilyGuardDashboard-BqpinD-j.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-C4KghYn7.js → Federation-D0gkfQFv.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-QL7x_Q_0.js → FormItemContext-BqgE-axK.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-F3Ryltwm.js → GenericCardRenderer-D0hJ2KvC.js} +1 -1
- package/src/assets/web-panel/assets/{Git-2HassK5k.js → Git-CmMB0uPY.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-DoBIp7oe.js → Governance-BnVEI0Dk.js} +1 -1
- package/src/assets/web-panel/assets/{Inference--W01QhZ-.js → Inference-YTAMihRP.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DmvwqGpT.js → KnowledgeGraph-0ax7VHop.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BBJ4yAel.js → Logs-B9TRcokL.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-yySN5YNM.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-D5lNngSI.js → Marketplace-B6CSuD_H.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CkEVOMKH.js → McpTools-CjMXvOVU.js} +4 -4
- package/src/assets/web-panel/assets/{Memory-B1Ow1xVE.js → Memory-CXRF71U3.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-SgYbUfb6.js → MobileBridge-DQgNp_oS.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BWdOvQAj.js → MobileProjects-DlPwcCbq.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-DcTXSSma.js → Mtc-6hDTRPe1.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-Dt3WG4oj.js → MtcAudit-BlVHU1DS.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-B9B38UZx.js → Multisig-DP9pzEbV.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-B0S4GGvG.js → NLProgramming-Djorh8EV.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DZ5U58Ng.js → Notes-oLZ-JkUg.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-PjL5ZW34.js → NotificationSettings-Cg288VH3.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DrAX2ESt.js → OrderTableRenderer-Bb1O3Ofr.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-Cv1GYs-c.js → Organization-CBdo-bHs.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Bbkp_PL3.js → Overflow-qZdnVumx.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BD8QUgoZ.js → P2P-D4kNfGNQ.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-BO-2PeaB.js → PdhVaultBrowser-DnlMemM7.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-D_OPVa02.js → Permissions-DHucHFBJ.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-mh-pEmaB.js → PersonalDataHub-BovlOIPR.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-6JC2EDdb.js → Pipeline-Deru3CQY.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CUshzUAG.js → Privacy-Bq5oTTbU.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Cs2Aalri.js → ProjectInit-BfzxVWAz.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-1ak49tcj.js → ProjectSettings-CKC6XBtH.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BV4oApsm.js → Projects-CMolGhae.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-CXXxvafH.js → Providers-C_jx4TWX.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-PTcDsF58.js → QrScannerModal-BdIHeVGC.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CDwucrJw.js → QuickAsk-BwZwAcPD.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CJlLVRXR.js → Recommend-BNTt0L-m.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DlN-ETsO.js → RemoteSession-Biyn2-Ro.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-DI23LR6m.js → Reputation-D6VpG32B.js} +1 -1
- package/src/assets/web-panel/assets/{Row-Cl7UQMrM.js → Row-D_74OvQQ.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CexHNfh8.js → RssFeed-BTr0a-BQ.js} +3 -3
- package/src/assets/web-panel/assets/{Search-BneBWvRN.js → Search-C3MCFoNU.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DX7Phgrp.js → Security-CqW9aJ6s.js} +4 -4
- package/src/assets/web-panel/assets/{Services-BWXO8Mte.js → Services-Cw5GNaHF.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DCyOjKPJ.js → Skeleton-DZps5qeY.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CXqERsTB.js → Skills-C6NQ1znT.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-bhbrbz8E.js → Sla-DFP8G2Sh.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-3IPU0HBZ.js → SpeechSettings-ESt6MB6v.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DBNTQLbM.js → SyncSettings-BHnN98aM.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-quP0bkN-.js → Tasks-NiSCaOf-.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-BouWmgho.js → Templates-DsKFhW2C.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-qv0D9s7z.js → Tenant-CQ0E0ze5.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BxvbE8BB.js → Terminal-D_rBu_by.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-D-IeLnJ2.js → TimelineRenderer-D3Vm4Po4.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CFMKKyVG.js → Tokens-DNTxRH6q.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-L8as3UuJ.js → Trigger-Dgprz1ms.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-MxmA4VZG.js → Trust-B2rUnVBD.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-C0VvJYRi.js → UkeySign-DEGQNc6_.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-Bf5QZj8N.js → VideoEditing-jlsAx3Eh.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BIJ9riRz.js → Wallet-8jQih1ij.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-B8p9Mhkw.js → WebAuthn-XLeO6xIB.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-BVsuaPen.js → WorkflowEditor-De_dgDAG.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BfkjoKpV.js → chat-CI19R_Sk.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DeAlsWK8.js → colors-DsYTOYN3.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-Cs97bz5j.js → compact-item-CM3-t_Qr.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BqbG60LH.js → createContext-BjxlBRZv.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-S1ld2LwU.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-i_RY0b1X.js → hasIn-RDaWX_4i.js} +1 -1
- package/src/assets/web-panel/assets/{index-U4f5izHz.js → index-9R6BxAr0.js} +1 -1
- package/src/assets/web-panel/assets/{index-0-agYlWL.js → index-B-Z8eFUJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-B1CbOH1i.js → index-B0PMlbMs.js} +1 -1
- package/src/assets/web-panel/assets/{index-DqBgBpgp.js → index-B5REnKt8.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcUXAB2s.js → index-B7WBt_4T.js} +1 -1
- package/src/assets/web-panel/assets/{index-CIG8fQ2_.js → index-B9O9YyWE.js} +1 -1
- package/src/assets/web-panel/assets/{index-gyFpvL7l.js → index-BCnZyIMA.js} +1 -1
- package/src/assets/web-panel/assets/{index-yObj1O4n.js → index-BGqqJfL0.js} +1 -1
- package/src/assets/web-panel/assets/{index-DiSkx4UB.js → index-BHNYPO0b.js} +3 -3
- package/src/assets/web-panel/assets/{index-Bm7lLR4c.js → index-BKJr-TZp.js} +1 -1
- package/src/assets/web-panel/assets/{index-BOVkf1K3.js → index-BN6UPD2E.js} +1 -1
- package/src/assets/web-panel/assets/{index-BESLFt4q.js → index-Bi46Xu4u.js} +1 -1
- package/src/assets/web-panel/assets/{index-CE2VtTlp.js → index-BlT2VAEK.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmbfhJUP.js → index-C0yx-jtQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BYUVuwKt.js → index-C4gkzxkw.js} +1 -1
- package/src/assets/web-panel/assets/{index-CeWoNHau.js → index-CVQMeiwH.js} +1 -1
- package/src/assets/web-panel/assets/{index-PT_5sBMA.js → index-Cd3euP_4.js} +1 -1
- package/src/assets/web-panel/assets/{index-CgsqdnRV.js → index-Cd9OJhHG.js} +1 -1
- package/src/assets/web-panel/assets/{index-B-3tEpTc.js → index-CiECJi-Q.js} +1 -1
- package/src/assets/web-panel/assets/{index-BkBi5TmC.js → index-CjTrRt13.js} +1 -1
- package/src/assets/web-panel/assets/{index-D2B4VPyP.js → index-CnHH7bnD.js} +1 -1
- package/src/assets/web-panel/assets/{index-dIHr4B_u.js → index-Cpqm1qfU.js} +1 -1
- package/src/assets/web-panel/assets/{index-B5UkyA3c.js → index-CyOGN6a5.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dk7-v4hP.js → index-D0zcy54x.js} +1 -1
- package/src/assets/web-panel/assets/{index-ZxO_-E8a.js → index-D6sm5-Xq.js} +1 -1
- package/src/assets/web-panel/assets/{index-B-JVTrpr.js → index-DIUnNOjG.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dk2qouAz.js → index-DX7tuWVJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BuLQobzW.js → index-DXXtGMUJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUUrv141.js → index-DcPFB8qJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-D9evtvg2.js → index-DoQA0-52.js} +1 -1
- package/src/assets/web-panel/assets/{index-COdGA-8n.js → index-Drlnwr8F.js} +1 -1
- package/src/assets/web-panel/assets/index-Drz6yq0m.js +1 -0
- package/src/assets/web-panel/assets/{index-CED2PL_y.js → index-Dsij_KsN.js} +1 -1
- package/src/assets/web-panel/assets/{index-79V_zv1s.js → index-Dxge-xWl.js} +1 -1
- package/src/assets/web-panel/assets/{index-CG3PRyAL.js → index-DyIWssPC.js} +1 -1
- package/src/assets/web-panel/assets/{index-YXgLng0K.js → index-IeiL9RKc.js} +1 -1
- package/src/assets/web-panel/assets/{index-s1opAL-M.js → index-nAH87mQP.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cf3WCLmy.js → index-pPL66J85.js} +1 -1
- package/src/assets/web-panel/assets/index-uWiUs7S_.js +1 -0
- package/src/assets/web-panel/assets/{initDefaultProps-C9h9yKL3.js → initDefaultProps-BTL88of4.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BvmLsPdu.js → motion-BUB2pXwB.js} +1 -1
- package/src/assets/web-panel/assets/{move-CoL4ekU1.js → move-egCkkOMm.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-C4pMy6xV.js → mtc-parser-DAWhZC8c.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DPuJfNxx.js → omit-CvOxe_6d.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-D0KEeaK2.js → pickAttrs-DZUSLZ5Z.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BpkyINxt.js → placementArrow-BERxGNMY.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DQI_wOq8.js → responsiveObserve-DZuDfZ9n.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DYfdDiRg.js → slide-DO756sgI.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-B5dtvb0D.js → statusUtils-BRQlIz28.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CF310mSj.js → styleChecker-DCSfdybl.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-D1Qp4BLp.js → useFlexGapSupport-LD8dWVve.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-C7_iyvJK.js → useFs-BX9uW2LK.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DZUt_fIm.js → usePersonalDataHub-BPSlPuHU.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-D3dsi0lZ.js → vnode-BmOILC9V.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-WdbOlvdQ.js → zoom-1iKowKGg.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +3 -3
- package/src/commands/automation.js +103 -1
- package/src/commands/team-merge-review.js +937 -0
- package/src/commands/team.js +2 -0
- package/src/data/changelog.json +14 -1
- package/src/lib/agent-schedule-store.js +139 -28
- package/src/lib/agent-team/team-merge-review-store.js +765 -0
- package/src/lib/agent-team/team-merge-review-transaction.js +1223 -0
- package/src/lib/agent-team/team-merge-review.js +1847 -0
- package/src/lib/automation-center-incidents.js +314 -0
- package/src/lib/automation-center-runtime.js +448 -0
- package/src/lib/automation-center.js +182 -38
- package/src/lib/automation-engine.js +41 -0
- package/src/lib/automation-execution-authority.js +241 -12
- package/src/lib/automation-execution-incident.js +737 -0
- package/src/lib/cowork-cron.js +85 -14
- package/src/lib/scheduler-kernel/agenda-adapter.js +17 -7
- package/src/lib/scheduler-kernel/automation-adapter.js +105 -11
- package/src/lib/scheduler-kernel/automation-event-adapter.js +87 -11
- package/src/lib/scheduler-kernel/contract.js +91 -0
- package/src/lib/scheduler-kernel/cowork-cron-adapter.js +12 -1
- package/src/lib/scheduler-kernel/loop-adapter.js +7 -1
- package/src/lib/scheduler-kernel/routine-adapter.js +7 -1
- package/src/lib/scheduler-kernel/runtime-control-capabilities.js +31 -0
- package/src/lib/scheduler-kernel/runtime.js +176 -3
- package/src/lib/scheduler-kernel/store.js +1253 -45
- package/src/runtime/agent-core.js +10 -0
- package/src/runtime/mcp-config.js +81 -10
- package/src/assets/web-panel/assets/MarkdownRenderer-BLCZMzhJ.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DPty0mGN.js +0 -1
- package/src/assets/web-panel/assets/index-Bt7g0Vq_.js +0 -1
- package/src/assets/web-panel/assets/index-ChVT0p9u.js +0 -1
package/src/commands/team.js
CHANGED
|
@@ -57,6 +57,7 @@ import {
|
|
|
57
57
|
} from "../lib/agent-team/team-control-store.js";
|
|
58
58
|
import { TeamProcessCheckpointBroker } from "../lib/agent-team/team-process-checkpoint.js";
|
|
59
59
|
import { registerTeamDistributedCommands } from "./team-distributed.js";
|
|
60
|
+
import { registerTeamMergeReviewCommands } from "./team-merge-review.js";
|
|
60
61
|
import {
|
|
61
62
|
sameFileStatIdentity,
|
|
62
63
|
samePathHandleFileIdentity,
|
|
@@ -1451,6 +1452,7 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
1451
1452
|
agentExecutor: spawnAgent,
|
|
1452
1453
|
buildAgentPrompt: buildTeamAgentPrompt,
|
|
1453
1454
|
});
|
|
1455
|
+
registerTeamMergeReviewCommands(team, { logger: log });
|
|
1454
1456
|
|
|
1455
1457
|
team
|
|
1456
1458
|
.command("control-bindings")
|
package/src/data/changelog.json
CHANGED
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"source": "CHANGELOG.md",
|
|
3
3
|
"releases": [
|
|
4
|
+
{
|
|
5
|
+
"productVersion": null,
|
|
6
|
+
"cliVersion": "0.163.8",
|
|
7
|
+
"cliVersions": ["0.163.7", "0.163.8"],
|
|
8
|
+
"date": "2026-08-14",
|
|
9
|
+
"title": "",
|
|
10
|
+
"sections": [
|
|
11
|
+
{
|
|
12
|
+
"heading": "Added — cc CLI 0.163.8: governed recovery, merge review, and MCP resource templates",
|
|
13
|
+
"body": "> `chainlesschain` **0.163.7 → 0.163.8** (candidate; not yet published,\n> 2026-08-14).\n> CLI-only candidate; `@chainlesschain/personal-data-hub` remains **0.4.57**\n> and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Crash-safe scheduler source persistence**: Agenda and Cowork authoritative\n stores now reject unreadable, malformed, and non-object records instead of\n treating them as empty state. Generation replacement uses private exclusive\n temporary files, complete short-write loops, file fsync, atomic rename, and\n POSIX directory fsync, while distinguishing pre-rename `not-committed`\n failures from post-rename durability-unknown outcomes.\n- **Deterministic scheduler disk-fault closure**: fault injection covers ENOSPC,\n partial writes, file and directory fsync failures, rename failures, corrupted\n source stores, native SQLite `SQLITE_FULL` transaction rollback, Automation\n source rollback atomicity, database truncation, and clean reopen behavior.\n Routine and Loop retain their existing durable-store and append/CAS\n protections.\n- **Governed Automation runtime recovery**: scheduler-backed Automation work can\n expose exact-fence, control-revision, capability-bound pause and resume safe\n points. Revisioned incidents support bounded retry or cancellation; retry\n revalidates the exact dead-letter occurrence, run identity, fence, and error\n evidence, while manual incidents are not silently replayed.\n- **Governed multi-agent merge review**: `cc team merge-review` subcommands\n `preview|show|apply|rollback` provide stable file and hunk selection,\n digest-bound decisions, durable conflict evidence, guarded cross-branch batch\n publication, and retained-history rollback. Git hooks, repository-local\n configuration, inherited environment, stale revisions, oversized selections,\n and changed branch identities fail closed.\n- **Read-only MCP resource templates**: templates-only MCP servers can now\n register the existing resource surface. The new\n `list_mcp_resource_templates {server?}` tool reads the bounded discovery\n cache, supports explicit server filtering, and lets the model instantiate a\n concrete URI before using the existing `read_mcp_resource` boundary. It does\n not add an implicit network request, subscription, or automatic URI\n expansion.\n- **Explicit optional-protocol decisions**: resource templates enter the\n production read-only surface; resource subscriptions, peer-controlled\n logging, and completion remain deferred pending bounded consumers and\n cancellation/recovery UX. MCP sampling remains undeclared and server\n `createMessage` requests continue to return JSON-RPC `-32601`.\n- **Transaction-time scheduler fencing**: claim, renewal, and settlement paths\n now read their lease clock inside the write transaction, preventing queue\n wait time from turning a pre-transaction timestamp into a stale lease or\n settlement decision.\n- **Formal scheduler soak evidence gate**: Linux, Windows, and macOS workflows\n now exercise two-worker contention, lease/fence recovery, heartbeat renewal,\n stale settlement rejection, outcome-unknown no-replay, DST/backlog behavior,\n SQLite integrity, descendant cleanup, and bounded resource trends. The\n campaign verifier requires at least four identity-bound formal segments whose\n authoritative starts span at least 72 natural hours, with no gap above\n 30 hours.\n- **Release boundary**: the scheduler soak implementation and smoke matrices are\n present, but the required 72-hour formal campaign has not completed; P2-4\n therefore remains partially complete. Signed native distribution,\n representative alias-removal telemetry, and the entire unmerged P2-2 native\n clipboard-image host work remain outside this candidate.\n- **Release status**: final tag, source SHA, workflow run IDs, package digests,\n provenance, and registry readback are intentionally omitted until the exact\n `0.163.8` release merge commit passes complete `CLI CI` and\n `CLI Strict Sandbox` matrices on Linux, Windows, and macOS, followed by the\n dedicated npm release and independent public readback workflows."
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
},
|
|
4
17
|
{
|
|
5
18
|
"productVersion": null,
|
|
6
19
|
"cliVersion": "0.163.7",
|
|
@@ -10,7 +23,7 @@
|
|
|
10
23
|
"sections": [
|
|
11
24
|
{
|
|
12
25
|
"heading": "Added — cc CLI 0.163.7: governed scheduler migration and causal observability",
|
|
13
|
-
"body": "> `chainlesschain` **0.163.6 → 0.163.7** (
|
|
26
|
+
"body": "> `chainlesschain` **0.163.6 → 0.163.7** (published from exact SHA\n> `3e997168621c53708a1682868c6cc4edc9baf15b`, 2026-08-14).\n> CLI-only release; `@chainlesschain/personal-data-hub` remains **0.4.57**\n> and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Five-domain migration journal**: Agenda, Cowork Cron, Routine, Automation,\n and Loop migrations use the scheduler store schema-v5 journal with\n domain-typed source locators, immutable source/target digest bindings,\n idempotent recovery, and fail-closed rejection of conflicting or ambiguous\n legacy entries.\n- **Governed rollback controls**: the new scheduler migration `list`, `show`,\n and `rollback` commands expose redacted migration status and blockers.\n Rollback requires the latest evidence digest, an interactive TTY, and the\n exact typed challenge before reopening any legacy source.\n- **Target-first recovery and CAS fencing**: rollback stops or restores the\n scheduler target before restoring the legacy source, validates target\n revision, definition and execution evidence, and makes terminal source\n restoration retry-safe across process crashes. This is not a claim of one\n atomic transaction across independent stores or filesystems.\n- **Fail-closed source identity**: Windows drive and UNC paths are canonicalized\n while relative, incomplete and device-namespace paths are rejected.\n Automation migration requires an existing native SQLite database and refuses\n the non-durable sql.js fallback; Loop restoration remains bound to its durable\n retirement fence, marker and original source digest.\n- **Windows persistence hardening**: team adjudication atomic replacement\n retries only transient Windows `EACCES`, `EBUSY`, and `EPERM` sharing\n failures with bounded backoff and authority-path revalidation. Exhausted,\n non-transient, and non-Windows replacement failures continue to fail closed.\n- **Cross-platform CI hardening**: migration fixtures verify retirement fences\n and canonical source identities consistently across operating systems, while\n distributed-queue and authority test workers use bounded lifetimes and attach\n result observers before short-lived children can exit. Terminal Skill\n authority fixtures now use an explicit parent acknowledgement before clean\n exit, removing Windows IPC exit-before-message ordering ambiguity without\n weakening concurrent revocation assertions.\n- **Verified causal delivery reports**: scoped sessions can be bound by exact\n transcript head and event count to digest-protected delivery states. The new\n session observability commands export a redacted session-to-delivery graph\n spanning diffs, gates, artifacts, pull requests, and merges, with exact\n workspace, team, and policy filters.\n- **Fail-closed call-ledger budgets**: `call-ledger@1` brackets model, retry,\n compaction, subagent, isolated-skill, and tool calls with known or unknown\n settlements. Strict budget mode rejects exceeded and unevaluable results\n instead of treating missing token, cost, retry, or tool-latency evidence as\n zero.\n- **Background recovery authority hardening**: verified transcript CAS,\n delegated recovery leases, IPC sender/nonce binding, bootstrap guards, exact\n process-group termination checks, and terminal cleanup prevent uncertain or\n still-live descendants from authorizing recovery or worktree deletion.\n- **Causal evidence boundary**: report bindings prove exact verified revisions,\n not that a model call semantically caused a source hunk. Scope labels are not\n identity or membership proofs, digests are not signatures, anti-rollback is\n machine-local, and incomplete or legacy ledgers remain partial or unknown.\n- **Release boundary**: deterministic scheduler disk-fault closure landed after\n this immutable release and is not attributed to its tarball. The\n three-platform long-soak campaign, signed native distribution, and\n representative alias-removal telemetry remained outside this release.\n- **Published release evidence**: immutable tag `v-npm-0-163-7` resolves to\n exact source commit `3e997168621c53708a1682868c6cc4edc9baf15b`. Its Linux,\n Windows, and macOS `CLI CI` (`31745391661`, attempt 2) and\n `CLI Strict Sandbox` (`31745391321`) matrices passed; the dedicated npm\n release (`31748153519`) completed its exact-SHA gate, immutable package,\n Trusted Publishing, and signed provenance, and the independent public\n readback (`31749404980`) succeeded. npm reports `latest=0.163.7`; the public\n tarball SHA-1 is `5bfb7471643cfe4d4cd0b0a382b31c63fc1efdff` and SHA-256 is\n `d7ca295e6cdb4e442ee7ad6bb9cc0b9d923f40de4eae395974d91b4dfab83a9d`."
|
|
14
27
|
}
|
|
15
28
|
]
|
|
16
29
|
},
|
|
@@ -258,6 +258,21 @@ function agendaStoreError(code, message, { retryable = false, retryAt } = {}) {
|
|
|
258
258
|
return error;
|
|
259
259
|
}
|
|
260
260
|
|
|
261
|
+
function agendaPersistenceError(
|
|
262
|
+
code,
|
|
263
|
+
message,
|
|
264
|
+
cause,
|
|
265
|
+
{ filePath, commitState } = {},
|
|
266
|
+
) {
|
|
267
|
+
const error = new Error(message, { cause });
|
|
268
|
+
error.name = "AgendaScheduleStoreError";
|
|
269
|
+
error.code = code;
|
|
270
|
+
error.filePath = filePath;
|
|
271
|
+
if (typeof cause?.code === "string") error.fsCode = cause.code;
|
|
272
|
+
if (commitState) error.commitState = commitState;
|
|
273
|
+
return error;
|
|
274
|
+
}
|
|
275
|
+
|
|
261
276
|
function applyScheduledAgentSuccess(entry, atMs) {
|
|
262
277
|
if (entry.kind === "wakeup") {
|
|
263
278
|
entry.status = "fired";
|
|
@@ -666,9 +681,16 @@ export function previousCronTime(expr, fromMs, options = {}) {
|
|
|
666
681
|
// ─── store ───────────────────────────────────────────────────────────────
|
|
667
682
|
|
|
668
683
|
export class AgentScheduleStore {
|
|
669
|
-
constructor({
|
|
684
|
+
constructor({
|
|
685
|
+
dir = null,
|
|
686
|
+
now = () => Date.now(),
|
|
687
|
+
fileSystem = fs,
|
|
688
|
+
platform = process.platform,
|
|
689
|
+
} = {}) {
|
|
670
690
|
this.dir = dir || agentScheduleDir();
|
|
671
691
|
this._now = typeof now === "function" ? now : () => now;
|
|
692
|
+
this._fs = fileSystem;
|
|
693
|
+
this._platform = platform;
|
|
672
694
|
}
|
|
673
695
|
|
|
674
696
|
_file(kind) {
|
|
@@ -676,37 +698,124 @@ export class AgentScheduleStore {
|
|
|
676
698
|
}
|
|
677
699
|
|
|
678
700
|
_ensureDir() {
|
|
679
|
-
|
|
701
|
+
this._fs.mkdirSync(this.dir, { recursive: true, mode: 0o700 });
|
|
680
702
|
}
|
|
681
703
|
|
|
682
|
-
_readAll(kind) {
|
|
704
|
+
_readAll(kind, { failOnMalformed = false } = {}) {
|
|
705
|
+
const filePath = this._file(kind);
|
|
683
706
|
let raw;
|
|
684
707
|
try {
|
|
685
|
-
raw =
|
|
686
|
-
} catch {
|
|
687
|
-
return [];
|
|
708
|
+
raw = this._fs.readFileSync(filePath, "utf-8");
|
|
709
|
+
} catch (cause) {
|
|
710
|
+
if (cause?.code === "ENOENT") return [];
|
|
711
|
+
throw agendaPersistenceError(
|
|
712
|
+
"AGENDA_SCHEDULE_STORE_READ_FAILED",
|
|
713
|
+
`Agenda schedule store read failed (${filePath})`,
|
|
714
|
+
cause,
|
|
715
|
+
{ filePath },
|
|
716
|
+
);
|
|
688
717
|
}
|
|
689
718
|
const entries = [];
|
|
719
|
+
let lineNumber = 0;
|
|
690
720
|
for (const line of raw.split("\n")) {
|
|
721
|
+
lineNumber += 1;
|
|
691
722
|
const trimmed = line.trim();
|
|
692
723
|
if (!trimmed) continue;
|
|
693
724
|
try {
|
|
694
|
-
|
|
695
|
-
|
|
725
|
+
const entry = JSON.parse(trimmed);
|
|
726
|
+
if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
|
|
727
|
+
throw new TypeError("schedule entry must be an object");
|
|
728
|
+
}
|
|
729
|
+
entries.push(entry);
|
|
730
|
+
} catch (cause) {
|
|
731
|
+
if (failOnMalformed) {
|
|
732
|
+
throw agendaPersistenceError(
|
|
733
|
+
"AGENDA_SCHEDULE_STORE_MALFORMED",
|
|
734
|
+
`Agenda schedule store contains malformed JSONL (${filePath}:${lineNumber})`,
|
|
735
|
+
cause,
|
|
736
|
+
{ filePath },
|
|
737
|
+
);
|
|
738
|
+
}
|
|
696
739
|
// Skip a corrupt line rather than throwing — one bad append must not
|
|
697
|
-
// poison
|
|
740
|
+
// poison advisory reads. Authoritative mutations opt into strict mode
|
|
741
|
+
// so they never replace a store after silently dropping durable rows.
|
|
698
742
|
}
|
|
699
743
|
}
|
|
700
744
|
return entries;
|
|
701
745
|
}
|
|
702
746
|
|
|
703
747
|
_writeAll(kind, entries) {
|
|
704
|
-
this.
|
|
748
|
+
const filePath = this._file(kind);
|
|
705
749
|
const body = entries.map((entry) => JSON.stringify(entry)).join("\n");
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
750
|
+
const contents = Buffer.from(body ? `${body}\n` : "", "utf8");
|
|
751
|
+
const temporaryPath = path.join(
|
|
752
|
+
this.dir,
|
|
753
|
+
`.${path.basename(filePath)}.${process.pid}.${randomUUID()}.tmp`,
|
|
754
|
+
);
|
|
755
|
+
let descriptor = null;
|
|
756
|
+
let renamed = false;
|
|
757
|
+
|
|
758
|
+
try {
|
|
759
|
+
this._ensureDir();
|
|
760
|
+
descriptor = this._fs.openSync(temporaryPath, "wx", 0o600);
|
|
761
|
+
let offset = 0;
|
|
762
|
+
while (offset < contents.length) {
|
|
763
|
+
const written = this._fs.writeSync(
|
|
764
|
+
descriptor,
|
|
765
|
+
contents,
|
|
766
|
+
offset,
|
|
767
|
+
contents.length - offset,
|
|
768
|
+
null,
|
|
769
|
+
);
|
|
770
|
+
if (!Number.isSafeInteger(written) || written <= 0) {
|
|
771
|
+
const cause = new Error("write returned no progress");
|
|
772
|
+
cause.code = "EIO";
|
|
773
|
+
throw cause;
|
|
774
|
+
}
|
|
775
|
+
offset += written;
|
|
776
|
+
}
|
|
777
|
+
this._fs.fsyncSync(descriptor);
|
|
778
|
+
this._fs.closeSync(descriptor);
|
|
779
|
+
descriptor = null;
|
|
780
|
+
this._fs.renameSync(temporaryPath, filePath);
|
|
781
|
+
renamed = true;
|
|
782
|
+
|
|
783
|
+
if (this._platform !== "win32") {
|
|
784
|
+
const directoryDescriptor = this._fs.openSync(this.dir, "r");
|
|
785
|
+
try {
|
|
786
|
+
this._fs.fsyncSync(directoryDescriptor);
|
|
787
|
+
} finally {
|
|
788
|
+
this._fs.closeSync(directoryDescriptor);
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
} catch (cause) {
|
|
792
|
+
if (descriptor !== null) {
|
|
793
|
+
try {
|
|
794
|
+
this._fs.closeSync(descriptor);
|
|
795
|
+
} catch {
|
|
796
|
+
// Preserve the original persistence failure.
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
if (!renamed) {
|
|
800
|
+
try {
|
|
801
|
+
this._fs.unlinkSync(temporaryPath);
|
|
802
|
+
} catch {
|
|
803
|
+
// Best-effort orphan cleanup; the authoritative file is untouched.
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
throw agendaPersistenceError(
|
|
807
|
+
"AGENDA_SCHEDULE_STORE_WRITE_FAILED",
|
|
808
|
+
`Agenda schedule store write failed (${filePath})`,
|
|
809
|
+
cause,
|
|
810
|
+
{
|
|
811
|
+
filePath,
|
|
812
|
+
// A failure before rename leaves the old generation authoritative.
|
|
813
|
+
// A directory-fsync failure after rename makes crash durability
|
|
814
|
+
// unknowable even though an immediate read sees the new generation.
|
|
815
|
+
commitState: renamed ? "unknown" : "not-committed",
|
|
816
|
+
},
|
|
817
|
+
);
|
|
818
|
+
}
|
|
710
819
|
}
|
|
711
820
|
|
|
712
821
|
// ── create ──────────────────────────────────────────────────────────────
|
|
@@ -741,7 +850,7 @@ export class AgentScheduleStore {
|
|
|
741
850
|
createdAt: now,
|
|
742
851
|
status: "pending",
|
|
743
852
|
};
|
|
744
|
-
const entries = this._readAll("wakeup");
|
|
853
|
+
const entries = this._readAll("wakeup", { failOnMalformed: true });
|
|
745
854
|
entries.push(entry);
|
|
746
855
|
this._writeAll("wakeup", entries);
|
|
747
856
|
return entry;
|
|
@@ -786,7 +895,7 @@ export class AgentScheduleStore {
|
|
|
786
895
|
runs: 0,
|
|
787
896
|
status: "active",
|
|
788
897
|
};
|
|
789
|
-
const entries = this._readAll("cron");
|
|
898
|
+
const entries = this._readAll("cron", { failOnMalformed: true });
|
|
790
899
|
entries.push(entry);
|
|
791
900
|
this._writeAll("cron", entries);
|
|
792
901
|
return entry;
|
|
@@ -882,7 +991,7 @@ export class AgentScheduleStore {
|
|
|
882
991
|
checks: 0,
|
|
883
992
|
status: "active",
|
|
884
993
|
};
|
|
885
|
-
const entries = this._readAll("monitor");
|
|
994
|
+
const entries = this._readAll("monitor", { failOnMalformed: true });
|
|
886
995
|
entries.push(entry);
|
|
887
996
|
this._writeAll("monitor", entries);
|
|
888
997
|
return entry;
|
|
@@ -917,7 +1026,7 @@ export class AgentScheduleStore {
|
|
|
917
1026
|
path.join(this.dir, ".agenda-claims"),
|
|
918
1027
|
() => {
|
|
919
1028
|
for (const kind of SCHEDULE_KINDS) {
|
|
920
|
-
const entries = this._readAll(kind);
|
|
1029
|
+
const entries = this._readAll(kind, { failOnMalformed: true });
|
|
921
1030
|
const entry = entries.find((candidate) => candidate.id === id);
|
|
922
1031
|
if (!entry) continue;
|
|
923
1032
|
if (!isSchedulableStatus(entry)) {
|
|
@@ -993,7 +1102,7 @@ export class AgentScheduleStore {
|
|
|
993
1102
|
path.join(this.dir, ".agenda-claims"),
|
|
994
1103
|
() => {
|
|
995
1104
|
for (const kind of SCHEDULE_KINDS) {
|
|
996
|
-
const entries = this._readAll(kind);
|
|
1105
|
+
const entries = this._readAll(kind, { failOnMalformed: true });
|
|
997
1106
|
const entry = entries.find((candidate) => candidate.id === id);
|
|
998
1107
|
if (!entry) continue;
|
|
999
1108
|
const prior = entry.schedulerMigration;
|
|
@@ -1079,7 +1188,7 @@ export class AgentScheduleStore {
|
|
|
1079
1188
|
path.join(this.dir, ".agenda-claims"),
|
|
1080
1189
|
() => {
|
|
1081
1190
|
for (const kind of SCHEDULE_KINDS) {
|
|
1082
|
-
const entries = this._readAll(kind);
|
|
1191
|
+
const entries = this._readAll(kind, { failOnMalformed: true });
|
|
1083
1192
|
const entry = entries.find((candidate) => candidate.id === id);
|
|
1084
1193
|
if (!entry) continue;
|
|
1085
1194
|
const migration = entry.schedulerMigration;
|
|
@@ -1171,7 +1280,9 @@ export class AgentScheduleStore {
|
|
|
1171
1280
|
() => {
|
|
1172
1281
|
const claimed = [];
|
|
1173
1282
|
for (const scheduleKind of kinds) {
|
|
1174
|
-
const entries = this._readAll(scheduleKind
|
|
1283
|
+
const entries = this._readAll(scheduleKind, {
|
|
1284
|
+
failOnMalformed: true,
|
|
1285
|
+
});
|
|
1175
1286
|
let changed = false;
|
|
1176
1287
|
for (const entry of entries) {
|
|
1177
1288
|
if (!isSchedulableStatus(entry) || isEntryExpired(entry, now))
|
|
@@ -1242,7 +1353,7 @@ export class AgentScheduleStore {
|
|
|
1242
1353
|
path.join(this.dir, ".agenda-claims"),
|
|
1243
1354
|
() => {
|
|
1244
1355
|
for (const kind of SCHEDULE_KINDS) {
|
|
1245
|
-
const entries = this._readAll(kind);
|
|
1356
|
+
const entries = this._readAll(kind, { failOnMalformed: true });
|
|
1246
1357
|
const entry = entries.find((candidate) => candidate.id === id);
|
|
1247
1358
|
if (!entry) continue;
|
|
1248
1359
|
const prior = entry.schedulerExecution;
|
|
@@ -1330,7 +1441,7 @@ export class AgentScheduleStore {
|
|
|
1330
1441
|
path.join(this.dir, ".agenda-claims"),
|
|
1331
1442
|
() => {
|
|
1332
1443
|
for (const kind of SCHEDULE_KINDS) {
|
|
1333
|
-
const entries = this._readAll(kind);
|
|
1444
|
+
const entries = this._readAll(kind, { failOnMalformed: true });
|
|
1334
1445
|
const entry = entries.find((candidate) => candidate.id === id);
|
|
1335
1446
|
if (!entry) continue;
|
|
1336
1447
|
const evidence = entry.schedulerExecution;
|
|
@@ -1408,7 +1519,7 @@ export class AgentScheduleStore {
|
|
|
1408
1519
|
path.join(this.dir, ".agenda-claims"),
|
|
1409
1520
|
() => {
|
|
1410
1521
|
for (const kind of SCHEDULE_KINDS) {
|
|
1411
|
-
const entries = this._readAll(kind);
|
|
1522
|
+
const entries = this._readAll(kind, { failOnMalformed: true });
|
|
1412
1523
|
const entry = entries.find((candidate) => candidate.id === id);
|
|
1413
1524
|
if (!entry) continue;
|
|
1414
1525
|
const evidence = entry.schedulerExecution;
|
|
@@ -1484,7 +1595,7 @@ export class AgentScheduleStore {
|
|
|
1484
1595
|
const now = atMs != null ? atMs : this._now();
|
|
1485
1596
|
const retired = [];
|
|
1486
1597
|
for (const kind of SCHEDULE_KINDS) {
|
|
1487
|
-
const entries = this._readAll(kind);
|
|
1598
|
+
const entries = this._readAll(kind, { failOnMalformed: true });
|
|
1488
1599
|
let changed = false;
|
|
1489
1600
|
for (const entry of entries) {
|
|
1490
1601
|
if (isSchedulableStatus(entry) && isEntryExpired(entry, now)) {
|
|
@@ -1501,7 +1612,7 @@ export class AgentScheduleStore {
|
|
|
1501
1612
|
|
|
1502
1613
|
cancel(id) {
|
|
1503
1614
|
for (const kind of SCHEDULE_KINDS) {
|
|
1504
|
-
const entries = this._readAll(kind);
|
|
1615
|
+
const entries = this._readAll(kind, { failOnMalformed: true });
|
|
1505
1616
|
const idx = entries.findIndex((entry) => entry.id === id);
|
|
1506
1617
|
if (idx >= 0) {
|
|
1507
1618
|
const [removed] = entries.splice(idx, 1);
|
|
@@ -1522,7 +1633,7 @@ export class AgentScheduleStore {
|
|
|
1522
1633
|
pruneTerminal({ before = Infinity } = {}) {
|
|
1523
1634
|
const removed = [];
|
|
1524
1635
|
for (const kind of SCHEDULE_KINDS) {
|
|
1525
|
-
const entries = this._readAll(kind);
|
|
1636
|
+
const entries = this._readAll(kind, { failOnMalformed: true });
|
|
1526
1637
|
const keep = entries.filter((entry) => {
|
|
1527
1638
|
const prunable =
|
|
1528
1639
|
TERMINAL_SET.has(entry.status) && terminalAt(entry) <= before;
|
|
@@ -1586,7 +1697,7 @@ export class AgentScheduleStore {
|
|
|
1586
1697
|
}
|
|
1587
1698
|
|
|
1588
1699
|
_mutate(kind, id, fn) {
|
|
1589
|
-
const entries = this._readAll(kind);
|
|
1700
|
+
const entries = this._readAll(kind, { failOnMalformed: true });
|
|
1590
1701
|
const entry = entries.find((e) => e.id === id);
|
|
1591
1702
|
if (!entry) return null;
|
|
1592
1703
|
fn(entry);
|