chainlesschain 0.163.4 → 0.163.6
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/completions/_cc +1 -1
- package/completions/cc.bash +1 -1
- package/completions/cc.fish +1 -1
- package/completions/cc.ps1 +1 -1
- package/package.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-DB5X7qqV.js → AIOps-DDIUofA8.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DxHRtKLk.js → ActionButton-Bm-5xYRn.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DIH5QrxT.js → Analytics-D5UH4ljI.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-uu0oxVz7.js → AppLayout-D_ifjOOP.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-BNSMiW9Y.js → Artifacts-BY1mXdC7.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-DcAzB4_x.js → Audit-Bujr4Ml3.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-ClSsvjIc.js → BackgroundAgents-sioKSTcC.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BMciY0js.js → Backup-DDOAK8RK.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-Hn3b57Sh.js → BaseInput-CtCsVVke.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CoSlC53V.js → Chat-DpNj0vnd.js} +4 -4
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CFevJ3So.js → ChatBubbleRenderer-CZta3Ftr.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-B4L4Eu4w.js → Checkbox-DoHVNSXq.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-C77FgRxF.js → Codegen-DlVl7Qmv.js} +1 -1
- package/src/assets/web-panel/assets/{Col-BrLtJLH3.js → Col-GIqoPYty.js} +1 -1
- package/src/assets/web-panel/assets/{Community-Be7pXXhA.js → Community-CIAPEVji.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DuGPecjo.js → Compact-BN7JiI_h.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CzS66mjP.js → Compliance-CqUWCM9B.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CEhjCoyK.js → Cowork-A4iPp7A4.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-D7ir8Vja.js → Cron-B2zeXXWb.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BcXmuLxf.js → Crosschain-BR2xmWr8.js} +1 -1
- package/src/assets/web-panel/assets/{DID-Cto1dtBy.js → DID-BzFDjrIv.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-B7KjgwOX.js → Dashboard-DKtDo3yA.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-COMqxijg.js → Dropdown-RNx43_YG.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BZrya-nf.js → EmailListRenderer-SwMt4Rcy.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-AmVeMq0J.js → FamilyGuardDashboard-CsYebZ4X.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-kZU8c-27.js → Federation-BmRKvBTy.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-sOV22v2-.js → FormItemContext-CVxGTA-0.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BUuLtGCz.js → GenericCardRenderer-x2iXpyB7.js} +1 -1
- package/src/assets/web-panel/assets/{Git-K-ZxsLsH.js → Git-DfqbkiOP.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-D3OEnawI.js → Governance-RuHyyj5O.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-Bll0gRmP.js → Inference-Bn7uZ7rI.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DBXwjr53.js → KnowledgeGraph-DlP7XefZ.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CEzPwEfP.js → Logs-BYNdOiCd.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-aMtgN-R6.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-BYyRyOPz.js → Marketplace-JQYmDqM8.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DVu8w_rM.js → McpTools-Cyx4yZ-9.js} +4 -4
- package/src/assets/web-panel/assets/{Memory-tenuZ_hO.js → Memory-VDuGZTN2.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-Bxgy4ozS.js → MobileBridge-_yKo97gi.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-Dgx1D6sc.js → MobileProjects-CXRXW3q7.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-CRfJ8r8j.js → Mtc-acTGtfLH.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-BBJq4Aiz.js → MtcAudit-ClpjXfkY.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-B3ii9lai.js → Multisig-_6Tn3o96.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-FIi-Cubv.js → NLProgramming-CK7pbZzP.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DIq8MPf1.js → Notes-Czy6V_P8.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BFOD9eGd.js → NotificationSettings-Cqx-UVv3.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer--41u7vre.js → OrderTableRenderer-C69WDxGy.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-B_0AWztW.js → Organization-DFnA9vLQ.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-B6I7TuXv.js → Overflow-ReZkk2yT.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-Cdf6qens.js → P2P-DzjSI0aI.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-B_0FcQJY.js → PdhVaultBrowser-DKTf5xIP.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-6nFBjsQp.js → Permissions-DhQ5klhR.js} +3 -3
- package/src/assets/web-panel/assets/{PersonalDataHub-nQYV7xpn.js → PersonalDataHub-CUL1iHrW.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-CBVod5jm.js → Pipeline-DU88iu4N.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-D52jW1Nt.js → Privacy-Bw-sYfyK.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Bdx3BYhf.js → ProjectInit-Bq3Q5y0z.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-b7xr4DUa.js → ProjectSettings-C8spzpho.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-DhfifCKx.js → Projects-Dd-xuPIc.js} +1 -1
- package/src/assets/web-panel/assets/Providers-Bf4eTP9W.js +1 -0
- package/src/assets/web-panel/assets/{QrScannerModal-FQKSmc3e.js → QrScannerModal-Dme9BDU1.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CSTrhzcF.js → QuickAsk-CIXfv1rE.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CxMABOUh.js → Recommend-CIxvdeZ-.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-Cv2T8yRa.js → RemoteSession-C6k7MExI.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-CE1k4Vvu.js → Reputation-CISDz2bl.js} +1 -1
- package/src/assets/web-panel/assets/{Row-BNgNcAV_.js → Row-CdnDxXyf.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-5ZiBZ3ph.js → RssFeed-C-QpRHsl.js} +3 -3
- package/src/assets/web-panel/assets/{Search-mDOIF1UV.js → Search-DBjaGzSn.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CtuCTC-e.js → Security-CQKukOeE.js} +3 -3
- package/src/assets/web-panel/assets/{Services-DxFO2Zg7.js → Services-DZz86jWb.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CKmKkH9y.js → Skeleton-jb8RMK0d.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-Bmzl9qkk.js → Skills-CdY76fZG.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-9RqaWHOC.js → Sla-C_CSiZX9.js} +1 -1
- package/src/assets/web-panel/assets/SpeechSettings-C7tT9iad.js +1 -0
- package/src/assets/web-panel/assets/{SyncSettings-CvNuCeBT.js → SyncSettings-qvimGO0O.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-B_sLdcnw.js → Tasks-Dng5LPJC.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-D9_YijdK.js → Templates-Bwqq5Wll.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-Cuc7BUSP.js → Tenant-DNWuwP7Z.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-6VYRnJgd.js → Terminal-B-6Othpp.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-GtK8xd8Y.js → TimelineRenderer-DKpKZfzx.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BZ94Lt5W.js → Tokens-DzfGMd2J.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DEcZgDaX.js → Trigger-BXwUi74J.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-CC3z9THe.js → Trust-BNzUq4ui.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-Cvtw8cV3.js → UkeySign-BYugxww4.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CL4e6Bn3.js → VideoEditing-DdauhtSJ.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-ycEemP27.js → Wallet-CSC9bCe_.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DgZ4X_aw.js → WebAuthn-Q8AN3bTO.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-D0qMhSv7.js → WorkflowEditor-d-LBGCuA.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DsAg01Zn.js → chat-BLVDCgsZ.js} +1 -1
- package/src/assets/web-panel/assets/{colors-B0oqAhrQ.js → colors-BZlPSEHl.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CmX0Rabz.js → compact-item-IWseP6R6.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-Be4cn1Ub.js → createContext-DnVRV3Ao.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-Jzu62CLC.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-D5v12kVq.js → hasIn-DLQZA_Wn.js} +1 -1
- package/src/assets/web-panel/assets/{index-BA4oulaP.js → index-1jeAudHd.js} +1 -1
- package/src/assets/web-panel/assets/{index-DM724NgU.js → index-BEu2lMBy.js} +1 -1
- package/src/assets/web-panel/assets/{index-5LGY0JbG.js → index-BOZJBTWZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DikJ0Qqe.js → index-BSjilZ9L.js} +1 -1
- package/src/assets/web-panel/assets/{index-BqltWojQ.js → index-BZs5bBnk.js} +1 -1
- package/src/assets/web-panel/assets/{index-7VKDn-t1.js → index-B_N4-Gq9.js} +1 -1
- package/src/assets/web-panel/assets/{index-BXGSbelg.js → index-Bbj2NS_I.js} +3 -3
- package/src/assets/web-panel/assets/{index-CGiIyTZw.js → index-BhA3QEni.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKmsS2jj.js → index-Bxp7uDD8.js} +1 -1
- package/src/assets/web-panel/assets/{index-B3mUHuVc.js → index-C1ifZtXo.js} +1 -1
- package/src/assets/web-panel/assets/{index-BBvyHguy.js → index-C2FqfMvU.js} +1 -1
- package/src/assets/web-panel/assets/{index-q_fQ94SE.js → index-C5dgnilC.js} +1 -1
- package/src/assets/web-panel/assets/{index-D5YVopyr.js → index-CINJQEj6.js} +1 -1
- package/src/assets/web-panel/assets/{index-0eWLkQKT.js → index-COev0W2g.js} +1 -1
- package/src/assets/web-panel/assets/{index-BoAIAZ5C.js → index-CT9vVN-X.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqoCZ5vR.js → index-CZDekj7T.js} +1 -1
- package/src/assets/web-panel/assets/{index-301ogenv.js → index-CarMTIyQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dn2dSdXx.js → index-CbQNL0ue.js} +1 -1
- package/src/assets/web-panel/assets/{index-DKUBj36_.js → index-CpBaJ3TD.js} +1 -1
- package/src/assets/web-panel/assets/{index-BBREnn1V.js → index-DB0MJgF_.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRIqLy1m.js → index-DOoQpuQY.js} +1 -1
- package/src/assets/web-panel/assets/{index-jK3ax6Z6.js → index-DTbxp4UH.js} +1 -1
- package/src/assets/web-panel/assets/{index-B1YGjOWC.js → index-DUq0c7gq.js} +1 -1
- package/src/assets/web-panel/assets/{index-CyyGTMKd.js → index-DZpYeqrh.js} +1 -1
- package/src/assets/web-panel/assets/{index-_JjRLSD0.js → index-D_LQodeJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DyUaFWEk.js → index-DalA0TKC.js} +1 -1
- package/src/assets/web-panel/assets/{index-BaE0Ui07.js → index-DjWnONdy.js} +1 -1
- package/src/assets/web-panel/assets/{index-CyWBir7N.js → index-Dkwsi1Kn.js} +1 -1
- package/src/assets/web-panel/assets/{index-qMuZ-NRR.js → index-DocEhinm.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ckrk3pIV.js → index-DpVrK6fr.js} +1 -1
- package/src/assets/web-panel/assets/{index-DQRsQen0.js → index-Dy0R5ZED.js} +1 -1
- package/src/assets/web-panel/assets/{index-frSojpHj.js → index-M7wxfAbm.js} +1 -1
- package/src/assets/web-panel/assets/{index-D0BSkxYQ.js → index-N_GoWZX4.js} +1 -1
- package/src/assets/web-panel/assets/{index-8WvYGnON.js → index-YSw_gxlZ.js} +1 -1
- package/src/assets/web-panel/assets/index-Zb2MeDSy.js +1 -0
- package/src/assets/web-panel/assets/index-fikqml4k.js +1 -0
- package/src/assets/web-panel/assets/{index-Hfe_dEGx.js → index-gt8bNefW.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZ2wUEgr.js → index-hwVDeoC0.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZpfzcuy.js → index-jWb70ZgZ.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-D4VdhJ9_.js → initDefaultProps-Co67Kqmb.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CZJA0MQW.js → motion-BMOxQSF_.js} +1 -1
- package/src/assets/web-panel/assets/{move-BqEs7Sb1.js → move-C5fWDw-N.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BpHEtsu1.js → mtc-parser-BJevpL0e.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BW94tY9W.js → omit-BCzNU8s6.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BnBjPWP9.js → pickAttrs-CybWvDPk.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-uUkjQ_hu.js → placementArrow-BMWS9HnW.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-B-klUqXK.js → responsiveObserve-BoL2UnGY.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CvY1cNAs.js → slide-DWNfXraU.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Ix5sEDT2.js → statusUtils-BquTM3tX.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-C8qcXOne.js → styleChecker-BEkCleim.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-KNF6Kj8f.js → useFlexGapSupport-Oecnq7EA.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DGJr345n.js → useFs-CkDffJ4F.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BboN99rI.js → usePersonalDataHub-qbvKXesB.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-Bgt8Vgte.js → vnode-C6v8n6mA.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-BhJtErgt.js → zoom-4CTeFILV.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +3 -3
- package/src/command-manifest.json +1 -1
- package/src/commands/agenda.js +125 -7
- package/src/commands/automation.js +462 -3
- package/src/commands/background-session.js +102 -1
- package/src/commands/cowork.js +30 -13
- package/src/commands/loop.js +167 -36
- package/src/commands/routine.js +50 -13
- package/src/commands/scheduler-daemon.js +450 -0
- package/src/data/changelog.json +27 -1
- package/src/lib/agent-schedule-store.js +509 -36
- package/src/lib/automation-center-routines.js +363 -0
- package/src/lib/automation-center.js +435 -0
- package/src/lib/automation-engine.js +74 -19
- package/src/lib/automation-execution-authority.js +736 -0
- package/src/lib/background-agent-supervisor.js +78 -0
- package/src/lib/background-needs-input-incident.js +221 -0
- package/src/lib/cowork-cron.js +555 -39
- package/src/lib/cowork-observe.js +5 -1
- package/src/lib/loop.js +37 -2
- package/src/lib/micro-compact.js +11 -5
- package/src/lib/permission-engine.js +14 -7
- package/src/lib/process-execution-broker/index.js +14 -3
- package/src/lib/public-ide-capability-manifest.js +2 -0
- package/src/lib/routine-store.js +242 -68
- package/src/lib/scheduler-kernel/agenda-adapter.js +812 -0
- package/src/lib/scheduler-kernel/authority-resolver.js +163 -0
- package/src/lib/scheduler-kernel/automation-adapter.js +592 -0
- package/src/lib/scheduler-kernel/automation-event-adapter.js +721 -0
- package/src/lib/scheduler-kernel/contract.js +11 -3
- package/src/lib/scheduler-kernel/cowork-cron-adapter.js +820 -0
- package/src/lib/scheduler-kernel/loop-adapter.js +378 -0
- package/src/lib/scheduler-kernel/routine-adapter.js +812 -0
- package/src/lib/scheduler-kernel/runtime.js +527 -0
- package/src/lib/scheduler-kernel/service.js +328 -0
- package/src/lib/scheduler-kernel/store.js +940 -98
- package/src/lib/session-message-provenance.js +4 -1
- package/src/repl/agent-repl.js +24 -5
- package/src/runtime/agent-core.js +38 -17
- package/src/runtime/coding-agent-contract-shared.cjs +5 -0
- package/src/workers/background-agent-worker.js +91 -28
- package/src/assets/web-panel/assets/MarkdownRenderer-CLmCbHx6.js +0 -1
- package/src/assets/web-panel/assets/Providers-Dy_PgDMr.js +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-CGdzFIYw.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CP2qzG6D.js +0 -1
- package/src/assets/web-panel/assets/index-CKB0vbJU.js +0 -1
- package/src/assets/web-panel/assets/index-DgoXmwqB.js +0 -1
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { logger } from "../lib/logger.js";
|
|
4
|
+
import {
|
|
5
|
+
DEFAULT_SERVICE_INTERVAL_MS,
|
|
6
|
+
MAX_SERVICE_INTERVAL_MS,
|
|
7
|
+
MIN_SERVICE_INTERVAL_MS,
|
|
8
|
+
createSchedulerService,
|
|
9
|
+
} from "../lib/scheduler-kernel/service.js";
|
|
10
|
+
|
|
11
|
+
export const SCHEDULER_DAEMON_DOMAINS = Object.freeze(["agenda", "cowork"]);
|
|
12
|
+
|
|
13
|
+
function schedulerDaemonError(code, message, details = undefined) {
|
|
14
|
+
const error = new Error(message);
|
|
15
|
+
error.code = code;
|
|
16
|
+
if (details !== undefined) error.details = details;
|
|
17
|
+
return error;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function positiveInteger(value, field) {
|
|
21
|
+
const normalized = Number(value);
|
|
22
|
+
if (!Number.isSafeInteger(normalized) || normalized < 1) {
|
|
23
|
+
throw schedulerDaemonError(
|
|
24
|
+
"SCHEDULER_DAEMON_INVALID_POLICY",
|
|
25
|
+
`${field} must be a positive integer`,
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
return normalized;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function nonnegativeInteger(value, field) {
|
|
32
|
+
const normalized = Number(value);
|
|
33
|
+
if (!Number.isSafeInteger(normalized) || normalized < 0) {
|
|
34
|
+
throw schedulerDaemonError(
|
|
35
|
+
"SCHEDULER_DAEMON_INVALID_POLICY",
|
|
36
|
+
`${field} must be a non-negative integer`,
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
return normalized;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function parseSchedulerCapabilities(value) {
|
|
43
|
+
if (typeof value !== "string") {
|
|
44
|
+
throw schedulerDaemonError(
|
|
45
|
+
"SCHEDULER_DAEMON_INVALID_POLICY",
|
|
46
|
+
"Scheduler capabilities must be a comma-separated string",
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
const capabilities = [
|
|
50
|
+
...new Set(
|
|
51
|
+
value
|
|
52
|
+
.split(",")
|
|
53
|
+
.map((entry) => entry.trim())
|
|
54
|
+
.filter(Boolean),
|
|
55
|
+
),
|
|
56
|
+
].sort();
|
|
57
|
+
if (capabilities.length === 0 || capabilities.includes("*")) {
|
|
58
|
+
throw schedulerDaemonError(
|
|
59
|
+
"SCHEDULER_DAEMON_INVALID_POLICY",
|
|
60
|
+
"Scheduler policy requires one or more exact capabilities",
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
return capabilities;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async function withSchedulerStore(dependencies, operation) {
|
|
67
|
+
const openStore =
|
|
68
|
+
dependencies.openSchedulerStore ||
|
|
69
|
+
(await import("../lib/scheduler-kernel/store.js")).openSchedulerStore;
|
|
70
|
+
const store = openStore();
|
|
71
|
+
try {
|
|
72
|
+
return operation(store);
|
|
73
|
+
} finally {
|
|
74
|
+
store.close();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export async function getSchedulerAuthorityPolicy(
|
|
79
|
+
principalType,
|
|
80
|
+
principalId,
|
|
81
|
+
dependencies = {},
|
|
82
|
+
) {
|
|
83
|
+
return withSchedulerStore(dependencies, (store) => {
|
|
84
|
+
const policy = store.getAuthorityPolicy({
|
|
85
|
+
type: principalType,
|
|
86
|
+
id: principalId,
|
|
87
|
+
});
|
|
88
|
+
if (!policy) {
|
|
89
|
+
throw schedulerDaemonError(
|
|
90
|
+
"SCHEDULER_AUTHORITY_POLICY_NOT_FOUND",
|
|
91
|
+
`Scheduler authority policy does not exist: ${principalType}:${principalId}`,
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
return policy;
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export async function setSchedulerAuthorityPolicy(
|
|
99
|
+
principalType,
|
|
100
|
+
principalId,
|
|
101
|
+
options,
|
|
102
|
+
dependencies = {},
|
|
103
|
+
) {
|
|
104
|
+
const windowSeconds = positiveInteger(options.windowSeconds, "windowSeconds");
|
|
105
|
+
const windowMs = windowSeconds * 1_000;
|
|
106
|
+
if (!Number.isSafeInteger(windowMs)) {
|
|
107
|
+
throw schedulerDaemonError(
|
|
108
|
+
"SCHEDULER_DAEMON_INVALID_POLICY",
|
|
109
|
+
"windowSeconds is too large",
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
return withSchedulerStore(dependencies, (store) =>
|
|
113
|
+
store.setAuthorityPolicy(
|
|
114
|
+
{ type: principalType, id: principalId },
|
|
115
|
+
{
|
|
116
|
+
capabilities: parseSchedulerCapabilities(options.capabilities),
|
|
117
|
+
windowMs,
|
|
118
|
+
maxRuns: positiveInteger(options.maxRuns, "maxRuns"),
|
|
119
|
+
maxUnits: positiveInteger(options.maxUnits, "maxUnits"),
|
|
120
|
+
enabled: options.disable !== true,
|
|
121
|
+
expectedRevision: nonnegativeInteger(
|
|
122
|
+
options.expectedRevision,
|
|
123
|
+
"expectedRevision",
|
|
124
|
+
),
|
|
125
|
+
},
|
|
126
|
+
),
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export function parseSchedulerDomains(
|
|
131
|
+
value = SCHEDULER_DAEMON_DOMAINS.join(","),
|
|
132
|
+
) {
|
|
133
|
+
if (typeof value !== "string") {
|
|
134
|
+
throw schedulerDaemonError(
|
|
135
|
+
"SCHEDULER_DAEMON_INVALID_DOMAINS",
|
|
136
|
+
"Scheduler domains must be a comma-separated string",
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
const requested = [
|
|
140
|
+
...new Set(
|
|
141
|
+
value
|
|
142
|
+
.split(",")
|
|
143
|
+
.map((entry) => entry.trim().toLowerCase())
|
|
144
|
+
.filter(Boolean),
|
|
145
|
+
),
|
|
146
|
+
];
|
|
147
|
+
const unknown = requested.filter(
|
|
148
|
+
(entry) => !SCHEDULER_DAEMON_DOMAINS.includes(entry),
|
|
149
|
+
);
|
|
150
|
+
if (requested.length === 0 || unknown.length > 0) {
|
|
151
|
+
throw schedulerDaemonError(
|
|
152
|
+
"SCHEDULER_DAEMON_INVALID_DOMAINS",
|
|
153
|
+
`Scheduler domains must be selected from: ${SCHEDULER_DAEMON_DOMAINS.join(", ")}`,
|
|
154
|
+
{ unknown },
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
return SCHEDULER_DAEMON_DOMAINS.filter((entry) => requested.includes(entry));
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export function parseSchedulerIntervalMs(
|
|
161
|
+
value = DEFAULT_SERVICE_INTERVAL_MS / 1000,
|
|
162
|
+
) {
|
|
163
|
+
const seconds = Number(value);
|
|
164
|
+
const intervalMs = Math.round(seconds * 1000);
|
|
165
|
+
if (
|
|
166
|
+
!Number.isFinite(seconds) ||
|
|
167
|
+
seconds <= 0 ||
|
|
168
|
+
!Number.isSafeInteger(intervalMs) ||
|
|
169
|
+
intervalMs < MIN_SERVICE_INTERVAL_MS ||
|
|
170
|
+
intervalMs > MAX_SERVICE_INTERVAL_MS
|
|
171
|
+
) {
|
|
172
|
+
throw schedulerDaemonError(
|
|
173
|
+
"SCHEDULER_DAEMON_INVALID_INTERVAL",
|
|
174
|
+
`Scheduler interval must be between ${MIN_SERVICE_INTERVAL_MS / 1000} and ${MAX_SERVICE_INTERVAL_MS / 1000} seconds`,
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
return intervalMs;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
async function loadSchedulerRuntime() {
|
|
181
|
+
const [
|
|
182
|
+
{ AgentScheduleStore },
|
|
183
|
+
{ runAgendaRun },
|
|
184
|
+
{ CoworkCronSchedulerBridge },
|
|
185
|
+
{ openSchedulerStore },
|
|
186
|
+
{ runCoworkTask },
|
|
187
|
+
] = await Promise.all([
|
|
188
|
+
import("../lib/agent-schedule-store.js"),
|
|
189
|
+
import("./agenda.js"),
|
|
190
|
+
import("../lib/scheduler-kernel/cowork-cron-adapter.js"),
|
|
191
|
+
import("../lib/scheduler-kernel/store.js"),
|
|
192
|
+
import("../lib/cowork-task-runner.js"),
|
|
193
|
+
]);
|
|
194
|
+
return {
|
|
195
|
+
AgentScheduleStore,
|
|
196
|
+
CoworkCronSchedulerBridge,
|
|
197
|
+
openSchedulerStore,
|
|
198
|
+
runAgendaRun,
|
|
199
|
+
runCoworkTask,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function parseAgendaSummary(lines) {
|
|
204
|
+
for (let index = lines.length - 1; index >= 0; index -= 1) {
|
|
205
|
+
try {
|
|
206
|
+
return JSON.parse(lines[index]);
|
|
207
|
+
} catch {
|
|
208
|
+
// Keep looking for the machine-readable summary.
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return { due: 0, retired: [], actions: [] };
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
export async function createDefaultSchedulerService({
|
|
215
|
+
cwd = process.cwd(),
|
|
216
|
+
domains = SCHEDULER_DAEMON_DOMAINS,
|
|
217
|
+
onEvent,
|
|
218
|
+
runtime,
|
|
219
|
+
createService = createSchedulerService,
|
|
220
|
+
} = {}) {
|
|
221
|
+
const selected = Array.isArray(domains)
|
|
222
|
+
? parseSchedulerDomains(domains.join(","))
|
|
223
|
+
: parseSchedulerDomains(domains);
|
|
224
|
+
const loaded = runtime || (await loadSchedulerRuntime());
|
|
225
|
+
const schedulerStore = loaded.openSchedulerStore();
|
|
226
|
+
const drivers = [];
|
|
227
|
+
try {
|
|
228
|
+
if (selected.includes("agenda")) {
|
|
229
|
+
const agendaStore = new loaded.AgentScheduleStore();
|
|
230
|
+
const ownerId = `scheduler-service:agenda:${process.pid}:${randomUUID()}`;
|
|
231
|
+
drivers.push({
|
|
232
|
+
name: "agenda",
|
|
233
|
+
async run({ signal }) {
|
|
234
|
+
const lines = [];
|
|
235
|
+
const code = await loaded.runAgendaRun(
|
|
236
|
+
{ json: true, signal },
|
|
237
|
+
{
|
|
238
|
+
store: agendaStore,
|
|
239
|
+
schedulerStore,
|
|
240
|
+
schedulerOwnerId: ownerId,
|
|
241
|
+
log: (line) => lines.push(String(line)),
|
|
242
|
+
},
|
|
243
|
+
);
|
|
244
|
+
const summary = parseAgendaSummary(lines);
|
|
245
|
+
if (code !== 0) {
|
|
246
|
+
throw schedulerDaemonError(
|
|
247
|
+
"SCHEDULER_DAEMON_AGENDA_FAILED",
|
|
248
|
+
"Agenda scheduler tick completed with one or more failed actions",
|
|
249
|
+
summary,
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
return summary;
|
|
253
|
+
},
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
if (selected.includes("cowork")) {
|
|
258
|
+
const bridge = new loaded.CoworkCronSchedulerBridge({
|
|
259
|
+
cwd,
|
|
260
|
+
schedulerStore,
|
|
261
|
+
runTask: loaded.runCoworkTask,
|
|
262
|
+
ownerId: `scheduler-service:cowork:${process.pid}:${randomUUID()}`,
|
|
263
|
+
});
|
|
264
|
+
drivers.push({
|
|
265
|
+
name: "cowork",
|
|
266
|
+
run: ({ signal }) => bridge.runDue({ signal }),
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
return createService({
|
|
271
|
+
drivers,
|
|
272
|
+
onEvent,
|
|
273
|
+
dispose: () => schedulerStore.close(),
|
|
274
|
+
});
|
|
275
|
+
} catch (error) {
|
|
276
|
+
schedulerStore.close();
|
|
277
|
+
throw error;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
function humanEvent(event, log) {
|
|
282
|
+
if (event.type === "scheduler-service-started") {
|
|
283
|
+
log(
|
|
284
|
+
chalk.green(
|
|
285
|
+
`Scheduler service running (${event.drivers.join(", ")}); press Ctrl-C to stop.`,
|
|
286
|
+
),
|
|
287
|
+
);
|
|
288
|
+
} else if (event.type === "scheduler-driver-failed") {
|
|
289
|
+
log(
|
|
290
|
+
chalk.red(
|
|
291
|
+
`${event.driver} scheduler failed (${event.error.code}): ${event.error.message}`,
|
|
292
|
+
),
|
|
293
|
+
);
|
|
294
|
+
} else if (event.type === "scheduler-service-stopped") {
|
|
295
|
+
log(chalk.gray(`Scheduler service stopped after ${event.ticks} tick(s).`));
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
export async function runSchedulerDaemon(options = {}, dependencies = {}) {
|
|
300
|
+
const domains = parseSchedulerDomains(options.domains);
|
|
301
|
+
const intervalMs = parseSchedulerIntervalMs(options.interval);
|
|
302
|
+
const log = dependencies.log || ((line) => logger.log(line));
|
|
303
|
+
const processRef = dependencies.processRef || process;
|
|
304
|
+
const controller = new AbortController();
|
|
305
|
+
const externalSignal = options.signal || dependencies.signal;
|
|
306
|
+
const abort = () => controller.abort(externalSignal?.reason);
|
|
307
|
+
if (externalSignal?.aborted) abort();
|
|
308
|
+
else externalSignal?.addEventListener?.("abort", abort, { once: true });
|
|
309
|
+
const onProcessSignal = () => controller.abort();
|
|
310
|
+
processRef.once?.("SIGINT", onProcessSignal);
|
|
311
|
+
processRef.once?.("SIGTERM", onProcessSignal);
|
|
312
|
+
|
|
313
|
+
const emit =
|
|
314
|
+
dependencies.onEvent ||
|
|
315
|
+
((event) => {
|
|
316
|
+
if (options.json) log(JSON.stringify(event));
|
|
317
|
+
else humanEvent(event, log);
|
|
318
|
+
});
|
|
319
|
+
const createDefault =
|
|
320
|
+
dependencies.createDefaultService || createDefaultSchedulerService;
|
|
321
|
+
let service;
|
|
322
|
+
try {
|
|
323
|
+
service = await createDefault({
|
|
324
|
+
cwd: options.cwd || process.cwd(),
|
|
325
|
+
domains,
|
|
326
|
+
onEvent: emit,
|
|
327
|
+
...(dependencies.runtime === undefined
|
|
328
|
+
? {}
|
|
329
|
+
: { runtime: dependencies.runtime }),
|
|
330
|
+
...(dependencies.createService === undefined
|
|
331
|
+
? {}
|
|
332
|
+
: { createService: dependencies.createService }),
|
|
333
|
+
});
|
|
334
|
+
const result = await service.run({
|
|
335
|
+
intervalMs,
|
|
336
|
+
once: options.once === true,
|
|
337
|
+
signal: controller.signal,
|
|
338
|
+
...(dependencies.maxTicks === undefined
|
|
339
|
+
? {}
|
|
340
|
+
: { maxTicks: dependencies.maxTicks }),
|
|
341
|
+
});
|
|
342
|
+
if (options.once === true) {
|
|
343
|
+
if (options.json) {
|
|
344
|
+
log(JSON.stringify({ type: "scheduler-run-summary", ...result }));
|
|
345
|
+
} else {
|
|
346
|
+
log(
|
|
347
|
+
result.status === "degraded"
|
|
348
|
+
? chalk.yellow("Scheduler tick completed with failures.")
|
|
349
|
+
: chalk.green("Scheduler tick completed."),
|
|
350
|
+
);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
return result.status === "degraded" ? 1 : 0;
|
|
354
|
+
} finally {
|
|
355
|
+
externalSignal?.removeEventListener?.("abort", abort);
|
|
356
|
+
processRef.removeListener?.("SIGINT", onProcessSignal);
|
|
357
|
+
processRef.removeListener?.("SIGTERM", onProcessSignal);
|
|
358
|
+
await service?.close();
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
export function registerSchedulerDaemonCommands(daemon) {
|
|
363
|
+
const scheduler = daemon
|
|
364
|
+
.command("scheduler")
|
|
365
|
+
.description("Run durable unattended scheduler domains in one process");
|
|
366
|
+
|
|
367
|
+
scheduler
|
|
368
|
+
.command("run", { isDefault: true })
|
|
369
|
+
.description("Run Agenda and Cowork scheduler domains")
|
|
370
|
+
.option("--once", "Run one tick and exit")
|
|
371
|
+
.option(
|
|
372
|
+
"--interval <seconds>",
|
|
373
|
+
"Polling interval in seconds",
|
|
374
|
+
String(DEFAULT_SERVICE_INTERVAL_MS / 1000),
|
|
375
|
+
)
|
|
376
|
+
.option(
|
|
377
|
+
"--domains <list>",
|
|
378
|
+
"Comma-separated domains (agenda,cowork)",
|
|
379
|
+
SCHEDULER_DAEMON_DOMAINS.join(","),
|
|
380
|
+
)
|
|
381
|
+
.option("--json", "Emit newline-delimited scheduler events")
|
|
382
|
+
.action(async (options) => {
|
|
383
|
+
try {
|
|
384
|
+
process.exitCode = await runSchedulerDaemon(options);
|
|
385
|
+
} catch (error) {
|
|
386
|
+
logger.error(chalk.red(error.message));
|
|
387
|
+
process.exitCode = 1;
|
|
388
|
+
}
|
|
389
|
+
});
|
|
390
|
+
|
|
391
|
+
const policy = scheduler
|
|
392
|
+
.command("policy")
|
|
393
|
+
.description("Inspect or update scheduler permission and budget policies");
|
|
394
|
+
|
|
395
|
+
policy
|
|
396
|
+
.command("get")
|
|
397
|
+
.description("Read one scheduler authority policy")
|
|
398
|
+
.argument("<principal-type>", "Authority principal type")
|
|
399
|
+
.argument("<principal-id>", "Authority principal id")
|
|
400
|
+
.action(async (principalType, principalId) => {
|
|
401
|
+
try {
|
|
402
|
+
logger.log(
|
|
403
|
+
JSON.stringify(
|
|
404
|
+
await getSchedulerAuthorityPolicy(principalType, principalId),
|
|
405
|
+
null,
|
|
406
|
+
2,
|
|
407
|
+
),
|
|
408
|
+
);
|
|
409
|
+
} catch (error) {
|
|
410
|
+
logger.error(chalk.red(error.message));
|
|
411
|
+
process.exitCode = 1;
|
|
412
|
+
}
|
|
413
|
+
});
|
|
414
|
+
|
|
415
|
+
policy
|
|
416
|
+
.command("set")
|
|
417
|
+
.description("CAS-update exact capabilities and a bounded usage budget")
|
|
418
|
+
.argument("<principal-type>", "Authority principal type")
|
|
419
|
+
.argument("<principal-id>", "Authority principal id")
|
|
420
|
+
.requiredOption(
|
|
421
|
+
"--capabilities <list>",
|
|
422
|
+
"Comma-separated exact capabilities",
|
|
423
|
+
)
|
|
424
|
+
.requiredOption("--window-seconds <n>", "Budget window in seconds")
|
|
425
|
+
.requiredOption("--max-runs <n>", "Maximum runs in the window")
|
|
426
|
+
.requiredOption("--max-units <n>", "Maximum units in the window")
|
|
427
|
+
.requiredOption(
|
|
428
|
+
"--expected-revision <n>",
|
|
429
|
+
"Current policy revision for compare-and-swap",
|
|
430
|
+
)
|
|
431
|
+
.option("--disable", "Disable unattended execution for this principal")
|
|
432
|
+
.action(async (principalType, principalId, options) => {
|
|
433
|
+
try {
|
|
434
|
+
logger.log(
|
|
435
|
+
JSON.stringify(
|
|
436
|
+
await setSchedulerAuthorityPolicy(
|
|
437
|
+
principalType,
|
|
438
|
+
principalId,
|
|
439
|
+
options,
|
|
440
|
+
),
|
|
441
|
+
null,
|
|
442
|
+
2,
|
|
443
|
+
),
|
|
444
|
+
);
|
|
445
|
+
} catch (error) {
|
|
446
|
+
logger.error(chalk.red(error.message));
|
|
447
|
+
process.exitCode = 1;
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
}
|
package/src/data/changelog.json
CHANGED
|
@@ -1,6 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"source": "CHANGELOG.md",
|
|
3
3
|
"releases": [
|
|
4
|
+
{
|
|
5
|
+
"productVersion": null,
|
|
6
|
+
"cliVersion": "0.163.6",
|
|
7
|
+
"cliVersions": ["0.163.5", "0.163.6"],
|
|
8
|
+
"date": "2026-08-12",
|
|
9
|
+
"title": "",
|
|
10
|
+
"sections": [
|
|
11
|
+
{
|
|
12
|
+
"heading": "Added — cc CLI 0.163.6: unified scheduler authority and automation control",
|
|
13
|
+
"body": "> `chainlesschain` **0.163.5 → 0.163.6** (candidate; not yet published,\n> 2026-08-12).\n> CLI-only candidate; `@chainlesschain/personal-data-hub` remains **0.4.57**\n> and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Complete scheduler adapter migration**: Agenda monitors, Loop iterations,\n Automation cron flows, Routine GitHub polling, channel automation events,\n and the standalone daemon now execute through the shared scheduler service\n with durable claims, definition snapshots, recovery fences, and bounded\n retry/dead-letter behavior.\n- **Timezone and missed-run consistency**: Agenda and Cowork cron definitions\n persist canonical IANA timezones, handle DST gaps and repeated civil times,\n and collapse downtime to one latest due occurrence without replay storms.\n- **Shared scheduler permission and budget authority**: Agenda, Routine,\n Cowork, Automation, and Loop bind exact capability policies to durable\n revisions and use one transactional reservation/settlement path. Missing,\n stale, disabled, exhausted, or inconsistent policy state fails closed;\n retries reuse the original reservation instead of charging twice.\n- **Layered Automation enforcement**: the shared scheduler authority composes\n with Automation's creator identity, connector permissions, live revocation,\n and per-flow run/action budgets. Domain evidence and the scheduler policy\n revision remain independently validated.\n- **Governed management surfaces**: scheduler policy inspection/update commands\n require exact capabilities and revision CAS, while the Automation Center\n exposes governed flow and Routine controls without bypassing backend\n permission or budget checks.\n- **Known residuals**: durable outcome-unknown adjudication, complete mixed-\n version migration/rollback, scheduler disk-fault closure, and the three-OS\n long-soak matrix remain open. Signed native distribution and representative\n alias-removal telemetry also remain outside this release.\n- **Release status**: final tag, source SHA, workflow run IDs, package digest,\n provenance, and registry readback are intentionally omitted until the exact\n `0.163.6` release commit passes the complete `CLI CI` and `CLI Strict Sandbox`\n Linux, Windows, and macOS matrices, followed by the dedicated npm release and\n independent public readback workflows."
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"productVersion": null,
|
|
19
|
+
"cliVersion": "0.163.5",
|
|
20
|
+
"cliVersions": ["0.163.4", "0.163.5"],
|
|
21
|
+
"date": "2026-08-11",
|
|
22
|
+
"title": "",
|
|
23
|
+
"sections": [
|
|
24
|
+
{
|
|
25
|
+
"heading": "Added — cc CLI 0.163.5: durable scheduler runtime and recovery",
|
|
26
|
+
"body": "> `chainlesschain` **0.163.4 → 0.163.5** (published from exact SHA\n> `095087c1e859a8451ce01ed58c59af3fede756fd`, 2026-08-11).\n> CLI-only release; `@chainlesschain/personal-data-hub` remains **0.4.57**\n> and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Unified scheduler runtime**: the versioned scheduler store now has a shared\n runtime with adapter registration, snapshot-bound authorization, durable\n owner/fence claims, lease renewal, bounded retry, dead-letter settlement,\n history, and adapter-kind isolation.\n- **Routine scheduling migration**: manual triggers and `routine run` cron/once\n executions use canonical logical occurrences, revision-CAS job snapshots,\n deterministic run evidence, dual-driver fencing, and crash recovery that\n settles terminal evidence without replaying the agent.\n- **Agenda wakeup/cron migration**: production Agenda wakeup and cron entries\n preserve their full permission/worktree/turn/token/cost/time run policy while\n executing through the shared kernel. New and legacy drivers coordinate with\n durable leases; known failures retry, while start-only outcomes fail closed.\n- **Cowork Cron migration**: production `cowork cron run` uses definition-only\n snapshots, workspace-scoped recovery claims, cross-version JSONL delivery\n fences, terminal-evidence recovery, and automatic one-second polling for\n six-field cron expressions.\n- **Durable compaction recovery**: micro-compaction strips transient runtime\n markers before persistence, records checkpoint state durably, restores it in\n REPL/agent flows, and preserves trace propagation across Process Broker\n execution boundaries.\n- **Honest execution boundary**: durable terminal evidence prevents duplicate\n automatic replay after a scheduler process crash. Start-only evidence or a\n post-side-effect persistence failure remains outcome-unknown and requires\n explicit handling; this release does not claim global exactly-once behavior.\n- **Known residuals**: Agenda monitor, Automation, Loop, Routine GitHub,\n standalone scheduler daemon/liveness, shared permission/budget resolution,\n IANA timezone/DST/missed-run semantics, migration/rollback, disk-fault and\n long-soak closure remain outside this release. Signed native distribution and\n representative alias-removal telemetry also remain open.\n- **Published release evidence**: immutable tag `v-npm-0-163-5` resolves to\n exact source commit `095087c1e859a8451ce01ed58c59af3fede756fd`. Its Linux,\n Windows, and macOS `CLI CI` (`31509337185`) and `CLI Strict Sandbox`\n (`31509336854`) matrices passed; the dedicated npm release (`31509336832`)\n completed its exact-SHA gate, immutable package, Trusted Publishing and\n signed provenance, and the independent public readback (`31514940240`)\n succeeded. npm reports `latest=0.163.5`; the public tarball SHA-1 is\n `5dc6677dee6d1d73b708e6a50e3808007a314894`."
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
},
|
|
4
30
|
{
|
|
5
31
|
"productVersion": null,
|
|
6
32
|
"cliVersion": "0.163.4",
|
|
@@ -10,7 +36,7 @@
|
|
|
10
36
|
"sections": [
|
|
11
37
|
{
|
|
12
38
|
"heading": "Added — cc CLI 0.163.4: immutable MCP capsules and durable scheduler storage",
|
|
13
|
-
"body": "> `chainlesschain` **0.163.3 → 0.163.4** (
|
|
39
|
+
"body": "> `chainlesschain` **0.163.3 → 0.163.4** (published from exact SHA\n> `27ed0ac2005e16ce5ddff53990e85b1d13ea0b1d`, 2026-08-11).\n> CLI-only release; `@chainlesschain/personal-data-hub` remains **0.4.57**\n> and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Immutable MCP capsule build inputs**: the capsule builder now executes in a\n bounded worker against an in-memory WASM virtual filesystem populated from\n verified bytes. Package sources and native builder assets are canonicalized,\n identity-bound, and no longer reopened from mutable host paths during the\n build.\n- **Platform-bound live capsule evidence**: materialized stdio MCP capsules are\n exercised through the production Process Broker and child contract on Linux,\n Windows, and macOS. Framed reports, exact asset identity, deferred host-path\n resolution, and shared CJS/ESM trace context prevent warning or path-alias\n drift from weakening the evidence chain.\n- **Bounded failure behavior**: worker memory, output, timeout, and cleanup are\n bounded; partial or malformed child evidence, post-verification replacement,\n unapproved effects, and unsupported strict boundaries fail closed.\n- **Command lifecycle evidence and alias decision**: report v2 binds exact\n coverage, approval, scope, and repository evidence and summarizes command\n telemetry without silently accepting zero-data input. All 25 deprecated\n aliases remain retained until representative opt-in telemetry exists and the\n documented `0.164.0` removal floor is reached.\n- **Scheduler kernel storage foundation**: a versioned SQLite store adds strict\n schema verification, expected-revision CAS, logical-occurrence deduplication,\n durable claims, and two-handle race coverage. This is the first P2-4 storage\n milestone, not completion of the scheduling kernel or orchestration runtime.\n- **Delivery and recovery hardening**: production delivery adapters, durable\n provider-backed compaction, MCP recovery admission, session ownership fences,\n and exact Windows write checks close additional internal consistency gaps.\n- **Native release readback hardening**: release evidence now verifies public\n bytes, checksums, manifests, signatures, and provenance contracts more\n strictly. Signed native distribution is still blocked until real signed\n artifacts and public package-manager readback are available.\n- **Known residuals**: full P2-4 scheduling orchestration, signed native\n distribution, representative alias telemetry, and the remaining documented\n long-soak/host-boundary follow-ups are not claimed by this release.\n- **Published release evidence**: immutable tag `v-npm-0-163-4` resolves to\n exact source commit `27ed0ac2005e16ce5ddff53990e85b1d13ea0b1d`. `CLI CI`\n (`31421782916`), `CLI Strict Sandbox` (`31421782072`), the npm release\n (`31424056034`), and independent public readback (`31425519966`) succeeded."
|
|
14
40
|
}
|
|
15
41
|
]
|
|
16
42
|
},
|