@flowdesk/core 0.1.11 → 0.1.13

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.
Files changed (136) hide show
  1. package/dist/agent-profiles.js +0 -1
  2. package/dist/agent-registry.d.ts +43 -0
  3. package/dist/agent-registry.d.ts.map +1 -0
  4. package/dist/agent-registry.js +309 -0
  5. package/dist/agent-registry.js.map +1 -0
  6. package/dist/audit.js +0 -1
  7. package/dist/authority-promotion.js +0 -1
  8. package/dist/bootstrap-foundation.js +0 -1
  9. package/dist/chat-control-authority.js +0 -1
  10. package/dist/chat-hook-authority-probe.js +0 -1
  11. package/dist/chat-routing.d.ts.map +1 -1
  12. package/dist/chat-routing.js +17 -9
  13. package/dist/chat-routing.js.map +1 -1
  14. package/dist/command-manifest.js +0 -1
  15. package/dist/config-policy.js +0 -1
  16. package/dist/connector-gateway.js +0 -1
  17. package/dist/connector-profile.js +0 -1
  18. package/dist/controlled-conformance-doc-write.js +0 -1
  19. package/dist/controlled-redacted-audit-export-write.js +0 -1
  20. package/dist/controlled-workspace-file-write.d.ts +36 -0
  21. package/dist/controlled-workspace-file-write.d.ts.map +1 -0
  22. package/dist/controlled-workspace-file-write.js +130 -0
  23. package/dist/controlled-workspace-file-write.js.map +1 -0
  24. package/dist/core-completion-safety-contracts.js +0 -1
  25. package/dist/dispatch-attempt-manifest.js +0 -1
  26. package/dist/dispatch-idempotency.js +0 -1
  27. package/dist/external-auth-policy.js +0 -1
  28. package/dist/fake-remote-connector-adapter.js +0 -1
  29. package/dist/fake-runtime.js +0 -1
  30. package/dist/fallback-decision.js +0 -1
  31. package/dist/fallback-regate-plan.js +0 -1
  32. package/dist/fds1-schema-probe-result.js +0 -1
  33. package/dist/guard-boundary.js +0 -1
  34. package/dist/guarded-dry-run.js +0 -1
  35. package/dist/hook-harness.js +0 -1
  36. package/dist/index.d.ts +12 -0
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +12 -0
  39. package/dist/index.js.map +1 -1
  40. package/dist/lane-heartbeat.js +0 -1
  41. package/dist/lane-lifecycle-record.d.ts +2 -0
  42. package/dist/lane-lifecycle-record.d.ts.map +1 -1
  43. package/dist/lane-lifecycle-record.js +6 -1
  44. package/dist/lane-lifecycle-record.js.map +1 -1
  45. package/dist/lane-observability.js +0 -1
  46. package/dist/lane-stall-projection.d.ts.map +1 -1
  47. package/dist/lane-stall-projection.js +55 -15
  48. package/dist/lane-stall-projection.js.map +1 -1
  49. package/dist/managed-dispatch-evidence-shape.js +0 -1
  50. package/dist/model-availability-cache.js +1 -2
  51. package/dist/model-availability-cache.js.map +1 -1
  52. package/dist/operational-intelligence.js +0 -1
  53. package/dist/pending-abort.d.ts +26 -0
  54. package/dist/pending-abort.d.ts.map +1 -0
  55. package/dist/pending-abort.js +78 -0
  56. package/dist/pending-abort.js.map +1 -0
  57. package/dist/plan.js +0 -1
  58. package/dist/planning-evidence-common.d.ts +18 -0
  59. package/dist/planning-evidence-common.d.ts.map +1 -0
  60. package/dist/planning-evidence-common.js +95 -0
  61. package/dist/planning-evidence-common.js.map +1 -0
  62. package/dist/pre-dispatch-audit-record.js +0 -1
  63. package/dist/production-approval-source.js +0 -1
  64. package/dist/production-enablement.js +0 -1
  65. package/dist/production-verification.js +0 -1
  66. package/dist/provider-failures.js +0 -1
  67. package/dist/provider-usage-collector.d.ts.map +1 -1
  68. package/dist/provider-usage-collector.js +104 -10
  69. package/dist/provider-usage-collector.js.map +1 -1
  70. package/dist/redaction.js +0 -1
  71. package/dist/release1-contracts.d.ts +1 -0
  72. package/dist/release1-contracts.d.ts.map +1 -1
  73. package/dist/release1-contracts.js +0 -1
  74. package/dist/release1-contracts.js.map +1 -1
  75. package/dist/remote-write-connector-gate.js +0 -1
  76. package/dist/retry-plan.d.ts +97 -0
  77. package/dist/retry-plan.d.ts.map +1 -0
  78. package/dist/retry-plan.js +265 -0
  79. package/dist/retry-plan.js.map +1 -0
  80. package/dist/retry.js +0 -1
  81. package/dist/reviewer-lane-conformance.js +0 -1
  82. package/dist/runtime-lane-productization.d.ts +1 -1
  83. package/dist/runtime-lane-productization.d.ts.map +1 -1
  84. package/dist/runtime-lane-productization.js +1 -1
  85. package/dist/runtime-lane-productization.js.map +1 -1
  86. package/dist/sanitized-auth-capture.js +0 -1
  87. package/dist/schema-artifacts.d.ts.map +1 -1
  88. package/dist/schema-artifacts.js +2 -2
  89. package/dist/schema-artifacts.js.map +1 -1
  90. package/dist/schema-registry.d.ts.map +1 -1
  91. package/dist/schema-registry.js +5 -1
  92. package/dist/schema-registry.js.map +1 -1
  93. package/dist/session-evidence.d.ts.map +1 -1
  94. package/dist/session-evidence.js +58 -0
  95. package/dist/session-evidence.js.map +1 -1
  96. package/dist/state-paths.d.ts +1 -1
  97. package/dist/state-paths.d.ts.map +1 -1
  98. package/dist/state-paths.js +32 -0
  99. package/dist/state-paths.js.map +1 -1
  100. package/dist/state-store.js +0 -1
  101. package/dist/status.js +0 -1
  102. package/dist/task-agent-assignment.d.ts +30 -0
  103. package/dist/task-agent-assignment.d.ts.map +1 -0
  104. package/dist/task-agent-assignment.js +77 -0
  105. package/dist/task-agent-assignment.js.map +1 -0
  106. package/dist/task-graph.d.ts +31 -0
  107. package/dist/task-graph.d.ts.map +1 -0
  108. package/dist/task-graph.js +122 -0
  109. package/dist/task-graph.js.map +1 -0
  110. package/dist/task-model-selection.d.ts +36 -0
  111. package/dist/task-model-selection.d.ts.map +1 -0
  112. package/dist/task-model-selection.js +99 -0
  113. package/dist/task-model-selection.js.map +1 -0
  114. package/dist/task-result.d.ts +31 -0
  115. package/dist/task-result.d.ts.map +1 -0
  116. package/dist/task-result.js +115 -0
  117. package/dist/task-result.js.map +1 -0
  118. package/dist/tool-contract-fixtures.js +0 -1
  119. package/dist/top-tier-reviewer-lane-probe.js +0 -1
  120. package/dist/usage-health.js +0 -1
  121. package/dist/validators.d.ts.map +1 -1
  122. package/dist/validators.js +10 -2
  123. package/dist/validators.js.map +1 -1
  124. package/dist/workflow-authoring-result.d.ts +25 -0
  125. package/dist/workflow-authoring-result.d.ts.map +1 -0
  126. package/dist/workflow-authoring-result.js +63 -0
  127. package/dist/workflow-authoring-result.js.map +1 -0
  128. package/dist/workflow-dispatch-plan.d.ts +65 -0
  129. package/dist/workflow-dispatch-plan.d.ts.map +1 -0
  130. package/dist/workflow-dispatch-plan.js +228 -0
  131. package/dist/workflow-dispatch-plan.js.map +1 -0
  132. package/dist/workflow-synthesis.d.ts +18 -0
  133. package/dist/workflow-synthesis.d.ts.map +1 -0
  134. package/dist/workflow-synthesis.js +40 -0
  135. package/dist/workflow-synthesis.js.map +1 -0
  136. package/package.json +1 -1
