@north-light/crouter 0.3.290 → 0.3.291

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.
@@ -31,7 +31,11 @@ interface NodeOutcomeBaseDTO {
31
31
  }
32
32
  /** A settled outcome. Narrowing on `kind` then `reason` makes a declined
33
33
  * structured result (`failure`/`declined`) a case a consumer must handle:
34
- * only that case carries `declined`; every other outcome has it null. */
34
+ * only that case can carry `declined`; every other outcome has it null. A
35
+ * declined outcome latched before the decline block was recorded on the row
36
+ * (or reconstructed by the outcome-column backfill from `terminal_reason`
37
+ * alone) carries null there — the decline happened, its reason/code/retryable
38
+ * triple was never stored. */
35
39
  export type NodeOutcomeDTO = (NodeOutcomeBaseDTO & {
36
40
  kind: 'result';
37
41
  reason: TerminalReasonDTO;
@@ -39,7 +43,7 @@ export type NodeOutcomeDTO = (NodeOutcomeBaseDTO & {
39
43
  }) | (NodeOutcomeBaseDTO & {
40
44
  kind: 'failure';
41
45
  reason: 'declined';
42
- declined: DeclinedResultDTO;
46
+ declined: DeclinedResultDTO | null;
43
47
  }) | (NodeOutcomeBaseDTO & {
44
48
  kind: 'failure';
45
49
  reason: Exclude<TerminalReasonDTO, 'declined'>;
@@ -62,12 +62,13 @@ export function toNodeOutcomeDTO(node) {
62
62
  };
63
63
  if (node.outcome_kind === 'result')
64
64
  return { ...base, kind: 'result', reason: node.outcome_reason, declined: null };
65
- if (node.outcome_reason === 'declined') {
66
- // The decline lane always records its detail; a declined row without one is corrupt, not a legacy shape.
67
- if (detail?.declined === undefined)
68
- throw new Error(`node ${node.node_id}: outcome reason 'declined' without a declined detail`);
69
- return { ...base, kind: 'failure', reason: 'declined', declined: detail.declined };
70
- }
65
+ // A declined row whose detail holds no decline block still projects: the row
66
+ // predates the decline block being recorded, or the outcome-column backfill
67
+ // rebuilt it from `terminal_reason` alone. This mapper also runs per row in
68
+ // the canvas-wide list projection, so throwing here would take every
69
+ // graph-wide read down over one unreadable node.
70
+ if (node.outcome_reason === 'declined')
71
+ return { ...base, kind: 'failure', reason: 'declined', declined: detail?.declined ?? null };
71
72
  return { ...base, kind: 'failure', reason: node.outcome_reason, declined: null };
72
73
  }
73
74
  /** Project a durable delivery row without exposing its execution coordinates or stderr tail. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@north-light/crouter",
3
- "version": "0.3.290",
3
+ "version": "0.3.291",
4
4
  "description": "crtr — agent runtime with memory, plugins, and marketplaces",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
package/runtime.lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@north-light/crouter",
3
- "version": "0.3.290",
3
+ "version": "0.3.291",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@north-light/crouter",
9
- "version": "0.3.290",
9
+ "version": "0.3.291",
10
10
  "hasInstallScript": true,
11
11
  "license": "MIT",
12
12
  "workspaces": [
@@ -4244,17 +4244,17 @@
4244
4244
  },
4245
4245
  "packages/crouter-api": {
4246
4246
  "name": "@north-light/crouter-api",
4247
- "version": "0.3.290",
4247
+ "version": "0.3.291",
4248
4248
  "license": "UNLICENSED"
4249
4249
  },
4250
4250
  "packages/crouter-env-docker": {
4251
4251
  "name": "@north-light/crouter-env-docker",
4252
- "version": "0.3.290",
4252
+ "version": "0.3.291",
4253
4253
  "license": "UNLICENSED"
4254
4254
  },
4255
4255
  "packages/crouter-sdk": {
4256
4256
  "name": "@north-light/crouter-sdk",
4257
- "version": "0.3.290",
4257
+ "version": "0.3.291",
4258
4258
  "license": "UNLICENSED",
4259
4259
  "dependencies": {
4260
4260
  "@north-light/crouter-api": "*"