nexus-agents 2.93.0 → 2.95.0
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/{child-mcp-config-WNISXFYD.js → child-mcp-config-NW7JMSDK.js} +2 -2
- package/dist/{chunk-XVY3I7JT.js → chunk-2X24T4ZD.js} +9 -12
- package/dist/chunk-2X24T4ZD.js.map +1 -0
- package/dist/{chunk-BHA6V7GK.js → chunk-3H6Q3RZM.js} +4 -4
- package/dist/{chunk-T73G67GT.js → chunk-3HXWI34V.js} +3 -3
- package/dist/{chunk-RTUZSR4R.js → chunk-47Z3YPOK.js} +2 -2
- package/dist/{chunk-G5IDRWWI.js → chunk-4NVYN2MB.js} +4 -4
- package/dist/{chunk-5BTRDVWC.js → chunk-55G7KQ7F.js} +5 -5
- package/dist/{chunk-WU3SUA35.js → chunk-5HBDXW44.js} +2 -2
- package/dist/{chunk-JCETWDU7.js → chunk-6IWPN5UB.js} +2 -2
- package/dist/{chunk-4A4WPM75.js → chunk-7GUP6KQQ.js} +8 -10
- package/dist/{chunk-4A4WPM75.js.map → chunk-7GUP6KQQ.js.map} +1 -1
- package/dist/{chunk-ULBKFMVO.js → chunk-BSHDI4BH.js} +2 -2
- package/dist/{chunk-JEBWSHSU.js → chunk-D3JSXVX3.js} +2 -2
- package/dist/{chunk-HKISF2E7.js → chunk-ECBH5INZ.js} +259 -8
- package/dist/chunk-ECBH5INZ.js.map +1 -0
- package/dist/{chunk-ZOAU7RE4.js → chunk-ECZW5FXN.js} +4 -6
- package/dist/{chunk-ZOAU7RE4.js.map → chunk-ECZW5FXN.js.map} +1 -1
- package/dist/{chunk-ZYHHDPFW.js → chunk-FTDVA33Z.js} +4 -4
- package/dist/{chunk-2T4NV6QT.js → chunk-FXVJLJUF.js} +2 -2
- package/dist/{chunk-IJ2AZZVH.js → chunk-FYGZ4MEQ.js} +141 -28
- package/dist/chunk-FYGZ4MEQ.js.map +1 -0
- package/dist/{chunk-SORBJPRA.js → chunk-G42N55ZR.js} +2 -2
- package/dist/{chunk-SHSKW5ML.js → chunk-GC5FH2IA.js} +7 -7
- package/dist/{chunk-FTCU55O6.js → chunk-KHZGMF2W.js} +4 -4
- package/dist/{chunk-2IBJC2EP.js → chunk-LXROEQAO.js} +2 -2
- package/dist/{chunk-CPH6LKXO.js → chunk-LZOTH2GI.js} +2 -2
- package/dist/{chunk-DTFMYM3V.js → chunk-O4LVC4MQ.js} +2 -2
- package/dist/{chunk-AZP66FIA.js → chunk-PFOY5ML6.js} +3 -3
- package/dist/{chunk-SMGH2B3A.js → chunk-QUPPV6UO.js} +20 -3
- package/dist/chunk-QUPPV6UO.js.map +1 -0
- package/dist/{chunk-K7VGX37L.js → chunk-TEKWQNQ2.js} +3 -3
- package/dist/{chunk-LJMO5P6O.js → chunk-VTMQND6B.js} +23 -13
- package/dist/chunk-VTMQND6B.js.map +1 -0
- package/dist/{chunk-BNHBZRU7.js → chunk-WGA4VGIR.js} +3 -3
- package/dist/{chunk-57OH2O2U.js → chunk-Y3OOHHKQ.js} +2 -2
- package/dist/{chunk-VSG6RSE6.js → chunk-YYXJ6RTO.js} +3 -3
- package/dist/{chunk-E3QWWP67.js → chunk-ZICVVBDW.js} +2 -2
- package/dist/{cli-circuit-breaker-6E4E2IU7.js → cli-circuit-breaker-LNU5DQSB.js} +4 -4
- package/dist/cli.js +131 -54
- package/dist/cli.js.map +1 -1
- package/dist/{composite-router-MQOPXLVV.js → composite-router-DJ54ND5X.js} +2 -2
- package/dist/{consensus-vote-ZRADOLXH.js → consensus-vote-XLEQFVE7.js} +12 -13
- package/dist/{context-retriever-TZGIETJO.js → context-retriever-6O6TREXH.js} +6 -6
- package/dist/{doctor-deep-OU2WC55V.js → doctor-deep-PSNJPELP.js} +3 -3
- package/dist/{expert-bridge-WP5ZWXFY.js → expert-bridge-Q3OWPD4L.js} +4 -4
- package/dist/{factory-RJTRVII5.js → factory-43RVPRT5.js} +5 -5
- package/dist/{factory-2TN2VZTR.js → factory-PSMTMC7V.js} +5 -5
- package/dist/index.d.ts +215 -207
- package/dist/index.js +26 -27
- package/dist/index.js.map +1 -1
- package/dist/{init-opencode-AYMNMWU7.js → init-opencode-25AUARJH.js} +5 -5
- package/dist/{issue-triage-QIVZN3PJ.js → issue-triage-KZTENUDH.js} +5 -5
- package/dist/{pr-reviewer-helpers-P24OBKVM.js → pr-reviewer-helpers-XENJ4E2T.js} +4 -4
- package/dist/{registry-command-KWWOKJ5C.js → registry-command-X3O34FAK.js} +2 -2
- package/dist/{repo-security-plan-KZNEXDCI.js → repo-security-plan-XCX7EFJR.js} +3 -3
- package/dist/{research-helpers-synthesize-DH5PPX7A.js → research-helpers-synthesize-CGVR6M4S.js} +3 -4
- package/dist/{routing-memory-AGHJQTRH.js → routing-memory-YZRYGXQC.js} +2 -2
- package/dist/{session-memory-O24IVZAW.js → session-memory-SXQAA2EN.js} +3 -3
- package/dist/{setup-command-NBXZ4NGV.js → setup-command-VG7JZI6O.js} +11 -12
- package/dist/{setup-config-Y4JA5QWO.js → setup-config-VJAK6AA2.js} +3 -3
- package/dist/{setup-custom-api-UNX4OJEX.js → setup-custom-api-KSF2JMTS.js} +4 -5
- package/dist/{setup-custom-api-UNX4OJEX.js.map → setup-custom-api-KSF2JMTS.js.map} +1 -1
- package/dist/{tool-memory-UEQNXIGC.js → tool-memory-L7SDFSF5.js} +5 -5
- package/dist/{weather-report-S5YXRY7G.js → weather-report-D6HFOK7S.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-HKISF2E7.js.map +0 -1
- package/dist/chunk-IJ2AZZVH.js.map +0 -1
- package/dist/chunk-LJMO5P6O.js.map +0 -1
- package/dist/chunk-NESW2TTD.js +0 -134
- package/dist/chunk-NESW2TTD.js.map +0 -1
- package/dist/chunk-SMGH2B3A.js.map +0 -1
- package/dist/chunk-XVY3I7JT.js.map +0 -1
- /package/dist/{child-mcp-config-WNISXFYD.js.map → child-mcp-config-NW7JMSDK.js.map} +0 -0
- /package/dist/{chunk-BHA6V7GK.js.map → chunk-3H6Q3RZM.js.map} +0 -0
- /package/dist/{chunk-T73G67GT.js.map → chunk-3HXWI34V.js.map} +0 -0
- /package/dist/{chunk-RTUZSR4R.js.map → chunk-47Z3YPOK.js.map} +0 -0
- /package/dist/{chunk-G5IDRWWI.js.map → chunk-4NVYN2MB.js.map} +0 -0
- /package/dist/{chunk-5BTRDVWC.js.map → chunk-55G7KQ7F.js.map} +0 -0
- /package/dist/{chunk-WU3SUA35.js.map → chunk-5HBDXW44.js.map} +0 -0
- /package/dist/{chunk-JCETWDU7.js.map → chunk-6IWPN5UB.js.map} +0 -0
- /package/dist/{chunk-ULBKFMVO.js.map → chunk-BSHDI4BH.js.map} +0 -0
- /package/dist/{chunk-JEBWSHSU.js.map → chunk-D3JSXVX3.js.map} +0 -0
- /package/dist/{chunk-ZYHHDPFW.js.map → chunk-FTDVA33Z.js.map} +0 -0
- /package/dist/{chunk-2T4NV6QT.js.map → chunk-FXVJLJUF.js.map} +0 -0
- /package/dist/{chunk-SORBJPRA.js.map → chunk-G42N55ZR.js.map} +0 -0
- /package/dist/{chunk-SHSKW5ML.js.map → chunk-GC5FH2IA.js.map} +0 -0
- /package/dist/{chunk-FTCU55O6.js.map → chunk-KHZGMF2W.js.map} +0 -0
- /package/dist/{chunk-2IBJC2EP.js.map → chunk-LXROEQAO.js.map} +0 -0
- /package/dist/{chunk-CPH6LKXO.js.map → chunk-LZOTH2GI.js.map} +0 -0
- /package/dist/{chunk-DTFMYM3V.js.map → chunk-O4LVC4MQ.js.map} +0 -0
- /package/dist/{chunk-AZP66FIA.js.map → chunk-PFOY5ML6.js.map} +0 -0
- /package/dist/{chunk-K7VGX37L.js.map → chunk-TEKWQNQ2.js.map} +0 -0
- /package/dist/{chunk-BNHBZRU7.js.map → chunk-WGA4VGIR.js.map} +0 -0
- /package/dist/{chunk-57OH2O2U.js.map → chunk-Y3OOHHKQ.js.map} +0 -0
- /package/dist/{chunk-VSG6RSE6.js.map → chunk-YYXJ6RTO.js.map} +0 -0
- /package/dist/{chunk-E3QWWP67.js.map → chunk-ZICVVBDW.js.map} +0 -0
- /package/dist/{cli-circuit-breaker-6E4E2IU7.js.map → cli-circuit-breaker-LNU5DQSB.js.map} +0 -0
- /package/dist/{composite-router-MQOPXLVV.js.map → composite-router-DJ54ND5X.js.map} +0 -0
- /package/dist/{consensus-vote-ZRADOLXH.js.map → consensus-vote-XLEQFVE7.js.map} +0 -0
- /package/dist/{context-retriever-TZGIETJO.js.map → context-retriever-6O6TREXH.js.map} +0 -0
- /package/dist/{doctor-deep-OU2WC55V.js.map → doctor-deep-PSNJPELP.js.map} +0 -0
- /package/dist/{expert-bridge-WP5ZWXFY.js.map → expert-bridge-Q3OWPD4L.js.map} +0 -0
- /package/dist/{factory-2TN2VZTR.js.map → factory-43RVPRT5.js.map} +0 -0
- /package/dist/{factory-RJTRVII5.js.map → factory-PSMTMC7V.js.map} +0 -0
- /package/dist/{init-opencode-AYMNMWU7.js.map → init-opencode-25AUARJH.js.map} +0 -0
- /package/dist/{issue-triage-QIVZN3PJ.js.map → issue-triage-KZTENUDH.js.map} +0 -0
- /package/dist/{pr-reviewer-helpers-P24OBKVM.js.map → pr-reviewer-helpers-XENJ4E2T.js.map} +0 -0
- /package/dist/{registry-command-KWWOKJ5C.js.map → registry-command-X3O34FAK.js.map} +0 -0
- /package/dist/{repo-security-plan-KZNEXDCI.js.map → repo-security-plan-XCX7EFJR.js.map} +0 -0
- /package/dist/{research-helpers-synthesize-DH5PPX7A.js.map → research-helpers-synthesize-CGVR6M4S.js.map} +0 -0
- /package/dist/{routing-memory-AGHJQTRH.js.map → routing-memory-YZRYGXQC.js.map} +0 -0
- /package/dist/{session-memory-O24IVZAW.js.map → session-memory-SXQAA2EN.js.map} +0 -0
- /package/dist/{setup-command-NBXZ4NGV.js.map → setup-command-VG7JZI6O.js.map} +0 -0
- /package/dist/{setup-config-Y4JA5QWO.js.map → setup-config-VJAK6AA2.js.map} +0 -0
- /package/dist/{tool-memory-UEQNXIGC.js.map → tool-memory-L7SDFSF5.js.map} +0 -0
- /package/dist/{weather-report-S5YXRY7G.js.map → weather-report-D6HFOK7S.js.map} +0 -0
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
CompositeRoutingError,
|
|
5
5
|
DEFAULT_COMPOSITE_CONFIG,
|
|
6
6
|
createCompositeRouter
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-ECBH5INZ.js";
|
|
8
8
|
import "./chunk-CH7QIDHQ.js";
|
|
9
9
|
import "./chunk-PR4QN5HX.js";
|
|
10
10
|
export {
|
|
@@ -14,4 +14,4 @@ export {
|
|
|
14
14
|
DEFAULT_COMPOSITE_CONFIG,
|
|
15
15
|
createCompositeRouter
|
|
16
16
|
};
|
|
17
|
-
//# sourceMappingURL=composite-router-
|
|
17
|
+
//# sourceMappingURL=composite-router-DJ54ND5X.js.map
|
|
@@ -6,20 +6,19 @@ import {
|
|
|
6
6
|
executeVoting,
|
|
7
7
|
registerConsensusVoteTool,
|
|
8
8
|
resetCorrelationTracker
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
15
|
-
import "./chunk-NESW2TTD.js";
|
|
9
|
+
} from "./chunk-VTMQND6B.js";
|
|
10
|
+
import "./chunk-D3JSXVX3.js";
|
|
11
|
+
import "./chunk-LXROEQAO.js";
|
|
12
|
+
import "./chunk-KHZGMF2W.js";
|
|
13
|
+
import "./chunk-Y3OOHHKQ.js";
|
|
14
|
+
import "./chunk-7GUP6KQQ.js";
|
|
16
15
|
import "./chunk-6T3EPABN.js";
|
|
17
|
-
import "./chunk-
|
|
18
|
-
import "./chunk-
|
|
19
|
-
import "./chunk-
|
|
16
|
+
import "./chunk-3H6Q3RZM.js";
|
|
17
|
+
import "./chunk-47Z3YPOK.js";
|
|
18
|
+
import "./chunk-G42N55ZR.js";
|
|
20
19
|
import "./chunk-PQHVC4BD.js";
|
|
21
|
-
import "./chunk-
|
|
22
|
-
import "./chunk-
|
|
20
|
+
import "./chunk-6IWPN5UB.js";
|
|
21
|
+
import "./chunk-ECBH5INZ.js";
|
|
23
22
|
import "./chunk-CH7QIDHQ.js";
|
|
24
23
|
import "./chunk-PR4QN5HX.js";
|
|
25
24
|
export {
|
|
@@ -31,4 +30,4 @@ export {
|
|
|
31
30
|
registerConsensusVoteTool,
|
|
32
31
|
resetCorrelationTracker
|
|
33
32
|
};
|
|
34
|
-
//# sourceMappingURL=consensus-vote-
|
|
33
|
+
//# sourceMappingURL=consensus-vote-XLEQFVE7.js.map
|
|
@@ -2,13 +2,13 @@ import {
|
|
|
2
2
|
getContextForTask,
|
|
3
3
|
inferTaskCategory,
|
|
4
4
|
summarizeContextForPrompt
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-TEKWQNQ2.js";
|
|
6
|
+
import "./chunk-KHZGMF2W.js";
|
|
7
7
|
import "./chunk-6T3EPABN.js";
|
|
8
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-G42N55ZR.js";
|
|
9
9
|
import "./chunk-PQHVC4BD.js";
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
10
|
+
import "./chunk-6IWPN5UB.js";
|
|
11
|
+
import "./chunk-ECBH5INZ.js";
|
|
12
12
|
import "./chunk-CH7QIDHQ.js";
|
|
13
13
|
import "./chunk-PR4QN5HX.js";
|
|
14
14
|
export {
|
|
@@ -16,4 +16,4 @@ export {
|
|
|
16
16
|
inferTaskCategory,
|
|
17
17
|
summarizeContextForPrompt
|
|
18
18
|
};
|
|
19
|
-
//# sourceMappingURL=context-retriever-
|
|
19
|
+
//# sourceMappingURL=context-retriever-6O6TREXH.js.map
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
formatDeepDiagnostics,
|
|
3
3
|
runDeepDiagnostics
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-ZICVVBDW.js";
|
|
5
|
+
import "./chunk-ECBH5INZ.js";
|
|
6
6
|
import "./chunk-CH7QIDHQ.js";
|
|
7
7
|
import "./chunk-PR4QN5HX.js";
|
|
8
8
|
export {
|
|
9
9
|
formatDeepDiagnostics,
|
|
10
10
|
runDeepDiagnostics
|
|
11
11
|
};
|
|
12
|
-
//# sourceMappingURL=doctor-deep-
|
|
12
|
+
//# sourceMappingURL=doctor-deep-PSNJPELP.js.map
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
executeExpert,
|
|
3
3
|
shutdownExpertBridge
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-2X24T4ZD.js";
|
|
5
|
+
import "./chunk-QUPPV6UO.js";
|
|
6
|
+
import "./chunk-ECBH5INZ.js";
|
|
7
7
|
import "./chunk-CH7QIDHQ.js";
|
|
8
8
|
import "./chunk-PR4QN5HX.js";
|
|
9
9
|
export {
|
|
10
10
|
executeExpert,
|
|
11
11
|
shutdownExpertBridge
|
|
12
12
|
};
|
|
13
|
-
//# sourceMappingURL=expert-bridge-
|
|
13
|
+
//# sourceMappingURL=expert-bridge-Q3OWPD4L.js.map
|
|
@@ -3,10 +3,10 @@ import {
|
|
|
3
3
|
createCliAdapter,
|
|
4
4
|
getAvailableClis,
|
|
5
5
|
isCliAvailable
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-3H6Q3RZM.js";
|
|
7
|
+
import "./chunk-47Z3YPOK.js";
|
|
8
|
+
import "./chunk-G42N55ZR.js";
|
|
9
|
+
import "./chunk-ECBH5INZ.js";
|
|
10
10
|
import "./chunk-CH7QIDHQ.js";
|
|
11
11
|
import "./chunk-PR4QN5HX.js";
|
|
12
12
|
export {
|
|
@@ -15,4 +15,4 @@ export {
|
|
|
15
15
|
getAvailableClis,
|
|
16
16
|
isCliAvailable
|
|
17
17
|
};
|
|
18
|
-
//# sourceMappingURL=factory-
|
|
18
|
+
//# sourceMappingURL=factory-43RVPRT5.js.map
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createGitHubProvider,
|
|
3
3
|
createScmProvider
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-FTDVA33Z.js";
|
|
5
|
+
import "./chunk-5HBDXW44.js";
|
|
6
|
+
import "./chunk-LZOTH2GI.js";
|
|
7
|
+
import "./chunk-ECBH5INZ.js";
|
|
8
8
|
import "./chunk-CH7QIDHQ.js";
|
|
9
9
|
import "./chunk-PR4QN5HX.js";
|
|
10
10
|
export {
|
|
11
11
|
createGitHubProvider,
|
|
12
12
|
createScmProvider
|
|
13
13
|
};
|
|
14
|
-
//# sourceMappingURL=factory-
|
|
14
|
+
//# sourceMappingURL=factory-PSMTMC7V.js.map
|
package/dist/index.d.ts
CHANGED
|
@@ -2745,6 +2745,14 @@ interface CompletionRequest {
|
|
|
2745
2745
|
temperature?: number;
|
|
2746
2746
|
/** Maximum tokens to generate */
|
|
2747
2747
|
maxTokens?: number;
|
|
2748
|
+
/**
|
|
2749
|
+
* Per-request timeout override in milliseconds. When set, adapters that
|
|
2750
|
+
* support it use this instead of their construction-time default — lets a
|
|
2751
|
+
* long-running caller (e.g. a consensus vote with a 300s budget) prevent the
|
|
2752
|
+
* adapter's shorter standard timeout from firing first (#3304). Adapters that
|
|
2753
|
+
* don't support per-request timeouts ignore it.
|
|
2754
|
+
*/
|
|
2755
|
+
timeoutMs?: number;
|
|
2748
2756
|
/** Tools available for the model */
|
|
2749
2757
|
tools?: ToolDefinition[];
|
|
2750
2758
|
/**
|
|
@@ -18815,6 +18823,213 @@ declare function getSwarmObserver(config?: Partial<SwarmObserverConfig>): SwarmO
|
|
|
18815
18823
|
*/
|
|
18816
18824
|
declare function setSwarmObserver(observer: SwarmObserver): void;
|
|
18817
18825
|
|
|
18826
|
+
/**
|
|
18827
|
+
* Pipeline Event Types — V2 Observability (Issue #912, Phase 4-1)
|
|
18828
|
+
*
|
|
18829
|
+
* Typed event definitions for the pipeline event bus.
|
|
18830
|
+
* Every event carries a timestamp and relevant correlation IDs.
|
|
18831
|
+
*
|
|
18832
|
+
* @see docs/v2/08-observability-eventing.md
|
|
18833
|
+
* @module pipeline/event-types
|
|
18834
|
+
*/
|
|
18835
|
+
/** All valid pipeline event types. */
|
|
18836
|
+
declare const PIPELINE_EVENT_TYPES: readonly ["task.created", "task.status_changed", "task.completed", "task.failed", "pipeline.started", "pipeline.completed", "pipeline.checkpoint", "stage.started", "stage.completed", "stage.failed", "stage.retrying", "policy.evaluated", "artifact.created", "model.called", "routing.decision", "tool.invoked", "tool.completed", "wave.started", "wave.completed", "signal.fitness_declined", "signal.swarm_unhealthy", "signal.vote_rejected"];
|
|
18837
|
+
type PipelineEventType = (typeof PIPELINE_EVENT_TYPES)[number];
|
|
18838
|
+
/** Base fields present on every event. */
|
|
18839
|
+
interface BaseEvent {
|
|
18840
|
+
readonly timestamp: number;
|
|
18841
|
+
}
|
|
18842
|
+
/** Task lifecycle events. */
|
|
18843
|
+
interface TaskCreatedEvent extends BaseEvent {
|
|
18844
|
+
readonly type: 'task.created';
|
|
18845
|
+
readonly taskId: string;
|
|
18846
|
+
}
|
|
18847
|
+
interface TaskStatusChangedEvent extends BaseEvent {
|
|
18848
|
+
readonly type: 'task.status_changed';
|
|
18849
|
+
readonly taskId: string;
|
|
18850
|
+
readonly from: string;
|
|
18851
|
+
readonly to: string;
|
|
18852
|
+
}
|
|
18853
|
+
interface TaskCompletedEvent extends BaseEvent {
|
|
18854
|
+
readonly type: 'task.completed';
|
|
18855
|
+
readonly taskId: string;
|
|
18856
|
+
readonly success: boolean;
|
|
18857
|
+
}
|
|
18858
|
+
interface TaskFailedEvent extends BaseEvent {
|
|
18859
|
+
readonly type: 'task.failed';
|
|
18860
|
+
readonly taskId: string;
|
|
18861
|
+
readonly error: string;
|
|
18862
|
+
}
|
|
18863
|
+
/** Pipeline lifecycle events. */
|
|
18864
|
+
interface PipelineStartedEvent extends BaseEvent {
|
|
18865
|
+
readonly type: 'pipeline.started';
|
|
18866
|
+
readonly taskId: string;
|
|
18867
|
+
readonly executionId: string;
|
|
18868
|
+
}
|
|
18869
|
+
interface PipelineCompletedEvent extends BaseEvent {
|
|
18870
|
+
readonly type: 'pipeline.completed';
|
|
18871
|
+
readonly executionId: string;
|
|
18872
|
+
readonly success: boolean;
|
|
18873
|
+
readonly durationMs: number;
|
|
18874
|
+
}
|
|
18875
|
+
interface PipelineCheckpointEvent extends BaseEvent {
|
|
18876
|
+
readonly type: 'pipeline.checkpoint';
|
|
18877
|
+
readonly executionId: string;
|
|
18878
|
+
readonly stepNumber: number;
|
|
18879
|
+
}
|
|
18880
|
+
/** Stage lifecycle events. */
|
|
18881
|
+
interface StageStartedEvent extends BaseEvent {
|
|
18882
|
+
readonly type: 'stage.started';
|
|
18883
|
+
readonly executionId: string;
|
|
18884
|
+
readonly stageId: string;
|
|
18885
|
+
readonly pluginId: string;
|
|
18886
|
+
}
|
|
18887
|
+
interface StageCompletedEvent extends BaseEvent {
|
|
18888
|
+
readonly type: 'stage.completed';
|
|
18889
|
+
readonly executionId: string;
|
|
18890
|
+
readonly stageId: string;
|
|
18891
|
+
readonly durationMs: number;
|
|
18892
|
+
readonly success: boolean;
|
|
18893
|
+
}
|
|
18894
|
+
interface StageFailedEvent extends BaseEvent {
|
|
18895
|
+
readonly type: 'stage.failed';
|
|
18896
|
+
readonly executionId: string;
|
|
18897
|
+
readonly stageId: string;
|
|
18898
|
+
readonly error: string;
|
|
18899
|
+
/** Error classification: retriable (transient) or fatal (permanent) (Epic #952). */
|
|
18900
|
+
readonly errorTaxonomy?: 'retriable' | 'fatal';
|
|
18901
|
+
}
|
|
18902
|
+
interface StageRetryingEvent extends BaseEvent {
|
|
18903
|
+
readonly type: 'stage.retrying';
|
|
18904
|
+
readonly executionId: string;
|
|
18905
|
+
readonly stageId: string;
|
|
18906
|
+
readonly attempt: number;
|
|
18907
|
+
}
|
|
18908
|
+
/** Policy gate events. */
|
|
18909
|
+
interface PolicyEvaluatedEvent extends BaseEvent {
|
|
18910
|
+
readonly type: 'policy.evaluated';
|
|
18911
|
+
readonly executionId: string;
|
|
18912
|
+
readonly gateId: string;
|
|
18913
|
+
readonly decision: string;
|
|
18914
|
+
}
|
|
18915
|
+
/** Artifact events. */
|
|
18916
|
+
interface ArtifactCreatedEvent extends BaseEvent {
|
|
18917
|
+
readonly type: 'artifact.created';
|
|
18918
|
+
readonly executionId: string;
|
|
18919
|
+
readonly artifactId: string;
|
|
18920
|
+
readonly artifactType: string;
|
|
18921
|
+
}
|
|
18922
|
+
/** Model call events. */
|
|
18923
|
+
interface ModelCalledEvent extends BaseEvent {
|
|
18924
|
+
readonly type: 'model.called';
|
|
18925
|
+
readonly executionId: string;
|
|
18926
|
+
readonly cli: string;
|
|
18927
|
+
readonly model: string;
|
|
18928
|
+
readonly tokensIn: number;
|
|
18929
|
+
readonly tokensOut: number;
|
|
18930
|
+
readonly durationMs: number;
|
|
18931
|
+
/** Agent that initiated this model call (Epic #952). */
|
|
18932
|
+
readonly agentId?: string;
|
|
18933
|
+
/** Agent role (e.g., code_expert, security_expert) (Epic #952). */
|
|
18934
|
+
readonly role?: string;
|
|
18935
|
+
}
|
|
18936
|
+
/** Routing decision events. */
|
|
18937
|
+
interface RoutingDecisionEvent extends BaseEvent {
|
|
18938
|
+
readonly type: 'routing.decision';
|
|
18939
|
+
readonly taskId: string;
|
|
18940
|
+
readonly selectedModel: string;
|
|
18941
|
+
/** Human-readable reasoning for model selection (Epic #952). */
|
|
18942
|
+
readonly reasoning?: string;
|
|
18943
|
+
/** Routing decision path (stage:result pairs) (Epic #952). */
|
|
18944
|
+
readonly decisionPath?: readonly string[];
|
|
18945
|
+
}
|
|
18946
|
+
/** Signal events (#3147 P2 — close the loop). Consumed by the TuneStage. */
|
|
18947
|
+
interface FitnessDeclinedSignalEvent extends BaseEvent {
|
|
18948
|
+
readonly type: 'signal.fitness_declined';
|
|
18949
|
+
/** Current fitness score (0-100). */
|
|
18950
|
+
readonly score: number;
|
|
18951
|
+
/** Governance floor the score fell below. */
|
|
18952
|
+
readonly floor: number;
|
|
18953
|
+
/** Fitness dimension that declined, when attributable. */
|
|
18954
|
+
readonly dimension?: string;
|
|
18955
|
+
}
|
|
18956
|
+
interface SwarmUnhealthySignalEvent extends BaseEvent {
|
|
18957
|
+
readonly type: 'signal.swarm_unhealthy';
|
|
18958
|
+
/** Agent/CLI whose health degraded. */
|
|
18959
|
+
readonly agentId: string;
|
|
18960
|
+
/** Human-readable degradation reason. */
|
|
18961
|
+
readonly reason: string;
|
|
18962
|
+
}
|
|
18963
|
+
interface VoteRejectedSignalEvent extends BaseEvent {
|
|
18964
|
+
readonly type: 'signal.vote_rejected';
|
|
18965
|
+
readonly proposalId: string;
|
|
18966
|
+
/** Approval percentage of the rejected vote (0-100). */
|
|
18967
|
+
readonly approvalPercentage: number;
|
|
18968
|
+
/** Rejection rule categories surfaced by voters. */
|
|
18969
|
+
readonly rejectionRules?: readonly string[];
|
|
18970
|
+
}
|
|
18971
|
+
/** MCP tool lifecycle events (Issue #1186). */
|
|
18972
|
+
interface ToolInvokedEvent extends BaseEvent {
|
|
18973
|
+
readonly type: 'tool.invoked';
|
|
18974
|
+
readonly toolName: string;
|
|
18975
|
+
readonly invocationId: string;
|
|
18976
|
+
}
|
|
18977
|
+
interface ToolCompletedEvent extends BaseEvent {
|
|
18978
|
+
readonly type: 'tool.completed';
|
|
18979
|
+
readonly toolName: string;
|
|
18980
|
+
readonly invocationId: string;
|
|
18981
|
+
readonly durationMs: number;
|
|
18982
|
+
readonly success: boolean;
|
|
18983
|
+
readonly errorMessage?: string;
|
|
18984
|
+
}
|
|
18985
|
+
/** Wave dispatch events for multi-wave worker execution (Issue #1401, Phase 6.2). */
|
|
18986
|
+
interface WaveStartedEvent extends BaseEvent {
|
|
18987
|
+
readonly type: 'wave.started';
|
|
18988
|
+
readonly executionId: string;
|
|
18989
|
+
readonly waveNumber: number;
|
|
18990
|
+
readonly totalWaves: number;
|
|
18991
|
+
readonly workerCount: number;
|
|
18992
|
+
readonly roles: readonly string[];
|
|
18993
|
+
}
|
|
18994
|
+
interface WaveCompletedEvent extends BaseEvent {
|
|
18995
|
+
readonly type: 'wave.completed';
|
|
18996
|
+
readonly executionId: string;
|
|
18997
|
+
readonly waveNumber: number;
|
|
18998
|
+
readonly totalWaves: number;
|
|
18999
|
+
readonly durationMs: number;
|
|
19000
|
+
readonly successes: number;
|
|
19001
|
+
readonly errors: number;
|
|
19002
|
+
}
|
|
19003
|
+
/** Discriminated union of all pipeline events. */
|
|
19004
|
+
type PipelineEvent = TaskCreatedEvent | TaskStatusChangedEvent | TaskCompletedEvent | TaskFailedEvent | PipelineStartedEvent | PipelineCompletedEvent | PipelineCheckpointEvent | StageStartedEvent | StageCompletedEvent | StageFailedEvent | StageRetryingEvent | PolicyEvaluatedEvent | ArtifactCreatedEvent | ModelCalledEvent | RoutingDecisionEvent | ToolInvokedEvent | ToolCompletedEvent | WaveStartedEvent | WaveCompletedEvent | FitnessDeclinedSignalEvent | SwarmUnhealthySignalEvent | VoteRejectedSignalEvent;
|
|
19005
|
+
/** Filter for subscribing to or querying events. */
|
|
19006
|
+
interface EventFilter {
|
|
19007
|
+
readonly type?: PipelineEventType | readonly PipelineEventType[];
|
|
19008
|
+
readonly taskId?: string;
|
|
19009
|
+
readonly executionId?: string;
|
|
19010
|
+
readonly since?: number;
|
|
19011
|
+
}
|
|
19012
|
+
/** Event handler callback. */
|
|
19013
|
+
type EventHandler = (event: PipelineEvent) => void;
|
|
19014
|
+
/** Unsubscribe function returned by subscribe. */
|
|
19015
|
+
type Unsubscribe = () => void;
|
|
19016
|
+
/**
|
|
19017
|
+
* Event bus interface — fire-and-forget event emission
|
|
19018
|
+
* with typed subscriptions and bounded query.
|
|
19019
|
+
*/
|
|
19020
|
+
interface IEventBus {
|
|
19021
|
+
/** Emit an event. Handlers must not throw. */
|
|
19022
|
+
emit(event: PipelineEvent): void;
|
|
19023
|
+
/** Subscribe to events matching filter. Returns unsubscribe function. */
|
|
19024
|
+
subscribe(filter: EventFilter, handler: EventHandler): Unsubscribe;
|
|
19025
|
+
/** Query recent events (bounded buffer). */
|
|
19026
|
+
query(filter: EventFilter, limit?: number): readonly PipelineEvent[];
|
|
19027
|
+
/** Total events emitted (including evicted). */
|
|
19028
|
+
readonly totalEmitted: number;
|
|
19029
|
+
/** Current buffer size. */
|
|
19030
|
+
readonly bufferSize: number;
|
|
19031
|
+
}
|
|
19032
|
+
|
|
18818
19033
|
/**
|
|
18819
19034
|
* nexus-agents/observability - Dashboard Types
|
|
18820
19035
|
*
|
|
@@ -20085,213 +20300,6 @@ declare class OrchestrationUnavailableError extends AgentError$1 {
|
|
|
20085
20300
|
});
|
|
20086
20301
|
}
|
|
20087
20302
|
|
|
20088
|
-
/**
|
|
20089
|
-
* Pipeline Event Types — V2 Observability (Issue #912, Phase 4-1)
|
|
20090
|
-
*
|
|
20091
|
-
* Typed event definitions for the pipeline event bus.
|
|
20092
|
-
* Every event carries a timestamp and relevant correlation IDs.
|
|
20093
|
-
*
|
|
20094
|
-
* @see docs/v2/08-observability-eventing.md
|
|
20095
|
-
* @module pipeline/event-types
|
|
20096
|
-
*/
|
|
20097
|
-
/** All valid pipeline event types. */
|
|
20098
|
-
declare const PIPELINE_EVENT_TYPES: readonly ["task.created", "task.status_changed", "task.completed", "task.failed", "pipeline.started", "pipeline.completed", "pipeline.checkpoint", "stage.started", "stage.completed", "stage.failed", "stage.retrying", "policy.evaluated", "artifact.created", "model.called", "routing.decision", "tool.invoked", "tool.completed", "wave.started", "wave.completed", "signal.fitness_declined", "signal.swarm_unhealthy", "signal.vote_rejected"];
|
|
20099
|
-
type PipelineEventType = (typeof PIPELINE_EVENT_TYPES)[number];
|
|
20100
|
-
/** Base fields present on every event. */
|
|
20101
|
-
interface BaseEvent {
|
|
20102
|
-
readonly timestamp: number;
|
|
20103
|
-
}
|
|
20104
|
-
/** Task lifecycle events. */
|
|
20105
|
-
interface TaskCreatedEvent extends BaseEvent {
|
|
20106
|
-
readonly type: 'task.created';
|
|
20107
|
-
readonly taskId: string;
|
|
20108
|
-
}
|
|
20109
|
-
interface TaskStatusChangedEvent extends BaseEvent {
|
|
20110
|
-
readonly type: 'task.status_changed';
|
|
20111
|
-
readonly taskId: string;
|
|
20112
|
-
readonly from: string;
|
|
20113
|
-
readonly to: string;
|
|
20114
|
-
}
|
|
20115
|
-
interface TaskCompletedEvent extends BaseEvent {
|
|
20116
|
-
readonly type: 'task.completed';
|
|
20117
|
-
readonly taskId: string;
|
|
20118
|
-
readonly success: boolean;
|
|
20119
|
-
}
|
|
20120
|
-
interface TaskFailedEvent extends BaseEvent {
|
|
20121
|
-
readonly type: 'task.failed';
|
|
20122
|
-
readonly taskId: string;
|
|
20123
|
-
readonly error: string;
|
|
20124
|
-
}
|
|
20125
|
-
/** Pipeline lifecycle events. */
|
|
20126
|
-
interface PipelineStartedEvent extends BaseEvent {
|
|
20127
|
-
readonly type: 'pipeline.started';
|
|
20128
|
-
readonly taskId: string;
|
|
20129
|
-
readonly executionId: string;
|
|
20130
|
-
}
|
|
20131
|
-
interface PipelineCompletedEvent extends BaseEvent {
|
|
20132
|
-
readonly type: 'pipeline.completed';
|
|
20133
|
-
readonly executionId: string;
|
|
20134
|
-
readonly success: boolean;
|
|
20135
|
-
readonly durationMs: number;
|
|
20136
|
-
}
|
|
20137
|
-
interface PipelineCheckpointEvent extends BaseEvent {
|
|
20138
|
-
readonly type: 'pipeline.checkpoint';
|
|
20139
|
-
readonly executionId: string;
|
|
20140
|
-
readonly stepNumber: number;
|
|
20141
|
-
}
|
|
20142
|
-
/** Stage lifecycle events. */
|
|
20143
|
-
interface StageStartedEvent extends BaseEvent {
|
|
20144
|
-
readonly type: 'stage.started';
|
|
20145
|
-
readonly executionId: string;
|
|
20146
|
-
readonly stageId: string;
|
|
20147
|
-
readonly pluginId: string;
|
|
20148
|
-
}
|
|
20149
|
-
interface StageCompletedEvent extends BaseEvent {
|
|
20150
|
-
readonly type: 'stage.completed';
|
|
20151
|
-
readonly executionId: string;
|
|
20152
|
-
readonly stageId: string;
|
|
20153
|
-
readonly durationMs: number;
|
|
20154
|
-
readonly success: boolean;
|
|
20155
|
-
}
|
|
20156
|
-
interface StageFailedEvent extends BaseEvent {
|
|
20157
|
-
readonly type: 'stage.failed';
|
|
20158
|
-
readonly executionId: string;
|
|
20159
|
-
readonly stageId: string;
|
|
20160
|
-
readonly error: string;
|
|
20161
|
-
/** Error classification: retriable (transient) or fatal (permanent) (Epic #952). */
|
|
20162
|
-
readonly errorTaxonomy?: 'retriable' | 'fatal';
|
|
20163
|
-
}
|
|
20164
|
-
interface StageRetryingEvent extends BaseEvent {
|
|
20165
|
-
readonly type: 'stage.retrying';
|
|
20166
|
-
readonly executionId: string;
|
|
20167
|
-
readonly stageId: string;
|
|
20168
|
-
readonly attempt: number;
|
|
20169
|
-
}
|
|
20170
|
-
/** Policy gate events. */
|
|
20171
|
-
interface PolicyEvaluatedEvent extends BaseEvent {
|
|
20172
|
-
readonly type: 'policy.evaluated';
|
|
20173
|
-
readonly executionId: string;
|
|
20174
|
-
readonly gateId: string;
|
|
20175
|
-
readonly decision: string;
|
|
20176
|
-
}
|
|
20177
|
-
/** Artifact events. */
|
|
20178
|
-
interface ArtifactCreatedEvent extends BaseEvent {
|
|
20179
|
-
readonly type: 'artifact.created';
|
|
20180
|
-
readonly executionId: string;
|
|
20181
|
-
readonly artifactId: string;
|
|
20182
|
-
readonly artifactType: string;
|
|
20183
|
-
}
|
|
20184
|
-
/** Model call events. */
|
|
20185
|
-
interface ModelCalledEvent extends BaseEvent {
|
|
20186
|
-
readonly type: 'model.called';
|
|
20187
|
-
readonly executionId: string;
|
|
20188
|
-
readonly cli: string;
|
|
20189
|
-
readonly model: string;
|
|
20190
|
-
readonly tokensIn: number;
|
|
20191
|
-
readonly tokensOut: number;
|
|
20192
|
-
readonly durationMs: number;
|
|
20193
|
-
/** Agent that initiated this model call (Epic #952). */
|
|
20194
|
-
readonly agentId?: string;
|
|
20195
|
-
/** Agent role (e.g., code_expert, security_expert) (Epic #952). */
|
|
20196
|
-
readonly role?: string;
|
|
20197
|
-
}
|
|
20198
|
-
/** Routing decision events. */
|
|
20199
|
-
interface RoutingDecisionEvent extends BaseEvent {
|
|
20200
|
-
readonly type: 'routing.decision';
|
|
20201
|
-
readonly taskId: string;
|
|
20202
|
-
readonly selectedModel: string;
|
|
20203
|
-
/** Human-readable reasoning for model selection (Epic #952). */
|
|
20204
|
-
readonly reasoning?: string;
|
|
20205
|
-
/** Routing decision path (stage:result pairs) (Epic #952). */
|
|
20206
|
-
readonly decisionPath?: readonly string[];
|
|
20207
|
-
}
|
|
20208
|
-
/** Signal events (#3147 P2 — close the loop). Consumed by the TuneStage. */
|
|
20209
|
-
interface FitnessDeclinedSignalEvent extends BaseEvent {
|
|
20210
|
-
readonly type: 'signal.fitness_declined';
|
|
20211
|
-
/** Current fitness score (0-100). */
|
|
20212
|
-
readonly score: number;
|
|
20213
|
-
/** Governance floor the score fell below. */
|
|
20214
|
-
readonly floor: number;
|
|
20215
|
-
/** Fitness dimension that declined, when attributable. */
|
|
20216
|
-
readonly dimension?: string;
|
|
20217
|
-
}
|
|
20218
|
-
interface SwarmUnhealthySignalEvent extends BaseEvent {
|
|
20219
|
-
readonly type: 'signal.swarm_unhealthy';
|
|
20220
|
-
/** Agent/CLI whose health degraded. */
|
|
20221
|
-
readonly agentId: string;
|
|
20222
|
-
/** Human-readable degradation reason. */
|
|
20223
|
-
readonly reason: string;
|
|
20224
|
-
}
|
|
20225
|
-
interface VoteRejectedSignalEvent extends BaseEvent {
|
|
20226
|
-
readonly type: 'signal.vote_rejected';
|
|
20227
|
-
readonly proposalId: string;
|
|
20228
|
-
/** Approval percentage of the rejected vote (0-100). */
|
|
20229
|
-
readonly approvalPercentage: number;
|
|
20230
|
-
/** Rejection rule categories surfaced by voters. */
|
|
20231
|
-
readonly rejectionRules?: readonly string[];
|
|
20232
|
-
}
|
|
20233
|
-
/** MCP tool lifecycle events (Issue #1186). */
|
|
20234
|
-
interface ToolInvokedEvent extends BaseEvent {
|
|
20235
|
-
readonly type: 'tool.invoked';
|
|
20236
|
-
readonly toolName: string;
|
|
20237
|
-
readonly invocationId: string;
|
|
20238
|
-
}
|
|
20239
|
-
interface ToolCompletedEvent extends BaseEvent {
|
|
20240
|
-
readonly type: 'tool.completed';
|
|
20241
|
-
readonly toolName: string;
|
|
20242
|
-
readonly invocationId: string;
|
|
20243
|
-
readonly durationMs: number;
|
|
20244
|
-
readonly success: boolean;
|
|
20245
|
-
readonly errorMessage?: string;
|
|
20246
|
-
}
|
|
20247
|
-
/** Wave dispatch events for multi-wave worker execution (Issue #1401, Phase 6.2). */
|
|
20248
|
-
interface WaveStartedEvent extends BaseEvent {
|
|
20249
|
-
readonly type: 'wave.started';
|
|
20250
|
-
readonly executionId: string;
|
|
20251
|
-
readonly waveNumber: number;
|
|
20252
|
-
readonly totalWaves: number;
|
|
20253
|
-
readonly workerCount: number;
|
|
20254
|
-
readonly roles: readonly string[];
|
|
20255
|
-
}
|
|
20256
|
-
interface WaveCompletedEvent extends BaseEvent {
|
|
20257
|
-
readonly type: 'wave.completed';
|
|
20258
|
-
readonly executionId: string;
|
|
20259
|
-
readonly waveNumber: number;
|
|
20260
|
-
readonly totalWaves: number;
|
|
20261
|
-
readonly durationMs: number;
|
|
20262
|
-
readonly successes: number;
|
|
20263
|
-
readonly errors: number;
|
|
20264
|
-
}
|
|
20265
|
-
/** Discriminated union of all pipeline events. */
|
|
20266
|
-
type PipelineEvent = TaskCreatedEvent | TaskStatusChangedEvent | TaskCompletedEvent | TaskFailedEvent | PipelineStartedEvent | PipelineCompletedEvent | PipelineCheckpointEvent | StageStartedEvent | StageCompletedEvent | StageFailedEvent | StageRetryingEvent | PolicyEvaluatedEvent | ArtifactCreatedEvent | ModelCalledEvent | RoutingDecisionEvent | ToolInvokedEvent | ToolCompletedEvent | WaveStartedEvent | WaveCompletedEvent | FitnessDeclinedSignalEvent | SwarmUnhealthySignalEvent | VoteRejectedSignalEvent;
|
|
20267
|
-
/** Filter for subscribing to or querying events. */
|
|
20268
|
-
interface EventFilter {
|
|
20269
|
-
readonly type?: PipelineEventType | readonly PipelineEventType[];
|
|
20270
|
-
readonly taskId?: string;
|
|
20271
|
-
readonly executionId?: string;
|
|
20272
|
-
readonly since?: number;
|
|
20273
|
-
}
|
|
20274
|
-
/** Event handler callback. */
|
|
20275
|
-
type EventHandler = (event: PipelineEvent) => void;
|
|
20276
|
-
/** Unsubscribe function returned by subscribe. */
|
|
20277
|
-
type Unsubscribe = () => void;
|
|
20278
|
-
/**
|
|
20279
|
-
* Event bus interface — fire-and-forget event emission
|
|
20280
|
-
* with typed subscriptions and bounded query.
|
|
20281
|
-
*/
|
|
20282
|
-
interface IEventBus {
|
|
20283
|
-
/** Emit an event. Handlers must not throw. */
|
|
20284
|
-
emit(event: PipelineEvent): void;
|
|
20285
|
-
/** Subscribe to events matching filter. Returns unsubscribe function. */
|
|
20286
|
-
subscribe(filter: EventFilter, handler: EventHandler): Unsubscribe;
|
|
20287
|
-
/** Query recent events (bounded buffer). */
|
|
20288
|
-
query(filter: EventFilter, limit?: number): readonly PipelineEvent[];
|
|
20289
|
-
/** Total events emitted (including evicted). */
|
|
20290
|
-
readonly totalEmitted: number;
|
|
20291
|
-
/** Current buffer size. */
|
|
20292
|
-
readonly bufferSize: number;
|
|
20293
|
-
}
|
|
20294
|
-
|
|
20295
20303
|
/**
|
|
20296
20304
|
* MCP tool for task orchestration with intelligent workflow pattern routing.
|
|
20297
20305
|
* Types/schemas in orchestrate-types.ts (Issue #708). Routing via Issue #846.
|