@sublang/slc 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 (137) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +192 -0
  3. package/dist/app.d.ts +85 -0
  4. package/dist/app.d.ts.map +1 -0
  5. package/dist/app.js +233 -0
  6. package/dist/app.js.map +1 -0
  7. package/dist/artifacts.d.ts +61 -0
  8. package/dist/artifacts.d.ts.map +1 -0
  9. package/dist/artifacts.js +97 -0
  10. package/dist/artifacts.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +26 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/cligent-agent.d.ts +11 -0
  16. package/dist/cligent-agent.d.ts.map +1 -0
  17. package/dist/cligent-agent.js +66 -0
  18. package/dist/cligent-agent.js.map +1 -0
  19. package/dist/compiled-executor.d.ts +42 -0
  20. package/dist/compiled-executor.d.ts.map +1 -0
  21. package/dist/compiled-executor.js +433 -0
  22. package/dist/compiled-executor.js.map +1 -0
  23. package/dist/config-file.d.ts +52 -0
  24. package/dist/config-file.d.ts.map +1 -0
  25. package/dist/config-file.js +159 -0
  26. package/dist/config-file.js.map +1 -0
  27. package/dist/config.d.ts +82 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/config.js +161 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/entry-module.d.ts +22 -0
  32. package/dist/entry-module.d.ts.map +1 -0
  33. package/dist/entry-module.js +216 -0
  34. package/dist/entry-module.js.map +1 -0
  35. package/dist/execution.d.ts +71 -0
  36. package/dist/execution.d.ts.map +1 -0
  37. package/dist/execution.js +207 -0
  38. package/dist/execution.js.map +1 -0
  39. package/dist/file-capability.d.ts +46 -0
  40. package/dist/file-capability.d.ts.map +1 -0
  41. package/dist/file-capability.js +234 -0
  42. package/dist/file-capability.js.map +1 -0
  43. package/dist/file-grants.d.ts +79 -0
  44. package/dist/file-grants.d.ts.map +1 -0
  45. package/dist/file-grants.js +133 -0
  46. package/dist/file-grants.js.map +1 -0
  47. package/dist/hash.d.ts +14 -0
  48. package/dist/hash.d.ts.map +1 -0
  49. package/dist/hash.js +34 -0
  50. package/dist/hash.js.map +1 -0
  51. package/dist/index.d.ts +20 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +22 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/interpreter.d.ts +48 -0
  56. package/dist/interpreter.d.ts.map +1 -0
  57. package/dist/interpreter.js +118 -0
  58. package/dist/interpreter.js.map +1 -0
  59. package/dist/invocation.d.ts +64 -0
  60. package/dist/invocation.d.ts.map +1 -0
  61. package/dist/invocation.js +148 -0
  62. package/dist/invocation.js.map +1 -0
  63. package/dist/link.d.ts +63 -0
  64. package/dist/link.d.ts.map +1 -0
  65. package/dist/link.js +172 -0
  66. package/dist/link.js.map +1 -0
  67. package/dist/markdown.d.ts +12 -0
  68. package/dist/markdown.d.ts.map +1 -0
  69. package/dist/markdown.js +63 -0
  70. package/dist/markdown.js.map +1 -0
  71. package/dist/normalize.md +68 -0
  72. package/dist/phase-runner.d.ts +64 -0
  73. package/dist/phase-runner.d.ts.map +1 -0
  74. package/dist/phase-runner.js +322 -0
  75. package/dist/phase-runner.js.map +1 -0
  76. package/dist/phase.d.ts +62 -0
  77. package/dist/phase.d.ts.map +1 -0
  78. package/dist/phase.js +111 -0
  79. package/dist/phase.js.map +1 -0
  80. package/dist/pin-closure.d.ts +19 -0
  81. package/dist/pin-closure.d.ts.map +1 -0
  82. package/dist/pin-closure.js +110 -0
  83. package/dist/pin-closure.js.map +1 -0
  84. package/dist/pin-currency.d.ts +55 -0
  85. package/dist/pin-currency.d.ts.map +1 -0
  86. package/dist/pin-currency.js +435 -0
  87. package/dist/pin-currency.js.map +1 -0
  88. package/dist/pin-generate.d.ts +46 -0
  89. package/dist/pin-generate.d.ts.map +1 -0
  90. package/dist/pin-generate.js +131 -0
  91. package/dist/pin-generate.js.map +1 -0
  92. package/dist/pin-paths.d.ts +11 -0
  93. package/dist/pin-paths.d.ts.map +1 -0
  94. package/dist/pin-paths.js +108 -0
  95. package/dist/pin-paths.js.map +1 -0
  96. package/dist/pins.d.ts +84 -0
  97. package/dist/pins.d.ts.map +1 -0
  98. package/dist/pins.js +265 -0
  99. package/dist/pins.js.map +1 -0
  100. package/dist/pipeline.d.ts +61 -0
  101. package/dist/pipeline.d.ts.map +1 -0
  102. package/dist/pipeline.js +147 -0
  103. package/dist/pipeline.js.map +1 -0
  104. package/dist/playbook-contract.d.ts +194 -0
  105. package/dist/playbook-contract.d.ts.map +1 -0
  106. package/dist/playbook-contract.js +180 -0
  107. package/dist/playbook-contract.js.map +1 -0
  108. package/dist/playbook-ports.d.ts +53 -0
  109. package/dist/playbook-ports.d.ts.map +1 -0
  110. package/dist/playbook-ports.js +217 -0
  111. package/dist/playbook-ports.js.map +1 -0
  112. package/dist/resolver.d.ts +68 -0
  113. package/dist/resolver.d.ts.map +1 -0
  114. package/dist/resolver.js +133 -0
  115. package/dist/resolver.js.map +1 -0
  116. package/dist/runner.d.ts +45 -0
  117. package/dist/runner.d.ts.map +1 -0
  118. package/dist/runner.js +506 -0
  119. package/dist/runner.js.map +1 -0
  120. package/dist/runtime-package.d.ts +7 -0
  121. package/dist/runtime-package.d.ts.map +1 -0
  122. package/dist/runtime-package.js +132 -0
  123. package/dist/runtime-package.js.map +1 -0
  124. package/dist/slc.config.template.yaml +5 -0
  125. package/dist/verify-coverage.d.ts +99 -0
  126. package/dist/verify-coverage.d.ts.map +1 -0
  127. package/dist/verify-coverage.js +1949 -0
  128. package/dist/verify-coverage.js.map +1 -0
  129. package/dist/verify-support.d.ts +10 -0
  130. package/dist/verify-support.d.ts.map +1 -0
  131. package/dist/verify-support.js +52 -0
  132. package/dist/verify-support.js.map +1 -0
  133. package/dist/verify.d.ts +393 -0
  134. package/dist/verify.d.ts.map +1 -0
  135. package/dist/verify.js +1790 -0
  136. package/dist/verify.js.map +1 -0
  137. package/package.json +76 -0
