dominds 1.25.8 → 1.25.10
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/dist/llm/kernel-driver/drive.js +168 -31
- package/dist/llm/kernel-driver/idle-reminder-wake.js +76 -37
- package/dist/persistence.js +1 -1
- package/dist/server/dominds-self-update.d.ts +1 -0
- package/dist/server/dominds-self-update.js +27 -1
- package/dist/server.js +13 -0
- package/package.json +3 -3
- package/webapp/dist/assets/{_basePickBy-CATeRp8S.js → _basePickBy-B4PyBhGX.js} +3 -3
- package/webapp/dist/assets/_basePickBy-B4PyBhGX.js.map +1 -0
- package/webapp/dist/assets/{_baseUniq-CFRLPgeM.js → _baseUniq-Cj1Wg2fB.js} +2 -2
- package/webapp/dist/assets/_baseUniq-Cj1Wg2fB.js.map +1 -0
- package/webapp/dist/assets/{arc-CB9bI1EY.js → arc-CWrSn-79.js} +2 -2
- package/webapp/dist/assets/arc-CWrSn-79.js.map +1 -0
- package/webapp/dist/assets/{architectureDiagram-VXUJARFQ-CCpiy2xw.js → architectureDiagram-2XIMDMQ5-7iHYM2Z2.js} +26 -8
- package/webapp/dist/assets/architectureDiagram-2XIMDMQ5-7iHYM2Z2.js.map +1 -0
- package/webapp/dist/assets/{blockDiagram-VD42YOAC-DgzrbcBd.js → blockDiagram-WCTKOSBZ-B1TGBHuF.js} +187 -170
- package/webapp/dist/assets/blockDiagram-WCTKOSBZ-B1TGBHuF.js.map +1 -0
- package/webapp/dist/assets/{c4Diagram-YG6GDRKO-C0LCDSs6.js → c4Diagram-IC4MRINW-BXTEEF9u.js} +4 -4
- package/webapp/dist/assets/c4Diagram-IC4MRINW-BXTEEF9u.js.map +1 -0
- package/webapp/dist/assets/{channel-sKpY2JZ5.js → channel-C9f2l1ub.js} +2 -2
- package/webapp/dist/assets/channel-C9f2l1ub.js.map +1 -0
- package/webapp/dist/assets/{chunk-4BX2VUAB-D9_yL_TQ.js → chunk-4BX2VUAB-CXrwbryc.js} +2 -2
- package/webapp/dist/assets/chunk-4BX2VUAB-CXrwbryc.js.map +1 -0
- package/webapp/dist/assets/{chunk-55IACEB6-CTuUncSx.js → chunk-55IACEB6-WAoUKKa8.js} +2 -2
- package/webapp/dist/assets/chunk-55IACEB6-WAoUKKa8.js.map +1 -0
- package/webapp/dist/assets/{chunk-FMBD7UC4-CyCMHG2I.js → chunk-FMBD7UC4-CP1cvzbf.js} +2 -2
- package/webapp/dist/assets/chunk-FMBD7UC4-CP1cvzbf.js.map +1 -0
- package/webapp/dist/assets/{chunk-TZMSLE5B-CEOLgAwG.js → chunk-JSJVCQXG-Od7hQgy7.js} +14 -6
- package/webapp/dist/assets/chunk-JSJVCQXG-Od7hQgy7.js.map +1 -0
- package/webapp/dist/assets/{chunk-QN33PNHL-DPr_6BJj.js → chunk-KX2RTZJC-Cp53YoAm.js} +2 -2
- package/webapp/dist/assets/chunk-KX2RTZJC-Cp53YoAm.js.map +1 -0
- package/webapp/dist/assets/{chunk-DI55MBZ5-BoHV50iw.js → chunk-NQ4KR5QH-DkyaPUwI.js} +9 -7
- package/webapp/dist/assets/chunk-NQ4KR5QH-DkyaPUwI.js.map +1 -0
- package/webapp/dist/assets/{chunk-QZHKN3VN-B87nIEZP.js → chunk-QZHKN3VN-DPcrZWPF.js} +2 -2
- package/webapp/dist/assets/chunk-QZHKN3VN-DPcrZWPF.js.map +1 -0
- package/webapp/dist/assets/{chunk-B4BG7PRW-Ceelj1iX.js → chunk-WL4C6EOR-BCx3EtFm.js} +171 -121
- package/webapp/dist/assets/chunk-WL4C6EOR-BCx3EtFm.js.map +1 -0
- package/webapp/dist/assets/{classDiagram-2ON5EDUG-OU3Rb0MK.js → classDiagram-VBA2DB6C-BnwaVhDD.js} +7 -6
- package/webapp/dist/assets/classDiagram-VBA2DB6C-BnwaVhDD.js.map +1 -0
- package/webapp/dist/assets/{classDiagram-v2-WZHVMYZB-OU3Rb0MK.js → classDiagram-v2-RAHNMMFH-BnwaVhDD.js} +7 -6
- package/webapp/dist/assets/classDiagram-v2-RAHNMMFH-BnwaVhDD.js.map +1 -0
- package/webapp/dist/assets/{clone-DPJ1e01h.js → clone-B32zbBXk.js} +2 -2
- package/webapp/dist/assets/clone-B32zbBXk.js.map +1 -0
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-Eb4tTnqa.js → cose-bilkent-S5V4N54A-DexuXMat.js} +2 -2
- package/webapp/dist/assets/cose-bilkent-S5V4N54A-DexuXMat.js.map +1 -0
- package/webapp/dist/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -1
- package/webapp/dist/assets/{dagre-6UL2VRFP--wouwNZD.js → dagre-KLK3FWXG-D-3S_ma4.js} +7 -7
- package/webapp/dist/assets/dagre-KLK3FWXG-D-3S_ma4.js.map +1 -0
- package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
- package/webapp/dist/assets/{diagram-PSM6KHXK-Da_Qnble.js → diagram-E7M64L7V-CR7hat4A.js} +10 -10
- package/webapp/dist/assets/diagram-E7M64L7V-CR7hat4A.js.map +1 -0
- package/webapp/dist/assets/{diagram-QEK2KX5R-BhOtufwo.js → diagram-IFDJBPK2-B6qnqfZU.js} +9 -8
- package/webapp/dist/assets/diagram-IFDJBPK2-B6qnqfZU.js.map +1 -0
- package/webapp/dist/assets/{diagram-S2PKOQOG-k-LiSr-7.js → diagram-P4PSJMXO-BDGFMbld.js} +8 -8
- package/webapp/dist/assets/diagram-P4PSJMXO-BDGFMbld.js.map +1 -0
- package/webapp/dist/assets/{erDiagram-Q2GNP2WA-DSTHWIXm.js → erDiagram-INFDFZHY-BcXnNg1A.js} +96 -75
- package/webapp/dist/assets/erDiagram-INFDFZHY-BcXnNg1A.js.map +1 -0
- package/webapp/dist/assets/{flowDiagram-NV44I4VS-BjS-xbaY.js → flowDiagram-PKNHOUZH-CgKu7usU.js} +98 -81
- package/webapp/dist/assets/flowDiagram-PKNHOUZH-CgKu7usU.js.map +1 -0
- package/webapp/dist/assets/{ganttDiagram-JELNMOA3-DAgcUpJe.js → ganttDiagram-A5KZAMGK-BwkrQGcZ.js} +28 -3
- package/webapp/dist/assets/ganttDiagram-A5KZAMGK-BwkrQGcZ.js.map +1 -0
- package/webapp/dist/assets/{gitGraphDiagram-V2S2FVAM-i1vEkfoe.js → gitGraphDiagram-K3NZZRJ6-CVqi-T5p.js} +38 -46
- package/webapp/dist/assets/gitGraphDiagram-K3NZZRJ6-CVqi-T5p.js.map +1 -0
- package/webapp/dist/assets/graph-B7VL6q5k.js +782 -0
- package/webapp/dist/assets/graph-B7VL6q5k.js.map +1 -0
- package/webapp/dist/assets/{index-piqwT9B7.js → index-4xG_gPRh.js} +1048 -1141
- package/webapp/dist/assets/{index-piqwT9B7.js.map → index-4xG_gPRh.js.map} +1 -1
- package/webapp/dist/assets/{index-yycTJNYb.css → index-BQoNJEGT.css} +1 -1
- package/webapp/dist/assets/{infoDiagram-HS3SLOUP-BH-Wj-38.js → infoDiagram-LFFYTUFH-a9WBcgds.js} +7 -7
- package/webapp/dist/assets/infoDiagram-LFFYTUFH-a9WBcgds.js.map +1 -0
- package/webapp/dist/assets/init-ZxktEp_H.js.map +1 -1
- package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-Bhiex3_9.js +966 -0
- package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-Bhiex3_9.js.map +1 -0
- package/webapp/dist/assets/{journeyDiagram-XKPGCS4Q-B5c5iW9X.js → journeyDiagram-4ABVD52K-DdMDmgOQ.js} +5 -5
- package/webapp/dist/assets/journeyDiagram-4ABVD52K-DdMDmgOQ.js.map +1 -0
- package/webapp/dist/assets/{kanban-definition-3W4ZIXB7-fgYwmV5l.js → kanban-definition-K7BYSVSG-C02Ns-Ee.js} +5 -3
- package/webapp/dist/assets/kanban-definition-K7BYSVSG-C02Ns-Ee.js.map +1 -0
- package/webapp/dist/assets/{layout-Dc9UeLis.js → layout-CKFoJLnz.js} +5 -5
- package/webapp/dist/assets/layout-CKFoJLnz.js.map +1 -0
- package/webapp/dist/assets/{linear-DFqZ7yVr.js → linear-DK87WR34.js} +2 -2
- package/webapp/dist/assets/linear-DK87WR34.js.map +1 -0
- package/webapp/dist/assets/{mindmap-definition-VGOIOE7T-CWXQmWf-.js → mindmap-definition-YRQLILUH-CNPEaAdT.js} +7 -5
- package/webapp/dist/assets/mindmap-definition-YRQLILUH-CNPEaAdT.js.map +1 -0
- package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
- package/webapp/dist/assets/{pieDiagram-ADFJNKIX-Dmm4opIx.js → pieDiagram-SKSYHLDU-BAieZgqR.js} +8 -8
- package/webapp/dist/assets/pieDiagram-SKSYHLDU-BAieZgqR.js.map +1 -0
- package/webapp/dist/assets/{quadrantDiagram-AYHSOK5B-L48S6y-Y.js → quadrantDiagram-337W2JSQ-DNfJ-efQ.js} +3 -3
- package/webapp/dist/assets/quadrantDiagram-337W2JSQ-DNfJ-efQ.js.map +1 -0
- package/webapp/dist/assets/{requirementDiagram-UZGBJVZJ-uQa6qCTU.js → requirementDiagram-Z7DCOOCP-Ci2ficlW.js} +16 -6
- package/webapp/dist/assets/requirementDiagram-Z7DCOOCP-Ci2ficlW.js.map +1 -0
- package/webapp/dist/assets/{sankeyDiagram-TZEHDZUN-4wM4sZjA.js → sankeyDiagram-WA2Y5GQK-y2RH0qmH.js} +2 -2
- package/webapp/dist/assets/sankeyDiagram-WA2Y5GQK-y2RH0qmH.js.map +1 -0
- package/webapp/dist/assets/{sequenceDiagram-WL72ISMW-EZlETI0Q.js → sequenceDiagram-2WXFIKYE-C4Mbfwyu.js} +601 -201
- package/webapp/dist/assets/sequenceDiagram-2WXFIKYE-C4Mbfwyu.js.map +1 -0
- package/webapp/dist/assets/{stateDiagram-FKZM4ZOC-CeCT7b7S.js → stateDiagram-RAJIS63D-enKQJ7WW.js} +9 -9
- package/webapp/dist/assets/stateDiagram-RAJIS63D-enKQJ7WW.js.map +1 -0
- package/webapp/dist/assets/{stateDiagram-v2-4FDKWEC3-3oDsYGFz.js → stateDiagram-v2-FVOUBMTO-44zqAgYM.js} +5 -5
- package/webapp/dist/assets/stateDiagram-v2-FVOUBMTO-44zqAgYM.js.map +1 -0
- package/webapp/dist/assets/{timeline-definition-IT6M3QCI-9k0ahO0m.js → timeline-definition-YZTLITO2-Byr_GVOH.js} +3 -3
- package/webapp/dist/assets/timeline-definition-YZTLITO2-Byr_GVOH.js.map +1 -0
- package/webapp/dist/assets/{treemap-GDKQZRPO--DQUhriC.js → treemap-KZPCXAKY-BSv-k7HC.js} +37 -24
- package/webapp/dist/assets/treemap-KZPCXAKY-BSv-k7HC.js.map +1 -0
- package/webapp/dist/assets/vennDiagram-LZ73GAT5-CPqduRWm.js +2487 -0
- package/webapp/dist/assets/vennDiagram-LZ73GAT5-CPqduRWm.js.map +1 -0
- package/webapp/dist/assets/{xychartDiagram-PRI3JC2R-VhFrAQO2.js → xychartDiagram-JWTSCODW-B8yG6HaE.js} +4 -4
- package/webapp/dist/assets/xychartDiagram-JWTSCODW-B8yG6HaE.js.map +1 -0
- package/webapp/dist/index.html +2 -2
- package/webapp/dist/assets/_basePickBy-CATeRp8S.js.map +0 -1
- package/webapp/dist/assets/_baseUniq-CFRLPgeM.js.map +0 -1
- package/webapp/dist/assets/arc-CB9bI1EY.js.map +0 -1
- package/webapp/dist/assets/architectureDiagram-VXUJARFQ-CCpiy2xw.js.map +0 -1
- package/webapp/dist/assets/blockDiagram-VD42YOAC-DgzrbcBd.js.map +0 -1
- package/webapp/dist/assets/c4Diagram-YG6GDRKO-C0LCDSs6.js.map +0 -1
- package/webapp/dist/assets/channel-sKpY2JZ5.js.map +0 -1
- package/webapp/dist/assets/chunk-4BX2VUAB-D9_yL_TQ.js.map +0 -1
- package/webapp/dist/assets/chunk-55IACEB6-CTuUncSx.js.map +0 -1
- package/webapp/dist/assets/chunk-B4BG7PRW-Ceelj1iX.js.map +0 -1
- package/webapp/dist/assets/chunk-DI55MBZ5-BoHV50iw.js.map +0 -1
- package/webapp/dist/assets/chunk-FMBD7UC4-CyCMHG2I.js.map +0 -1
- package/webapp/dist/assets/chunk-QN33PNHL-DPr_6BJj.js.map +0 -1
- package/webapp/dist/assets/chunk-QZHKN3VN-B87nIEZP.js.map +0 -1
- package/webapp/dist/assets/chunk-TZMSLE5B-CEOLgAwG.js.map +0 -1
- package/webapp/dist/assets/classDiagram-2ON5EDUG-OU3Rb0MK.js.map +0 -1
- package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-OU3Rb0MK.js.map +0 -1
- package/webapp/dist/assets/clone-DPJ1e01h.js.map +0 -1
- package/webapp/dist/assets/cose-bilkent-S5V4N54A-Eb4tTnqa.js.map +0 -1
- package/webapp/dist/assets/dagre-6UL2VRFP--wouwNZD.js.map +0 -1
- package/webapp/dist/assets/diagram-PSM6KHXK-Da_Qnble.js.map +0 -1
- package/webapp/dist/assets/diagram-QEK2KX5R-BhOtufwo.js.map +0 -1
- package/webapp/dist/assets/diagram-S2PKOQOG-k-LiSr-7.js.map +0 -1
- package/webapp/dist/assets/erDiagram-Q2GNP2WA-DSTHWIXm.js.map +0 -1
- package/webapp/dist/assets/flowDiagram-NV44I4VS-BjS-xbaY.js.map +0 -1
- package/webapp/dist/assets/ganttDiagram-JELNMOA3-DAgcUpJe.js.map +0 -1
- package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-i1vEkfoe.js.map +0 -1
- package/webapp/dist/assets/graph-CxNIZAUJ.js +0 -425
- package/webapp/dist/assets/graph-CxNIZAUJ.js.map +0 -1
- package/webapp/dist/assets/infoDiagram-HS3SLOUP-BH-Wj-38.js.map +0 -1
- package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-B5c5iW9X.js.map +0 -1
- package/webapp/dist/assets/kanban-definition-3W4ZIXB7-fgYwmV5l.js.map +0 -1
- package/webapp/dist/assets/layout-Dc9UeLis.js.map +0 -1
- package/webapp/dist/assets/linear-DFqZ7yVr.js.map +0 -1
- package/webapp/dist/assets/mindmap-definition-VGOIOE7T-CWXQmWf-.js.map +0 -1
- package/webapp/dist/assets/pieDiagram-ADFJNKIX-Dmm4opIx.js.map +0 -1
- package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-L48S6y-Y.js.map +0 -1
- package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-uQa6qCTU.js.map +0 -1
- package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-4wM4sZjA.js.map +0 -1
- package/webapp/dist/assets/sequenceDiagram-WL72ISMW-EZlETI0Q.js.map +0 -1
- package/webapp/dist/assets/stateDiagram-FKZM4ZOC-CeCT7b7S.js.map +0 -1
- package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3-3oDsYGFz.js.map +0 -1
- package/webapp/dist/assets/timeline-definition-IT6M3QCI-9k0ahO0m.js.map +0 -1
- package/webapp/dist/assets/treemap-GDKQZRPO--DQUhriC.js.map +0 -1
- package/webapp/dist/assets/xychartDiagram-PRI3JC2R-VhFrAQO2.js.map +0 -1
|
@@ -1309,7 +1309,7 @@ async function maybeWriteUnexpectedIdleAfterToolRoundDebugDump(args) {
|
|
|
1309
1309
|
throw new Error('unexpected idle debug invariant violation: diagnostics disappeared');
|
|
1310
1310
|
}
|
|
1311
1311
|
const capturedAt = (0, time_1.formatUnifiedTimestamp)(new Date());
|
|
1312
|
-
const debugDir = node_path_1.default.resolve(process.cwd(), '.
|
|
1312
|
+
const debugDir = node_path_1.default.resolve(process.cwd(), '.dialogs', 'debug');
|
|
1313
1313
|
const fileName = [
|
|
1314
1314
|
'kernel-driver-unexpected-idle-after-tool-round',
|
|
1315
1315
|
sanitizeDebugFileSegment(capturedAt),
|
|
@@ -1347,6 +1347,54 @@ async function maybeWriteUnexpectedIdleAfterToolRoundDebugDump(args) {
|
|
|
1347
1347
|
await promises_1.default.mkdir(debugDir, { recursive: true });
|
|
1348
1348
|
await promises_1.default.writeFile(node_path_1.default.join(debugDir, fileName), `${JSON.stringify(payload, null, 2)}\n`, 'utf8');
|
|
1349
1349
|
}
|
|
1350
|
+
async function writeMissingImmediateFollowupTriggerDebugDump(args) {
|
|
1351
|
+
const capturedAt = (0, time_1.formatUnifiedTimestamp)(new Date());
|
|
1352
|
+
const debugDir = node_path_1.default.resolve(process.cwd(), '.dialogs', 'debug');
|
|
1353
|
+
const trigger = args.expectation.trigger;
|
|
1354
|
+
const fileName = [
|
|
1355
|
+
'kernel-driver-missing-immediate-followup-trigger',
|
|
1356
|
+
sanitizeDebugFileSegment(capturedAt),
|
|
1357
|
+
sanitizeDebugFileSegment(args.dlg.id.rootId),
|
|
1358
|
+
sanitizeDebugFileSegment(args.dlg.id.selfId),
|
|
1359
|
+
sanitizeDebugFileSegment(trigger.triggerId),
|
|
1360
|
+
`${(0, id_1.generateShortId)()}.json`,
|
|
1361
|
+
].join('-');
|
|
1362
|
+
const activeCallees = await persistence_1.DialogPersistence.loadActiveCallees(args.dlg.id, args.dlg.status);
|
|
1363
|
+
const suspension = await args.dlg.getSuspensionStatus();
|
|
1364
|
+
const payload = {
|
|
1365
|
+
kind: args.repairOutcome === 'repaired'
|
|
1366
|
+
? 'kernel_driver_missing_immediate_followup_trigger_repaired'
|
|
1367
|
+
: 'kernel_driver_missing_immediate_followup_trigger_repair_failed',
|
|
1368
|
+
capturedAt,
|
|
1369
|
+
rtwsRootAbs: process.cwd(),
|
|
1370
|
+
repairOutcome: args.repairOutcome,
|
|
1371
|
+
checkPoint: args.checkPoint,
|
|
1372
|
+
dialog: {
|
|
1373
|
+
rootId: args.dlg.id.rootId,
|
|
1374
|
+
selfId: args.dlg.id.selfId,
|
|
1375
|
+
value: args.dlg.id.valueOf(),
|
|
1376
|
+
agentId: args.dlg.agentId,
|
|
1377
|
+
status: args.dlg.status,
|
|
1378
|
+
currentCourse: args.dlg.currentCourse,
|
|
1379
|
+
activeGenCourse: args.dlg.activeGenCourseOrUndefined ?? null,
|
|
1380
|
+
activeGenSeq: args.dlg.activeGenSeqOrUndefined ?? null,
|
|
1381
|
+
hasQueuedPrompt: args.dlg.hasQueuedPrompt(),
|
|
1382
|
+
queuedPrompt: args.dlg.peekQueuedPrompt() ?? null,
|
|
1383
|
+
},
|
|
1384
|
+
expectation: args.expectation,
|
|
1385
|
+
latestBeforeRepair: args.latestBeforeRepair,
|
|
1386
|
+
latestAfterRepair: args.latestAfterRepair,
|
|
1387
|
+
activeCallees,
|
|
1388
|
+
suspension,
|
|
1389
|
+
callstack: new Error(args.repairOutcome === 'repaired'
|
|
1390
|
+
? 'kernel-driver missing immediate followup trigger repaired'
|
|
1391
|
+
: 'kernel-driver missing immediate followup trigger repair failed').stack ?? null,
|
|
1392
|
+
};
|
|
1393
|
+
await promises_1.default.mkdir(debugDir, { recursive: true });
|
|
1394
|
+
const debugPath = node_path_1.default.join(debugDir, fileName);
|
|
1395
|
+
await promises_1.default.writeFile(debugPath, `${JSON.stringify(payload, null, 2)}\n`, 'utf8');
|
|
1396
|
+
return debugPath;
|
|
1397
|
+
}
|
|
1350
1398
|
async function maybeWriteIdleWithActiveReplyObligationDebugDump(args) {
|
|
1351
1399
|
if (args.finalDisplayState.kind !== 'idle_waiting_user') {
|
|
1352
1400
|
return;
|
|
@@ -1355,7 +1403,7 @@ async function maybeWriteIdleWithActiveReplyObligationDebugDump(args) {
|
|
|
1355
1403
|
return;
|
|
1356
1404
|
}
|
|
1357
1405
|
const capturedAt = (0, time_1.formatUnifiedTimestamp)(new Date());
|
|
1358
|
-
const debugDir = node_path_1.default.resolve(process.cwd(), '.
|
|
1406
|
+
const debugDir = node_path_1.default.resolve(process.cwd(), '.dialogs', 'debug');
|
|
1359
1407
|
const fileName = [
|
|
1360
1408
|
'kernel-driver-idle-with-active-reply-obligation',
|
|
1361
1409
|
sanitizeDebugFileSegment(capturedAt),
|
|
@@ -1392,7 +1440,7 @@ async function maybeWriteIdleWithActiveReplyObligationDebugDump(args) {
|
|
|
1392
1440
|
await promises_1.default.mkdir(debugDir, { recursive: true });
|
|
1393
1441
|
await promises_1.default.writeFile(node_path_1.default.join(debugDir, fileName), `${JSON.stringify(payload, null, 2)}\n`, 'utf8');
|
|
1394
1442
|
}
|
|
1395
|
-
|
|
1443
|
+
function buildImmediateFollowupTriggerExpectation(args) {
|
|
1396
1444
|
const reasons = [];
|
|
1397
1445
|
if (args.routed.immediateFollowupCallIds.length > 0) {
|
|
1398
1446
|
reasons.push({
|
|
@@ -1418,11 +1466,11 @@ async function upsertImmediateFollowupTrigger(args) {
|
|
|
1418
1466
|
});
|
|
1419
1467
|
}
|
|
1420
1468
|
if (reasons.length === 0) {
|
|
1421
|
-
return;
|
|
1469
|
+
return undefined;
|
|
1422
1470
|
}
|
|
1423
1471
|
const course = args.dlg.activeGenCourseOrUndefined ?? args.dlg.currentCourse;
|
|
1424
1472
|
const genseq = args.dlg.activeGenSeq;
|
|
1425
|
-
|
|
1473
|
+
const trigger = {
|
|
1426
1474
|
triggerId: `followup:c${String(course)}:g${String(genseq)}`,
|
|
1427
1475
|
kind: 'followup',
|
|
1428
1476
|
sourceGeneration: {
|
|
@@ -1431,7 +1479,74 @@ async function upsertImmediateFollowupTrigger(args) {
|
|
|
1431
1479
|
},
|
|
1432
1480
|
reasons,
|
|
1433
1481
|
continuation: args.continuation,
|
|
1482
|
+
};
|
|
1483
|
+
return {
|
|
1484
|
+
trigger,
|
|
1485
|
+
callIds: args.streamedFuncCalls.map((call) => call.id),
|
|
1486
|
+
callNames: args.streamedFuncCalls.map((call) => call.name),
|
|
1487
|
+
routed: summarizeRoutedFunctionResult(args.routed),
|
|
1488
|
+
continuation: args.continuation,
|
|
1489
|
+
invalidFuncCallCount: args.invalidFuncCallCount,
|
|
1490
|
+
};
|
|
1491
|
+
}
|
|
1492
|
+
async function upsertImmediateFollowupTrigger(dlg, expectation) {
|
|
1493
|
+
await persistence_1.DialogPersistence.upsertNextStepTrigger(dlg.id, expectation.trigger, dlg.status);
|
|
1494
|
+
}
|
|
1495
|
+
function hasExpectedImmediateFollowupTrigger(latest, expectation) {
|
|
1496
|
+
return (latest?.nextStep.triggers.some((trigger) => trigger.kind === 'followup' && trigger.triggerId === expectation.trigger.triggerId) === true);
|
|
1497
|
+
}
|
|
1498
|
+
async function repairMissingImmediateFollowupTrigger(args) {
|
|
1499
|
+
const expectation = args.expectation;
|
|
1500
|
+
if (expectation === undefined) {
|
|
1501
|
+
return;
|
|
1502
|
+
}
|
|
1503
|
+
const latestBeforeRepair = await persistence_1.DialogPersistence.loadDialogLatest(args.dlg.id, args.dlg.status);
|
|
1504
|
+
if (hasExpectedImmediateFollowupTrigger(latestBeforeRepair, expectation)) {
|
|
1505
|
+
return;
|
|
1506
|
+
}
|
|
1507
|
+
await persistence_1.DialogPersistence.upsertNextStepTrigger(args.dlg.id, expectation.trigger, args.dlg.status);
|
|
1508
|
+
const latestAfterRepair = await persistence_1.DialogPersistence.loadDialogLatest(args.dlg.id, args.dlg.status);
|
|
1509
|
+
const repairSucceeded = hasExpectedImmediateFollowupTrigger(latestAfterRepair, expectation);
|
|
1510
|
+
const repairOutcome = repairSucceeded
|
|
1511
|
+
? 'repaired'
|
|
1512
|
+
: 'repair_failed';
|
|
1513
|
+
const debugPath = await writeMissingImmediateFollowupTriggerDebugDump({
|
|
1514
|
+
dlg: args.dlg,
|
|
1515
|
+
expectation,
|
|
1516
|
+
latestBeforeRepair,
|
|
1517
|
+
latestAfterRepair,
|
|
1518
|
+
checkPoint: args.checkPoint,
|
|
1519
|
+
repairOutcome,
|
|
1434
1520
|
});
|
|
1521
|
+
const message = `${repairSucceeded ? 'Repaired' : 'Failed to repair'} missing immediate follow-up trigger after function results ` +
|
|
1522
|
+
`(triggerId=${expectation.trigger.triggerId}, checkPoint=${args.checkPoint})`;
|
|
1523
|
+
log_1.log.error(message, new Error(`kernel_driver_missing_immediate_followup_trigger_${repairOutcome}`), {
|
|
1524
|
+
rootId: args.dlg.id.rootId,
|
|
1525
|
+
selfId: args.dlg.id.selfId,
|
|
1526
|
+
dialogId: args.dlg.id.valueOf(),
|
|
1527
|
+
status: args.dlg.status,
|
|
1528
|
+
triggerId: expectation.trigger.triggerId,
|
|
1529
|
+
checkPoint: args.checkPoint,
|
|
1530
|
+
repairSucceeded,
|
|
1531
|
+
sourceGeneration: expectation.trigger.sourceGeneration,
|
|
1532
|
+
reasonKinds: expectation.trigger.reasons.map((reason) => reason.kind),
|
|
1533
|
+
callIds: expectation.callIds,
|
|
1534
|
+
callNames: expectation.callNames,
|
|
1535
|
+
invalidFuncCallCount: expectation.invalidFuncCallCount,
|
|
1536
|
+
continuation: expectation.continuation,
|
|
1537
|
+
routed: expectation.routed,
|
|
1538
|
+
latestBeforeRepairNextStep: latestBeforeRepair?.nextStep ?? null,
|
|
1539
|
+
latestBeforeRepairGenerationRunState: latestBeforeRepair?.generationRunState ?? null,
|
|
1540
|
+
latestBeforeRepairDisplayState: latestBeforeRepair?.displayState ?? null,
|
|
1541
|
+
latestAfterRepairNextStep: latestAfterRepair?.nextStep ?? null,
|
|
1542
|
+
latestAfterRepairGenerationRunState: latestAfterRepair?.generationRunState ?? null,
|
|
1543
|
+
latestAfterRepairDisplayState: latestAfterRepair?.displayState ?? null,
|
|
1544
|
+
debugPath,
|
|
1545
|
+
});
|
|
1546
|
+
await args.dlg.streamError(`${message}; debug=${debugPath}`);
|
|
1547
|
+
if (!repairSucceeded) {
|
|
1548
|
+
throw new Error(`${message}; debug=${debugPath}`);
|
|
1549
|
+
}
|
|
1435
1550
|
}
|
|
1436
1551
|
function shouldImmediatelyFollowUpSuccessfulToolResult(tool) {
|
|
1437
1552
|
return resolveFuncToolFollowupMode(tool) === 'immediate';
|
|
@@ -2269,6 +2384,7 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
|
|
|
2269
2384
|
}
|
|
2270
2385
|
lastBusinessContinuation = currentBusinessContinuation;
|
|
2271
2386
|
let generationBodyError;
|
|
2387
|
+
let immediateFollowupTriggerExpectation;
|
|
2272
2388
|
const q4hAnswerCallId = normalizeQ4HAnswerCallId(currentPrompt?.q4hAnswerCallId);
|
|
2273
2389
|
const isQ4HAnswerPrompt = q4hAnswerCallId !== undefined;
|
|
2274
2390
|
try {
|
|
@@ -3139,13 +3255,38 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
|
|
|
3139
3255
|
});
|
|
3140
3256
|
break;
|
|
3141
3257
|
}
|
|
3258
|
+
// Start an immediate post-tool generation only when this round produced tool outputs that
|
|
3259
|
+
// warrant same-drive LLM reaction right away. Provider-native side-channel UI events are
|
|
3260
|
+
// meaningful output, but they are not transcript/context inputs and therefore must not
|
|
3261
|
+
// trigger another immediate generation round by themselves.
|
|
3262
|
+
const shouldStartImmediatePostToolGeneration = routed.hasImmediateFollowupToolCalls ||
|
|
3263
|
+
routed.hasImmediateTellaskOutputs ||
|
|
3264
|
+
invalidFuncCallCount > 0;
|
|
3265
|
+
if (shouldStartImmediatePostToolGeneration) {
|
|
3266
|
+
const expectation = buildImmediateFollowupTriggerExpectation({
|
|
3267
|
+
dlg,
|
|
3268
|
+
routed,
|
|
3269
|
+
invalidFuncCallCount,
|
|
3270
|
+
streamedFuncCalls,
|
|
3271
|
+
continuation: currentBusinessContinuation,
|
|
3272
|
+
});
|
|
3273
|
+
if (expectation === undefined) {
|
|
3274
|
+
throw new Error(`Immediate follow-up trigger invariant violation: expected trigger reasons missing ` +
|
|
3275
|
+
`(dialog=${dlg.id.valueOf()}, course=${String(dlg.activeGenCourseOrUndefined ?? dlg.currentCourse)}, ` +
|
|
3276
|
+
`genseq=${String(dlg.activeGenSeq)}, immediateToolCalls=${String(routed.hasImmediateFollowupToolCalls)}, ` +
|
|
3277
|
+
`immediateTellaskOutputs=${String(routed.hasImmediateTellaskOutputs)}, ` +
|
|
3278
|
+
`invalidFuncCallCount=${String(invalidFuncCallCount)})`);
|
|
3279
|
+
}
|
|
3280
|
+
immediateFollowupTriggerExpectation = expectation;
|
|
3281
|
+
await upsertImmediateFollowupTrigger(dlg, immediateFollowupTriggerExpectation);
|
|
3282
|
+
}
|
|
3142
3283
|
if (dlg.hasQueuedPrompt()) {
|
|
3143
3284
|
lastToolRoundStopDiagnostics = buildToolRoundStopDiagnostics({
|
|
3144
3285
|
dlg,
|
|
3145
3286
|
streamedFuncCalls,
|
|
3146
3287
|
routed,
|
|
3147
3288
|
lastBusinessContinuation,
|
|
3148
|
-
shouldStartImmediatePostToolGeneration
|
|
3289
|
+
shouldStartImmediatePostToolGeneration,
|
|
3149
3290
|
stopReason: 'queued_prompt_after_tool_round',
|
|
3150
3291
|
queuedPromptAfterToolRound: true,
|
|
3151
3292
|
remindersVer: dlg.remindersVer,
|
|
@@ -3166,7 +3307,7 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
|
|
|
3166
3307
|
streamedFuncCalls,
|
|
3167
3308
|
routed,
|
|
3168
3309
|
lastBusinessContinuation,
|
|
3169
|
-
shouldStartImmediatePostToolGeneration
|
|
3310
|
+
shouldStartImmediatePostToolGeneration,
|
|
3170
3311
|
stopReason: 'suspended_after_tool_round',
|
|
3171
3312
|
suspensionAfterToolRound,
|
|
3172
3313
|
queuedPromptAfterToolRound: dlg.hasQueuedPrompt(),
|
|
@@ -3176,13 +3317,6 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
|
|
|
3176
3317
|
await preserveDiligenceBudgetAcrossQ4H(dlg);
|
|
3177
3318
|
break;
|
|
3178
3319
|
}
|
|
3179
|
-
// Start an immediate post-tool generation only when this round produced tool outputs that
|
|
3180
|
-
// warrant same-drive LLM reaction right away. Provider-native side-channel UI events are
|
|
3181
|
-
// meaningful output, but they are not transcript/context inputs and therefore must not
|
|
3182
|
-
// trigger another immediate generation round by themselves.
|
|
3183
|
-
const shouldStartImmediatePostToolGeneration = routed.hasImmediateFollowupToolCalls ||
|
|
3184
|
-
routed.hasImmediateTellaskOutputs ||
|
|
3185
|
-
invalidFuncCallCount > 0;
|
|
3186
3320
|
if (!shouldStartImmediatePostToolGeneration) {
|
|
3187
3321
|
if (routed.shouldStopAfterPendingTellaskWait) {
|
|
3188
3322
|
lastToolRoundStopDiagnostics = buildToolRoundStopDiagnostics({
|
|
@@ -3239,23 +3373,19 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
|
|
|
3239
3373
|
});
|
|
3240
3374
|
break;
|
|
3241
3375
|
}
|
|
3242
|
-
|
|
3243
|
-
|
|
3244
|
-
|
|
3245
|
-
|
|
3246
|
-
|
|
3247
|
-
|
|
3248
|
-
|
|
3249
|
-
|
|
3250
|
-
|
|
3251
|
-
|
|
3252
|
-
|
|
3253
|
-
|
|
3254
|
-
|
|
3255
|
-
? currentUserPromptMsgId
|
|
3256
|
-
: undefined;
|
|
3257
|
-
continue;
|
|
3258
|
-
}
|
|
3376
|
+
await repairMissingImmediateFollowupTrigger({
|
|
3377
|
+
dlg,
|
|
3378
|
+
expectation: immediateFollowupTriggerExpectation,
|
|
3379
|
+
checkPoint: 'before_immediate_post_tool_generation_continue',
|
|
3380
|
+
});
|
|
3381
|
+
resolvingImmediateToolResultForUserPrompt =
|
|
3382
|
+
currentGenerationBelongsToUserPrompt ||
|
|
3383
|
+
currentGenerationBelongsToUserToolChain ||
|
|
3384
|
+
isUserOriginPrompt(currentPrompt);
|
|
3385
|
+
resolvingImmediateToolResultUserPromptMsgId = resolvingImmediateToolResultForUserPrompt
|
|
3386
|
+
? currentUserPromptMsgId
|
|
3387
|
+
: undefined;
|
|
3388
|
+
continue;
|
|
3259
3389
|
}
|
|
3260
3390
|
catch (err) {
|
|
3261
3391
|
generationBodyError = err;
|
|
@@ -3263,6 +3393,13 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
|
|
|
3263
3393
|
}
|
|
3264
3394
|
finally {
|
|
3265
3395
|
try {
|
|
3396
|
+
if (generationBodyError === undefined) {
|
|
3397
|
+
await repairMissingImmediateFollowupTrigger({
|
|
3398
|
+
dlg,
|
|
3399
|
+
expectation: immediateFollowupTriggerExpectation,
|
|
3400
|
+
checkPoint: 'before_notify_generating_finish',
|
|
3401
|
+
});
|
|
3402
|
+
}
|
|
3266
3403
|
await dlg.notifyGeneratingFinish(contextHealthForGen, llmGenModelForGen);
|
|
3267
3404
|
}
|
|
3268
3405
|
catch (finishErr) {
|
|
@@ -103,7 +103,41 @@ ${body}
|
|
|
103
103
|
|
|
104
104
|
Continue according to the current task context; if these events do not affect the work, do not send a placeholder acknowledgement.`;
|
|
105
105
|
}
|
|
106
|
-
async function
|
|
106
|
+
async function loadCurrentWakeEvents(dialog, events) {
|
|
107
|
+
const targets = await dialog.listVisibleReminderTargets();
|
|
108
|
+
const targetsByReminderId = new Map();
|
|
109
|
+
for (const target of targets) {
|
|
110
|
+
const existing = targetsByReminderId.get(target.reminder.id);
|
|
111
|
+
if (existing) {
|
|
112
|
+
existing.push(target);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
targetsByReminderId.set(target.reminder.id, [target]);
|
|
116
|
+
}
|
|
117
|
+
const currentEvents = [];
|
|
118
|
+
const staleEvents = [];
|
|
119
|
+
for (const event of events) {
|
|
120
|
+
if (targetsByReminderId.has(event.reminderId)) {
|
|
121
|
+
currentEvents.push(event);
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
staleEvents.push(event);
|
|
125
|
+
}
|
|
126
|
+
if (staleEvents.length > 0) {
|
|
127
|
+
log_1.log.warn('idle reminder wake dropped stale event because reminder target disappeared', undefined, {
|
|
128
|
+
dialogId: dialog.id.valueOf(),
|
|
129
|
+
rootId: dialog.id.rootId,
|
|
130
|
+
selfId: dialog.id.selfId,
|
|
131
|
+
droppedEventCount: staleEvents.length,
|
|
132
|
+
droppedEvents: staleEvents.map((event) => ({
|
|
133
|
+
eventId: event.eventId,
|
|
134
|
+
reminderId: event.reminderId,
|
|
135
|
+
})),
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
return { events: currentEvents, targetsByReminderId };
|
|
139
|
+
}
|
|
140
|
+
async function applyWakeEventUpdates(dialog, events, targetsByReminderId) {
|
|
107
141
|
const eventsWithUpdates = events.filter((event) => event.updatedContent !== undefined || event.updatedMeta !== undefined);
|
|
108
142
|
if (eventsWithUpdates.length === 0)
|
|
109
143
|
return;
|
|
@@ -115,43 +149,45 @@ async function applyWakeEventUpdates(dialog, events) {
|
|
|
115
149
|
}
|
|
116
150
|
byReminderId.set(event.reminderId, event);
|
|
117
151
|
}
|
|
118
|
-
const targets = await dialog.listVisibleReminderTargets();
|
|
119
152
|
const appliedReminderIds = new Set();
|
|
120
|
-
for (const
|
|
121
|
-
const
|
|
122
|
-
if (
|
|
123
|
-
|
|
124
|
-
appliedReminderIds.add(event.reminderId);
|
|
125
|
-
const nextContent = event.updatedContent ?? target.reminder.content;
|
|
126
|
-
const nextMeta = event.updatedMeta !== undefined ? event.updatedMeta : target.reminder.meta;
|
|
127
|
-
if (target.source === 'dialog') {
|
|
128
|
-
dialog.updateReminder(target.index, nextContent, nextMeta, {
|
|
129
|
-
renderMode: target.reminder.renderMode,
|
|
130
|
-
});
|
|
131
|
-
continue;
|
|
153
|
+
for (const [reminderId, event] of byReminderId.entries()) {
|
|
154
|
+
const targets = targetsByReminderId.get(reminderId);
|
|
155
|
+
if (targets === undefined) {
|
|
156
|
+
throw new Error(`idle reminder wake invariant violation: current wake event lost target mapping (${reminderId})`);
|
|
132
157
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
158
|
+
appliedReminderIds.add(reminderId);
|
|
159
|
+
for (const target of targets) {
|
|
160
|
+
const nextContent = event.updatedContent ?? target.reminder.content;
|
|
161
|
+
const nextMeta = event.updatedMeta !== undefined ? event.updatedMeta : target.reminder.meta;
|
|
162
|
+
if (target.source === 'dialog') {
|
|
163
|
+
dialog.updateReminder(target.index, nextContent, nextMeta, {
|
|
164
|
+
renderMode: target.reminder.renderMode,
|
|
165
|
+
});
|
|
166
|
+
continue;
|
|
141
167
|
}
|
|
142
|
-
|
|
143
|
-
id
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
168
|
+
await (0, shared_reminders_1.mutateSharedReminders)(target.target, (reminders) => {
|
|
169
|
+
const index = reminders.findIndex((reminder) => reminder.id === target.reminder.id);
|
|
170
|
+
if (index < 0) {
|
|
171
|
+
throw new Error(`idle reminder wake invariant violation: shared reminder ${target.reminder.id} disappeared before update`);
|
|
172
|
+
}
|
|
173
|
+
const previous = reminders[index];
|
|
174
|
+
if (!previous) {
|
|
175
|
+
throw new Error(`idle reminder wake invariant violation: shared reminder ${target.reminder.id} missing at resolved index`);
|
|
176
|
+
}
|
|
177
|
+
reminders[index] = (0, tool_1.materializeReminder)({
|
|
178
|
+
id: previous.id,
|
|
179
|
+
content: nextContent,
|
|
180
|
+
owner: previous.owner,
|
|
181
|
+
meta: nextMeta,
|
|
182
|
+
echoback: previous.echoback,
|
|
183
|
+
scope: previous.scope,
|
|
184
|
+
createdAt: previous.createdAt,
|
|
185
|
+
priority: previous.priority,
|
|
186
|
+
renderMode: previous.renderMode,
|
|
187
|
+
});
|
|
152
188
|
});
|
|
153
|
-
|
|
154
|
-
|
|
189
|
+
dialog.touchReminders();
|
|
190
|
+
}
|
|
155
191
|
}
|
|
156
192
|
for (const reminderId of byReminderId.keys()) {
|
|
157
193
|
if (appliedReminderIds.has(reminderId))
|
|
@@ -267,7 +303,10 @@ async function runIdleReminderWakeTask(dialog, callbacks, task) {
|
|
|
267
303
|
const events = dedupeAndSortWakeEvents(collected);
|
|
268
304
|
if (events.length === 0)
|
|
269
305
|
return;
|
|
270
|
-
await
|
|
306
|
+
const currentWakeEvents = await loadCurrentWakeEvents(dialog, events);
|
|
307
|
+
if (currentWakeEvents.events.length === 0)
|
|
308
|
+
return;
|
|
309
|
+
await applyWakeEventUpdates(dialog, currentWakeEvents.events, currentWakeEvents.targetsByReminderId);
|
|
271
310
|
if (task.controller.signal.aborted || !isCurrentTask(dialog.id, task))
|
|
272
311
|
return;
|
|
273
312
|
if (!(await loadFreshIdleWakeEligibility(dialog))) {
|
|
@@ -275,12 +314,12 @@ async function runIdleReminderWakeTask(dialog, callbacks, task) {
|
|
|
275
314
|
dialogId: dialog.id.valueOf(),
|
|
276
315
|
rootId: dialog.id.rootId,
|
|
277
316
|
selfId: dialog.id.selfId,
|
|
278
|
-
eventIds: events.map((event) => event.eventId),
|
|
317
|
+
eventIds: currentWakeEvents.events.map((event) => event.eventId),
|
|
279
318
|
});
|
|
280
319
|
return;
|
|
281
320
|
}
|
|
282
321
|
const prompt = {
|
|
283
|
-
content: buildAggregatedWakePromptContent(events),
|
|
322
|
+
content: buildAggregatedWakePromptContent(currentWakeEvents.events),
|
|
284
323
|
msgId: (0, id_1.generateShortId)(),
|
|
285
324
|
grammar: 'markdown',
|
|
286
325
|
origin: 'runtime',
|
package/dist/persistence.js
CHANGED
|
@@ -186,7 +186,7 @@ function sanitizeDebugFileSegment(value) {
|
|
|
186
186
|
}
|
|
187
187
|
async function writeInvariantDebugDump(args) {
|
|
188
188
|
const capturedAt = (0, time_1.formatUnifiedTimestamp)(new Date());
|
|
189
|
-
const debugDir = path.resolve(process.cwd(), '.
|
|
189
|
+
const debugDir = path.resolve(process.cwd(), '.dialogs', 'debug');
|
|
190
190
|
const fileName = [
|
|
191
191
|
args.prefix,
|
|
192
192
|
sanitizeDebugFileSegment(capturedAt),
|
|
@@ -5,6 +5,7 @@ export declare function configureDomindsSelfUpdate(params: {
|
|
|
5
5
|
host: string;
|
|
6
6
|
port: number;
|
|
7
7
|
mode: ServerMode;
|
|
8
|
+
closeWebSocketClients: () => void;
|
|
8
9
|
stopServer: () => Promise<void>;
|
|
9
10
|
}): void;
|
|
10
11
|
export declare function setDomindsSelfUpdateBroadcaster(next: ((status: DomindsSelfUpdateStatus) => void) | null): void;
|
|
@@ -20,6 +20,7 @@ const BACKGROUND_CHECK_INTERVAL_MS = 30 * 60 * 1000;
|
|
|
20
20
|
const LATEST_VERSION_CHECK_TIMEOUT_MS = 60000;
|
|
21
21
|
const RESTART_PORT_RELEASE_TIMEOUT_MS = 15000;
|
|
22
22
|
const RESTART_PORT_PROBE_INTERVAL_MS = 150;
|
|
23
|
+
const RESTART_EXIT_GRACE_MS = 1000;
|
|
23
24
|
const COMMAND_OUTPUT_LOG_LIMIT = 2000;
|
|
24
25
|
const PROXY_URL_ENV_KEYS = new Set([
|
|
25
26
|
'HTTP_PROXY',
|
|
@@ -97,6 +98,9 @@ function truncateCommandOutput(value) {
|
|
|
97
98
|
return raw;
|
|
98
99
|
return `${raw.slice(0, COMMAND_OUTPUT_LOG_LIMIT)}...[truncated ${raw.length - COMMAND_OUTPUT_LOG_LIMIT} chars]`;
|
|
99
100
|
}
|
|
101
|
+
function delayMs(ms) {
|
|
102
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
103
|
+
}
|
|
100
104
|
function formatPathEnvExcerpt(pathEnv) {
|
|
101
105
|
if (pathEnv === null || pathEnv.trim() === '')
|
|
102
106
|
return null;
|
|
@@ -620,6 +624,7 @@ function configureDomindsSelfUpdate(params) {
|
|
|
620
624
|
host: params.host,
|
|
621
625
|
port: params.port,
|
|
622
626
|
mode: params.mode,
|
|
627
|
+
closeWebSocketClients: params.closeWebSocketClients,
|
|
623
628
|
stopServer: params.stopServer,
|
|
624
629
|
};
|
|
625
630
|
latestObservation = { kind: 'unknown' };
|
|
@@ -922,7 +927,28 @@ function spawnDetachedRestartHelper(params) {
|
|
|
922
927
|
}
|
|
923
928
|
async function stopAndExitForRestart() {
|
|
924
929
|
const cfg = assertRuntimeConfig();
|
|
925
|
-
|
|
930
|
+
let stopSettled = false;
|
|
931
|
+
void cfg
|
|
932
|
+
.stopServer()
|
|
933
|
+
.then(() => {
|
|
934
|
+
stopSettled = true;
|
|
935
|
+
})
|
|
936
|
+
.catch((error) => {
|
|
937
|
+
stopSettled = true;
|
|
938
|
+
log.error('Failed to stop Dominds HTTP server during restart grace window', error, {
|
|
939
|
+
host: cfg.host,
|
|
940
|
+
port: cfg.port,
|
|
941
|
+
});
|
|
942
|
+
});
|
|
943
|
+
cfg.closeWebSocketClients();
|
|
944
|
+
await delayMs(RESTART_EXIT_GRACE_MS);
|
|
945
|
+
if (!stopSettled) {
|
|
946
|
+
log.warn('Exiting Dominds process before graceful HTTP server stop completed during restart', undefined, {
|
|
947
|
+
host: cfg.host,
|
|
948
|
+
port: cfg.port,
|
|
949
|
+
graceMs: RESTART_EXIT_GRACE_MS,
|
|
950
|
+
});
|
|
951
|
+
}
|
|
926
952
|
process.exit(0);
|
|
927
953
|
}
|
|
928
954
|
async function restartDomindsIntoLatest() {
|
package/dist/server.js
CHANGED
|
@@ -233,6 +233,19 @@ async function startServer(opts = {}) {
|
|
|
233
233
|
host,
|
|
234
234
|
port: boundPort,
|
|
235
235
|
mode: serverMode,
|
|
236
|
+
closeWebSocketClients: () => {
|
|
237
|
+
if (clients.size === 0)
|
|
238
|
+
return;
|
|
239
|
+
log.info(`Closing ${clients.size} WebSocket client(s) for Dominds restart`);
|
|
240
|
+
for (const ws of clients) {
|
|
241
|
+
try {
|
|
242
|
+
ws.close(1012, 'server_restart');
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
log.warn('Failed to close WebSocket client for Dominds restart', error);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
},
|
|
236
249
|
stopServer: async () => {
|
|
237
250
|
await httpServer.stop();
|
|
238
251
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dominds",
|
|
3
|
-
"version": "1.25.
|
|
3
|
+
"version": "1.25.10",
|
|
4
4
|
"description": "Dominds CLI and aggregation shell for the LongRun AI kernel/runtime packages.",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"publishConfig": {
|
|
@@ -53,8 +53,8 @@
|
|
|
53
53
|
"yaml": "^2.8.2",
|
|
54
54
|
"zod": "^4.3.6",
|
|
55
55
|
"@longrun-ai/codex-auth": "0.13.0",
|
|
56
|
-
"@longrun-ai/kernel": "1.15.
|
|
57
|
-
"@longrun-ai/shell": "1.15.
|
|
56
|
+
"@longrun-ai/kernel": "1.15.8",
|
|
57
|
+
"@longrun-ai/shell": "1.15.8"
|
|
58
58
|
},
|
|
59
59
|
"devDependencies": {
|
|
60
60
|
"@types/node": "^25.3.5",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { e as isSymbol, c as baseFlatten, g as baseIteratee, k as keys, h as baseFindIndex, j as baseEach, l as arrayMap, m as hasPath, n as castPath, t as toKey, o as baseGet } from "./_baseUniq-
|
|
2
|
-
import {
|
|
1
|
+
import { e as isSymbol, c as baseFlatten, g as baseIteratee, k as keys, h as baseFindIndex, j as baseEach, l as arrayMap, m as hasPath, n as castPath, t as toKey, o as baseGet } from "./_baseUniq-Cj1Wg2fB.js";
|
|
2
|
+
import { aU as isObject, aC as baseRest, aV as isIterateeCall, aW as keysIn, aX as eq, aY as isArrayLike, aZ as isArray, a_ as identity, a$ as isIndex, b0 as assignValue } from "./index-4xG_gPRh.js";
|
|
3
3
|
var reWhitespace = /\s/;
|
|
4
4
|
function trimmedEndIndex(string) {
|
|
5
5
|
var index = string.length;
|
|
@@ -193,4 +193,4 @@ export {
|
|
|
193
193
|
map as m,
|
|
194
194
|
toFinite as t
|
|
195
195
|
};
|
|
196
|
-
//# sourceMappingURL=_basePickBy-
|
|
196
|
+
//# sourceMappingURL=_basePickBy-B4PyBhGX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_basePickBy-B4PyBhGX.js","sources":["../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_trimmedEndIndex.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseTrim.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/toNumber.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/toFinite.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/toInteger.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/flatten.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/defaults.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/last.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_createFind.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/findIndex.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/find.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseMap.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/map.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseHas.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/has.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseLt.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseExtremum.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/min.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseSet.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_basePickBy.js"],"sourcesContent":["/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nexport default trimmedEndIndex;\n","import trimmedEndIndex from './_trimmedEndIndex.js';\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nexport default baseTrim;\n","import baseTrim from './_baseTrim.js';\nimport isObject from './isObject.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nexport default toNumber;\n","import toNumber from './toNumber.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nexport default toFinite;\n","import toFinite from './toFinite.js';\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nexport default toInteger;\n","import baseFlatten from './_baseFlatten.js';\n\n/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\nfunction flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\n}\n\nexport default flatten;\n","import baseRest from './_baseRest.js';\nimport eq from './eq.js';\nimport isIterateeCall from './_isIterateeCall.js';\nimport keysIn from './keysIn.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar defaults = baseRest(function(object, sources) {\n object = Object(object);\n\n var index = -1;\n var length = sources.length;\n var guard = length > 2 ? sources[2] : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n length = 1;\n }\n\n while (++index < length) {\n var source = sources[index];\n var props = keysIn(source);\n var propsIndex = -1;\n var propsLength = props.length;\n\n while (++propsIndex < propsLength) {\n var key = props[propsIndex];\n var value = object[key];\n\n if (value === undefined ||\n (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n object[key] = source[key];\n }\n }\n }\n\n return object;\n});\n\nexport default defaults;\n","/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n}\n\nexport default last;\n","import baseIteratee from './_baseIteratee.js';\nimport isArrayLike from './isArrayLike.js';\nimport keys from './keys.js';\n\n/**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\nfunction createFind(findIndexFunc) {\n return function(collection, predicate, fromIndex) {\n var iterable = Object(collection);\n if (!isArrayLike(collection)) {\n var iteratee = baseIteratee(predicate, 3);\n collection = keys(collection);\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n }\n var index = findIndexFunc(collection, predicate, fromIndex);\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n };\n}\n\nexport default createFind;\n","import baseFindIndex from './_baseFindIndex.js';\nimport baseIteratee from './_baseIteratee.js';\nimport toInteger from './toInteger.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The `_.matches` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */\nfunction findIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseFindIndex(array, baseIteratee(predicate, 3), index);\n}\n\nexport default findIndex;\n","import createFind from './_createFind.js';\nimport findIndex from './findIndex.js';\n\n/**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\nvar find = createFind(findIndex);\n\nexport default find;\n","import baseEach from './_baseEach.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n}\n\nexport default baseMap;\n","import arrayMap from './_arrayMap.js';\nimport baseIteratee from './_baseIteratee.js';\nimport baseMap from './_baseMap.js';\nimport isArray from './isArray.js';\n\n/**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\nfunction map(collection, iteratee) {\n var func = isArray(collection) ? arrayMap : baseMap;\n return func(collection, baseIteratee(iteratee, 3));\n}\n\nexport default map;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n return object != null && hasOwnProperty.call(object, key);\n}\n\nexport default baseHas;\n","import baseHas from './_baseHas.js';\nimport hasPath from './_hasPath.js';\n\n/**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\nfunction has(object, path) {\n return object != null && hasPath(object, path, baseHas);\n}\n\nexport default has;\n","/**\n * The base implementation of `_.lt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n */\nfunction baseLt(value, other) {\n return value < other;\n}\n\nexport default baseLt;\n","import isSymbol from './isSymbol.js';\n\n/**\n * The base implementation of methods like `_.max` and `_.min` which accepts a\n * `comparator` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */\nfunction baseExtremum(array, iteratee, comparator) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index],\n current = iteratee(value);\n\n if (current != null && (computed === undefined\n ? (current === current && !isSymbol(current))\n : comparator(current, computed)\n )) {\n var computed = current,\n result = value;\n }\n }\n return result;\n}\n\nexport default baseExtremum;\n","import baseExtremum from './_baseExtremum.js';\nimport baseLt from './_baseLt.js';\nimport identity from './identity.js';\n\n/**\n * Computes the minimum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * _.min([4, 2, 8, 6]);\n * // => 2\n *\n * _.min([]);\n * // => undefined\n */\nfunction min(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseLt)\n : undefined;\n}\n\nexport default min;\n","import assignValue from './_assignValue.js';\nimport castPath from './_castPath.js';\nimport isIndex from './_isIndex.js';\nimport isObject from './isObject.js';\nimport toKey from './_toKey.js';\n\n/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\nfunction baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n return object;\n }\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n}\n\nexport default baseSet;\n","import baseGet from './_baseGet.js';\nimport baseSet from './_baseSet.js';\nimport castPath from './_castPath.js';\n\n/**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\nfunction basePickBy(object, paths, predicate) {\n var index = -1,\n length = paths.length,\n result = {};\n\n while (++index < length) {\n var path = paths[index],\n value = baseGet(object, path);\n\n if (predicate(value, path)) {\n baseSet(result, castPath(path, object), value);\n }\n }\n return result;\n}\n\nexport default basePickBy;\n"],"names":["objectProto","hasOwnProperty","collection"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]}
|