taskflow-mcp-core 0.3.0-beta.1.1 → 1.0.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 (185) hide show
  1. package/CONTROL_GUIDE.md +113 -0
  2. package/README.md +34 -25
  3. package/dist/control/admission-service.d.ts +15 -0
  4. package/dist/control/admission-service.d.ts.map +1 -0
  5. package/dist/control/admission-service.js +64 -0
  6. package/dist/control/admission-service.js.map +1 -0
  7. package/dist/control/approval-edits.d.ts +12 -0
  8. package/dist/control/approval-edits.d.ts.map +1 -0
  9. package/dist/control/approval-edits.js +66 -0
  10. package/dist/control/approval-edits.js.map +1 -0
  11. package/dist/control/approval-service.d.ts +173 -0
  12. package/dist/control/approval-service.d.ts.map +1 -0
  13. package/dist/control/approval-service.js +342 -0
  14. package/dist/control/approval-service.js.map +1 -0
  15. package/dist/control/authorization.d.ts +94 -0
  16. package/dist/control/authorization.d.ts.map +1 -0
  17. package/dist/control/authorization.js +302 -0
  18. package/dist/control/authorization.js.map +1 -0
  19. package/dist/control/control-cli.d.ts +3 -0
  20. package/dist/control/control-cli.d.ts.map +1 -0
  21. package/dist/control/control-cli.js +279 -0
  22. package/dist/control/control-cli.js.map +1 -0
  23. package/dist/control/control-console.d.ts +17 -0
  24. package/dist/control/control-console.d.ts.map +1 -0
  25. package/dist/control/control-console.js +67 -0
  26. package/dist/control/control-console.js.map +1 -0
  27. package/dist/control/control-host.d.ts +98 -0
  28. package/dist/control/control-host.d.ts.map +1 -0
  29. package/dist/control/control-host.js +459 -0
  30. package/dist/control/control-host.js.map +1 -0
  31. package/dist/control/control-mcp.d.ts +11 -0
  32. package/dist/control/control-mcp.d.ts.map +1 -0
  33. package/dist/control/control-mcp.js +78 -0
  34. package/dist/control/control-mcp.js.map +1 -0
  35. package/dist/control/errors.d.ts +44 -0
  36. package/dist/control/errors.d.ts.map +1 -0
  37. package/dist/control/errors.js +93 -0
  38. package/dist/control/errors.js.map +1 -0
  39. package/dist/control/hello.d.ts +39 -0
  40. package/dist/control/hello.d.ts.map +1 -0
  41. package/dist/control/hello.js +80 -0
  42. package/dist/control/hello.js.map +1 -0
  43. package/dist/control/host-runtime.d.ts +32 -0
  44. package/dist/control/host-runtime.d.ts.map +1 -0
  45. package/dist/control/host-runtime.js +542 -0
  46. package/dist/control/host-runtime.js.map +1 -0
  47. package/dist/control/index.d.ts +32 -0
  48. package/dist/control/index.d.ts.map +1 -0
  49. package/dist/control/index.js +32 -0
  50. package/dist/control/index.js.map +1 -0
  51. package/dist/control/legacy-conflict.d.ts +19 -0
  52. package/dist/control/legacy-conflict.d.ts.map +1 -0
  53. package/dist/control/legacy-conflict.js +176 -0
  54. package/dist/control/legacy-conflict.js.map +1 -0
  55. package/dist/control/local-bootstrap.d.ts +21 -0
  56. package/dist/control/local-bootstrap.d.ts.map +1 -0
  57. package/dist/control/local-bootstrap.js +224 -0
  58. package/dist/control/local-bootstrap.js.map +1 -0
  59. package/dist/control/modes.d.ts +60 -0
  60. package/dist/control/modes.d.ts.map +1 -0
  61. package/dist/control/modes.js +86 -0
  62. package/dist/control/modes.js.map +1 -0
  63. package/dist/control/project-admin-cli.d.ts +3 -0
  64. package/dist/control/project-admin-cli.d.ts.map +1 -0
  65. package/dist/control/project-admin-cli.js +155 -0
  66. package/dist/control/project-admin-cli.js.map +1 -0
  67. package/dist/control/project-registry.d.ts +20 -0
  68. package/dist/control/project-registry.d.ts.map +1 -0
  69. package/dist/control/project-registry.js +181 -0
  70. package/dist/control/project-registry.js.map +1 -0
  71. package/dist/control/runtime-checkpoint.d.ts +11 -0
  72. package/dist/control/runtime-checkpoint.d.ts.map +1 -0
  73. package/dist/control/runtime-checkpoint.js +39 -0
  74. package/dist/control/runtime-checkpoint.js.map +1 -0
  75. package/dist/control/runtime-provider.d.ts +100 -0
  76. package/dist/control/runtime-provider.d.ts.map +1 -0
  77. package/dist/control/runtime-provider.js +258 -0
  78. package/dist/control/runtime-provider.js.map +1 -0
  79. package/dist/control/schema/approval.d.ts +108 -0
  80. package/dist/control/schema/approval.d.ts.map +1 -0
  81. package/dist/control/schema/approval.js +65 -0
  82. package/dist/control/schema/approval.js.map +1 -0
  83. package/dist/control/schema/commands.d.ts +663 -0
  84. package/dist/control/schema/commands.d.ts.map +1 -0
  85. package/dist/control/schema/commands.js +147 -0
  86. package/dist/control/schema/commands.js.map +1 -0
  87. package/dist/control/schema/common.d.ts +24 -0
  88. package/dist/control/schema/common.d.ts.map +1 -0
  89. package/dist/control/schema/common.js +38 -0
  90. package/dist/control/schema/common.js.map +1 -0
  91. package/dist/control/schema/coordinator.d.ts +98 -0
  92. package/dist/control/schema/coordinator.d.ts.map +1 -0
  93. package/dist/control/schema/coordinator.js +87 -0
  94. package/dist/control/schema/coordinator.js.map +1 -0
  95. package/dist/control/schema/evidence.d.ts +140 -0
  96. package/dist/control/schema/evidence.d.ts.map +1 -0
  97. package/dist/control/schema/evidence.js +64 -0
  98. package/dist/control/schema/evidence.js.map +1 -0
  99. package/dist/control/schema/header.d.ts +79 -0
  100. package/dist/control/schema/header.d.ts.map +1 -0
  101. package/dist/control/schema/header.js +66 -0
  102. package/dist/control/schema/header.js.map +1 -0
  103. package/dist/control/schema/index.d.ts +31 -0
  104. package/dist/control/schema/index.d.ts.map +1 -0
  105. package/dist/control/schema/index.js +31 -0
  106. package/dist/control/schema/index.js.map +1 -0
  107. package/dist/control/schema/plan.d.ts +291 -0
  108. package/dist/control/schema/plan.d.ts.map +1 -0
  109. package/dist/control/schema/plan.js +80 -0
  110. package/dist/control/schema/plan.js.map +1 -0
  111. package/dist/control/schema/policy.d.ts +96 -0
  112. package/dist/control/schema/policy.d.ts.map +1 -0
  113. package/dist/control/schema/policy.js +73 -0
  114. package/dist/control/schema/policy.js.map +1 -0
  115. package/dist/control/schema/run.d.ts +61 -0
  116. package/dist/control/schema/run.d.ts.map +1 -0
  117. package/dist/control/schema/run.js +56 -0
  118. package/dist/control/schema/run.js.map +1 -0
  119. package/dist/control/schema/te-mirrors.d.ts +145 -0
  120. package/dist/control/schema/te-mirrors.d.ts.map +1 -0
  121. package/dist/control/schema/te-mirrors.js +145 -0
  122. package/dist/control/schema/te-mirrors.js.map +1 -0
  123. package/dist/control/schema/transport.d.ts +479 -0
  124. package/dist/control/schema/transport.d.ts.map +1 -0
  125. package/dist/control/schema/transport.js +181 -0
  126. package/dist/control/schema/transport.js.map +1 -0
  127. package/dist/control/singleton.d.ts +135 -0
  128. package/dist/control/singleton.d.ts.map +1 -0
  129. package/dist/control/singleton.js +607 -0
  130. package/dist/control/singleton.js.map +1 -0
  131. package/dist/control/store/coordinator-store.d.ts +143 -0
  132. package/dist/control/store/coordinator-store.d.ts.map +1 -0
  133. package/dist/control/store/coordinator-store.js +620 -0
  134. package/dist/control/store/coordinator-store.js.map +1 -0
  135. package/dist/control/store/evidence-adapter.d.ts +10 -0
  136. package/dist/control/store/evidence-adapter.d.ts.map +1 -0
  137. package/dist/control/store/evidence-adapter.js +114 -0
  138. package/dist/control/store/evidence-adapter.js.map +1 -0
  139. package/dist/control/store/evidence-explanation.d.ts +55 -0
  140. package/dist/control/store/evidence-explanation.d.ts.map +1 -0
  141. package/dist/control/store/evidence-explanation.js +50 -0
  142. package/dist/control/store/evidence-explanation.js.map +1 -0
  143. package/dist/control/store/evidence-store.d.ts +143 -0
  144. package/dist/control/store/evidence-store.d.ts.map +1 -0
  145. package/dist/control/store/evidence-store.js +437 -0
  146. package/dist/control/store/evidence-store.js.map +1 -0
  147. package/dist/control/store/index.d.ts +3 -0
  148. package/dist/control/store/index.d.ts.map +1 -0
  149. package/dist/control/store/index.js +2 -0
  150. package/dist/control/store/index.js.map +1 -0
  151. package/dist/control/store/journal.d.ts +270 -0
  152. package/dist/control/store/journal.d.ts.map +1 -0
  153. package/dist/control/store/journal.js +50 -0
  154. package/dist/control/store/journal.js.map +1 -0
  155. package/dist/control/store/project-lifecycle.d.ts +49 -0
  156. package/dist/control/store/project-lifecycle.d.ts.map +1 -0
  157. package/dist/control/store/project-lifecycle.js +288 -0
  158. package/dist/control/store/project-lifecycle.js.map +1 -0
  159. package/dist/control/store/store.d.ts +93 -0
  160. package/dist/control/store/store.d.ts.map +1 -0
  161. package/dist/control/store/store.js +873 -0
  162. package/dist/control/store/store.js.map +1 -0
  163. package/dist/control/te-provider.d.ts +86 -0
  164. package/dist/control/te-provider.d.ts.map +1 -0
  165. package/dist/control/te-provider.js +131 -0
  166. package/dist/control/te-provider.js.map +1 -0
  167. package/dist/control/uds.d.ts +114 -0
  168. package/dist/control/uds.d.ts.map +1 -0
  169. package/dist/control/uds.js +456 -0
  170. package/dist/control/uds.js.map +1 -0
  171. package/dist/control/web-console/view.d.ts +5 -0
  172. package/dist/control/web-console/view.d.ts.map +1 -0
  173. package/dist/control/web-console/view.js +122 -0
  174. package/dist/control/web-console/view.js.map +1 -0
  175. package/dist/control/web-console.d.ts +50 -0
  176. package/dist/control/web-console.d.ts.map +1 -0
  177. package/dist/control/web-console.js +317 -0
  178. package/dist/control/web-console.js.map +1 -0
  179. package/dist/mcp/jsonrpc.d.ts.map +1 -1
  180. package/dist/mcp/jsonrpc.js +12 -3
  181. package/dist/mcp/jsonrpc.js.map +1 -1
  182. package/dist/mcp/server.d.ts.map +1 -1
  183. package/dist/mcp/server.js +26 -17
  184. package/dist/mcp/server.js.map +1 -1
  185. package/package.json +13 -5
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Unified 0.3-C error envelope (P4). `ControlError` is the runtime shape;
3
+ * `toEnvelope()` produces the closed wire ErrorEnvelope. Custom bare codes are
4
+ * forbidden — only the closed TF_* set (schema/transport.ts) is used.
5
+ */
6
+ import { type ControlErrorCode, type ErrorEnvelope, type RecoveryAction, type SideEffects } from "./schema/transport.ts";
7
+ export { CONTROL_ERROR_CODES } from "./schema/transport.ts";
8
+ export type { ControlErrorCode, ErrorEnvelope } from "./schema/transport.ts";
9
+ export interface ControlErrorOptions {
10
+ recoveryAction?: RecoveryAction;
11
+ sideEffects?: SideEffects;
12
+ commandId?: string;
13
+ commitSeq?: number;
14
+ controlDomainId?: string;
15
+ projectId?: string;
16
+ cause?: unknown;
17
+ }
18
+ export declare class ControlError extends Error {
19
+ readonly code: ControlErrorCode;
20
+ readonly recoveryAction: RecoveryAction;
21
+ readonly sideEffects: SideEffects;
22
+ readonly commandId?: string;
23
+ readonly commitSeq?: number;
24
+ readonly controlDomainId?: string;
25
+ readonly projectId?: string;
26
+ constructor(code: ControlErrorCode, message: string, options?: ControlErrorOptions);
27
+ toEnvelope(): ErrorEnvelope;
28
+ }
29
+ /** Convenience builder for protocol/negotiation failures. */
30
+ export declare function protocolError(message: string, options?: ControlErrorOptions): ControlError;
31
+ /**
32
+ * P4 normative pin: TF_RECONCILE_REQUIRED is always `operator` + `unknown` and
33
+ * status RPCs return a normal snapshot, never a transport-level failure.
34
+ */
35
+ export declare function reconcileRequired(message: string, options?: Omit<ControlErrorOptions, "recoveryAction" | "sideEffects">): ControlError;
36
+ /** Fail-closed helper for bootstrap/singleton failures (P13). */
37
+ export declare function bootstrapFailed(message: string, options?: ControlErrorOptions): ControlError;
38
+ /** Assert a value is a closed wire code (guards against bare custom codes). */
39
+ export declare function assertClosedControlCode(code: string): asserts code is ControlErrorCode;
40
+ /** Map any thrown value to a closed wire ErrorEnvelope (P4). */
41
+ export declare function errorToEnvelope(error: unknown): ErrorEnvelope;
42
+ /** Rehydrate a ControlError from a wire ErrorEnvelope (transport layer). */
43
+ export declare function errorFromEnvelope(envelope: ErrorEnvelope): ControlError;
44
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../taskflow-control/src/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAEN,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE7E,MAAM,WAAW,mBAAmB;IACnC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB;AAQD,qBAAa,YAAa,SAAQ,KAAK;IACtC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAE5B,YAAY,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,EAUrF;IAED,UAAU,IAAI,aAAa,CAW1B;CACD;AAED,6DAA6D;AAC7D,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,YAAY,CAE9F;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,IAAI,CAAC,mBAAmB,EAAE,gBAAgB,GAAG,aAAa,CAAM,GAAG,YAAY,CAM1I;AAED,iEAAiE;AACjE,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,YAAY,CAEhG;AAED,+EAA+E;AAC/E,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,IAAI,gBAAgB,CAItF;AAED,gEAAgE;AAChE,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CAS7D;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,GAAG,YAAY,CASvE"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Unified 0.3-C error envelope (P4). `ControlError` is the runtime shape;
3
+ * `toEnvelope()` produces the closed wire ErrorEnvelope. Custom bare codes are
4
+ * forbidden — only the closed TF_* set (schema/transport.ts) is used.
5
+ */
6
+ import { CONTROL_ERROR_CODES, } from "./schema/transport.js";
7
+ export { CONTROL_ERROR_CODES } from "./schema/transport.js";
8
+ /** P4 default mapping: most wire errors are command-level with no side effects. */
9
+ const DEFAULT_RECOVERY = {
10
+ recoveryAction: "none",
11
+ sideEffects: "none",
12
+ };
13
+ export class ControlError extends Error {
14
+ code;
15
+ recoveryAction;
16
+ sideEffects;
17
+ commandId;
18
+ commitSeq;
19
+ controlDomainId;
20
+ projectId;
21
+ constructor(code, message, options = {}) {
22
+ super(message, options.cause === undefined ? undefined : { cause: options.cause });
23
+ this.name = "ControlError";
24
+ this.code = code;
25
+ this.recoveryAction = options.recoveryAction ?? DEFAULT_RECOVERY.recoveryAction;
26
+ this.sideEffects = options.sideEffects ?? DEFAULT_RECOVERY.sideEffects;
27
+ this.commandId = options.commandId;
28
+ this.commitSeq = options.commitSeq;
29
+ this.controlDomainId = options.controlDomainId;
30
+ this.projectId = options.projectId;
31
+ }
32
+ toEnvelope() {
33
+ return {
34
+ code: this.code,
35
+ message: this.message,
36
+ recoveryAction: this.recoveryAction,
37
+ sideEffects: this.sideEffects,
38
+ ...(this.commandId !== undefined ? { commandId: this.commandId } : {}),
39
+ ...(this.commitSeq !== undefined ? { commitSeq: this.commitSeq } : {}),
40
+ ...(this.controlDomainId !== undefined ? { controlDomainId: this.controlDomainId } : {}),
41
+ ...(this.projectId !== undefined ? { projectId: this.projectId } : {}),
42
+ };
43
+ }
44
+ }
45
+ /** Convenience builder for protocol/negotiation failures. */
46
+ export function protocolError(message, options = {}) {
47
+ return new ControlError("TF_PROTOCOL_INCOMPATIBLE", message, options);
48
+ }
49
+ /**
50
+ * P4 normative pin: TF_RECONCILE_REQUIRED is always `operator` + `unknown` and
51
+ * status RPCs return a normal snapshot, never a transport-level failure.
52
+ */
53
+ export function reconcileRequired(message, options = {}) {
54
+ return new ControlError("TF_RECONCILE_REQUIRED", message, {
55
+ ...options,
56
+ recoveryAction: "operator",
57
+ sideEffects: "unknown",
58
+ });
59
+ }
60
+ /** Fail-closed helper for bootstrap/singleton failures (P13). */
61
+ export function bootstrapFailed(message, options = {}) {
62
+ return new ControlError("TF_BOOTSTRAP_FAILED", message, options);
63
+ }
64
+ /** Assert a value is a closed wire code (guards against bare custom codes). */
65
+ export function assertClosedControlCode(code) {
66
+ if (!CONTROL_ERROR_CODES.includes(code)) {
67
+ throw new Error(`TF_COMMAND_FAILED: not a closed 0.3-C wire error code: ${code}`);
68
+ }
69
+ }
70
+ /** Map any thrown value to a closed wire ErrorEnvelope (P4). */
71
+ export function errorToEnvelope(error) {
72
+ if (error instanceof ControlError)
73
+ return error.toEnvelope();
74
+ const message = error instanceof Error ? error.message : String(error);
75
+ return {
76
+ code: "TF_COMMAND_FAILED",
77
+ message,
78
+ recoveryAction: "retry-new-command",
79
+ sideEffects: "none",
80
+ };
81
+ }
82
+ /** Rehydrate a ControlError from a wire ErrorEnvelope (transport layer). */
83
+ export function errorFromEnvelope(envelope) {
84
+ return new ControlError(envelope.code, envelope.message, {
85
+ recoveryAction: envelope.recoveryAction,
86
+ sideEffects: envelope.sideEffects,
87
+ ...(envelope.commandId !== undefined ? { commandId: envelope.commandId } : {}),
88
+ ...(envelope.commitSeq !== undefined ? { commitSeq: envelope.commitSeq } : {}),
89
+ ...(envelope.controlDomainId !== undefined ? { controlDomainId: envelope.controlDomainId } : {}),
90
+ ...(envelope.projectId !== undefined ? { projectId: envelope.projectId } : {}),
91
+ });
92
+ }
93
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../taskflow-control/src/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Hello-before-RPC negotiation gate (P4 / RFC §18).
3
+ *
4
+ * The first message on any control channel MUST be a NegotiationHandshake.
5
+ * No RPC is dispatched before a successful hello. Failures:
6
+ * - protocolMajor mismatch → TF_PROTOCOL_INCOMPATIBLE
7
+ * - no overlapping supported schema → TF_SCHEMA_UNSUPPORTED
8
+ * - unmet requiredFeatures (either direction) → TF_FEATURE_REQUIRED
9
+ *
10
+ * Compatible clients then exchange their supported read/write schema lists;
11
+ * an unknown schema on a later message → TF_SCHEMA_UNSUPPORTED (never silent
12
+ * reparse — wire-freeze rule 4).
13
+ */
14
+ import { ControlError } from "./errors.ts";
15
+ import { type NegotiationHandshake } from "./schema/transport.ts";
16
+ export type HelloVerdict = {
17
+ ok: true;
18
+ serverHello: NegotiationHandshake;
19
+ } | {
20
+ ok: false;
21
+ error: ControlError;
22
+ };
23
+ export interface HelloGateOptions {
24
+ /** Features the server requires a client to offer. */
25
+ requiredFeatures?: readonly string[];
26
+ /** Extra schemas the server accepts beyond its declared list. */
27
+ extraReadSchemas?: readonly string[];
28
+ }
29
+ export interface HelloGate {
30
+ /** True once a client has passed the handshake; RPCs before this are rejected. */
31
+ readonly greeted: boolean;
32
+ /** The server's own handshake (sent back on success). */
33
+ readonly serverHello: NegotiationHandshake;
34
+ hello(clientHello: unknown): HelloVerdict;
35
+ }
36
+ export declare function createHelloGate(serverHello: NegotiationHandshake, options?: HelloGateOptions): HelloGate;
37
+ /** Rejection for any RPC attempted before a successful hello. */
38
+ export declare function helloRequiredError(): ControlError;
39
+ //# sourceMappingURL=hello.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hello.d.ts","sourceRoot":"","sources":["../../../taskflow-control/src/hello.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAiB,YAAY,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAA8C,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE9G,MAAM,MAAM,YAAY,GACrB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,WAAW,EAAE,oBAAoB,CAAA;CAAE,GAC/C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CAAC;AAEtC,MAAM,WAAW,gBAAgB;IAChC,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,iEAAiE;IACjE,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,SAAS;IACzB,kFAAkF;IAClF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,yDAAyD;IACzD,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;IAC3C,KAAK,CAAC,WAAW,EAAE,OAAO,GAAG,YAAY,CAAC;CAC1C;AAED,wBAAgB,eAAe,CAC9B,WAAW,EAAE,oBAAoB,EACjC,OAAO,GAAE,gBAAqB,GAC5B,SAAS,CAyEX;AAED,iEAAiE;AACjE,wBAAgB,kBAAkB,IAAI,YAAY,CAEjD"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Hello-before-RPC negotiation gate (P4 / RFC §18).
3
+ *
4
+ * The first message on any control channel MUST be a NegotiationHandshake.
5
+ * No RPC is dispatched before a successful hello. Failures:
6
+ * - protocolMajor mismatch → TF_PROTOCOL_INCOMPATIBLE
7
+ * - no overlapping supported schema → TF_SCHEMA_UNSUPPORTED
8
+ * - unmet requiredFeatures (either direction) → TF_FEATURE_REQUIRED
9
+ *
10
+ * Compatible clients then exchange their supported read/write schema lists;
11
+ * an unknown schema on a later message → TF_SCHEMA_UNSUPPORTED (never silent
12
+ * reparse — wire-freeze rule 4).
13
+ */
14
+ import { Value } from "typebox/value";
15
+ import { protocolError, ControlError } from "./errors.js";
16
+ import { NegotiationHandshakeSchema, PROTOCOL_MAJOR } from "./schema/transport.js";
17
+ export function createHelloGate(serverHello, options = {}) {
18
+ const requiredFeatures = [...(options.requiredFeatures ?? [])];
19
+ let greeted = false;
20
+ const validate = (clientHello) => {
21
+ if (typeof clientHello !== "object" || clientHello === null || Array.isArray(clientHello)) {
22
+ return { ok: false, error: protocolError("hello must be a NegotiationHandshake object") };
23
+ }
24
+ const hello = clientHello;
25
+ if (typeof hello.protocolMajor !== "number" || hello.protocolMajor !== PROTOCOL_MAJOR) {
26
+ return {
27
+ ok: false,
28
+ error: protocolError(`protocolMajor ${JSON.stringify(hello.protocolMajor)} is incompatible; expected ${PROTOCOL_MAJOR}`),
29
+ };
30
+ }
31
+ // Validate the complete wire shape before iterating feature lists or
32
+ // trusting schema/build metadata supplied by another process.
33
+ if (!Value.Check(NegotiationHandshakeSchema, clientHello)) {
34
+ return { ok: false, error: protocolError("hello must match NegotiationHandshake") };
35
+ }
36
+ const serverRead = new Set([...serverHello.supportedReadSchemas, ...(options.extraReadSchemas ?? [])]);
37
+ const schemaOverlap = hello.supportedReadSchemas.some((schema) => serverRead.has(schema));
38
+ if (!schemaOverlap) {
39
+ return {
40
+ ok: false,
41
+ error: new ControlError("TF_SCHEMA_UNSUPPORTED", `no overlapping supported read schema (client: ${hello.supportedReadSchemas.join(",")})`, { recoveryAction: "refresh", sideEffects: "none" }),
42
+ };
43
+ }
44
+ const clientRequired = hello.requiredFeatures ?? [];
45
+ for (const feature of clientRequired) {
46
+ if (!(serverHello.offeredFeatures ?? []).includes(feature)) {
47
+ return {
48
+ ok: false,
49
+ error: new ControlError("TF_FEATURE_REQUIRED", `client requires feature ${JSON.stringify(feature)} which this control does not offer`, { recoveryAction: "refresh", sideEffects: "none" }),
50
+ };
51
+ }
52
+ }
53
+ for (const feature of requiredFeatures) {
54
+ if (!(hello.offeredFeatures ?? []).includes(feature)) {
55
+ return {
56
+ ok: false,
57
+ error: new ControlError("TF_FEATURE_REQUIRED", `control requires feature ${JSON.stringify(feature)} which the client does not offer`, { recoveryAction: "refresh", sideEffects: "none" }),
58
+ };
59
+ }
60
+ }
61
+ return { ok: true, serverHello };
62
+ };
63
+ return {
64
+ get greeted() {
65
+ return greeted;
66
+ },
67
+ serverHello,
68
+ hello(clientHello) {
69
+ const verdict = validate(clientHello);
70
+ if (verdict.ok)
71
+ greeted = true;
72
+ return verdict;
73
+ },
74
+ };
75
+ }
76
+ /** Rejection for any RPC attempted before a successful hello. */
77
+ export function helloRequiredError() {
78
+ return protocolError("hello must precede any RPC on this control channel");
79
+ }
80
+ //# sourceMappingURL=hello.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hello.js","sourceRoot":"","sources":["../../../taskflow-control/src/hello.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { ProjectRegistry, type ProjectMount } from "./project-registry.ts";
2
+ import { type AuthorizationAuthority, type VerifiedContext } from "./authorization.ts";
3
+ import { UserCoordinatorStore } from "./store/coordinator-store.ts";
4
+ import { RuntimeTeExecutionProvider } from "./runtime-provider.ts";
5
+ import type { CoordinatorLease } from "./schema/coordinator.ts";
6
+ import type { EvidenceStore, TerminalEvidenceObservation } from "./store/evidence-store.ts";
7
+ export interface HostRuntimeOptions {
8
+ registry: ProjectRegistry;
9
+ authorization: AuthorizationAuthority;
10
+ provider: RuntimeTeExecutionProvider;
11
+ controlHome: string;
12
+ epoch: () => number;
13
+ holderId: () => string;
14
+ liveLease: () => CoordinatorLease | null;
15
+ maxActiveRuns?: number;
16
+ durableApprovalAvailable?: (context: VerifiedContext) => boolean;
17
+ evidenceFactory?: (mount: ProjectMount, verify: HostRuntime["verifyTerminal"]) => EvidenceStore | Promise<EvidenceStore>;
18
+ }
19
+ export declare class HostRuntime {
20
+ #private;
21
+ readonly options: HostRuntimeOptions;
22
+ readonly coordinator: UserCoordinatorStore<VerifiedContext>;
23
+ constructor(options: HostRuntimeOptions);
24
+ initialize(): Promise<void>;
25
+ close(): void;
26
+ dispatch(context: VerifiedContext, method: string, raw: unknown): Promise<unknown>;
27
+ verifyTerminal(project: {
28
+ projectId: string;
29
+ controlDomainId: string;
30
+ }, runId: string, eventId: string): Promise<TerminalEvidenceObservation>;
31
+ }
32
+ //# sourceMappingURL=host-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-runtime.d.ts","sourceRoot":"","sources":["../../../taskflow-control/src/host-runtime.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,KAAK,sBAAsB,EAAE,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAUnE,OAAO,KAAK,EAAE,gBAAgB,EAA0B,MAAM,yBAAyB,CAAC;AACxF,OAAO,KAAK,EAAE,aAAa,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAI5F,MAAM,WAAW,kBAAkB;IAClC,QAAQ,EAAE,eAAe,CAAC;IAAC,aAAa,EAAE,sBAAsB,CAAC;IAAC,QAAQ,EAAE,0BAA0B,CAAC;IACvG,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,gBAAgB,GAAG,IAAI,CAAC;IAC3G,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wBAAwB,CAAC,EAAE,CAAC,OAAO,EAAC,eAAe,KAAG,OAAO,CAAC;IAC9D,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAAK,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACzH;AAMD,qBAAa,WAAW;;IACvB,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACrC,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC,eAAe,CAAC,CAAC;IAO5D,YAAY,OAAO,EAAE,kBAAkB,EA0BtC;IACK,UAAU,kBAA2C;IAC3D,KAAK,SAAqD;IAUpD,QAAQ,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAqEvF;IA4OK,cAAc,CAAC,OAAO,EAAE;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAE,OAAO,CAAC,2BAA2B,CAAC,CAU/I;CACD"}