@flowdesk/core 0.1.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.
Files changed (121) hide show
  1. package/dist/agent-profiles.d.ts +38 -0
  2. package/dist/agent-profiles.d.ts.map +1 -0
  3. package/dist/agent-profiles.js +138 -0
  4. package/dist/agent-profiles.js.map +1 -0
  5. package/dist/audit.d.ts +11 -0
  6. package/dist/audit.d.ts.map +1 -0
  7. package/dist/audit.js +65 -0
  8. package/dist/audit.js.map +1 -0
  9. package/dist/bootstrap-foundation.d.ts +83 -0
  10. package/dist/bootstrap-foundation.d.ts.map +1 -0
  11. package/dist/bootstrap-foundation.js +773 -0
  12. package/dist/bootstrap-foundation.js.map +1 -0
  13. package/dist/chat-routing.d.ts +15 -0
  14. package/dist/chat-routing.d.ts.map +1 -0
  15. package/dist/chat-routing.js +172 -0
  16. package/dist/chat-routing.js.map +1 -0
  17. package/dist/command-manifest.d.ts +39 -0
  18. package/dist/command-manifest.d.ts.map +1 -0
  19. package/dist/command-manifest.js +240 -0
  20. package/dist/command-manifest.js.map +1 -0
  21. package/dist/config-policy.d.ts +31 -0
  22. package/dist/config-policy.d.ts.map +1 -0
  23. package/dist/config-policy.js +341 -0
  24. package/dist/config-policy.js.map +1 -0
  25. package/dist/fake-runtime.d.ts +68 -0
  26. package/dist/fake-runtime.d.ts.map +1 -0
  27. package/dist/fake-runtime.js +285 -0
  28. package/dist/fake-runtime.js.map +1 -0
  29. package/dist/guard-boundary.d.ts +53 -0
  30. package/dist/guard-boundary.d.ts.map +1 -0
  31. package/dist/guard-boundary.js +220 -0
  32. package/dist/guard-boundary.js.map +1 -0
  33. package/dist/guarded-dry-run.d.ts +46 -0
  34. package/dist/guarded-dry-run.d.ts.map +1 -0
  35. package/dist/guarded-dry-run.js +111 -0
  36. package/dist/guarded-dry-run.js.map +1 -0
  37. package/dist/hook-harness.d.ts +8 -0
  38. package/dist/hook-harness.d.ts.map +1 -0
  39. package/dist/hook-harness.js +130 -0
  40. package/dist/hook-harness.js.map +1 -0
  41. package/dist/index.d.ts +41 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +51 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/lane-observability.d.ts +22 -0
  46. package/dist/lane-observability.d.ts.map +1 -0
  47. package/dist/lane-observability.js +138 -0
  48. package/dist/lane-observability.js.map +1 -0
  49. package/dist/plan.d.ts +37 -0
  50. package/dist/plan.d.ts.map +1 -0
  51. package/dist/plan.js +137 -0
  52. package/dist/plan.js.map +1 -0
  53. package/dist/production-enablement.d.ts +57 -0
  54. package/dist/production-enablement.d.ts.map +1 -0
  55. package/dist/production-enablement.js +259 -0
  56. package/dist/production-enablement.js.map +1 -0
  57. package/dist/provider-failures.d.ts +19 -0
  58. package/dist/provider-failures.d.ts.map +1 -0
  59. package/dist/provider-failures.js +116 -0
  60. package/dist/provider-failures.js.map +1 -0
  61. package/dist/provider-usage-collector.d.ts +60 -0
  62. package/dist/provider-usage-collector.d.ts.map +1 -0
  63. package/dist/provider-usage-collector.js +502 -0
  64. package/dist/provider-usage-collector.js.map +1 -0
  65. package/dist/redaction.d.ts +5 -0
  66. package/dist/redaction.d.ts.map +1 -0
  67. package/dist/redaction.js +11 -0
  68. package/dist/redaction.js.map +1 -0
  69. package/dist/release1-contracts.d.ts +1203 -0
  70. package/dist/release1-contracts.d.ts.map +1 -0
  71. package/dist/release1-contracts.js +256 -0
  72. package/dist/release1-contracts.js.map +1 -0
  73. package/dist/retry.d.ts +21 -0
  74. package/dist/retry.d.ts.map +1 -0
  75. package/dist/retry.js +107 -0
  76. package/dist/retry.js.map +1 -0
  77. package/dist/reviewer-lane-conformance.d.ts +35 -0
  78. package/dist/reviewer-lane-conformance.d.ts.map +1 -0
  79. package/dist/reviewer-lane-conformance.js +124 -0
  80. package/dist/reviewer-lane-conformance.js.map +1 -0
  81. package/dist/schema-artifacts.d.ts +19 -0
  82. package/dist/schema-artifacts.d.ts.map +1 -0
  83. package/dist/schema-artifacts.js +182 -0
  84. package/dist/schema-artifacts.js.map +1 -0
  85. package/dist/schema-registry.d.ts +32 -0
  86. package/dist/schema-registry.d.ts.map +1 -0
  87. package/dist/schema-registry.js +163 -0
  88. package/dist/schema-registry.js.map +1 -0
  89. package/dist/session-evidence.d.ts +71 -0
  90. package/dist/session-evidence.d.ts.map +1 -0
  91. package/dist/session-evidence.js +336 -0
  92. package/dist/session-evidence.js.map +1 -0
  93. package/dist/state-paths.d.ts +20 -0
  94. package/dist/state-paths.d.ts.map +1 -0
  95. package/dist/state-paths.js +72 -0
  96. package/dist/state-paths.js.map +1 -0
  97. package/dist/state-store.d.ts +75 -0
  98. package/dist/state-store.d.ts.map +1 -0
  99. package/dist/state-store.js +567 -0
  100. package/dist/state-store.js.map +1 -0
  101. package/dist/status.d.ts +37 -0
  102. package/dist/status.d.ts.map +1 -0
  103. package/dist/status.js +304 -0
  104. package/dist/status.js.map +1 -0
  105. package/dist/tool-contract-fixtures.d.ts +134 -0
  106. package/dist/tool-contract-fixtures.d.ts.map +1 -0
  107. package/dist/tool-contract-fixtures.js +389 -0
  108. package/dist/tool-contract-fixtures.js.map +1 -0
  109. package/dist/top-tier-reviewer-lane-probe.d.ts +10 -0
  110. package/dist/top-tier-reviewer-lane-probe.d.ts.map +1 -0
  111. package/dist/top-tier-reviewer-lane-probe.js +76 -0
  112. package/dist/top-tier-reviewer-lane-probe.js.map +1 -0
  113. package/dist/usage-health.d.ts +44 -0
  114. package/dist/usage-health.d.ts.map +1 -0
  115. package/dist/usage-health.js +105 -0
  116. package/dist/usage-health.js.map +1 -0
  117. package/dist/validators.d.ts +142 -0
  118. package/dist/validators.d.ts.map +1 -0
  119. package/dist/validators.js +1690 -0
  120. package/dist/validators.js.map +1 -0
  121. package/package.json +37 -0
