chainlesschain 0.162.78 → 0.162.80
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/README.md +37 -1
- package/bin/chainlesschain.js +20 -1
- package/package.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-BhKMd38k.js → AIOps-CwebRiRI.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BzhKY5C_.js → ActionButton-C7h2xsW3.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-CATIz2Jc.js → Analytics-BRdOQzzK.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-eCx64YWg.js → AppLayout-D_i-Jbsu.js} +5 -5
- package/src/assets/web-panel/assets/{Audit-CGOHfCHj.js → Audit-AgCF_nLK.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-Dyr6R0Ra.js → Backup-Be9up1Uo.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CVhBu7NZ.js → BaseInput-2j-7gyTU.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-DOCCKp2k.js → Chat-ZyYadHdk.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-DcXCCnjN.js → ChatBubbleRenderer-CwnbmcAg.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-3yjnENud.js → Checkbox-Di0bejSO.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-D06sn8kB.js → Codegen-BgEwqrVh.js} +1 -1
- package/src/assets/web-panel/assets/{Col-Bjn5vFES.js → Col-FIduoerd.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BYHpQHmf.js → Community-Bf7olKXg.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-MKRmnUDQ.js → Compact-CsjIF6B3.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CVtPe8dh.js → Compliance-CQchRaQh.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BRu5M3dv.js → Cowork-gJzDgX9E.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-D_7eU5Ut.js → Cron-CDjeagXb.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BFyVp_e9.js → Crosschain-D4UE5bt0.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DRoG7638.js → DID-OwvsxTzD.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-NfM_v-Oe.js → Dashboard-CbmOlZ1l.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CGN1Ksu0.js → Dropdown-B6tBUMev.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-DhsY_z_a.js → EmailListRenderer-DnM2-O3n.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-vW_VsKUG.js → FamilyGuardDashboard-DPD9znJH.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-D2ob_c7h.js → Federation-DjUj87Vr.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-Cpem15Pr.js → FormItemContext-DyPgrKLf.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-P6XfmXwT.js → GenericCardRenderer-D3fmbO1W.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CfSeec1R.js → Git-IvwC_R2h.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-4ipIpqNl.js → Governance-CTVEvxpW.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CiQY_P9Y.js → Inference-DQlp7Rf1.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-B3Qem78R.js → KnowledgeGraph-Cg8pVh5j.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-De2zWVy6.js → Logs-D7kLXyaK.js} +2 -2
- package/src/assets/web-panel/assets/{Marketplace-CTNu4c1A.js → Marketplace-QOj6g-oT.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-Xx25EA2f.js → McpTools-PO9yrTD6.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-YzzCCrch.js → Memory-B1FwSFmt.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CJZY98f0.js → MobileBridge-CYiQSoKu.js} +3 -3
- package/src/assets/web-panel/assets/{MobileProjects-Dw7yl4KN.js → MobileProjects-BThUga4r.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-D7TzGJhH.js → Mtc-B4pMzmr7.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-THyGhf0h.js → MtcAudit-D6-KGsvR.js} +6 -6
- package/src/assets/web-panel/assets/{Multisig-RVxuGPUR.js → Multisig-BlZigJMj.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DK7TCzKF.js → NLProgramming-Dhy92OLw.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-BaOU0psj.js → Notes-DOSv2Lb0.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-BMivJy85.js → NotificationSettings-FRWsHQfi.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BZOiY8Yw.js → OrderTableRenderer-xRSRWRZg.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-zVRtW1n_.js → Organization-DApwYY-B.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-C0YLldFH.js → Overflow-DyJQHxIY.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-Xxgzghqp.js → P2P-NKTPd_Bn.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-DH_LO13b.js → PdhVaultBrowser-DCgGt1BE.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-CvAd1VBw.js → Permissions-BX9MCb2z.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CWQGgCAK.js → PersonalDataHub-Bcg4az84.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-BNAoh-Lb.js → Pipeline-DjsbfwbG.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CNO5pFq-.js → Privacy-kDWl06vo.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-WaVVDsm3.js → ProjectInit-yCe-Imkv.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-D1WfkuJ3.js → ProjectSettings-tVcxlGJ5.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BzjvJYMW.js → Projects-DGL4Za4o.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-IOOJ4_wy.js → Providers-CciGxskW.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-ChHZqVZy.js → QuickAsk-It17rT4F.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CSiW6Qv9.js → Recommend-CixKdpBl.js} +1 -1
- package/src/assets/web-panel/assets/{Reputation-BQe0rkfF.js → Reputation-LB0_D2lx.js} +1 -1
- package/src/assets/web-panel/assets/{Row-Dem0Wxxb.js → Row-BoiDd-zb.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-pBY5G41C.js → RssFeed-yA5FdTgh.js} +2 -2
- package/src/assets/web-panel/assets/{Search-CtRepO6B.js → Search-xYldUFeJ.js} +1 -1
- package/src/assets/web-panel/assets/{Security-nrSlKpWq.js → Security-BtRMnkFm.js} +4 -4
- package/src/assets/web-panel/assets/{Services-DeaDBASi.js → Services-CNKTgE2v.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-Cz9R-Wjb.js → Skeleton-B9goiUo_.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-B3U-XLH3.js → Skills-CUf2Z5Ge.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-Bu46dIA_.js → Sla-TPga8c2I.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-C9Z0V0pk.js → SpeechSettings-B8zrmLP6.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-Ctj9KHHr.js → SyncSettings-DGyAbZ84.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-D4upQgR_.js → Tasks-DPeVrQNM.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-JHsPGU_c.js → Templates-CNLco6pc.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-uoaQL3fB.js → Tenant-CL9Eczo8.js} +1 -1
- package/src/assets/web-panel/assets/Terminal-DGLvbp97.js +3 -0
- package/src/assets/web-panel/assets/{TimelineRenderer-BTicmSAV.js → TimelineRenderer-Cv0LxMwd.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-Bp3BUe2K.js → Tokens-DLhHgtcS.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-CgoISw5d.js → Trigger-DzDaE-An.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-CC29awNT.js → Trust-CRh-fhYe.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CB1SB6Nc.js → UkeySign-_xBJ16UC.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-D7vptDUg.js → VideoEditing-Z5m_edIa.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BWfjzF7p.js → Wallet-DgmchNit.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-Dzz5OnPc.js → WebAuthn-BxuKxjuf.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-CiDeVmsG.js → WorkflowEditor-luJ180aM.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DQbciNb5.js → chat-DzglnTps.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DcLbPJzb.js → colors-DelLNoxZ.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CvYrR3rc.js → compact-item-BZaabUge.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BR4P7Rgm.js → createContext-DqTSTjmk.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CJLMPKYL.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-IQ88RNRJ.js → hasIn-CAeHUQj2.js} +1 -1
- package/src/assets/web-panel/assets/index-7CJalvEf.js +1 -0
- package/src/assets/web-panel/assets/{index-Bw0Dm_P6.js → index-7FxBHcH8.js} +1 -1
- package/src/assets/web-panel/assets/{index-Db5LFFCN.js → index-BAcpfWwI.js} +1 -1
- package/src/assets/web-panel/assets/{index-B5W1vQHV.js → index-BAfdWN9t.js} +1 -1
- package/src/assets/web-panel/assets/{index-BUTN1VlO.js → index-BR-DF81e.js} +3 -3
- package/src/assets/web-panel/assets/{index-BmPuR0aA.js → index-BTbN0V4A.js} +1 -1
- package/src/assets/web-panel/assets/{index-D8OJdOc_.js → index-Bv2Tp7kz.js} +1 -1
- package/src/assets/web-panel/assets/{index-BhkZZXtI.js → index-BzLgm3Jm.js} +1 -1
- package/src/assets/web-panel/assets/{index-CzERBV9P.js → index-CBZPDGTg.js} +1 -1
- package/src/assets/web-panel/assets/{index-UbB2IcFR.js → index-CBtnHlYF.js} +1 -1
- package/src/assets/web-panel/assets/{index-eKd1n8pw.js → index-CDw1am9U.js} +1 -1
- package/src/assets/web-panel/assets/{index-JqOP7puJ.js → index-CI5cynRw.js} +1 -1
- package/src/assets/web-panel/assets/{index-BiMlLIZ-.js → index-CKZQVcH1.js} +1 -1
- package/src/assets/web-panel/assets/{index-CgP5aQmA.js → index-CV4FisuU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BH2RT15D.js → index-CaSLz8-6.js} +1 -1
- package/src/assets/web-panel/assets/{index-DgaCUxpi.js → index-Cj7oeTxA.js} +1 -1
- package/src/assets/web-panel/assets/{index-DdQBxvpt.js → index-Clq1OP4B.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bl1TSbTE.js → index-CppTZ4SW.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQXs-5db.js → index-D-QuIaEh.js} +1 -1
- package/src/assets/web-panel/assets/{index-DGwa8mnJ.js → index-D-lVDXUg.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHIp5msb.js → index-DE4-6oHW.js} +1 -1
- package/src/assets/web-panel/assets/{index-CCO8yc1h.js → index-DM7xncnU.js} +1 -1
- package/src/assets/web-panel/assets/{index-b6FjzfoJ.js → index-DRt2lx0X.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bo7HAK6G.js → index-DSATjRyg.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dpmnk2qv.js → index-DU9QWJO5.js} +1 -1
- package/src/assets/web-panel/assets/{index-Mn8_ryOe.js → index-DXvcxNo5.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dox9vEhP.js → index-DhMSUhbW.js} +1 -1
- package/src/assets/web-panel/assets/{index-bRT7u-51.js → index-Dk1R9vFq.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHxJnExB.js → index-DrSuq6t6.js} +1 -1
- package/src/assets/web-panel/assets/{index-CPOupQSX.js → index-DtfTElxo.js} +1 -1
- package/src/assets/web-panel/assets/{index-BxY0ozve.js → index-KeadEGaZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BvQpTO67.js → index-NZBXGj64.js} +1 -1
- package/src/assets/web-panel/assets/{index-CiOZ_Whh.js → index-OGKhEFZZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CeCWyiFl.js → index-RZ23Wlp8.js} +1 -1
- package/src/assets/web-panel/assets/{index-BVb6RI7f.js → index-WzAdJ0PX.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cm74AosZ.js → index-Xo2WWPZ4.js} +1 -1
- package/src/assets/web-panel/assets/index-_hLbeSOT.js +1 -0
- package/src/assets/web-panel/assets/{index-CE2mqX8w.js → index-kJ30C4m8.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bu8931Yi.js → index-vLR-ssxc.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-C0arzCLE.js → initDefaultProps-BiHvIjo1.js} +1 -1
- package/src/assets/web-panel/assets/{motion-C1K6JxwD.js → motion-COD0OBOe.js} +1 -1
- package/src/assets/web-panel/assets/{move-DREsRLHj.js → move-DJNLMhIj.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BtPS3EDq.js → omit-4qrDRhlN.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BPz6tHoT.js → pickAttrs-3jv8tAgW.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-B0CR_CSI.js → placementArrow-N1UVUOH_.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-Ch2ojiNn.js → responsiveObserve-D67_gjCH.js} +1 -1
- package/src/assets/web-panel/assets/{slide-9qU9vOhj.js → slide-DiDh7_u4.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Cr4fICjV.js → statusUtils-Dzz3tSiz.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Cor2-FwV.js → styleChecker-L-tgt7xx.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-BINo_rNH.js → useFlexGapSupport-vAgElNal.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-Dm1tDNYC.js → useFs-af0c_HYI.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-__JgBEkX.js → usePersonalDataHub-V9U2Mbny.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-1hQKpRgP.js → vnode-C7zS_LLr.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-C1EY9X2J.js → zoom-DdXBDemd.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/audit.js +4 -3
- package/src/commands/automation.js +6 -14
- package/src/commands/bi.js +10 -9
- package/src/commands/codegen.js +5 -13
- package/src/commands/dao.js +8 -6
- package/src/commands/dbevo.js +13 -14
- package/src/commands/economy.js +3 -2
- package/src/commands/evolution.js +3 -2
- package/src/commands/federation.js +4 -3
- package/src/commands/governance.js +9 -4
- package/src/commands/hardening.js +5 -4
- package/src/commands/incentive.js +6 -5
- package/src/commands/kg.js +17 -10
- package/src/commands/lowcode.js +23 -11
- package/src/commands/marketplace.js +4 -3
- package/src/commands/mcp.js +17 -5
- package/src/commands/ops.js +9 -4
- package/src/commands/recommend.js +7 -5
- package/src/commands/scim.js +3 -2
- package/src/commands/session.js +9 -6
- package/src/commands/social.js +4 -3
- package/src/commands/sync.js +3 -2
- package/src/commands/tenant.js +11 -6
- package/src/commands/zkp.js +8 -9
- package/src/gateways/ws/ws-agent-handler.js +12 -3
- package/src/gateways/ws/ws-server.js +6 -0
- package/src/harness/background-task-manager.js +44 -18
- package/src/harness/mcp-client.js +125 -46
- package/src/lib/chat-core.js +209 -107
- package/src/lib/claude-code-bridge.js +13 -1
- package/src/lib/dao-governance.js +3 -3
- package/src/lib/downloader.js +82 -25
- package/src/lib/headless-config-command.js +62 -0
- package/src/lib/json-schema-output.js +55 -11
- package/src/lib/mcp-oauth.js +110 -21
- package/src/lib/mcp-serve.js +70 -11
- package/src/lib/multisig-runtime.js +22 -3
- package/src/lib/parse-json-option.js +35 -0
- package/src/lib/parse-number-option.js +27 -0
- package/src/lib/runnable-provider.js +216 -0
- package/src/repl/agent-repl.js +76 -17
- package/src/repl/config-summary.js +66 -0
- package/src/runtime/agent-core.js +210 -37
- package/src/runtime/headless-runner.js +49 -1
- package/src/runtime/headless-stream.js +34 -0
- package/src/assets/web-panel/assets/Terminal-CWRWr8bq.js +0 -3
- package/src/assets/web-panel/assets/devWarning-CnV02N63.js +0 -1
- package/src/assets/web-panel/assets/index-DJ2gkaIH.js +0 -1
- package/src/assets/web-panel/assets/index-Dvm_-AOi.js +0 -1
package/src/commands/scim.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import chalk from "chalk";
|
|
7
7
|
import { logger } from "../lib/logger.js";
|
|
8
|
+
import { parseJsonOption } from "../lib/parse-json-option.js";
|
|
8
9
|
import { bootstrap, shutdown } from "../runtime/bootstrap.js";
|
|
9
10
|
import {
|
|
10
11
|
ensureSCIMTables,
|
|
@@ -348,7 +349,7 @@ export function registerScimCommand(program) {
|
|
|
348
349
|
.requiredOption("-e, --external <id>", "external id")
|
|
349
350
|
.option("-m, --metadata <json>", "metadata JSON", "{}")
|
|
350
351
|
.action((id, opts) => {
|
|
351
|
-
const meta =
|
|
352
|
+
const meta = parseJsonOption(opts.metadata, "--metadata", {});
|
|
352
353
|
const i = registerIdentityV2(id, {
|
|
353
354
|
connectorId: opts.connector,
|
|
354
355
|
externalId: opts.external,
|
|
@@ -412,7 +413,7 @@ export function registerScimCommand(program) {
|
|
|
412
413
|
.option("-k, --kind <kind>", "job kind", "full")
|
|
413
414
|
.option("-m, --metadata <json>", "metadata JSON", "{}")
|
|
414
415
|
.action((id, opts) => {
|
|
415
|
-
const meta =
|
|
416
|
+
const meta = parseJsonOption(opts.metadata, "--metadata", {});
|
|
416
417
|
const j = createSyncJobV2(id, {
|
|
417
418
|
connectorId: opts.connector,
|
|
418
419
|
kind: opts.kind,
|
package/src/commands/session.js
CHANGED
|
@@ -7,6 +7,7 @@ import fs from "fs";
|
|
|
7
7
|
import path from "path";
|
|
8
8
|
import chalk from "chalk";
|
|
9
9
|
import { logger } from "../lib/logger.js";
|
|
10
|
+
import { parseJsonOption } from "../lib/parse-json-option.js";
|
|
10
11
|
import { bootstrap, shutdown } from "../runtime/bootstrap.js";
|
|
11
12
|
import {
|
|
12
13
|
listSessions,
|
|
@@ -288,7 +289,10 @@ export function registerSessionCommand(program) {
|
|
|
288
289
|
.description(
|
|
289
290
|
"Export a session as Markdown (chat-DB session, or JSONL agent session fallback)",
|
|
290
291
|
)
|
|
291
|
-
.argument(
|
|
292
|
+
.argument(
|
|
293
|
+
"<id>",
|
|
294
|
+
"Session ID (or prefix; `last` = most recent agent session)",
|
|
295
|
+
)
|
|
292
296
|
.option("-o, --output <file>", "Output file path")
|
|
293
297
|
.action(async (id, options) => {
|
|
294
298
|
try {
|
|
@@ -315,9 +319,8 @@ export function registerSessionCommand(program) {
|
|
|
315
319
|
const store = await import("../harness/jsonl-session-store.js");
|
|
316
320
|
const sid = id === "last" ? store.getLastSessionId() : id;
|
|
317
321
|
if (sid && store.sessionExists(sid)) {
|
|
318
|
-
const { renderAgentSessionMarkdown } =
|
|
319
|
-
"../lib/agent-session-export.js"
|
|
320
|
-
);
|
|
322
|
+
const { renderAgentSessionMarkdown } =
|
|
323
|
+
await import("../lib/agent-session-export.js");
|
|
321
324
|
markdown = renderAgentSessionMarkdown(sid, store.readEvents(sid), {
|
|
322
325
|
exportedAt: new Date().toISOString(),
|
|
323
326
|
});
|
|
@@ -1026,7 +1029,7 @@ export function registerSessionCommand(program) {
|
|
|
1026
1029
|
.requiredOption("-m, --model <model>", "model")
|
|
1027
1030
|
.option("--metadata <json>", "metadata JSON", "{}")
|
|
1028
1031
|
.action((id, opts) => {
|
|
1029
|
-
const meta =
|
|
1032
|
+
const meta = parseJsonOption(opts.metadata, "--metadata", {});
|
|
1030
1033
|
const c = registerConversationV2(id, {
|
|
1031
1034
|
userId: opts.user,
|
|
1032
1035
|
model: opts.model,
|
|
@@ -1092,7 +1095,7 @@ export function registerSessionCommand(program) {
|
|
|
1092
1095
|
.option("-r, --role <role>", "role (user/assistant)", "user")
|
|
1093
1096
|
.option("-m, --metadata <json>", "metadata JSON", "{}")
|
|
1094
1097
|
.action((id, opts) => {
|
|
1095
|
-
const meta =
|
|
1098
|
+
const meta = parseJsonOption(opts.metadata, "--metadata", {});
|
|
1096
1099
|
const t = createTurnV2(id, {
|
|
1097
1100
|
conversationId: opts.conversation,
|
|
1098
1101
|
role: opts.role,
|
package/src/commands/social.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import chalk from "chalk";
|
|
7
7
|
import { logger } from "../lib/logger.js";
|
|
8
|
+
import { parseJsonOption } from "../lib/parse-json-option.js";
|
|
8
9
|
import { bootstrap, shutdown } from "../runtime/bootstrap.js";
|
|
9
10
|
import {
|
|
10
11
|
ensureSocialTables,
|
|
@@ -642,7 +643,7 @@ export function registerSocialCommand(program) {
|
|
|
642
643
|
ensureGraphTables(db);
|
|
643
644
|
graphLoadFromDb(db);
|
|
644
645
|
|
|
645
|
-
const metadata = options.metadata
|
|
646
|
+
const metadata = parseJsonOption(options.metadata, "--metadata", null);
|
|
646
647
|
const result = graphAddEdge(db, source, target, options.type, {
|
|
647
648
|
weight: Number(options.weight) || 1.0,
|
|
648
649
|
metadata,
|
|
@@ -1206,7 +1207,7 @@ export function registerSocialCommand(program) {
|
|
|
1206
1207
|
.requiredOption("-p, --peer <peerId>", "peer id")
|
|
1207
1208
|
.option("-m, --metadata <json>", "metadata JSON", "{}")
|
|
1208
1209
|
.action((id, opts) => {
|
|
1209
|
-
const meta =
|
|
1210
|
+
const meta = parseJsonOption(opts.metadata, "--metadata", {});
|
|
1210
1211
|
const r = registerRelationshipV2(id, {
|
|
1211
1212
|
userId: opts.user,
|
|
1212
1213
|
peerId: opts.peer,
|
|
@@ -1272,7 +1273,7 @@ export function registerSocialCommand(program) {
|
|
|
1272
1273
|
.requiredOption("-t, --topic <topic>", "topic")
|
|
1273
1274
|
.option("-m, --metadata <json>", "metadata JSON", "{}")
|
|
1274
1275
|
.action((id, opts) => {
|
|
1275
|
-
const meta =
|
|
1276
|
+
const meta = parseJsonOption(opts.metadata, "--metadata", {});
|
|
1276
1277
|
const t = createThreadV2(id, {
|
|
1277
1278
|
userId: opts.user,
|
|
1278
1279
|
topic: opts.topic,
|
package/src/commands/sync.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import chalk from "chalk";
|
|
7
7
|
import { logger } from "../lib/logger.js";
|
|
8
|
+
import { parseJsonOption } from "../lib/parse-json-option.js";
|
|
8
9
|
import { bootstrap, shutdown } from "../runtime/bootstrap.js";
|
|
9
10
|
import {
|
|
10
11
|
getSyncStatus,
|
|
@@ -373,7 +374,7 @@ export function registerSyncCommand(program) {
|
|
|
373
374
|
.requiredOption("-k, --kind <kind>", "kind (file/note/...)")
|
|
374
375
|
.option("-m, --metadata <json>", "metadata JSON", "{}")
|
|
375
376
|
.action((id, opts) => {
|
|
376
|
-
const meta =
|
|
377
|
+
const meta = parseJsonOption(opts.metadata, "--metadata", {});
|
|
377
378
|
const r = registerResourceV2(id, {
|
|
378
379
|
owner: opts.owner,
|
|
379
380
|
kind: opts.kind,
|
|
@@ -437,7 +438,7 @@ export function registerSyncCommand(program) {
|
|
|
437
438
|
.option("-k, --kind <kind>", "run kind", "push")
|
|
438
439
|
.option("-m, --metadata <json>", "metadata JSON", "{}")
|
|
439
440
|
.action((id, opts) => {
|
|
440
|
-
const meta =
|
|
441
|
+
const meta = parseJsonOption(opts.metadata, "--metadata", {});
|
|
441
442
|
const j = createSyncRunV2(id, {
|
|
442
443
|
resourceId: opts.resource,
|
|
443
444
|
kind: opts.kind,
|
package/src/commands/tenant.js
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
import fs from "fs";
|
|
9
9
|
import chalk from "chalk";
|
|
10
10
|
import { logger } from "../lib/logger.js";
|
|
11
|
+
import { parseJsonOption } from "../lib/parse-json-option.js";
|
|
11
12
|
import { bootstrap, shutdown } from "../runtime/bootstrap.js";
|
|
12
13
|
import {
|
|
13
14
|
ensureTenantTables,
|
|
@@ -170,7 +171,7 @@ export function registerTenantCommand(program) {
|
|
|
170
171
|
try {
|
|
171
172
|
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
172
173
|
const db = _dbFromCtx(ctx);
|
|
173
|
-
const config = options.config
|
|
174
|
+
const config = parseJsonOption(options.config, "--config", null);
|
|
174
175
|
const t = createTenant(db, {
|
|
175
176
|
name,
|
|
176
177
|
slug,
|
|
@@ -205,7 +206,7 @@ export function registerTenantCommand(program) {
|
|
|
205
206
|
const db = _dbFromCtx(ctx);
|
|
206
207
|
const updates = {};
|
|
207
208
|
if (options.config !== undefined) {
|
|
208
|
-
updates.config =
|
|
209
|
+
updates.config = parseJsonOption(options.config, "--config");
|
|
209
210
|
}
|
|
210
211
|
if (options.plan !== undefined) updates.plan = options.plan;
|
|
211
212
|
if (options.status !== undefined) updates.status = options.status;
|
|
@@ -720,7 +721,8 @@ export function registerTenantCommand(program) {
|
|
|
720
721
|
const config = { tenantId, plan: opts.plan };
|
|
721
722
|
if (opts.owner) config.ownerId = opts.owner;
|
|
722
723
|
if (opts.initialStatus) config.initialStatus = opts.initialStatus;
|
|
723
|
-
if (opts.metadata)
|
|
724
|
+
if (opts.metadata)
|
|
725
|
+
config.metadata = parseJsonOption(opts.metadata, "--metadata");
|
|
724
726
|
console.log(JSON.stringify(registerTenantV2(null, config), null, 2));
|
|
725
727
|
});
|
|
726
728
|
|
|
@@ -740,7 +742,8 @@ export function registerTenantCommand(program) {
|
|
|
740
742
|
.action((tenantId, status, opts) => {
|
|
741
743
|
const patch = {};
|
|
742
744
|
if (opts.reason !== undefined) patch.reason = opts.reason;
|
|
743
|
-
if (opts.metadata)
|
|
745
|
+
if (opts.metadata)
|
|
746
|
+
patch.metadata = parseJsonOption(opts.metadata, "--metadata");
|
|
744
747
|
console.log(
|
|
745
748
|
JSON.stringify(
|
|
746
749
|
setTenantMaturityV2(null, tenantId, status, patch),
|
|
@@ -811,7 +814,8 @@ export function registerTenantCommand(program) {
|
|
|
811
814
|
plan: opts.plan,
|
|
812
815
|
};
|
|
813
816
|
if (opts.expiresAt) config.expiresAt = Number(opts.expiresAt);
|
|
814
|
-
if (opts.metadata)
|
|
817
|
+
if (opts.metadata)
|
|
818
|
+
config.metadata = parseJsonOption(opts.metadata, "--metadata");
|
|
815
819
|
console.log(
|
|
816
820
|
JSON.stringify(registerSubscriptionV2(null, config), null, 2),
|
|
817
821
|
);
|
|
@@ -833,7 +837,8 @@ export function registerTenantCommand(program) {
|
|
|
833
837
|
.action((subscriptionId, status, opts) => {
|
|
834
838
|
const patch = {};
|
|
835
839
|
if (opts.reason !== undefined) patch.reason = opts.reason;
|
|
836
|
-
if (opts.metadata)
|
|
840
|
+
if (opts.metadata)
|
|
841
|
+
patch.metadata = parseJsonOption(opts.metadata, "--metadata");
|
|
837
842
|
console.log(
|
|
838
843
|
JSON.stringify(
|
|
839
844
|
setSubscriptionStatusV2(null, subscriptionId, status, patch),
|
package/src/commands/zkp.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import chalk from "chalk";
|
|
7
7
|
import { logger } from "../lib/logger.js";
|
|
8
|
+
import { parseJsonOption } from "../lib/parse-json-option.js";
|
|
8
9
|
import { bootstrap, shutdown } from "../runtime/bootstrap.js";
|
|
9
10
|
import {
|
|
10
11
|
ensureZKPTables,
|
|
@@ -100,10 +101,8 @@ export function registerZkpCommand(program) {
|
|
|
100
101
|
const db = ctx.db.getDatabase();
|
|
101
102
|
ensureZKPTables(db);
|
|
102
103
|
|
|
103
|
-
const privateInputs = options.private
|
|
104
|
-
|
|
105
|
-
: {};
|
|
106
|
-
const publicInputs = options.public ? JSON.parse(options.public) : [];
|
|
104
|
+
const privateInputs = parseJsonOption(options.private, "--private", {});
|
|
105
|
+
const publicInputs = parseJsonOption(options.public, "--public", []);
|
|
107
106
|
const proveOpts = options.scheme ? { scheme: options.scheme } : {};
|
|
108
107
|
const proof = generateProof(
|
|
109
108
|
db,
|
|
@@ -174,7 +173,7 @@ export function registerZkpCommand(program) {
|
|
|
174
173
|
.option("--json", "Output as JSON")
|
|
175
174
|
.action(async (options) => {
|
|
176
175
|
try {
|
|
177
|
-
const claims = options.claims
|
|
176
|
+
const claims = parseJsonOption(options.claims, "--claims", {});
|
|
178
177
|
const disclose = options.disclose
|
|
179
178
|
? options.disclose.split(",").map((s) => s.trim())
|
|
180
179
|
: [];
|
|
@@ -404,7 +403,7 @@ export function registerZkpCommand(program) {
|
|
|
404
403
|
const db = ctx.db.getDatabase();
|
|
405
404
|
ensureZKPTables(db);
|
|
406
405
|
|
|
407
|
-
const claims = options.claims
|
|
406
|
+
const claims = parseJsonOption(options.claims, "--claims", {});
|
|
408
407
|
const cred = registerCredential(db, {
|
|
409
408
|
did: options.did,
|
|
410
409
|
claims,
|
|
@@ -622,7 +621,7 @@ export function registerZkpCommand(program) {
|
|
|
622
621
|
}
|
|
623
622
|
const db = ctx.db.getDatabase();
|
|
624
623
|
ensureZKPTables(db);
|
|
625
|
-
const def = options.definition
|
|
624
|
+
const def = parseJsonOption(options.definition, "--definition", {});
|
|
626
625
|
const circuit = compileCircuitV2(db, {
|
|
627
626
|
name,
|
|
628
627
|
definition: def,
|
|
@@ -675,8 +674,8 @@ export function registerZkpCommand(program) {
|
|
|
675
674
|
ensureZKPTables(db);
|
|
676
675
|
const proof = generateProofV2(db, {
|
|
677
676
|
circuitId,
|
|
678
|
-
privateInputs:
|
|
679
|
-
publicInputs:
|
|
677
|
+
privateInputs: parseJsonOption(options.private, "--private"),
|
|
678
|
+
publicInputs: parseJsonOption(options.public, "--public"),
|
|
680
679
|
scheme: options.scheme,
|
|
681
680
|
});
|
|
682
681
|
logger.success("Proof generated (V2)");
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
detectTaskType,
|
|
17
17
|
selectModelForTask,
|
|
18
18
|
} from "../../lib/task-model-selector.js";
|
|
19
|
+
import { runnableTaskModel } from "../../lib/runnable-provider.js";
|
|
19
20
|
import { PlanState } from "../../lib/plan-mode.js";
|
|
20
21
|
import { CLISlotFiller } from "../../lib/slot-filler.js";
|
|
21
22
|
import { createAbortError, isAbortError } from "../../lib/abort-utils.js";
|
|
@@ -63,7 +64,9 @@ export class WSAgentHandler {
|
|
|
63
64
|
// Add user message
|
|
64
65
|
session.messages.push({ role: "user", content: userMessage });
|
|
65
66
|
|
|
66
|
-
// Auto-select model based on task type
|
|
67
|
+
// Auto-select model based on task type — runnable-first: never switch
|
|
68
|
+
// onto a provider with no usable key (you'd just 401). Keep the
|
|
69
|
+
// configured model in that case.
|
|
67
70
|
let activeModel = session.model;
|
|
68
71
|
const taskDetection = detectTaskType(userMessage);
|
|
69
72
|
if (taskDetection.confidence > 0.3) {
|
|
@@ -71,8 +74,14 @@ export class WSAgentHandler {
|
|
|
71
74
|
session.provider,
|
|
72
75
|
taskDetection.taskType,
|
|
73
76
|
);
|
|
74
|
-
|
|
75
|
-
|
|
77
|
+
const switchTo = runnableTaskModel({
|
|
78
|
+
provider: session.provider,
|
|
79
|
+
currentModel: activeModel,
|
|
80
|
+
recommended,
|
|
81
|
+
apiKey: session.apiKey,
|
|
82
|
+
});
|
|
83
|
+
if (switchTo) {
|
|
84
|
+
activeModel = switchTo;
|
|
76
85
|
this.interaction.emit("model-switch", {
|
|
77
86
|
requestId,
|
|
78
87
|
from: session.model,
|
|
@@ -855,6 +855,12 @@ export class ChainlessChainWSServer extends EventEmitter {
|
|
|
855
855
|
}
|
|
856
856
|
|
|
857
857
|
_startHeartbeat() {
|
|
858
|
+
// Idempotent: clear any existing timer first so a repeated start() (or a
|
|
859
|
+
// re-fired "listening" event) can't leak the previous interval — stop()
|
|
860
|
+
// only clears the most recent handle, so an overwrite would orphan it.
|
|
861
|
+
if (this._heartbeatTimer) {
|
|
862
|
+
clearInterval(this._heartbeatTimer);
|
|
863
|
+
}
|
|
858
864
|
this._heartbeatTimer = setInterval(() => {
|
|
859
865
|
for (const [clientId, client] of this.clients) {
|
|
860
866
|
if (!client.alive) {
|
|
@@ -9,12 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import { fork } from "node:child_process";
|
|
12
|
-
import {
|
|
13
|
-
existsSync,
|
|
14
|
-
mkdirSync,
|
|
15
|
-
appendFileSync,
|
|
16
|
-
readFileSync,
|
|
17
|
-
} from "node:fs";
|
|
12
|
+
import { existsSync, mkdirSync, appendFileSync, readFileSync } from "node:fs";
|
|
18
13
|
import { join } from "node:path";
|
|
19
14
|
import { createHash } from "node:crypto";
|
|
20
15
|
import { EventEmitter } from "node:events";
|
|
@@ -38,7 +33,10 @@ export const TaskStatus = {
|
|
|
38
33
|
TIMEOUT: "timeout",
|
|
39
34
|
};
|
|
40
35
|
|
|
41
|
-
const RECOVERABLE_TASK_STATUSES = new Set([
|
|
36
|
+
const RECOVERABLE_TASK_STATUSES = new Set([
|
|
37
|
+
TaskStatus.PENDING,
|
|
38
|
+
TaskStatus.RUNNING,
|
|
39
|
+
]);
|
|
42
40
|
|
|
43
41
|
export class BackgroundTaskManager extends EventEmitter {
|
|
44
42
|
constructor(options = {}) {
|
|
@@ -47,7 +45,9 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
47
45
|
this.heartbeatTimeout = options.heartbeatTimeout || 60000;
|
|
48
46
|
this.historyLimit = options.historyLimit || 50;
|
|
49
47
|
this.nodeId =
|
|
50
|
-
options.nodeId ||
|
|
48
|
+
options.nodeId ||
|
|
49
|
+
process.env.CC_NODE_ID ||
|
|
50
|
+
`${process.pid}@${process.platform}`;
|
|
51
51
|
this.recoveryPolicy = options.recoveryPolicy || "claim-stale";
|
|
52
52
|
this.staleNodeTimeout = options.staleNodeTimeout || 5 * 60 * 1000;
|
|
53
53
|
this.tasks = new Map();
|
|
@@ -139,7 +139,12 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
139
139
|
child.on("exit", (code) => {
|
|
140
140
|
if (task.status === TaskStatus.RUNNING) {
|
|
141
141
|
if (code === 0) {
|
|
142
|
-
this._complete(
|
|
142
|
+
this._complete(
|
|
143
|
+
taskId,
|
|
144
|
+
TaskStatus.COMPLETED,
|
|
145
|
+
"Process exited (0)",
|
|
146
|
+
null,
|
|
147
|
+
);
|
|
143
148
|
} else {
|
|
144
149
|
this._complete(
|
|
145
150
|
taskId,
|
|
@@ -178,8 +183,12 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
178
183
|
|
|
179
184
|
getHistory(taskId, options = {}) {
|
|
180
185
|
const history = this.get(taskId)?.history || [];
|
|
181
|
-
const limit = Number.isFinite(options.limit)
|
|
182
|
-
|
|
186
|
+
const limit = Number.isFinite(options.limit)
|
|
187
|
+
? Math.max(1, options.limit)
|
|
188
|
+
: null;
|
|
189
|
+
const offset = Number.isFinite(options.offset)
|
|
190
|
+
? Math.max(0, options.offset)
|
|
191
|
+
: 0;
|
|
183
192
|
|
|
184
193
|
if (limit === null && offset === 0) {
|
|
185
194
|
return history;
|
|
@@ -192,7 +201,8 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
192
201
|
offset,
|
|
193
202
|
limit: limit || history.length,
|
|
194
203
|
hasMore: offset + items.length < history.length,
|
|
195
|
-
nextOffset:
|
|
204
|
+
nextOffset:
|
|
205
|
+
offset + items.length < history.length ? offset + items.length : null,
|
|
196
206
|
};
|
|
197
207
|
}
|
|
198
208
|
|
|
@@ -212,9 +222,16 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
212
222
|
const child = this.processes.get(taskId);
|
|
213
223
|
if (child) {
|
|
214
224
|
child.kill("SIGTERM");
|
|
215
|
-
|
|
225
|
+
// Escalate to SIGKILL only if SIGTERM didn't take. unref() + clear-on-exit
|
|
226
|
+
// so a prompt exit (or process shutdown right after stop) isn't held open
|
|
227
|
+
// for the full grace period by this timer.
|
|
228
|
+
const killTimer = setTimeout(() => {
|
|
216
229
|
if (child.exitCode === null) child.kill("SIGKILL");
|
|
217
230
|
}, 2000);
|
|
231
|
+
if (killTimer && typeof killTimer.unref === "function") killTimer.unref();
|
|
232
|
+
if (typeof child.once === "function") {
|
|
233
|
+
child.once("exit", () => clearTimeout(killTimer));
|
|
234
|
+
}
|
|
218
235
|
}
|
|
219
236
|
const task = this.tasks.get(taskId);
|
|
220
237
|
if (task) {
|
|
@@ -335,7 +352,8 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
335
352
|
}
|
|
336
353
|
|
|
337
354
|
_normalizePersistedTask(entry) {
|
|
338
|
-
const task =
|
|
355
|
+
const task =
|
|
356
|
+
entry?.kind === "task_snapshot" && entry.task ? entry.task : entry;
|
|
339
357
|
|
|
340
358
|
if (!task || typeof task !== "object") {
|
|
341
359
|
return null;
|
|
@@ -354,7 +372,11 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
354
372
|
if (normalized.history.length === 0) {
|
|
355
373
|
normalized.history.push({
|
|
356
374
|
event: "loaded",
|
|
357
|
-
timestamp:
|
|
375
|
+
timestamp:
|
|
376
|
+
normalized.completedAt ||
|
|
377
|
+
normalized.startedAt ||
|
|
378
|
+
normalized.createdAt ||
|
|
379
|
+
Date.now(),
|
|
358
380
|
status: normalized.status,
|
|
359
381
|
});
|
|
360
382
|
}
|
|
@@ -414,8 +436,10 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
414
436
|
|
|
415
437
|
_decideRecovery(task) {
|
|
416
438
|
const previousOwnerNodeId = task.ownerNodeId || null;
|
|
417
|
-
const sameNode =
|
|
418
|
-
|
|
439
|
+
const sameNode =
|
|
440
|
+
previousOwnerNodeId === this.nodeId || !previousOwnerNodeId;
|
|
441
|
+
const lastSeenAt =
|
|
442
|
+
task.lastHeartbeat || task.startedAt || task.createdAt || 0;
|
|
419
443
|
const stale = Date.now() - lastSeenAt > this.staleNodeTimeout;
|
|
420
444
|
|
|
421
445
|
if (sameNode) {
|
|
@@ -440,7 +464,9 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
440
464
|
return {
|
|
441
465
|
shouldRecover: false,
|
|
442
466
|
policy: this.recoveryPolicy,
|
|
443
|
-
reason: stale
|
|
467
|
+
reason: stale
|
|
468
|
+
? "foreign-node-stale-observed"
|
|
469
|
+
: "foreign-node-active-observed",
|
|
444
470
|
previousOwnerNodeId,
|
|
445
471
|
};
|
|
446
472
|
}
|