@@ -0,0 +1,30 @@
1
+ import type { FlowDeskAgentRegistryRoleCategoryV1 } from "./agent-registry.js";
2
+ import type { OpaqueId, OpaqueRef } from "./release1-contracts.js";
3
+ import { type ValidationResult } from "./planning-evidence-common.js";
4
+ export declare const FLOWDESK_TASK_AGENT_ASSIGNMENT_SCHEMA_VERSION_V1: "flowdesk.task_agent_assignment.v1";
5
+ export type FlowDeskTaskAgentCompatibilityStatusV1 = "compatible" | "blocked" | "unknown";
6
+ export interface FlowDeskTaskAgentAssignmentV1 {
7
+ schema_version: typeof FLOWDESK_TASK_AGENT_ASSIGNMENT_SCHEMA_VERSION_V1;
8
+ workflow_id: OpaqueId;
9
+ task_id: OpaqueId;
10
+ assignment_id: OpaqueId;
11
+ agent_role: FlowDeskAgentRegistryRoleCategoryV1;
12
+ agent_role_ref: OpaqueRef;
13
+ selected_agent_ref: OpaqueRef;
14
+ selected_profile_ref: OpaqueRef;
15
+ compatibility_status: FlowDeskTaskAgentCompatibilityStatusV1;
16
+ fit_label: string;
17
+ registry_evidence_ref: OpaqueRef;
18
+ profile_evidence_ref: OpaqueRef;
19
+ blocked_labels: string[];
20
+ created_at: string;
21
+ release_gate: "release1_planning_only";
22
+ dispatch_authority_enabled: false;
23
+ provider_call_made: false;
24
+ runtime_execution: false;
25
+ actual_lane_launch: false;
26
+ write_authority_enabled: false;
27
+ redaction_version: "v1";
28
+ }
29
+ export declare function validateFlowDeskTaskAgentAssignmentV1(value: unknown): ValidationResult;
30
+ //# sourceMappingURL=task-agent-assignment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-agent-assignment.d.ts","sourceRoot":"","sources":["../src/task-agent-assignment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mCAAmC,EAAE,MAAM,qBAAqB,CAAC;AAE/E,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAMN,KAAK,gBAAgB,EASrB,MAAM,+BAA+B,CAAC;AAEvC,eAAO,MAAM,gDAAgD,EAAG,mCAA4C,CAAC;AAE7G,MAAM,MAAM,sCAAsC,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC;AAE1F,MAAM,WAAW,6BAA6B;IAC7C,cAAc,EAAE,OAAO,gDAAgD,CAAC;IACxE,WAAW,EAAE,QAAQ,CAAC;IACtB,OAAO,EAAE,QAAQ,CAAC;IAClB,aAAa,EAAE,QAAQ,CAAC;IACxB,UAAU,EAAE,mCAAmC,CAAC;IAChD,cAAc,EAAE,SAAS,CAAC;IAC1B,kBAAkB,EAAE,SAAS,CAAC;IAC9B,oBAAoB,EAAE,SAAS,CAAC;IAChC,oBAAoB,EAAE,sCAAsC,CAAC;IAC7D,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB,EAAE,SAAS,CAAC;IACjC,oBAAoB,EAAE,SAAS,CAAC;IAChC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,wBAAwB,CAAC;IACvC,0BAA0B,EAAE,KAAK,CAAC;IAClC,kBAAkB,EAAE,KAAK,CAAC;IAC1B,iBAAiB,EAAE,KAAK,CAAC;IACzB,kBAAkB,EAAE,KAAK,CAAC;IAC1B,uBAAuB,EAAE,KAAK,CAAC;IAC/B,iBAAiB,EAAE,IAAI,CAAC;CACxB;AAgDD,wBAAgB,qCAAqC,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAwBtF"}
@@ -0,0 +1,77 @@
1
+ import { FLOWDESK_AGENT_REGISTRY_ROLE_CATEGORIES_V1 } from "./agent-registry.js";
2
+ import { FLOWDESK_PLANNING_AUTHORITY_KEYS_V1, invalid, isPlanningEvidenceRecord, rejectUnknownPlanningProperties, requirePlanningKeys, valid, validatePlanningAuthorityFalse, validatePlanningNoForbiddenPayloads, validatePlanningOpaqueId, validatePlanningOpaqueRef, validatePlanningOpaqueRefArray, validatePlanningSafeText, validatePlanningTimestamp, } from "./planning-evidence-common.js";
3
+ export const FLOWDESK_TASK_AGENT_ASSIGNMENT_SCHEMA_VERSION_V1 = "flowdesk.task_agent_assignment.v1";
4
+ const ALLOWED_KEYS = new Set([
5
+ "schema_version",
6
+ "workflow_id",
7
+ "task_id",
8
+ "assignment_id",
9
+ "agent_role",
10
+ "agent_role_ref",
11
+ "selected_agent_ref",
12
+ "selected_profile_ref",
13
+ "compatibility_status",
14
+ "fit_label",
15
+ "registry_evidence_ref",
16
+ "profile_evidence_ref",
17
+ "blocked_labels",
18
+ "created_at",
19
+ "release_gate",
20
+ ...FLOWDESK_PLANNING_AUTHORITY_KEYS_V1,
21
+ "redaction_version",
22
+ ]);
23
+ const REQUIRED_KEYS = [
24
+ "schema_version",
25
+ "workflow_id",
26
+ "task_id",
27
+ "assignment_id",
28
+ "agent_role",
29
+ "agent_role_ref",
30
+ "selected_agent_ref",
31
+ "selected_profile_ref",
32
+ "compatibility_status",
33
+ "fit_label",
34
+ "registry_evidence_ref",
35
+ "profile_evidence_ref",
36
+ "blocked_labels",
37
+ "created_at",
38
+ "release_gate",
39
+ ...FLOWDESK_PLANNING_AUTHORITY_KEYS_V1,
40
+ "redaction_version",
41
+ ];
42
+ const COMPATIBILITY_STATUSES = new Set([
43
+ "compatible",
44
+ "blocked",
45
+ "unknown",
46
+ ]);
47
+ export function validateFlowDeskTaskAgentAssignmentV1(value) {
48
+ if (!isPlanningEvidenceRecord(value))
49
+ return invalid("task agent assignment must be an object");
50
+ const errors = [];
51
+ errors.push(...rejectUnknownPlanningProperties(value, ALLOWED_KEYS, "task agent assignment"));
52
+ errors.push(...requirePlanningKeys(value, REQUIRED_KEYS, "task agent assignment"));
53
+ if (value.schema_version !== FLOWDESK_TASK_AGENT_ASSIGNMENT_SCHEMA_VERSION_V1)
54
+ errors.push(`schema_version must be ${FLOWDESK_TASK_AGENT_ASSIGNMENT_SCHEMA_VERSION_V1}`);
55
+ errors.push(...validatePlanningOpaqueId(value.workflow_id, "workflow_id").errors);
56
+ errors.push(...validatePlanningOpaqueId(value.task_id, "task_id").errors);
57
+ errors.push(...validatePlanningOpaqueId(value.assignment_id, "assignment_id").errors);
58
+ if (!FLOWDESK_AGENT_REGISTRY_ROLE_CATEGORIES_V1.includes(value.agent_role))
59
+ errors.push("agent_role is invalid");
60
+ errors.push(...validatePlanningOpaqueRef(value.agent_role_ref, "agent_role_ref").errors);
61
+ errors.push(...validatePlanningOpaqueRef(value.selected_agent_ref, "selected_agent_ref").errors);
62
+ errors.push(...validatePlanningOpaqueRef(value.selected_profile_ref, "selected_profile_ref").errors);
63
+ if (!COMPATIBILITY_STATUSES.has(value.compatibility_status))
64
+ errors.push("compatibility_status is invalid");
65
+ errors.push(...validatePlanningSafeText(value.fit_label, "fit_label", 120).errors);
66
+ errors.push(...validatePlanningOpaqueRef(value.registry_evidence_ref, "registry_evidence_ref").errors);
67
+ errors.push(...validatePlanningOpaqueRef(value.profile_evidence_ref, "profile_evidence_ref").errors);
68
+ errors.push(...validatePlanningOpaqueRefArray(value.blocked_labels, "blocked_labels", 12).errors);
69
+ errors.push(...validatePlanningTimestamp(value.created_at, "created_at").errors);
70
+ if (value.release_gate !== "release1_planning_only")
71
+ errors.push("release_gate must be release1_planning_only");
72
+ if (value.redaction_version !== "v1")
73
+ errors.push("redaction_version must be v1");
74
+ errors.push(...validatePlanningAuthorityFalse(value, "task_agent_assignment"));
75
+ errors.push(...validatePlanningNoForbiddenPayloads(value, "task_agent_assignment").errors);
76
+ return errors.length === 0 ? valid() : invalid(...errors);
77
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-agent-assignment.js","sourceRoot":"","sources":["../src/task-agent-assignment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { OpaqueId } from "./release1-contracts.js";
2
+ import { type ValidationResult } from "./planning-evidence-common.js";
3
+ export declare const FLOWDESK_TASK_GRAPH_SCHEMA_VERSION_V1: "flowdesk.task_graph.v1";
4
+ export interface FlowDeskTaskGraphNodeV1 {
5
+ task_id: OpaqueId;
6
+ title: string;
7
+ summary: string;
8
+ }
9
+ export interface FlowDeskTaskGraphEdgeV1 {
10
+ from_task_id: OpaqueId;
11
+ to_task_id: OpaqueId;
12
+ relation: "depends_on";
13
+ }
14
+ export interface FlowDeskTaskGraphV1 {
15
+ schema_version: typeof FLOWDESK_TASK_GRAPH_SCHEMA_VERSION_V1;
16
+ workflow_id: OpaqueId;
17
+ task_graph_id: OpaqueId;
18
+ nodes: FlowDeskTaskGraphNodeV1[];
19
+ edges: FlowDeskTaskGraphEdgeV1[];
20
+ graph_summary: string;
21
+ created_at: string;
22
+ release_gate: "release1_planning_only";
23
+ dispatch_authority_enabled: false;
24
+ provider_call_made: false;
25
+ runtime_execution: false;
26
+ actual_lane_launch: false;
27
+ write_authority_enabled: false;
28
+ redaction_version: "v1";
29
+ }
30
+ export declare function validateFlowDeskTaskGraphV1(value: unknown): ValidationResult;
31
+ //# sourceMappingURL=task-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-graph.d.ts","sourceRoot":"","sources":["../src/task-graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAMN,KAAK,gBAAgB,EAOrB,MAAM,+BAA+B,CAAC;AAEvC,eAAO,MAAM,qCAAqC,EAAG,wBAAiC,CAAC;AAEvF,MAAM,WAAW,uBAAuB;IACvC,OAAO,EAAE,QAAQ,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACvC,YAAY,EAAE,QAAQ,CAAC;IACvB,UAAU,EAAE,QAAQ,CAAC;IACrB,QAAQ,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IACnC,cAAc,EAAE,OAAO,qCAAqC,CAAC;IAC7D,WAAW,EAAE,QAAQ,CAAC;IACtB,aAAa,EAAE,QAAQ,CAAC;IACxB,KAAK,EAAE,uBAAuB,EAAE,CAAC;IACjC,KAAK,EAAE,uBAAuB,EAAE,CAAC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,wBAAwB,CAAC;IACvC,0BAA0B,EAAE,KAAK,CAAC;IAClC,kBAAkB,EAAE,KAAK,CAAC;IAC1B,iBAAiB,EAAE,KAAK,CAAC;IACzB,kBAAkB,EAAE,KAAK,CAAC;IAC1B,uBAAuB,EAAE,KAAK,CAAC;IAC/B,iBAAiB,EAAE,IAAI,CAAC;CACxB;AA8ED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CA0B5E"}
@@ -0,0 +1,122 @@
1
+ import { FLOWDESK_PLANNING_AUTHORITY_KEYS_V1, invalid, isPlanningEvidenceRecord, rejectUnknownPlanningProperties, requirePlanningKeys, valid, validatePlanningAuthorityFalse, validatePlanningNoForbiddenPayloads, validatePlanningOpaqueId, validatePlanningSafeText, validatePlanningTimestamp, } from "./planning-evidence-common.js";
2
+ export const FLOWDESK_TASK_GRAPH_SCHEMA_VERSION_V1 = "flowdesk.task_graph.v1";
3
+ const GRAPH_ALLOWED_KEYS = new Set([
4
+ "schema_version",
5
+ "workflow_id",
6
+ "task_graph_id",
7
+ "nodes",
8
+ "edges",
9
+ "graph_summary",
10
+ "created_at",
11
+ "release_gate",
12
+ ...FLOWDESK_PLANNING_AUTHORITY_KEYS_V1,
13
+ "redaction_version",
14
+ ]);
15
+ const NODE_ALLOWED_KEYS = new Set(["task_id", "title", "summary"]);
16
+ const EDGE_ALLOWED_KEYS = new Set(["from_task_id", "to_task_id", "relation"]);
17
+ function validateNode(value, label) {
18
+ if (!isPlanningEvidenceRecord(value))
19
+ return invalid(`${label} must be an object`);
20
+ const errors = [];
21
+ errors.push(...rejectUnknownPlanningProperties(value, NODE_ALLOWED_KEYS, label));
22
+ errors.push(...requirePlanningKeys(value, ["task_id", "title", "summary"], label));
23
+ errors.push(...validatePlanningOpaqueId(value.task_id, `${label}.task_id`).errors);
24
+ errors.push(...validatePlanningSafeText(value.title, `${label}.title`, 160).errors);
25
+ errors.push(...validatePlanningSafeText(value.summary, `${label}.summary`, 500).errors);
26
+ errors.push(...validatePlanningNoForbiddenPayloads(value, label).errors);
27
+ return errors.length === 0 ? valid() : invalid(...errors);
28
+ }
29
+ function validateEdge(value, label) {
30
+ if (!isPlanningEvidenceRecord(value))
31
+ return invalid(`${label} must be an object`);
32
+ const errors = [];
33
+ errors.push(...rejectUnknownPlanningProperties(value, EDGE_ALLOWED_KEYS, label));
34
+ errors.push(...requirePlanningKeys(value, ["from_task_id", "to_task_id", "relation"], label));
35
+ errors.push(...validatePlanningOpaqueId(value.from_task_id, `${label}.from_task_id`).errors);
36
+ errors.push(...validatePlanningOpaqueId(value.to_task_id, `${label}.to_task_id`).errors);
37
+ if (value.relation !== "depends_on")
38
+ errors.push(`${label}.relation must be depends_on`);
39
+ if (value.from_task_id === value.to_task_id)
40
+ errors.push(`${label} self dependency is not allowed`);
41
+ errors.push(...validatePlanningNoForbiddenPayloads(value, label).errors);
42
+ return errors.length === 0 ? valid() : invalid(...errors);
43
+ }
44
+ function validateDag(nodes, edges) {
45
+ const errors = [];
46
+ const nodeIds = new Set();
47
+ for (const node of nodes) {
48
+ if (nodeIds.has(node.task_id))
49
+ errors.push(`duplicate task id: ${node.task_id}`);
50
+ nodeIds.add(node.task_id);
51
+ }
52
+ const outgoing = new Map();
53
+ for (const edge of edges) {
54
+ if (!nodeIds.has(edge.from_task_id))
55
+ errors.push(`missing dependency task id: ${edge.from_task_id}`);
56
+ if (!nodeIds.has(edge.to_task_id))
57
+ errors.push(`missing dependent task id: ${edge.to_task_id}`);
58
+ if (edge.from_task_id === edge.to_task_id)
59
+ errors.push(`self dependency is not allowed: ${edge.from_task_id}`);
60
+ const list = outgoing.get(edge.from_task_id) ?? [];
61
+ list.push(edge.to_task_id);
62
+ outgoing.set(edge.from_task_id, list);
63
+ }
64
+ const visiting = new Set();
65
+ const visited = new Set();
66
+ const visit = (id) => {
67
+ if (visiting.has(id))
68
+ return true;
69
+ if (visited.has(id))
70
+ return false;
71
+ visiting.add(id);
72
+ for (const next of outgoing.get(id) ?? [])
73
+ if (visit(next))
74
+ return true;
75
+ visiting.delete(id);
76
+ visited.add(id);
77
+ return false;
78
+ };
79
+ for (const id of nodeIds) {
80
+ if (visit(id)) {
81
+ errors.push("task graph contains a cycle");
82
+ break;
83
+ }
84
+ }
85
+ return errors;
86
+ }
87
+ export function validateFlowDeskTaskGraphV1(value) {
88
+ if (!isPlanningEvidenceRecord(value))
89
+ return invalid("task graph must be an object");
90
+ const errors = [];
91
+ errors.push(...rejectUnknownPlanningProperties(value, GRAPH_ALLOWED_KEYS, "task graph"));
92
+ errors.push(...requirePlanningKeys(value, ["schema_version", "workflow_id", "task_graph_id", "nodes", "edges", "graph_summary", "created_at", "release_gate", ...FLOWDESK_PLANNING_AUTHORITY_KEYS_V1, "redaction_version"], "task graph"));
93
+ if (value.schema_version !== FLOWDESK_TASK_GRAPH_SCHEMA_VERSION_V1)
94
+ errors.push(`schema_version must be ${FLOWDESK_TASK_GRAPH_SCHEMA_VERSION_V1}`);
95
+ errors.push(...validatePlanningOpaqueId(value.workflow_id, "workflow_id").errors);
96
+ errors.push(...validatePlanningOpaqueId(value.task_graph_id, "task_graph_id").errors);
97
+ if (!Array.isArray(value.nodes))
98
+ errors.push("nodes must be an array");
99
+ else {
100
+ if (value.nodes.length === 0 || value.nodes.length > 64)
101
+ errors.push("nodes must contain 1..64 items");
102
+ errors.push(...value.nodes.flatMap((node, index) => validateNode(node, `nodes[${index}]`).errors));
103
+ }
104
+ if (!Array.isArray(value.edges))
105
+ errors.push("edges must be an array");
106
+ else {
107
+ if (value.edges.length > 128)
108
+ errors.push("edges exceeds 128 items");
109
+ errors.push(...value.edges.flatMap((edge, index) => validateEdge(edge, `edges[${index}]`).errors));
110
+ }
111
+ if (Array.isArray(value.nodes) && Array.isArray(value.edges))
112
+ errors.push(...validateDag(value.nodes, value.edges));
113
+ errors.push(...validatePlanningSafeText(value.graph_summary, "graph_summary", 500).errors);
114
+ errors.push(...validatePlanningTimestamp(value.created_at, "created_at").errors);
115
+ if (value.release_gate !== "release1_planning_only")
116
+ errors.push("release_gate must be release1_planning_only");
117
+ if (value.redaction_version !== "v1")
118
+ errors.push("redaction_version must be v1");
119
+ errors.push(...validatePlanningAuthorityFalse(value, "task_graph"));
120
+ errors.push(...validatePlanningNoForbiddenPayloads(value, "task_graph").errors);
121
+ return errors.length === 0 ? valid() : invalid(...errors);
122
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-graph.js","sourceRoot":"","sources":["../src/task-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { OpaqueId, OpaqueRef, ProviderFamily } from "./release1-contracts.js";
2
+ import { type ValidationResult } from "./planning-evidence-common.js";
3
+ export declare const FLOWDESK_TASK_MODEL_SELECTION_SCHEMA_VERSION_V1: "flowdesk.task_model_selection.v1";
4
+ export type FlowDeskTaskModelSelectionStatusV1 = "selected" | "blocked" | "non_dispatchable";
5
+ export type FlowDeskTaskModelAvailabilityLabelV1 = "available" | "unavailable" | "unknown" | "non_dispatchable";
6
+ export type FlowDeskTaskModelFreshnessV1 = "fresh" | "stale" | "unknown";
7
+ export interface FlowDeskTaskModelSelectionV1 {
8
+ schema_version: typeof FLOWDESK_TASK_MODEL_SELECTION_SCHEMA_VERSION_V1;
9
+ workflow_id: OpaqueId;
10
+ task_id: OpaqueId;
11
+ selection_id: OpaqueId;
12
+ provider_family: ProviderFamily;
13
+ provider_qualified_model_id: string;
14
+ usage_snapshot_ref: OpaqueRef;
15
+ usage_snapshot_freshness: FlowDeskTaskModelFreshnessV1;
16
+ provider_health_ref: OpaqueRef;
17
+ provider_health_label: "ok" | "warning" | "critical" | "exhausted" | "unknown";
18
+ exact_model_availability_ref: OpaqueRef;
19
+ exact_model_availability_label: FlowDeskTaskModelAvailabilityLabelV1;
20
+ fit_label: string;
21
+ performance_label: string;
22
+ selection_status: FlowDeskTaskModelSelectionStatusV1;
23
+ blocked_labels: string[];
24
+ fallback_allowed: false;
25
+ reselection_allowed: false;
26
+ created_at: string;
27
+ release_gate: "release1_planning_only";
28
+ dispatch_authority_enabled: false;
29
+ provider_call_made: false;
30
+ runtime_execution: false;
31
+ actual_lane_launch: false;
32
+ write_authority_enabled: false;
33
+ redaction_version: "v1";
34
+ }
35
+ export declare function validateFlowDeskTaskModelSelectionV1(value: unknown): ValidationResult;
36
+ //# sourceMappingURL=task-model-selection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-model-selection.d.ts","sourceRoot":"","sources":["../src/task-model-selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAMN,KAAK,gBAAgB,EAUrB,MAAM,+BAA+B,CAAC;AAGvC,eAAO,MAAM,+CAA+C,EAAG,kCAA2C,CAAC;AAE3G,MAAM,MAAM,kCAAkC,GAAG,UAAU,GAAG,SAAS,GAAG,kBAAkB,CAAC;AAC7F,MAAM,MAAM,oCAAoC,GAAG,WAAW,GAAG,aAAa,GAAG,SAAS,GAAG,kBAAkB,CAAC;AAChH,MAAM,MAAM,4BAA4B,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;AAEzE,MAAM,WAAW,4BAA4B;IAC5C,cAAc,EAAE,OAAO,+CAA+C,CAAC;IACvE,WAAW,EAAE,QAAQ,CAAC;IACtB,OAAO,EAAE,QAAQ,CAAC;IAClB,YAAY,EAAE,QAAQ,CAAC;IACvB,eAAe,EAAE,cAAc,CAAC;IAChC,2BAA2B,EAAE,MAAM,CAAC;IACpC,kBAAkB,EAAE,SAAS,CAAC;IAC9B,wBAAwB,EAAE,4BAA4B,CAAC;IACvD,mBAAmB,EAAE,SAAS,CAAC;IAC/B,qBAAqB,EAAE,IAAI,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;IAC/E,4BAA4B,EAAE,SAAS,CAAC;IACxC,8BAA8B,EAAE,oCAAoC,CAAC;IACrE,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,kCAAkC,CAAC;IACrD,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,gBAAgB,EAAE,KAAK,CAAC;IACxB,mBAAmB,EAAE,KAAK,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,wBAAwB,CAAC;IACvC,0BAA0B,EAAE,KAAK,CAAC;IAClC,kBAAkB,EAAE,KAAK,CAAC;IAC1B,iBAAiB,EAAE,KAAK,CAAC;IACzB,kBAAkB,EAAE,KAAK,CAAC;IAC1B,uBAAuB,EAAE,KAAK,CAAC;IAC/B,iBAAiB,EAAE,IAAI,CAAC;CACxB;AAyDD,wBAAgB,oCAAoC,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CA+BrF"}
@@ -0,0 +1,99 @@
1
+ import { FLOWDESK_PLANNING_AUTHORITY_KEYS_V1, invalid, isPlanningEvidenceRecord, rejectUnknownPlanningProperties, requirePlanningKeys, valid, validatePlanningAuthorityFalse, validatePlanningNoForbiddenPayloads, validatePlanningOpaqueId, validatePlanningOpaqueRef, validatePlanningSafeLabelArray, validatePlanningSafeText, validatePlanningTimestamp, } from "./planning-evidence-common.js";
2
+ import { validateConcreteProviderQualifiedModelId, validateProviderFamily } from "./validators.js";
3
+ export const FLOWDESK_TASK_MODEL_SELECTION_SCHEMA_VERSION_V1 = "flowdesk.task_model_selection.v1";
4
+ const ALLOWED_KEYS = new Set([
5
+ "schema_version",
6
+ "workflow_id",
7
+ "task_id",
8
+ "selection_id",
9
+ "provider_family",
10
+ "provider_qualified_model_id",
11
+ "usage_snapshot_ref",
12
+ "usage_snapshot_freshness",
13
+ "provider_health_ref",
14
+ "provider_health_label",
15
+ "exact_model_availability_ref",
16
+ "exact_model_availability_label",
17
+ "fit_label",
18
+ "performance_label",
19
+ "selection_status",
20
+ "blocked_labels",
21
+ "fallback_allowed",
22
+ "reselection_allowed",
23
+ "created_at",
24
+ "release_gate",
25
+ ...FLOWDESK_PLANNING_AUTHORITY_KEYS_V1,
26
+ "redaction_version",
27
+ ]);
28
+ const REQUIRED_KEYS = [
29
+ "schema_version",
30
+ "workflow_id",
31
+ "task_id",
32
+ "selection_id",
33
+ "provider_family",
34
+ "provider_qualified_model_id",
35
+ "usage_snapshot_ref",
36
+ "usage_snapshot_freshness",
37
+ "provider_health_ref",
38
+ "provider_health_label",
39
+ "exact_model_availability_ref",
40
+ "exact_model_availability_label",
41
+ "fit_label",
42
+ "performance_label",
43
+ "selection_status",
44
+ "blocked_labels",
45
+ "fallback_allowed",
46
+ "reselection_allowed",
47
+ "created_at",
48
+ "release_gate",
49
+ ...FLOWDESK_PLANNING_AUTHORITY_KEYS_V1,
50
+ "redaction_version",
51
+ ];
52
+ const FRESHNESS = new Set(["fresh", "stale", "unknown"]);
53
+ const HEALTH = new Set(["ok", "warning", "critical", "exhausted", "unknown"]);
54
+ const AVAILABILITY = new Set(["available", "unavailable", "unknown", "non_dispatchable"]);
55
+ const STATUSES = new Set(["selected", "blocked", "non_dispatchable"]);
56
+ export function validateFlowDeskTaskModelSelectionV1(value) {
57
+ if (!isPlanningEvidenceRecord(value))
58
+ return invalid("task model selection must be an object");
59
+ const errors = [];
60
+ errors.push(...rejectUnknownPlanningProperties(value, ALLOWED_KEYS, "task model selection"));
61
+ errors.push(...requirePlanningKeys(value, REQUIRED_KEYS, "task model selection"));
62
+ if (value.schema_version !== FLOWDESK_TASK_MODEL_SELECTION_SCHEMA_VERSION_V1)
63
+ errors.push(`schema_version must be ${FLOWDESK_TASK_MODEL_SELECTION_SCHEMA_VERSION_V1}`);
64
+ errors.push(...validatePlanningOpaqueId(value.workflow_id, "workflow_id").errors);
65
+ errors.push(...validatePlanningOpaqueId(value.task_id, "task_id").errors);
66
+ errors.push(...validatePlanningOpaqueId(value.selection_id, "selection_id").errors);
67
+ errors.push(...validateProviderFamily(value.provider_family).errors);
68
+ errors.push(...validateConcreteProviderQualifiedModelId(value.provider_qualified_model_id, "provider_qualified_model_id").errors);
69
+ if (typeof value.provider_family === "string" && typeof value.provider_qualified_model_id === "string" && !value.provider_qualified_model_id.startsWith(`${value.provider_family}/`))
70
+ errors.push("provider_qualified_model_id must match provider_family");
71
+ errors.push(...validatePlanningOpaqueRef(value.usage_snapshot_ref, "usage_snapshot_ref").errors);
72
+ if (!FRESHNESS.has(value.usage_snapshot_freshness))
73
+ errors.push("usage_snapshot_freshness is invalid");
74
+ errors.push(...validatePlanningOpaqueRef(value.provider_health_ref, "provider_health_ref").errors);
75
+ if (!HEALTH.has(value.provider_health_label))
76
+ errors.push("provider_health_label is invalid");
77
+ errors.push(...validatePlanningOpaqueRef(value.exact_model_availability_ref, "exact_model_availability_ref").errors);
78
+ if (!AVAILABILITY.has(value.exact_model_availability_label))
79
+ errors.push("exact_model_availability_label is invalid");
80
+ errors.push(...validatePlanningSafeText(value.fit_label, "fit_label", 120).errors);
81
+ errors.push(...validatePlanningSafeText(value.performance_label, "performance_label", 120).errors);
82
+ if (!STATUSES.has(value.selection_status))
83
+ errors.push("selection_status is invalid");
84
+ errors.push(...validatePlanningSafeLabelArray(value.blocked_labels, "blocked_labels", 16).errors);
85
+ if (value.fallback_allowed !== false)
86
+ errors.push("fallback_allowed must be false");
87
+ if (value.reselection_allowed !== false)
88
+ errors.push("reselection_allowed must be false");
89
+ if (value.provider_family === "gemini" && value.exact_model_availability_label === "non_dispatchable" && value.selection_status !== "blocked" && value.selection_status !== "non_dispatchable")
90
+ errors.push("non-dispatchable Gemini must be represented as blocked or non_dispatchable");
91
+ errors.push(...validatePlanningTimestamp(value.created_at, "created_at").errors);
92
+ if (value.release_gate !== "release1_planning_only")
93
+ errors.push("release_gate must be release1_planning_only");
94
+ if (value.redaction_version !== "v1")
95
+ errors.push("redaction_version must be v1");
96
+ errors.push(...validatePlanningAuthorityFalse(value, "task_model_selection"));
97
+ errors.push(...validatePlanningNoForbiddenPayloads(value, "task_model_selection").errors);
98
+ return errors.length === 0 ? valid() : invalid(...errors);
99
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-model-selection.js","sourceRoot":"","sources":["../src/task-model-selection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { type ValidationResult } from "./validators.js";
2
+ export interface FlowDeskTaskResultV1 {
3
+ schema_version: "flowdesk.task_result.v1";
4
+ workflow_id: string;
5
+ lane_id: string;
6
+ task_id: string;
7
+ agent_ref: string;
8
+ provider_qualified_model_id: string;
9
+ task_prompt_sha256: string;
10
+ result_text: string;
11
+ result_text_truncated: boolean;
12
+ result_text_sha256: string;
13
+ created_at: string;
14
+ dispatch_authority_enabled: false;
15
+ }
16
+ export interface FlowDeskTaskFailedV1 {
17
+ schema_version: "flowdesk.task_failed.v1";
18
+ workflow_id: string;
19
+ lane_id: string;
20
+ task_id: string;
21
+ agent_ref: string;
22
+ provider_qualified_model_id: string;
23
+ failure_category: "sdk_create_failed" | "sdk_prompt_timeout" | "no_response" | "response_too_large" | "unknown";
24
+ redacted_reason: string;
25
+ created_at: string;
26
+ dispatch_authority_enabled: false;
27
+ }
28
+ export declare const VALID_TASK_FAILURE_CATEGORIES: Set<string>;
29
+ export declare function validateFlowDeskTaskResultV1(value: unknown): ValidationResult;
30
+ export declare function validateFlowDeskTaskFailedV1(value: unknown): ValidationResult;
31
+ //# sourceMappingURL=task-result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-result.d.ts","sourceRoot":"","sources":["../src/task-result.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,gBAAgB,EAIrB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,oBAAoB;IACpC,cAAc,EAAE,yBAAyB,CAAC;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B,EAAE,MAAM,CAAC;IACpC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B,EAAE,KAAK,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACpC,cAAc,EAAE,yBAAyB,CAAC;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B,EAAE,MAAM,CAAC;IACpC,gBAAgB,EACb,mBAAmB,GACnB,oBAAoB,GACpB,aAAa,GACb,oBAAoB,GACpB,SAAS,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B,EAAE,KAAK,CAAC;CAClC;AAED,eAAO,MAAM,6BAA6B,aAMxC,CAAC;AAwCH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAsC7E;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CA+B7E"}
@@ -0,0 +1,115 @@
1
+ import { invalid, valid, validateNoForbiddenRawPayloads, validateOpaqueId, } from "./validators.js";
2
+ export const VALID_TASK_FAILURE_CATEGORIES = new Set([
3
+ "sdk_create_failed",
4
+ "sdk_prompt_timeout",
5
+ "no_response",
6
+ "response_too_large",
7
+ "unknown",
8
+ ]);
9
+ const TASK_RESULT_MAX_TEXT = 32_768;
10
+ // ---------------------------------------------------------------------------
11
+ // Local helpers
12
+ // ---------------------------------------------------------------------------
13
+ function isRecord(value) {
14
+ return typeof value === "object" && value !== null && !Array.isArray(value);
15
+ }
16
+ function timestamp(value, label) {
17
+ return typeof value === "string" && Number.isFinite(Date.parse(value))
18
+ ? valid()
19
+ : invalid(`${label} must be a parseable timestamp`);
20
+ }
21
+ function exactString(value, expected, label) {
22
+ return value === expected ? valid() : invalid(`${label} must be ${expected}`);
23
+ }
24
+ function nonEmptyString(value, label) {
25
+ return typeof value === "string" && value.trim().length > 0
26
+ ? valid()
27
+ : invalid(`${label} must be a non-empty string`);
28
+ }
29
+ function idStartsWith(value, prefix, label) {
30
+ if (typeof value !== "string" || value.trim().length === 0)
31
+ return invalid(`${label} must be a non-empty string`);
32
+ return value.startsWith(prefix)
33
+ ? valid()
34
+ : invalid(`${label} must start with "${prefix}"`);
35
+ }
36
+ // ---------------------------------------------------------------------------
37
+ // Validators
38
+ // ---------------------------------------------------------------------------
39
+ export function validateFlowDeskTaskResultV1(value) {
40
+ if (!isRecord(value))
41
+ return invalid("task result must be an object");
42
+ const record = value;
43
+ const errors = [];
44
+ const allowed = new Set([
45
+ "schema_version",
46
+ "workflow_id",
47
+ "lane_id",
48
+ "task_id",
49
+ "agent_ref",
50
+ "provider_qualified_model_id",
51
+ "task_prompt_sha256",
52
+ "result_text",
53
+ "result_text_truncated",
54
+ "result_text_sha256",
55
+ "created_at",
56
+ "dispatch_authority_enabled",
57
+ ]);
58
+ for (const key of Object.keys(record))
59
+ if (!allowed.has(key))
60
+ errors.push(`unknown property: ${key}`);
61
+ errors.push(...exactString(record.schema_version, "flowdesk.task_result.v1", "schema_version").errors);
62
+ errors.push(...validateOpaqueId(record.workflow_id, "workflow_id").errors);
63
+ errors.push(...validateOpaqueId(record.lane_id, "lane_id").errors);
64
+ errors.push(...idStartsWith(record.task_id, "task-", "task_id").errors);
65
+ errors.push(...nonEmptyString(record.agent_ref, "agent_ref").errors);
66
+ errors.push(...nonEmptyString(record.provider_qualified_model_id, "provider_qualified_model_id").errors);
67
+ errors.push(...nonEmptyString(record.task_prompt_sha256, "task_prompt_sha256").errors);
68
+ if (typeof record.result_text !== "string")
69
+ errors.push("result_text must be a string");
70
+ else if (record.result_text.length > TASK_RESULT_MAX_TEXT)
71
+ errors.push(`result_text exceeds ${TASK_RESULT_MAX_TEXT} chars`);
72
+ if (typeof record.result_text_truncated !== "boolean")
73
+ errors.push("result_text_truncated must be a boolean");
74
+ errors.push(...nonEmptyString(record.result_text_sha256, "result_text_sha256").errors);
75
+ errors.push(...timestamp(record.created_at, "created_at").errors);
76
+ if (record.dispatch_authority_enabled !== false)
77
+ errors.push("task result cannot enable dispatch authority");
78
+ errors.push(...validateNoForbiddenRawPayloads(record, "task_result").errors);
79
+ return errors.length === 0 ? valid() : invalid(...errors);
80
+ }
81
+ export function validateFlowDeskTaskFailedV1(value) {
82
+ if (!isRecord(value))
83
+ return invalid("task failed record must be an object");
84
+ const record = value;
85
+ const errors = [];
86
+ const allowed = new Set([
87
+ "schema_version",
88
+ "workflow_id",
89
+ "lane_id",
90
+ "task_id",
91
+ "agent_ref",
92
+ "provider_qualified_model_id",
93
+ "failure_category",
94
+ "redacted_reason",
95
+ "created_at",
96
+ "dispatch_authority_enabled",
97
+ ]);
98
+ for (const key of Object.keys(record))
99
+ if (!allowed.has(key))
100
+ errors.push(`unknown property: ${key}`);
101
+ errors.push(...exactString(record.schema_version, "flowdesk.task_failed.v1", "schema_version").errors);
102
+ errors.push(...validateOpaqueId(record.workflow_id, "workflow_id").errors);
103
+ errors.push(...validateOpaqueId(record.lane_id, "lane_id").errors);
104
+ errors.push(...idStartsWith(record.task_id, "task-", "task_id").errors);
105
+ errors.push(...nonEmptyString(record.agent_ref, "agent_ref").errors);
106
+ errors.push(...nonEmptyString(record.provider_qualified_model_id, "provider_qualified_model_id").errors);
107
+ if (!VALID_TASK_FAILURE_CATEGORIES.has(record.failure_category ?? ""))
108
+ errors.push("failure_category is invalid");
109
+ errors.push(...nonEmptyString(record.redacted_reason, "redacted_reason").errors);
110
+ errors.push(...timestamp(record.created_at, "created_at").errors);
111
+ if (record.dispatch_authority_enabled !== false)
112
+ errors.push("task failed record cannot enable dispatch authority");
113
+ errors.push(...validateNoForbiddenRawPayloads(record, "task_failed").errors);
114
+ return errors.length === 0 ? valid() : invalid(...errors);
115
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-result.js","sourceRoot":"","sources":["../src/task-result.ts"],"names":[],"mappings":"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"}
@@ -386,4 +386,3 @@ export function validateFlowDeskFds1UnsupportedControlStubsComplete(stubs = FLOW
386
386
  ...stubs.map((stub) => validateFlowDeskFds1UnsupportedControlStub(stub))
387
387
  ]);
388
388
  }
389
- //# sourceMappingURL=tool-contract-fixtures.js.map
@@ -73,4 +73,3 @@ export function evaluateFlowDeskTopTierReviewerLaneProbeV1(request, context = {}
73
73
  evidenceRefs: Object.values(evidenceMap)
74
74
  });
75
75
  }
76
- //# sourceMappingURL=top-tier-reviewer-lane-probe.js.map
@@ -102,4 +102,3 @@ export function rejectMergedUsageProviderAuthorityV1(value) {
102
102
  };
103
103
  return visit(value) ? invalid("usage and provider health must not be merged into one authority object") : valid();
104
104
  }
105
- //# sourceMappingURL=usage-health.js.map