@@ -0,0 +1,46 @@
1
+ import { type FlowDeskRelease1MinimumPortableCommandName } from "./command-manifest.js";
2
+ import { type GuardBoundaryDecisionV1, type GuardBoundaryInputV1 } from "./guard-boundary.js";
3
+ import type { FlowDeskAuditRecordV1, FlowDeskRunRequestV1, FlowDeskRunResponseV1, IsoTimestamp, OpaqueId, OpaqueRef } from "./release1-contracts.js";
4
+ import type { FlowDeskStateWriteIntent } from "./state-store.js";
5
+ import { type ValidationResult } from "./validators.js";
6
+ export interface FlowDeskGuardedDryRunCommandInputV1 {
7
+ commandName: FlowDeskRelease1MinimumPortableCommandName;
8
+ request: FlowDeskRunRequestV1;
9
+ guardBoundary: Omit<GuardBoundaryInputV1, "operation" | "workflowId">;
10
+ sessionId: OpaqueId;
11
+ attemptId: OpaqueId;
12
+ auditEventId: OpaqueId;
13
+ nowIso: IsoTimestamp;
14
+ decisionRef: OpaqueRef;
15
+ routeRef: OpaqueRef;
16
+ commandShapeHash: string;
17
+ runResultRef: OpaqueRef;
18
+ verificationSummaryRef: OpaqueRef;
19
+ redactionVersion: string;
20
+ }
21
+ export interface FlowDeskGuardedDryRunPlanningEvidenceV1 {
22
+ plan_revision_id: OpaqueId;
23
+ route_ref: OpaqueRef;
24
+ guard_decision_ref: OpaqueRef;
25
+ command_shape_hash: string;
26
+ pre_run_audit_ref: OpaqueRef;
27
+ request_schema_id: "flowdesk.run.request.v1";
28
+ response_schema_id: "flowdesk.run.response.v1";
29
+ }
30
+ export interface FlowDeskGuardedDryRunCommandEvaluationV1 extends ValidationResult {
31
+ commandName: FlowDeskRelease1MinimumPortableCommandName;
32
+ guardDecision: GuardBoundaryDecisionV1;
33
+ response: FlowDeskRunResponseV1;
34
+ planningEvidence?: FlowDeskGuardedDryRunPlanningEvidenceV1;
35
+ preRunAuditIntent?: FlowDeskStateWriteIntent<FlowDeskAuditRecordV1>;
36
+ runtime: {
37
+ realOpenCodeDispatch: false;
38
+ actualLaneLaunch: false;
39
+ providerCall: false;
40
+ automaticFallbackOrReselection: false;
41
+ hardCancelOrNoReply: false;
42
+ stateWriteApplied: false;
43
+ };
44
+ }
45
+ export declare function evaluateFlowDeskGuardedDryRunCommandV1(input: FlowDeskGuardedDryRunCommandInputV1): FlowDeskGuardedDryRunCommandEvaluationV1;
46
+ //# sourceMappingURL=guarded-dry-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guarded-dry-run.d.ts","sourceRoot":"","sources":["../src/guarded-dry-run.ts"],"names":[],"mappings":"AACA,OAAO,EAAmC,KAAK,0CAA0C,EAAE,MAAM,uBAAuB,CAAC;AACzH,OAAO,EAA2B,KAAK,uBAAuB,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACvH,OAAO,KAAK,EAAwB,qBAAqB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAyC,MAAM,yBAAyB,CAAC;AAClN,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAiE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEvH,MAAM,WAAW,mCAAmC;IAClD,WAAW,EAAE,0CAA0C,CAAC;IACxD,OAAO,EAAE,oBAAoB,CAAC;IAC9B,aAAa,EAAE,IAAI,CAAC,oBAAoB,EAAE,WAAW,GAAG,YAAY,CAAC,CAAC;IACtE,SAAS,EAAE,QAAQ,CAAC;IACpB,SAAS,EAAE,QAAQ,CAAC;IACpB,YAAY,EAAE,QAAQ,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,WAAW,EAAE,SAAS,CAAC;IACvB,QAAQ,EAAE,SAAS,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,SAAS,CAAC;IACxB,sBAAsB,EAAE,SAAS,CAAC;IAClC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,uCAAuC;IACtD,gBAAgB,EAAE,QAAQ,CAAC;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,kBAAkB,EAAE,SAAS,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,SAAS,CAAC;IAC7B,iBAAiB,EAAE,yBAAyB,CAAC;IAC7C,kBAAkB,EAAE,0BAA0B,CAAC;CAChD;AAED,MAAM,WAAW,wCAAyC,SAAQ,gBAAgB;IAChF,WAAW,EAAE,0CAA0C,CAAC;IACxD,aAAa,EAAE,uBAAuB,CAAC;IACvC,QAAQ,EAAE,qBAAqB,CAAC;IAChC,gBAAgB,CAAC,EAAE,uCAAuC,CAAC;IAC3D,iBAAiB,CAAC,EAAE,wBAAwB,CAAC,qBAAqB,CAAC,CAAC;IACpE,OAAO,EAAE;QACP,oBAAoB,EAAE,KAAK,CAAC;QAC5B,gBAAgB,EAAE,KAAK,CAAC;QACxB,YAAY,EAAE,KAAK,CAAC;QACpB,8BAA8B,EAAE,KAAK,CAAC;QACtC,mBAAmB,EAAE,KAAK,CAAC;QAC3B,iBAAiB,EAAE,KAAK,CAAC;KAC1B,CAAC;CACH;AA2CD,wBAAgB,sCAAsC,CAAC,KAAK,EAAE,mCAAmC,GAAG,wCAAwC,CAgF3I"}
@@ -0,0 +1,111 @@
1
+ import { preparePreRunAuditWriteIntent } from "./audit.js";
2
+ import { getFlowDeskCommandManifestEntry } from "./command-manifest.js";
3
+ import { evaluateGuardBoundaryV1 } from "./guard-boundary.js";
4
+ import { validateOpaqueId, validateRunRequestV1, validateRunResponseV1 } from "./validators.js";
5
+ const inertRuntime = {
6
+ realOpenCodeDispatch: false,
7
+ actualLaneLaunch: false,
8
+ providerCall: false,
9
+ automaticFallbackOrReselection: false,
10
+ hardCancelOrNoReply: false,
11
+ stateWriteApplied: false
12
+ };
13
+ function resultErrors(...results) {
14
+ return results.flatMap((result) => result.errors);
15
+ }
16
+ function redactedError(category, safeRemediation) {
17
+ return { category, safe_remediation: safeRemediation };
18
+ }
19
+ function responseFor(input, ok, status, userMessage, safeNextActions, error) {
20
+ return {
21
+ schema_version: "flowdesk.run.response.v1",
22
+ ok,
23
+ status,
24
+ safe_next_actions: safeNextActions,
25
+ user_message: userMessage,
26
+ ...(error === undefined ? {} : { error }),
27
+ run_result_ref: input.runResultRef,
28
+ verification_summary_ref: input.verificationSummaryRef,
29
+ artifact_disposition: "none"
30
+ };
31
+ }
32
+ function blockedDecision(category, reason) {
33
+ return {
34
+ status: "blocked",
35
+ reason_category: category,
36
+ redacted_reason: reason,
37
+ required_checks: [],
38
+ safe_next_actions: ["/flowdesk-doctor", "/flowdesk-status"]
39
+ };
40
+ }
41
+ export function evaluateFlowDeskGuardedDryRunCommandV1(input) {
42
+ const manifestEntry = getFlowDeskCommandManifestEntry(input.commandName);
43
+ const requestResult = validateRunRequestV1(input.request);
44
+ const idErrors = resultErrors(validateOpaqueId(input.sessionId, "session_id"), validateOpaqueId(input.attemptId, "attempt_id"), validateOpaqueId(input.auditEventId, "audit_event_id"), validateOpaqueId(input.decisionRef, "decision_ref"), validateOpaqueId(input.routeRef, "route_ref"), validateOpaqueId(input.commandShapeHash, "command_shape_hash"), validateOpaqueId(input.runResultRef, "run_result_ref"), validateOpaqueId(input.verificationSummaryRef, "verification_summary_ref"));
45
+ const baseErrors = [...requestResult.errors, ...idErrors];
46
+ if (manifestEntry === undefined || input.commandName !== "/flowdesk-run" || manifestEntry.toolName !== "flowdesk_run")
47
+ baseErrors.push("guarded dry-run evaluator only accepts the /flowdesk-run command");
48
+ if (manifestEntry !== undefined && (manifestEntry.actualLaneLaunch || manifestEntry.providerCall || manifestEntry.dispatchApprovalEligible || manifestEntry.fallbackAuthority || manifestEntry.hardCancelOrNoReplyAuthority))
49
+ baseErrors.push("command manifest is not inert for Release 1 dry-run evaluation");
50
+ if (input.request.run_mode !== "guarded-dry-run")
51
+ baseErrors.push("guarded dry-run evaluator requires run_mode guarded-dry-run");
52
+ if (input.request.workflow_id === undefined)
53
+ baseErrors.push("guarded dry-run evaluator requires workflow_id for guard binding");
54
+ if (baseErrors.length > 0) {
55
+ const guardDecision = blockedDecision("schema", "Run command request failed closed before Guard evaluation.");
56
+ const response = responseFor(input, false, "blocked", "FlowDesk blocked this dry-run before execution planning.", ["/flowdesk-doctor", "/flowdesk-status"], redactedError("schema", "Run doctor or status, then retry with a schema-valid guarded dry-run request."));
57
+ const responseResult = validateRunResponseV1(response);
58
+ return { ok: false, errors: [...baseErrors, ...responseResult.errors], commandName: input.commandName, guardDecision, response, runtime: inertRuntime };
59
+ }
60
+ const guardDecision = evaluateGuardBoundaryV1({ ...input.guardBoundary, operation: "guarded-dry-run", workflowId: input.request.workflow_id });
61
+ if (guardDecision.status !== "eligible") {
62
+ const response = responseFor(input, false, "blocked", guardDecision.redacted_reason, [...guardDecision.safe_next_actions], redactedError(guardDecision.reason_category, "Use FlowDesk doctor or status to refresh the missing non-dispatch evidence."));
63
+ const responseResult = validateRunResponseV1(response);
64
+ return { ok: false, errors: responseResult.errors, commandName: input.commandName, guardDecision, response, runtime: inertRuntime };
65
+ }
66
+ const auditEvent = {
67
+ schema_version: "flowdesk.audit_event.v1",
68
+ event_id: input.auditEventId,
69
+ event_type: "pre_run_guarded_dry_run",
70
+ workflow_id: input.request.workflow_id,
71
+ attempt_id: input.attemptId,
72
+ ...(input.request.step_id === undefined ? {} : { step_id: input.request.step_id }),
73
+ created_at: input.nowIso,
74
+ actor_class: "flowdesk",
75
+ decision_ref: input.decisionRef,
76
+ redaction_version: input.redactionVersion,
77
+ summary_label: "Guarded dry-run planned without dispatch.",
78
+ artifact_refs: [input.runResultRef, input.verificationSummaryRef]
79
+ };
80
+ const auditIntentResult = preparePreRunAuditWriteIntent(input.sessionId, auditEvent, {
81
+ auditRef: input.guardBoundary.auditRef ?? input.decisionRef,
82
+ evidenceRefs: [input.routeRef, input.decisionRef, input.guardBoundary.conformanceRef, input.guardBoundary.runtimeCapabilityRef].filter((ref) => ref !== undefined)
83
+ });
84
+ if (!auditIntentResult.ok || auditIntentResult.writeIntent === undefined) {
85
+ const response = responseFor(input, false, "blocked", "FlowDesk blocked this dry-run because pre-run audit evidence could not be prepared.", ["/flowdesk-doctor", "/flowdesk-status"], redactedError("audit", "Refresh audit evidence before retrying the guarded dry-run."));
86
+ const responseResult = validateRunResponseV1(response);
87
+ return { ok: false, errors: [...auditIntentResult.errors, ...responseResult.errors], commandName: input.commandName, guardDecision: blockedDecision("audit", "Pre-run audit evidence preparation failed."), response, runtime: inertRuntime };
88
+ }
89
+ const response = responseFor(input, true, "dry_run_complete", "FlowDesk completed an inert guarded dry-run plan. No OpenCode dispatch, lane launch, provider call, fallback, cancellation authority, or state write occurred.", ["/flowdesk-status", "/flowdesk-export-debug"], undefined);
90
+ const responseResult = validateRunResponseV1(response);
91
+ const planningEvidence = {
92
+ plan_revision_id: input.request.plan_revision_id,
93
+ route_ref: input.routeRef,
94
+ guard_decision_ref: input.decisionRef,
95
+ command_shape_hash: input.commandShapeHash,
96
+ pre_run_audit_ref: input.guardBoundary.auditRef ?? input.decisionRef,
97
+ request_schema_id: "flowdesk.run.request.v1",
98
+ response_schema_id: "flowdesk.run.response.v1"
99
+ };
100
+ return {
101
+ ok: responseResult.ok,
102
+ errors: responseResult.errors,
103
+ commandName: input.commandName,
104
+ guardDecision,
105
+ response,
106
+ planningEvidence,
107
+ preRunAuditIntent: auditIntentResult.writeIntent,
108
+ runtime: inertRuntime
109
+ };
110
+ }
111
+ //# sourceMappingURL=guarded-dry-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guarded-dry-run.js","sourceRoot":"","sources":["../src/guarded-dry-run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { FlowDeskHookHarnessRequestV1, FlowDeskHookHarnessResponseV1 } from "./release1-contracts.js";
2
+ import type { ValidationResult } from "./validators.js";
3
+ export interface FlowDeskHookHarnessEvaluationV1 extends ValidationResult {
4
+ response: FlowDeskHookHarnessResponseV1;
5
+ }
6
+ export declare function buildFlowDeskHookHarnessResponseV1(request: FlowDeskHookHarnessRequestV1): FlowDeskHookHarnessResponseV1;
7
+ export declare function evaluateFlowDeskHookHarnessV1(request: FlowDeskHookHarnessRequestV1): FlowDeskHookHarnessEvaluationV1;
8
+ //# sourceMappingURL=hook-harness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-harness.d.ts","sourceRoot":"","sources":["../src/hook-harness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,4BAA4B,EAC5B,6BAA6B,EAG9B,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGxD,MAAM,WAAW,+BAAgC,SAAQ,gBAAgB;IACvE,QAAQ,EAAE,6BAA6B,CAAC;CACzC;AAwED,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,4BAA4B,GAAG,6BAA6B,CAqDvH;AAED,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,4BAA4B,GAAG,+BAA+B,CAKpH"}
@@ -0,0 +1,130 @@
1
+ import { invalid, valid, validateHookHarnessRequestV1, validateHookHarnessResponseV1, validateOpaqueId, validateOpaqueRef } from "./validators.js";
2
+ const safeManualActions = ["/flowdesk-doctor", "/flowdesk-status", "/flowdesk-export-debug"];
3
+ const offFallbackActions = ["/flowdesk-doctor", "/flowdesk-status", "/flowdesk-export-debug"];
4
+ const privilegedCapabilities = new Set([
5
+ "privileged_automation",
6
+ "real_dispatch",
7
+ "provider_call",
8
+ "lane_launch",
9
+ "managed_fallback",
10
+ "hard_chat_control"
11
+ ]);
12
+ const unsafeLaterGatePattern = /\b(real[\s_-]*(?:opencode[\s_-]*)?dispatch|realOpenCodeDispatch|actual[\s_-]*lane[\s_-]*launch|actualLaneLaunch|provider[\s_-]*(?:call|request|api)|providerCall|automatic[\s_-]*(?:fallback|reselection)|automaticFallbackOrReselection|fallback[\s_-]*(?:provider|model|authority)|fallbackAuthority|reselect(?:ion)?|hard[\s_-]*(?:cancel|stop|no[\s_-]*reply)|hardCancelOrNoReply|noReply|no[\s_-]*reply|cancel:\s*true|stop:\s*true|opencode[\s_-]*run)\b/i;
13
+ const unsafeShellExecutionPattern = /(?:\$\(|\$\{|`|\b(?:shell[\s_-]*interpolation|command[\s_-]*template[\s_-]*interpolation|pre[\s_-]*hook[\s_-]*(?:execution|exec|run)|before[\s_-]*hook[\s_-]*(?:execution|exec|run))\b)/i;
14
+ function uniqueActions(actions) {
15
+ return [...new Set(actions)].slice(0, 8);
16
+ }
17
+ function redactedAttemptRef(request) {
18
+ const candidate = request?.redacted_attempt_ref;
19
+ return typeof candidate === "string" && validateOpaqueRef(candidate, "redacted_attempt_ref").ok ? candidate : "attempt-redacted";
20
+ }
21
+ function baseResponse(request, fields) {
22
+ return {
23
+ schema_version: "flowdesk.hook_harness.response.v1",
24
+ request_id: validateOpaqueId(request?.request_id, "request_id").ok ? request?.request_id ?? "request-redacted" : "request-redacted",
25
+ hook_harness_mode: request?.hook_harness_mode === "observe" || request?.hook_harness_mode === "off" ? request.hook_harness_mode : "enforce",
26
+ redacted_attempt_ref: redactedAttemptRef(request),
27
+ privileged_automation_enabled: false,
28
+ dispatch_authorized: false,
29
+ guard_bypassed: false,
30
+ fallback_authorized: false,
31
+ hard_chat_authority: false,
32
+ ...fields
33
+ };
34
+ }
35
+ function schemaFailedResponse(request) {
36
+ return baseResponse({ ...request, hook_harness_mode: "enforce" }, {
37
+ ok: false,
38
+ decision: "deny",
39
+ diagnostic_observations: ["Hook harness input failed redacted schema validation."],
40
+ safe_next_actions: [...safeManualActions],
41
+ user_message: "FlowDesk blocked this hook harness request before evaluation because the redacted contract was invalid.",
42
+ managed_automation_enabled: false,
43
+ mutation_applied: false,
44
+ denial_applied: true
45
+ });
46
+ }
47
+ function classifyCommandActions(summary, capability) {
48
+ if (/\b(status|progress|checkpoint)\b/i.test(summary))
49
+ return ["/flowdesk-status"];
50
+ if (/\b(doctor|diagnos(?:e|tic)|compatibility|health)\b/i.test(summary))
51
+ return ["/flowdesk-doctor"];
52
+ if (/\b(resume|continue from checkpoint)\b/i.test(summary))
53
+ return ["/flowdesk-status", "/flowdesk-resume"];
54
+ if (/\b(retry|try again)\b/i.test(summary))
55
+ return ["/flowdesk-status", "/flowdesk-retry"];
56
+ if (/\b(abort|cancel workflow|stop workflow)\b/i.test(summary))
57
+ return ["/flowdesk-status", "/flowdesk-abort"];
58
+ if (/\b(usage|quota|limit)\b/i.test(summary))
59
+ return ["/flowdesk-usage", "/flowdesk-doctor"];
60
+ if (/\b(debug export|export debug|debug bundle|logs?)\b/i.test(summary))
61
+ return ["/flowdesk-export-debug", "/flowdesk-status"];
62
+ if (capability === "managed_plan" || capability === "command_backed_flow")
63
+ return ["/flowdesk-plan", "/flowdesk-status"];
64
+ return ["/flowdesk-status", "/flowdesk-doctor"];
65
+ }
66
+ function isUnsafeLaterGate(request) {
67
+ return request.requested_capability === "unknown" || privilegedCapabilities.has(request.requested_capability) || unsafeLaterGatePattern.test(request.attempt_summary) || unsafeShellExecutionPattern.test(request.attempt_summary);
68
+ }
69
+ function lacksManagedConformanceProof(request) {
70
+ return request.hook_harness_mode === "enforce" && request.requested_capability !== "safe_manual" && request.conformance_ref === undefined;
71
+ }
72
+ export function buildFlowDeskHookHarnessResponseV1(request) {
73
+ if (!validateHookHarnessRequestV1(request).ok)
74
+ return schemaFailedResponse(request);
75
+ if (request.hook_harness_mode === "observe") {
76
+ return baseResponse(request, {
77
+ ok: true,
78
+ decision: "observe",
79
+ diagnostic_observations: [isUnsafeLaterGate(request) ? "Observed a later-gate or privileged automation attempt without containment authority." : "Observed a safe manual or command-backed request."],
80
+ safe_next_actions: [...safeManualActions],
81
+ user_message: "FlowDesk hook harness is observing only; it did not mutate, deny, authorize dispatch, or claim containment authority.",
82
+ managed_automation_enabled: false,
83
+ mutation_applied: false,
84
+ denial_applied: false
85
+ });
86
+ }
87
+ if (request.hook_harness_mode === "off") {
88
+ return baseResponse(request, {
89
+ ok: true,
90
+ decision: "off_fallback",
91
+ diagnostic_observations: ["Managed hook harness automation is off; Guard remains required for privileged behavior."],
92
+ safe_next_actions: [...offFallbackActions],
93
+ user_message: "Managed FlowDesk automation is off. Safe manual setup, status, diagnostics, and fallback commands remain available.",
94
+ managed_automation_enabled: false,
95
+ mutation_applied: false,
96
+ denial_applied: false
97
+ });
98
+ }
99
+ if (isUnsafeLaterGate(request) || lacksManagedConformanceProof(request)) {
100
+ return baseResponse(request, {
101
+ ok: false,
102
+ decision: "deny",
103
+ diagnostic_observations: [lacksManagedConformanceProof(request) ? "Denied managed hook automation without conformance evidence." : "Denied an unsafe later-gate, unknown, shell-execution, or privileged automation attempt."],
104
+ safe_next_actions: [...safeManualActions],
105
+ user_message: "FlowDesk denied this hook attempt because Release 1 cannot perform real dispatch, provider calls, lane launch, automatic fallback, or hard chat control.",
106
+ managed_automation_enabled: false,
107
+ mutation_applied: false,
108
+ denial_applied: true
109
+ });
110
+ }
111
+ const safeActions = classifyCommandActions(request.attempt_summary, request.requested_capability);
112
+ return baseResponse(request, {
113
+ ok: true,
114
+ decision: request.requested_capability === "safe_manual" ? "allow_safe_manual" : "route_command",
115
+ diagnostic_observations: ["Routed to a safe command-backed Release 1 action without dispatch authority."],
116
+ safe_next_actions: uniqueActions(safeActions),
117
+ user_message: "FlowDesk routed this hook attempt to safe Release 1 command-backed behavior.",
118
+ managed_automation_enabled: request.requested_capability !== "safe_manual",
119
+ mutation_applied: request.requested_capability !== "safe_manual",
120
+ denial_applied: false
121
+ });
122
+ }
123
+ export function evaluateFlowDeskHookHarnessV1(request) {
124
+ const response = buildFlowDeskHookHarnessResponseV1(request);
125
+ const responseResult = validateHookHarnessResponseV1(response);
126
+ if (!responseResult.ok)
127
+ return { ...invalid(...responseResult.errors), response };
128
+ return { ...valid(), response };
129
+ }
130
+ //# sourceMappingURL=hook-harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-harness.js","sourceRoot":"","sources":["../src/hook-harness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ export declare const flowdeskCorePackageName: "@flowdesk/core";
2
+ export declare const flowdeskRelease1Scope: readonly ["guarded-command-backed-workflows", "dry-run", "fake-runtime", "redacted-audit-debug", "no-real-dispatch"];
3
+ export declare const flowdeskNoRealDispatchBoundary: {
4
+ readonly releaseGate: "release1-general-use-mvp";
5
+ readonly realOpenCodeDispatch: "disabled";
6
+ readonly providerModelFallback: "disabled";
7
+ readonly hardChatCancelOrNoReply: "disabled";
8
+ readonly cliSubprocessDispatch: "disabled";
9
+ };
10
+ export declare function describeFlowDeskCoreScaffold(): string;
11
+ export declare function canUseRealDispatchInRelease1(): false;
12
+ export * from "./agent-profiles.js";
13
+ export * from "./audit.js";
14
+ export * from "./bootstrap-foundation.js";
15
+ export * from "./chat-routing.js";
16
+ export * from "./command-manifest.js";
17
+ export * from "./config-policy.js";
18
+ export * from "./fake-runtime.js";
19
+ export * from "./guard-boundary.js";
20
+ export * from "./guarded-dry-run.js";
21
+ export * from "./hook-harness.js";
22
+ export * from "./lane-observability.js";
23
+ export * from "./plan.js";
24
+ export * from "./production-enablement.js";
25
+ export * from "./provider-failures.js";
26
+ export * from "./provider-usage-collector.js";
27
+ export * from "./redaction.js";
28
+ export * from "./release1-contracts.js";
29
+ export * from "./retry.js";
30
+ export * from "./reviewer-lane-conformance.js";
31
+ export * from "./schema-artifacts.js";
32
+ export * from "./schema-registry.js";
33
+ export * from "./session-evidence.js";
34
+ export * from "./state-paths.js";
35
+ export * from "./state-store.js";
36
+ export * from "./status.js";
37
+ export * from "./tool-contract-fixtures.js";
38
+ export * from "./top-tier-reviewer-lane-probe.js";
39
+ export * from "./usage-health.js";
40
+ export * from "./validators.js";
41
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,EAAG,gBAAyB,CAAC;AAEjE,eAAO,MAAM,qBAAqB,sHAMxB,CAAC;AAEX,eAAO,MAAM,8BAA8B;;;;;;CAMjC,CAAC;AAEX,wBAAgB,4BAA4B,IAAI,MAAM,CAErD;AAED,wBAAgB,4BAA4B,IAAI,KAAK,CAEpD;AAED,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,WAAW,CAAC;AAC1B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,YAAY,CAAC;AAC3B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAClD,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,51 @@
1
+ export const flowdeskCorePackageName = "@flowdesk/core";
2
+ export const flowdeskRelease1Scope = [
3
+ "guarded-command-backed-workflows",
4
+ "dry-run",
5
+ "fake-runtime",
6
+ "redacted-audit-debug",
7
+ "no-real-dispatch",
8
+ ];
9
+ export const flowdeskNoRealDispatchBoundary = {
10
+ releaseGate: "release1-general-use-mvp",
11
+ realOpenCodeDispatch: "disabled",
12
+ providerModelFallback: "disabled",
13
+ hardChatCancelOrNoReply: "disabled",
14
+ cliSubprocessDispatch: "disabled",
15
+ };
16
+ export function describeFlowDeskCoreScaffold() {
17
+ return `${flowdeskCorePackageName}: ${flowdeskNoRealDispatchBoundary.releaseGate}`;
18
+ }
19
+ export function canUseRealDispatchInRelease1() {
20
+ return false;
21
+ }
22
+ export * from "./agent-profiles.js";
23
+ export * from "./audit.js";
24
+ export * from "./bootstrap-foundation.js";
25
+ export * from "./chat-routing.js";
26
+ export * from "./command-manifest.js";
27
+ export * from "./config-policy.js";
28
+ export * from "./fake-runtime.js";
29
+ export * from "./guard-boundary.js";
30
+ export * from "./guarded-dry-run.js";
31
+ export * from "./hook-harness.js";
32
+ export * from "./lane-observability.js";
33
+ export * from "./plan.js";
34
+ export * from "./production-enablement.js";
35
+ export * from "./provider-failures.js";
36
+ export * from "./provider-usage-collector.js";
37
+ export * from "./redaction.js";
38
+ export * from "./release1-contracts.js";
39
+ export * from "./retry.js";
40
+ export * from "./reviewer-lane-conformance.js";
41
+ export * from "./schema-artifacts.js";
42
+ export * from "./schema-registry.js";
43
+ export * from "./session-evidence.js";
44
+ export * from "./state-paths.js";
45
+ export * from "./state-store.js";
46
+ export * from "./status.js";
47
+ export * from "./tool-contract-fixtures.js";
48
+ export * from "./top-tier-reviewer-lane-probe.js";
49
+ export * from "./usage-health.js";
50
+ export * from "./validators.js";
51
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG,gBAAyB,CAAC;AAEjE,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACpC,kCAAkC;IAClC,SAAS;IACT,cAAc;IACd,sBAAsB;IACtB,kBAAkB;CACT,CAAC;AAEX,MAAM,CAAC,MAAM,8BAA8B,GAAG;IAC7C,WAAW,EAAE,0BAA0B;IACvC,oBAAoB,EAAE,UAAU;IAChC,qBAAqB,EAAE,UAAU;IACjC,uBAAuB,EAAE,UAAU;IACnC,qBAAqB,EAAE,UAAU;CACxB,CAAC;AAEX,MAAM,UAAU,4BAA4B;IAC3C,OAAO,GAAG,uBAAuB,KAAK,8BAA8B,CAAC,WAAW,EAAE,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,4BAA4B;IAC3C,OAAO,KAAK,CAAC;AACd,CAAC;AAED,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,WAAW,CAAC;AAC1B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,YAAY,CAAC;AAC3B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAClD,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { FlowDeskLaneObservabilityArtifactV1, FlowDeskStatusLaneSummaryV1, LaneInspectionStateV1, LaneObservabilityLevelV1, SafeNextAction } from "./release1-contracts.js";
2
+ import { type ValidationResult } from "./validators.js";
3
+ export interface FlowDeskLaneObservabilityInputV1 {
4
+ observabilityId: string;
5
+ statusSummaryRef: string;
6
+ laneSummary: FlowDeskStatusLaneSummaryV1;
7
+ observabilityLevel?: LaneObservabilityLevelV1;
8
+ inspectionState?: LaneInspectionStateV1;
9
+ requestedBindingRef?: string;
10
+ observedBindingRef?: string;
11
+ parentSessionRef?: string;
12
+ childSessionRef?: string;
13
+ messageRef?: string;
14
+ outputRef?: string;
15
+ detailRef?: string;
16
+ debugRef?: string;
17
+ inspectActions?: SafeNextAction[];
18
+ redactionStatus?: FlowDeskLaneObservabilityArtifactV1["redaction_status"];
19
+ }
20
+ export declare function createFlowDeskLaneObservabilityArtifactV1(input: FlowDeskLaneObservabilityInputV1): FlowDeskLaneObservabilityArtifactV1;
21
+ export declare function validateFlowDeskLaneObservabilityArtifactV1(value: unknown): ValidationResult;
22
+ //# sourceMappingURL=lane-observability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lane-observability.d.ts","sourceRoot":"","sources":["../src/lane-observability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,mCAAmC,EACnC,2BAA2B,EAC3B,qBAAqB,EACrB,wBAAwB,EACxB,cAAc,EACd,MAAM,yBAAyB,CAAC;AAOjC,OAAO,EAEN,KAAK,gBAAgB,EAKrB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,gCAAgC;IAChD,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,2BAA2B,CAAC;IACzC,kBAAkB,CAAC,EAAE,wBAAwB,CAAC;IAC9C,eAAe,CAAC,EAAE,qBAAqB,CAAC;IACxC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,cAAc,EAAE,CAAC;IAClC,eAAe,CAAC,EAAE,mCAAmC,CAAC,kBAAkB,CAAC,CAAC;CAC1E;AAqBD,wBAAgB,yCAAyC,CACxD,KAAK,EAAE,gCAAgC,GACrC,mCAAmC,CAsCrC;AAED,wBAAgB,2CAA2C,CAC1D,KAAK,EAAE,OAAO,GACZ,gBAAgB,CA4FlB"}
@@ -0,0 +1,138 @@
1
+ import { LANE_INSPECTION_STATES, LANE_OBSERVABILITY_LEVELS, PERSISTED_LANE_STATES, SAFE_NEXT_ACTIONS, } from "./release1-contracts.js";
2
+ import { invalid, valid, validateNoForbiddenRawPayloads, validateOpaqueId, validateOpaqueRef, } from "./validators.js";
3
+ const DEFAULT_INSPECT_ACTIONS = [
4
+ "/flowdesk-status",
5
+ "/flowdesk-export-debug",
6
+ ];
7
+ function uniqueActions(actions) {
8
+ return [...new Set(actions)].slice(0, 8);
9
+ }
10
+ function optionalRef(value, label, errors) {
11
+ if (value === undefined)
12
+ return false;
13
+ errors.push(...validateOpaqueRef(value, label).errors);
14
+ return true;
15
+ }
16
+ export function createFlowDeskLaneObservabilityArtifactV1(input) {
17
+ const inspectActions = uniqueActions(input.inspectActions ?? DEFAULT_INSPECT_ACTIONS);
18
+ const debugRef = input.debugRef ?? input.laneSummary.debug_ref;
19
+ return {
20
+ schema_version: "flowdesk.lane_observability.v1",
21
+ observability_id: input.observabilityId,
22
+ workflow_id: input.laneSummary.workflow_id,
23
+ lane_id: input.laneSummary.lane_id,
24
+ status_summary_ref: input.statusSummaryRef,
25
+ observability_level: input.observabilityLevel ?? "openable_refs",
26
+ inspection_state: input.inspectionState ?? "inspectable",
27
+ lane_state: input.laneSummary
28
+ .state,
29
+ ...(input.requestedBindingRef === undefined
30
+ ? {}
31
+ : { requested_binding_ref: input.requestedBindingRef }),
32
+ ...(input.observedBindingRef === undefined
33
+ ? {}
34
+ : { observed_binding_ref: input.observedBindingRef }),
35
+ ...(input.parentSessionRef === undefined
36
+ ? {}
37
+ : { parent_session_ref: input.parentSessionRef }),
38
+ ...(input.childSessionRef === undefined
39
+ ? {}
40
+ : { child_session_ref: input.childSessionRef }),
41
+ ...(input.messageRef === undefined ? {} : { message_ref: input.messageRef }),
42
+ ...(input.outputRef === undefined ? {} : { output_ref: input.outputRef }),
43
+ ...(input.detailRef === undefined ? {} : { detail_ref: input.detailRef }),
44
+ ...(debugRef === undefined ? {} : { debug_ref: debugRef }),
45
+ inspect_actions: inspectActions,
46
+ redaction_status: input.redactionStatus ?? "passed",
47
+ created_at: input.laneSummary.created_at,
48
+ updated_at: input.laneSummary.updated_at,
49
+ dispatch_authority_enabled: false,
50
+ provider_call_made: false,
51
+ runtime_execution: false,
52
+ hard_chat_authority_claimed: false,
53
+ };
54
+ }
55
+ export function validateFlowDeskLaneObservabilityArtifactV1(value) {
56
+ if (typeof value !== "object" || value === null || Array.isArray(value))
57
+ return invalid("lane observability artifact must be an object");
58
+ const record = value;
59
+ const errors = [];
60
+ const allowed = new Set([
61
+ "schema_version",
62
+ "observability_id",
63
+ "workflow_id",
64
+ "lane_id",
65
+ "status_summary_ref",
66
+ "observability_level",
67
+ "inspection_state",
68
+ "lane_state",
69
+ "requested_binding_ref",
70
+ "observed_binding_ref",
71
+ "parent_session_ref",
72
+ "child_session_ref",
73
+ "message_ref",
74
+ "output_ref",
75
+ "detail_ref",
76
+ "debug_ref",
77
+ "inspect_actions",
78
+ "redaction_status",
79
+ "created_at",
80
+ "updated_at",
81
+ "dispatch_authority_enabled",
82
+ "provider_call_made",
83
+ "runtime_execution",
84
+ "hard_chat_authority_claimed",
85
+ ]);
86
+ for (const key of Object.keys(record))
87
+ if (!allowed.has(key))
88
+ errors.push(`unknown properties: ${key}`);
89
+ if (record.schema_version !== "flowdesk.lane_observability.v1")
90
+ errors.push("lane observability schema_version is invalid");
91
+ errors.push(...validateOpaqueId(record.observability_id, "observability_id").errors, ...validateOpaqueId(record.workflow_id, "workflow_id").errors, ...validateOpaqueId(record.lane_id, "lane_id").errors, ...validateOpaqueRef(record.status_summary_ref, "status_summary_ref").errors);
92
+ if (!LANE_OBSERVABILITY_LEVELS.includes(record.observability_level))
93
+ errors.push("observability_level is invalid");
94
+ if (!LANE_INSPECTION_STATES.includes(record.inspection_state))
95
+ errors.push("inspection_state is invalid");
96
+ if (!PERSISTED_LANE_STATES.includes(record.lane_state))
97
+ errors.push("lane_state is invalid or future-gated");
98
+ for (const [value, label] of [
99
+ [record.requested_binding_ref, "requested_binding_ref"],
100
+ [record.observed_binding_ref, "observed_binding_ref"],
101
+ [record.parent_session_ref, "parent_session_ref"],
102
+ [record.child_session_ref, "child_session_ref"],
103
+ [record.message_ref, "message_ref"],
104
+ [record.output_ref, "output_ref"],
105
+ [record.detail_ref, "detail_ref"],
106
+ [record.debug_ref, "debug_ref"],
107
+ ]) {
108
+ optionalRef(value, label, errors);
109
+ }
110
+ if (!Array.isArray(record.inspect_actions))
111
+ errors.push("inspect_actions must be an array");
112
+ else {
113
+ if (record.inspect_actions.length === 0 || record.inspect_actions.length > 8)
114
+ errors.push("inspect_actions must contain 1..8 actions");
115
+ for (const action of record.inspect_actions)
116
+ if (!SAFE_NEXT_ACTIONS.includes(action))
117
+ errors.push(`inspect_action is invalid: ${action}`);
118
+ }
119
+ if (!["passed", "partial", "blocked"].includes(record.redaction_status ?? ""))
120
+ errors.push("redaction_status is invalid");
121
+ if (typeof record.created_at !== "string" ||
122
+ !Number.isFinite(Date.parse(record.created_at)))
123
+ errors.push("created_at must be parseable");
124
+ if (typeof record.updated_at !== "string" ||
125
+ !Number.isFinite(Date.parse(record.updated_at)))
126
+ errors.push("updated_at must be parseable");
127
+ if (record.dispatch_authority_enabled !== false)
128
+ errors.push("lane observability cannot enable dispatch authority");
129
+ if (record.provider_call_made !== false)
130
+ errors.push("lane observability cannot claim provider calls");
131
+ if (record.runtime_execution !== false)
132
+ errors.push("lane observability cannot claim runtime execution");
133
+ if (record.hard_chat_authority_claimed !== false)
134
+ errors.push("lane observability cannot claim hard chat authority");
135
+ errors.push(...validateNoForbiddenRawPayloads(record, "lane_observability").errors);
136
+ return errors.length === 0 ? valid() : invalid(...errors);
137
+ }
138
+ //# sourceMappingURL=lane-observability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lane-observability.js","sourceRoot":"","sources":["../src/lane-observability.ts"],"names":[],"mappings":"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"}