@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.
- package/dist/agent-profiles.js +0 -1
- package/dist/agent-registry.d.ts +43 -0
- package/dist/agent-registry.d.ts.map +1 -0
- package/dist/agent-registry.js +309 -0
- package/dist/agent-registry.js.map +1 -0
- package/dist/audit.js +0 -1
- package/dist/authority-promotion.js +0 -1
- package/dist/bootstrap-foundation.js +0 -1
- package/dist/chat-control-authority.js +0 -1
- package/dist/chat-hook-authority-probe.js +0 -1
- package/dist/chat-routing.d.ts.map +1 -1
- package/dist/chat-routing.js +17 -9
- package/dist/chat-routing.js.map +1 -1
- package/dist/command-manifest.js +0 -1
- package/dist/config-policy.js +0 -1
- package/dist/connector-gateway.js +0 -1
- package/dist/connector-profile.js +0 -1
- package/dist/controlled-conformance-doc-write.js +0 -1
- package/dist/controlled-redacted-audit-export-write.js +0 -1
- package/dist/controlled-workspace-file-write.d.ts +36 -0
- package/dist/controlled-workspace-file-write.d.ts.map +1 -0
- package/dist/controlled-workspace-file-write.js +130 -0
- package/dist/controlled-workspace-file-write.js.map +1 -0
- package/dist/core-completion-safety-contracts.js +0 -1
- package/dist/dispatch-attempt-manifest.js +0 -1
- package/dist/dispatch-idempotency.js +0 -1
- package/dist/external-auth-policy.js +0 -1
- package/dist/fake-remote-connector-adapter.js +0 -1
- package/dist/fake-runtime.js +0 -1
- package/dist/fallback-decision.js +0 -1
- package/dist/fallback-regate-plan.js +0 -1
- package/dist/fds1-schema-probe-result.js +0 -1
- package/dist/guard-boundary.js +0 -1
- package/dist/guarded-dry-run.js +0 -1
- package/dist/hook-harness.js +0 -1
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/lane-heartbeat.js +0 -1
- package/dist/lane-lifecycle-record.d.ts +2 -0
- package/dist/lane-lifecycle-record.d.ts.map +1 -1
- package/dist/lane-lifecycle-record.js +6 -1
- package/dist/lane-lifecycle-record.js.map +1 -1
- package/dist/lane-observability.js +0 -1
- package/dist/lane-stall-projection.d.ts.map +1 -1
- package/dist/lane-stall-projection.js +55 -15
- package/dist/lane-stall-projection.js.map +1 -1
- package/dist/managed-dispatch-evidence-shape.js +0 -1
- package/dist/model-availability-cache.js +1 -2
- package/dist/model-availability-cache.js.map +1 -1
- package/dist/operational-intelligence.js +0 -1
- package/dist/pending-abort.d.ts +26 -0
- package/dist/pending-abort.d.ts.map +1 -0
- package/dist/pending-abort.js +78 -0
- package/dist/pending-abort.js.map +1 -0
- package/dist/plan.js +0 -1
- package/dist/planning-evidence-common.d.ts +18 -0
- package/dist/planning-evidence-common.d.ts.map +1 -0
- package/dist/planning-evidence-common.js +95 -0
- package/dist/planning-evidence-common.js.map +1 -0
- package/dist/pre-dispatch-audit-record.js +0 -1
- package/dist/production-approval-source.js +0 -1
- package/dist/production-enablement.js +0 -1
- package/dist/production-verification.js +0 -1
- package/dist/provider-failures.js +0 -1
- package/dist/provider-usage-collector.d.ts.map +1 -1
- package/dist/provider-usage-collector.js +104 -10
- package/dist/provider-usage-collector.js.map +1 -1
- package/dist/redaction.js +0 -1
- package/dist/release1-contracts.d.ts +1 -0
- package/dist/release1-contracts.d.ts.map +1 -1
- package/dist/release1-contracts.js +0 -1
- package/dist/release1-contracts.js.map +1 -1
- package/dist/remote-write-connector-gate.js +0 -1
- package/dist/retry-plan.d.ts +97 -0
- package/dist/retry-plan.d.ts.map +1 -0
- package/dist/retry-plan.js +265 -0
- package/dist/retry-plan.js.map +1 -0
- package/dist/retry.js +0 -1
- package/dist/reviewer-lane-conformance.js +0 -1
- package/dist/runtime-lane-productization.d.ts +1 -1
- package/dist/runtime-lane-productization.d.ts.map +1 -1
- package/dist/runtime-lane-productization.js +1 -1
- package/dist/runtime-lane-productization.js.map +1 -1
- package/dist/sanitized-auth-capture.js +0 -1
- package/dist/schema-artifacts.d.ts.map +1 -1
- package/dist/schema-artifacts.js +2 -2
- package/dist/schema-artifacts.js.map +1 -1
- package/dist/schema-registry.d.ts.map +1 -1
- package/dist/schema-registry.js +5 -1
- package/dist/schema-registry.js.map +1 -1
- package/dist/session-evidence.d.ts.map +1 -1
- package/dist/session-evidence.js +58 -0
- package/dist/session-evidence.js.map +1 -1
- package/dist/state-paths.d.ts +1 -1
- package/dist/state-paths.d.ts.map +1 -1
- package/dist/state-paths.js +32 -0
- package/dist/state-paths.js.map +1 -1
- package/dist/state-store.js +0 -1
- package/dist/status.js +0 -1
- package/dist/task-agent-assignment.d.ts +30 -0
- package/dist/task-agent-assignment.d.ts.map +1 -0
- package/dist/task-agent-assignment.js +77 -0
- package/dist/task-agent-assignment.js.map +1 -0
- package/dist/task-graph.d.ts +31 -0
- package/dist/task-graph.d.ts.map +1 -0
- package/dist/task-graph.js +122 -0
- package/dist/task-graph.js.map +1 -0
- package/dist/task-model-selection.d.ts +36 -0
- package/dist/task-model-selection.d.ts.map +1 -0
- package/dist/task-model-selection.js +99 -0
- package/dist/task-model-selection.js.map +1 -0
- package/dist/task-result.d.ts +31 -0
- package/dist/task-result.d.ts.map +1 -0
- package/dist/task-result.js +115 -0
- package/dist/task-result.js.map +1 -0
- package/dist/tool-contract-fixtures.js +0 -1
- package/dist/top-tier-reviewer-lane-probe.js +0 -1
- package/dist/usage-health.js +0 -1
- package/dist/validators.d.ts.map +1 -1
- package/dist/validators.js +10 -2
- package/dist/validators.js.map +1 -1
- package/dist/workflow-authoring-result.d.ts +25 -0
- package/dist/workflow-authoring-result.d.ts.map +1 -0
- package/dist/workflow-authoring-result.js +63 -0
- package/dist/workflow-authoring-result.js.map +1 -0
- package/dist/workflow-dispatch-plan.d.ts +65 -0
- package/dist/workflow-dispatch-plan.d.ts.map +1 -0
- package/dist/workflow-dispatch-plan.js +228 -0
- package/dist/workflow-dispatch-plan.js.map +1 -0
- package/dist/workflow-synthesis.d.ts +18 -0
- package/dist/workflow-synthesis.d.ts.map +1 -0
- package/dist/workflow-synthesis.js +40 -0
- package/dist/workflow-synthesis.js.map +1 -0
- 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":"AACA,OAAO,EAAE,0CAA0C,EAAE,MAAM,qBAAqB,CAAC;AAEjF,OAAO,EACN,mCAAmC,EACnC,OAAO,EACP,wBAAwB,EACxB,+BAA+B,EAC/B,mBAAmB,EAEnB,KAAK,EACL,8BAA8B,EAC9B,mCAAmC,EACnC,wBAAwB,EACxB,yBAAyB,EACzB,8BAA8B,EAC9B,wBAAwB,EACxB,yBAAyB,GACzB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,CAAC,MAAM,gDAAgD,GAAG,mCAA4C,CAAC;AA4B7G,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC5B,gBAAgB;IAChB,aAAa;IACb,SAAS;IACT,eAAe;IACf,YAAY;IACZ,gBAAgB;IAChB,oBAAoB;IACpB,sBAAsB;IACtB,sBAAsB;IACtB,WAAW;IACX,uBAAuB;IACvB,sBAAsB;IACtB,gBAAgB;IAChB,YAAY;IACZ,cAAc;IACd,GAAG,mCAAmC;IACtC,mBAAmB;CACnB,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG;IACrB,gBAAgB;IAChB,aAAa;IACb,SAAS;IACT,eAAe;IACf,YAAY;IACZ,gBAAgB;IAChB,oBAAoB;IACpB,sBAAsB;IACtB,sBAAsB;IACtB,WAAW;IACX,uBAAuB;IACvB,sBAAsB;IACtB,gBAAgB;IAChB,YAAY;IACZ,cAAc;IACd,GAAG,mCAAmC;IACtC,mBAAmB;CACV,CAAC;AAEX,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAyC;IAC9E,YAAY;IACZ,SAAS;IACT,SAAS;CACT,CAAC,CAAC;AAEH,MAAM,UAAU,qCAAqC,CAAC,KAAc;IACnE,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,yCAAyC,CAAC,CAAC;IAChG,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,CAAC,IAAI,CAAC,GAAG,+BAA+B,CAAC,KAAK,EAAE,YAAY,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAC9F,MAAM,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,KAAK,EAAE,aAAa,EAAE,uBAAuB,CAAC,CAAC,CAAC;IACnF,IAAI,KAAK,CAAC,cAAc,KAAK,gDAAgD;QAAE,MAAM,CAAC,IAAI,CAAC,0BAA0B,gDAAgD,EAAE,CAAC,CAAC;IACzK,MAAM,CAAC,IAAI,CAAC,GAAG,wBAAwB,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;IAClF,MAAM,CAAC,IAAI,CAAC,GAAG,wBAAwB,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;IAC1E,MAAM,CAAC,IAAI,CAAC,GAAG,wBAAwB,CAAC,KAAK,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;IACtF,IAAI,CAAC,0CAA0C,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAiD,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACxJ,MAAM,CAAC,IAAI,CAAC,GAAG,yBAAyB,CAAC,KAAK,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;IACzF,MAAM,CAAC,IAAI,CAAC,GAAG,yBAAyB,CAAC,KAAK,CAAC,kBAAkB,EAAE,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;IACjG,MAAM,CAAC,IAAI,CAAC,GAAG,yBAAyB,CAAC,KAAK,CAAC,oBAAoB,EAAE,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;IACrG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,oBAA8D,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IACtJ,MAAM,CAAC,IAAI,CAAC,GAAG,wBAAwB,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IACnF,MAAM,CAAC,IAAI,CAAC,GAAG,yBAAyB,CAAC,KAAK,CAAC,qBAAqB,EAAE,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;IACvG,MAAM,CAAC,IAAI,CAAC,GAAG,yBAAyB,CAAC,KAAK,CAAC,oBAAoB,EAAE,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;IACrG,MAAM,CAAC,IAAI,CAAC,GAAG,8BAA8B,CAAC,KAAK,CAAC,cAAc,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IAClG,MAAM,CAAC,IAAI,CAAC,GAAG,yBAAyB,CAAC,KAAK,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;IACjF,IAAI,KAAK,CAAC,YAAY,KAAK,wBAAwB;QAAE,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAChH,IAAI,KAAK,CAAC,iBAAiB,KAAK,IAAI;QAAE,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAClF,MAAM,CAAC,IAAI,CAAC,GAAG,8BAA8B,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAC/E,MAAM,CAAC,IAAI,CAAC,GAAG,mCAAmC,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;IAC3F,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -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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"}
|
package/dist/usage-health.js
CHANGED