@@ -0,0 +1,61 @@
1
+ import { type Phase } from './phase.js';
2
+ /**
3
+ * Maps a pipeline reference to candidate directories. DR-001 leaves the actual
4
+ * resolution to the consumer; `slc` only enforces that exactly one resolves.
5
+ */
6
+ export type PipelineResolver = (reference: string) => string[] | Promise<string[]>;
7
+ /** A resolved pipeline: its directory, ordered phases, passes, and optional link phase. */
8
+ export interface Pipeline {
9
+ /** The resolved pipeline directory. */
10
+ dir: string;
11
+ /** Ordinary compile phases in entry-to-exit order. */
12
+ phases: Phase[];
13
+ /**
14
+ * Format-preserving pass phases, sorted by name. Passes sit outside the
15
+ * linear chain; a compile schedules them only on request (DR-013).
16
+ */
17
+ passes: Phase[];
18
+ /** Path to the reserved `link.md`, or `null` when absent. */
19
+ linkFile: string | null;
20
+ }
21
+ /** Machine-readable reason a pipeline was refused. */
22
+ export type PipelineErrorCode = 'unresolved-pipeline' | 'ambiguous-pipeline' | 'chain-incomplete' | 'chain-branch' | 'chain-cycle';
23
+ /** Raised when a pipeline cannot be resolved or its chain is invalid (DR-001). */
24
+ export declare class PipelineError extends Error {
25
+ readonly code: PipelineErrorCode;
26
+ constructor(code: PipelineErrorCode, message: string);
27
+ }
28
+ /**
29
+ * Resolves a pipeline reference to exactly one directory (PIPE-16).
30
+ *
31
+ * @throws {PipelineError} when the reference resolves to zero (`unresolved`) or
32
+ * more than one (`ambiguous`) directory.
33
+ */
34
+ export declare function resolvePipeline(reference: string, resolver: PipelineResolver): Promise<string>;
35
+ /**
36
+ * Lists the `.md` files directly inside a resolved pipeline directory (PIPE-17).
37
+ *
38
+ * Subdirectories are not descended into, and `link.md` is returned separately as
39
+ * the reserved link phase rather than as an ordinary phase file.
40
+ */
41
+ export declare function discoverPhaseFiles(dir: string): Promise<{
42
+ phaseFiles: string[];
43
+ linkFile: string | null;
44
+ }>;
45
+ /**
46
+ * Infers the single linear phase order by chaining each phase's target format to
47
+ * the next phase's source format (PIPE-4).
48
+ *
49
+ * @throws {PipelineError} when the chain is incomplete, branches, or cycles
50
+ * (PIPE-5).
51
+ */
52
+ export declare function inferChain(phases: readonly Phase[]): Phase[];
53
+ /**
54
+ * Discovers, loads, and orders the ordinary phases of a pipeline directory,
55
+ * validating extension consistency (PIPE-3) and chain shape (PIPE-4, PIPE-5).
56
+ * Format-preserving pass phases are split out of chain inference (DR-013) and
57
+ * returned sorted by name. Names cannot collide: every phase — chain or pass —
58
+ * is named by its unique filename, and `link.md` is reserved before loading.
59
+ */
60
+ export declare function loadPipeline(dir: string): Promise<Pipeline>;
61
+ //# sourceMappingURL=pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAgBA,OAAO,EAGL,KAAK,KAAK,EACX,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAC7B,SAAS,EAAE,MAAM,KACd,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AAElC,2FAA2F;AAC3F,MAAM,WAAW,QAAQ;IACvB,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,sDAAsD;IACtD,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB;;;OAGG;IACH,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,sDAAsD;AACtD,MAAM,MAAM,iBAAiB,GACzB,qBAAqB,GACrB,oBAAoB,GACpB,kBAAkB,GAClB,cAAc,GACd,aAAa,CAAC;AAElB,kFAAkF;AAClF,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;gBAErB,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM;CAKrD;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,MAAM,CAAC,CAejB;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAe5D;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,KAAK,EAAE,CAkD5D;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAiBjE"}
@@ -0,0 +1,147 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // SPDX-FileCopyrightText: 2026 SubLang International <https://sublang.ai>
3
+ /**
4
+ * Pipeline resolution, phase discovery, and chain inference (DR-001).
5
+ *
6
+ * Implements PIPE-16 (refuse a reference that resolves to other than one
7
+ * directory), PIPE-17 (discover phase files directly in a pipeline directory,
8
+ * reserving `link.md`), PIPE-4 (infer the single linear phase order), and
9
+ * PIPE-5 (refuse incomplete, branching, or cyclic chains). See
10
+ * specs/dev/pipeline.md.
11
+ */
12
+ import { readdir } from 'node:fs/promises';
13
+ import { join } from 'node:path';
14
+ import { checkExtensionConsistency, loadPhaseFile, } from './phase.js';
15
+ /** Raised when a pipeline cannot be resolved or its chain is invalid (DR-001). */
16
+ export class PipelineError extends Error {
17
+ code;
18
+ constructor(code, message) {
19
+ super(message);
20
+ this.name = 'PipelineError';
21
+ this.code = code;
22
+ }
23
+ }
24
+ /**
25
+ * Resolves a pipeline reference to exactly one directory (PIPE-16).
26
+ *
27
+ * @throws {PipelineError} when the reference resolves to zero (`unresolved`) or
28
+ * more than one (`ambiguous`) directory.
29
+ */
30
+ export async function resolvePipeline(reference, resolver) {
31
+ const candidates = await resolver(reference);
32
+ if (candidates.length === 0) {
33
+ throw new PipelineError('unresolved-pipeline', `pipeline reference "${reference}" did not resolve to a pipeline directory`);
34
+ }
35
+ if (candidates.length > 1) {
36
+ throw new PipelineError('ambiguous-pipeline', `pipeline reference "${reference}" resolved to multiple directories: ${candidates.join(', ')}`);
37
+ }
38
+ return candidates[0];
39
+ }
40
+ /**
41
+ * Lists the `.md` files directly inside a resolved pipeline directory (PIPE-17).
42
+ *
43
+ * Subdirectories are not descended into, and `link.md` is returned separately as
44
+ * the reserved link phase rather than as an ordinary phase file.
45
+ */
46
+ export async function discoverPhaseFiles(dir) {
47
+ const entries = await readdir(dir, { withFileTypes: true });
48
+ const phaseFiles = [];
49
+ let linkFile = null;
50
+ for (const entry of entries) {
51
+ if (!entry.isFile() || !entry.name.endsWith('.md'))
52
+ continue;
53
+ const full = join(dir, entry.name);
54
+ if (entry.name === 'link.md') {
55
+ linkFile = full;
56
+ }
57
+ else {
58
+ phaseFiles.push(full);
59
+ }
60
+ }
61
+ phaseFiles.sort();
62
+ return { phaseFiles, linkFile };
63
+ }
64
+ /**
65
+ * Infers the single linear phase order by chaining each phase's target format to
66
+ * the next phase's source format (PIPE-4).
67
+ *
68
+ * @throws {PipelineError} when the chain is incomplete, branches, or cycles
69
+ * (PIPE-5).
70
+ */
71
+ export function inferChain(phases) {
72
+ if (phases.length === 0) {
73
+ throw new PipelineError('chain-incomplete', 'pipeline has no phases');
74
+ }
75
+ const producers = new Map();
76
+ const consumers = new Map();
77
+ for (const phase of phases) {
78
+ push(producers, phase.target.format, phase);
79
+ push(consumers, phase.source.format, phase);
80
+ }
81
+ branchGuard(producers, 'produced');
82
+ branchGuard(consumers, 'consumed');
83
+ const entries = phases.filter((phase) => !producers.has(phase.source.format));
84
+ if (entries.length === 0) {
85
+ throw new PipelineError('chain-cycle', 'pipeline chain has no entry phase');
86
+ }
87
+ if (entries.length > 1) {
88
+ throw new PipelineError('chain-branch', `multiple entry phases: ${names(entries)}`);
89
+ }
90
+ const ordered = [];
91
+ const visited = new Set();
92
+ let current = entries[0];
93
+ while (current !== undefined) {
94
+ if (visited.has(current)) {
95
+ throw new PipelineError('chain-cycle', `pipeline chain revisits phase "${current.name}"`);
96
+ }
97
+ visited.add(current);
98
+ ordered.push(current);
99
+ current = consumers.get(current.target.format)?.[0];
100
+ }
101
+ if (visited.size !== phases.length) {
102
+ const missing = phases.filter((phase) => !visited.has(phase));
103
+ throw new PipelineError('chain-incomplete', `phases not connected into a single chain: ${names(missing)}`);
104
+ }
105
+ return ordered;
106
+ }
107
+ /**
108
+ * Discovers, loads, and orders the ordinary phases of a pipeline directory,
109
+ * validating extension consistency (PIPE-3) and chain shape (PIPE-4, PIPE-5).
110
+ * Format-preserving pass phases are split out of chain inference (DR-013) and
111
+ * returned sorted by name. Names cannot collide: every phase — chain or pass —
112
+ * is named by its unique filename, and `link.md` is reserved before loading.
113
+ */
114
+ export async function loadPipeline(dir) {
115
+ const { phaseFiles, linkFile } = await discoverPhaseFiles(dir);
116
+ const loaded = await Promise.all(phaseFiles.map((file) => loadPhaseFile(file)));
117
+ checkExtensionConsistency(loaded);
118
+ const passes = loaded
119
+ .filter((phase) => phase.pass)
120
+ .sort((left, right) => left.name < right.name ? -1 : left.name > right.name ? 1 : 0);
121
+ return {
122
+ dir,
123
+ phases: inferChain(loaded.filter((phase) => !phase.pass)),
124
+ passes,
125
+ linkFile,
126
+ };
127
+ }
128
+ function branchGuard(byFormat, verb) {
129
+ for (const [format, phases] of byFormat) {
130
+ if (phases.length > 1) {
131
+ throw new PipelineError('chain-branch', `format "${format}" is ${verb} by multiple phases: ${names(phases)}`);
132
+ }
133
+ }
134
+ }
135
+ function push(map, key, value) {
136
+ const existing = map.get(key);
137
+ if (existing === undefined) {
138
+ map.set(key, [value]);
139
+ }
140
+ else {
141
+ existing.push(value);
142
+ }
143
+ }
144
+ function names(phases) {
145
+ return phases.map((phase) => phase.name).join(', ');
146
+ }
147
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Compatibility types for Playbook's evolving pre-1.0 runtime contract.
3
+ *
4
+ * The installed `@sublang/playbook` now supplies the composed six-port
5
+ * contract, so the retired 0.9 profile is frozen here as local structural
6
+ * types: legacy artifacts keep executing against the exact shapes they were
7
+ * compiled for, independent of how the shared contract module evolves
8
+ * (DR-010, DR-011).
9
+ */
10
+ /** The frozen 0.9 player result (DR-010 legacy profile). */
11
+ export interface LegacyPlayerResult {
12
+ status: 'ok' | 'aborted' | 'error';
13
+ finalText?: string;
14
+ error?: string;
15
+ }
16
+ /** The frozen 0.9 four-port boundary (DR-010 legacy profile). */
17
+ export interface LegacyPlaybookPorts {
18
+ callPlayer(playerId: string, prompt: string, signal: AbortSignal): Promise<LegacyPlayerResult>;
19
+ callJudge(prompt: string, signal: AbortSignal): Promise<string>;
20
+ emitStatus(message: string, data?: unknown): Promise<void>;
21
+ emitTelemetry(event: {
22
+ topic: string;
23
+ payload: unknown;
24
+ }): Promise<void>;
25
+ }
26
+ /** The frozen 0.9 runtime surface (DR-010 legacy profile). */
27
+ export interface LegacyPlaybookRuntime {
28
+ init(ports: LegacyPlaybookPorts): Promise<void>;
29
+ handleBossInput(turn: {
30
+ text: string;
31
+ signal: AbortSignal;
32
+ }): Promise<void>;
33
+ dispose(): Promise<void>;
34
+ }
35
+ export interface PlayerCallOptions {
36
+ resume: string | false;
37
+ }
38
+ export interface PlayerResult extends LegacyPlayerResult {
39
+ resumeToken?: string;
40
+ }
41
+ export interface CaptainCallOptions {
42
+ visibility: 'visible' | 'hidden';
43
+ resume: false;
44
+ /**
45
+ * Source-owned tool restriction: an explicitly empty allowlist for
46
+ * routing-only Captains; absent for transformation-performing Captains,
47
+ * which work through the host Captain's tools (link.md §PlaybookPorts).
48
+ */
49
+ allowedTools?: readonly [];
50
+ }
51
+ export interface CaptainResult {
52
+ status: 'ok' | 'aborted' | 'error';
53
+ finalText?: string;
54
+ error?: string;
55
+ }
56
+ export type RuntimeContractProfile = 'legacy' | 'session-v1' | 'composed-v2';
57
+ export type JsonValue = null | boolean | number | string | readonly JsonValue[] | {
58
+ readonly [key: string]: JsonValue;
59
+ };
60
+ export interface NormalizedError {
61
+ name: string;
62
+ message: string;
63
+ stack?: string;
64
+ }
65
+ export type PlaybookStateValue = string | {
66
+ readonly [key: string]: PlaybookStateValue;
67
+ };
68
+ export interface PlaybookState {
69
+ value: PlaybookStateValue;
70
+ activeStateIds: readonly string[];
71
+ tags: readonly string[];
72
+ status: 'active' | 'done' | 'error' | 'stopped';
73
+ quiescent: boolean;
74
+ stateId?: string;
75
+ }
76
+ export interface PlaybookPendingCall {
77
+ callId: string;
78
+ playbookId: string;
79
+ childSessionId: string;
80
+ }
81
+ export interface PlaybookCallRequest {
82
+ callId: string;
83
+ playbookId: string;
84
+ text: string;
85
+ }
86
+ export type PlaybookCallResult = {
87
+ status: 'ok';
88
+ playbookId: string;
89
+ childSessionId: string;
90
+ state?: PlaybookState;
91
+ output?: JsonValue;
92
+ } | {
93
+ status: 'aborted';
94
+ playbookId: string;
95
+ childSessionId?: string;
96
+ state?: PlaybookState;
97
+ error?: NormalizedError;
98
+ } | {
99
+ status: 'error';
100
+ playbookId: string;
101
+ childSessionId?: string;
102
+ state?: PlaybookState;
103
+ error: NormalizedError;
104
+ };
105
+ export type PlaybookCallStart = {
106
+ state: 'settled';
107
+ result: PlaybookCallResult;
108
+ } | {
109
+ state: 'suspended';
110
+ childSessionId: string;
111
+ };
112
+ export type PlaybookRunResult = {
113
+ outcome: 'quiescent' | 'no-action';
114
+ state: PlaybookState;
115
+ } | {
116
+ outcome: 'failed' | 'aborted';
117
+ state: PlaybookState;
118
+ error?: NormalizedError;
119
+ } | {
120
+ outcome: 'terminal';
121
+ state: PlaybookState;
122
+ output?: JsonValue;
123
+ } | {
124
+ outcome: 'suspended';
125
+ state: PlaybookState;
126
+ pendingCall: PlaybookPendingCall;
127
+ };
128
+ /** The six source-owned ports, additive over the locked four-port contract. */
129
+ export interface CompatiblePlaybookPorts extends LegacyPlaybookPorts {
130
+ callPlayer(playerId: string, prompt: string, signal: AbortSignal, options?: PlayerCallOptions): Promise<PlayerResult>;
131
+ callCaptain(prompt: string, signal: AbortSignal, options: CaptainCallOptions): Promise<CaptainResult>;
132
+ callPlaybook(request: PlaybookCallRequest, signal: AbortSignal): Promise<PlaybookCallStart>;
133
+ }
134
+ /** The exact six-port composed-session boundary. */
135
+ export interface ComposedPlaybookPorts {
136
+ callPlayer(playerId: string, prompt: string, signal: AbortSignal, options: PlayerCallOptions): Promise<PlayerResult>;
137
+ callCaptain(prompt: string, signal: AbortSignal, options: CaptainCallOptions): Promise<CaptainResult>;
138
+ callJudge(prompt: string, signal: AbortSignal): Promise<string>;
139
+ callPlaybook(request: PlaybookCallRequest, signal: AbortSignal): Promise<PlaybookCallStart>;
140
+ emitStatus(message: string, data?: unknown): Promise<void>;
141
+ emitTelemetry(event: {
142
+ topic: string;
143
+ payload: unknown;
144
+ }): Promise<void>;
145
+ }
146
+ /** The committed traced-session contract: explicit resume but no child port. */
147
+ export interface SessionV1PlaybookPorts {
148
+ callPlayer(playerId: string, prompt: string, signal: AbortSignal, options: PlayerCallOptions): Promise<PlayerResult>;
149
+ callJudge(prompt: string, signal: AbortSignal): Promise<string>;
150
+ emitStatus(message: string, data?: unknown): Promise<void>;
151
+ emitTelemetry(event: {
152
+ topic: string;
153
+ payload: unknown;
154
+ }): Promise<void>;
155
+ }
156
+ export interface PlaybookSessionV1 {
157
+ sessionId: string;
158
+ playbookId: string;
159
+ ports: SessionV1PlaybookPorts;
160
+ }
161
+ export interface PlaybookSession {
162
+ sessionId: string;
163
+ playbookId: string;
164
+ rootSessionId: string;
165
+ parentSessionId?: string;
166
+ parentCallId?: string;
167
+ depth: number;
168
+ ports: ComposedPlaybookPorts;
169
+ }
170
+ export interface SessionPlaybookRuntime {
171
+ init(session: PlaybookSession): Promise<void>;
172
+ handleBossInput(turn: {
173
+ text: string;
174
+ signal: AbortSignal;
175
+ }): Promise<PlaybookRunResult | void>;
176
+ resumePlaybookCall?(input: {
177
+ callId: string;
178
+ result: PlaybookCallResult;
179
+ signal: AbortSignal;
180
+ }): Promise<PlaybookRunResult>;
181
+ dispose(): Promise<void>;
182
+ }
183
+ export interface SessionV1PlaybookRuntime {
184
+ init(session: PlaybookSessionV1): Promise<void>;
185
+ handleBossInput(turn: {
186
+ text: string;
187
+ signal: AbortSignal;
188
+ }): Promise<void>;
189
+ dispose(): Promise<void>;
190
+ }
191
+ export type CompatiblePlaybookRuntime = LegacyPlaybookRuntime | SessionV1PlaybookRuntime | SessionPlaybookRuntime;
192
+ export type CompatiblePlaybookRuntimeFactory<Options = unknown> = (options: Options) => CompatiblePlaybookRuntime;
193
+ export declare function isPlaybookRunResult(value: unknown): value is PlaybookRunResult;
194
+ //# sourceMappingURL=playbook-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playbook-contract.d.ts","sourceRoot":"","sources":["../src/playbook-contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,180 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // SPDX-FileCopyrightText: 2026 SubLang International <https://sublang.ai>
3
+ export function isPlaybookRunResult(value) {
4
+ try {
5
+ const fields = dataRecord(value);
6
+ if (fields === null || typeof fields.outcome !== 'string')
7
+ return false;
8
+ if (!isPlaybookState(fields.state))
9
+ return false;
10
+ switch (fields.outcome) {
11
+ case 'quiescent':
12
+ case 'no-action':
13
+ return hasExactKeys(fields, ['outcome', 'state']);
14
+ case 'failed':
15
+ case 'aborted':
16
+ return (hasExactKeys(fields, ['outcome', 'state', 'error']) &&
17
+ (fields.error === undefined || isNormalizedError(fields.error)));
18
+ case 'terminal':
19
+ return (hasExactKeys(fields, ['outcome', 'state', 'output']) &&
20
+ (fields.output === undefined || isJsonValue(fields.output)));
21
+ case 'suspended': {
22
+ const pendingCall = dataRecord(fields.pendingCall);
23
+ return (hasExactKeys(fields, ['outcome', 'state', 'pendingCall']) &&
24
+ pendingCall !== null &&
25
+ hasExactKeys(pendingCall, [
26
+ 'callId',
27
+ 'playbookId',
28
+ 'childSessionId',
29
+ ]) &&
30
+ nonEmptyString(pendingCall.callId) &&
31
+ nonEmptyString(pendingCall.playbookId) &&
32
+ nonEmptyString(pendingCall.childSessionId));
33
+ }
34
+ default:
35
+ return false;
36
+ }
37
+ }
38
+ catch {
39
+ // Hostile accessors/proxies are invalid results, not control-plane errors.
40
+ return false;
41
+ }
42
+ }
43
+ function isPlaybookState(value) {
44
+ const fields = dataRecord(value);
45
+ if (fields === null ||
46
+ !hasExactKeys(fields, [
47
+ 'value',
48
+ 'activeStateIds',
49
+ 'tags',
50
+ 'status',
51
+ 'quiescent',
52
+ 'stateId',
53
+ ])) {
54
+ return false;
55
+ }
56
+ if (typeof fields.quiescent !== 'boolean' ||
57
+ !Array.isArray(fields.activeStateIds) ||
58
+ !fields.activeStateIds.every((item) => typeof item === 'string') ||
59
+ !Array.isArray(fields.tags) ||
60
+ !fields.tags.every((item) => typeof item === 'string') ||
61
+ typeof fields.status !== 'string' ||
62
+ !['active', 'done', 'error', 'stopped'].includes(fields.status) ||
63
+ (fields.stateId !== undefined && !nonEmptyString(fields.stateId))) {
64
+ return false;
65
+ }
66
+ return isPlaybookStateValue(fields.value);
67
+ }
68
+ function isNormalizedError(value) {
69
+ const fields = dataRecord(value);
70
+ return (fields !== null &&
71
+ hasExactKeys(fields, ['name', 'message', 'stack']) &&
72
+ typeof fields.name === 'string' &&
73
+ typeof fields.message === 'string' &&
74
+ (fields.stack === undefined || typeof fields.stack === 'string'));
75
+ }
76
+ function dataRecord(value) {
77
+ if (!isRecord(value) || !isPlainRecord(value))
78
+ return null;
79
+ if (Object.getOwnPropertySymbols(value).length > 0)
80
+ return null;
81
+ const out = Object.create(null);
82
+ for (const [key, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(value))) {
83
+ if (!Object.prototype.hasOwnProperty.call(descriptor, 'value'))
84
+ return null;
85
+ out[key] = descriptor.value;
86
+ }
87
+ return out;
88
+ }
89
+ function hasExactKeys(value, allowed) {
90
+ const keys = Object.keys(value);
91
+ return ((keys.includes('outcome') || !allowed.includes('outcome')) &&
92
+ keys.every((key) => allowed.includes(key)));
93
+ }
94
+ function isPlaybookStateValue(value, ancestors = new Set()) {
95
+ if (typeof value === 'string')
96
+ return true;
97
+ if (!isRecord(value) || !isPlainRecord(value))
98
+ return false;
99
+ if (ancestors.has(value))
100
+ return false;
101
+ const values = enumerableDataValues(value);
102
+ if (values === null)
103
+ return false;
104
+ ancestors.add(value);
105
+ const valid = values.every((item) => isPlaybookStateValue(item, ancestors));
106
+ ancestors.delete(value);
107
+ return valid;
108
+ }
109
+ function isJsonValue(value, ancestors = new Set()) {
110
+ if (value === null ||
111
+ typeof value === 'string' ||
112
+ typeof value === 'boolean') {
113
+ return true;
114
+ }
115
+ if (typeof value === 'number')
116
+ return Number.isFinite(value);
117
+ if (typeof value !== 'object')
118
+ return false;
119
+ if (ancestors.has(value))
120
+ return false;
121
+ ancestors.add(value);
122
+ let valid;
123
+ if (Array.isArray(value)) {
124
+ valid = isJsonArray(value, ancestors);
125
+ }
126
+ else {
127
+ const values = isPlainRecord(value) ? enumerableDataValues(value) : null;
128
+ valid =
129
+ values !== null && values.every((item) => isJsonValue(item, ancestors));
130
+ }
131
+ ancestors.delete(value);
132
+ return valid;
133
+ }
134
+ function isJsonArray(value, ancestors) {
135
+ if (Object.getOwnPropertySymbols(value).length > 0)
136
+ return false;
137
+ const descriptors = Object.getOwnPropertyDescriptors(value);
138
+ for (let index = 0; index < value.length; index++) {
139
+ const descriptor = descriptors[String(index)];
140
+ if (descriptor === undefined ||
141
+ !Object.prototype.hasOwnProperty.call(descriptor, 'value') ||
142
+ !isJsonValue(descriptor.value, ancestors)) {
143
+ return false;
144
+ }
145
+ }
146
+ return Object.entries(descriptors).every(([key, descriptor]) => {
147
+ if (!descriptor.enumerable)
148
+ return true;
149
+ const index = Number(key);
150
+ return (Number.isSafeInteger(index) &&
151
+ index >= 0 &&
152
+ index < value.length &&
153
+ String(index) === key);
154
+ });
155
+ }
156
+ function enumerableDataValues(value) {
157
+ if (Object.getOwnPropertySymbols(value).length > 0)
158
+ return null;
159
+ const values = [];
160
+ for (const descriptor of Object.values(Object.getOwnPropertyDescriptors(value))) {
161
+ if (!descriptor.enumerable)
162
+ continue;
163
+ if (!Object.prototype.hasOwnProperty.call(descriptor, 'value')) {
164
+ return null;
165
+ }
166
+ values.push(descriptor.value);
167
+ }
168
+ return values;
169
+ }
170
+ function isPlainRecord(value) {
171
+ const prototype = Object.getPrototypeOf(value);
172
+ return prototype === Object.prototype || prototype === null;
173
+ }
174
+ function nonEmptyString(value) {
175
+ return typeof value === 'string' && value.trim().length > 0;
176
+ }
177
+ function isRecord(value) {
178
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
179
+ }
180
+ //# sourceMappingURL=playbook-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playbook-contract.js","sourceRoot":"","sources":["../src/playbook-contract.ts"],"names":[],"mappings":"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"}