@superdoc-dev/sdk 1.19.2 → 1.20.1

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 (103) hide show
  1. package/dist/action-primitives/doc-index.cjs +215 -0
  2. package/dist/action-primitives/doc-index.d.ts +83 -0
  3. package/dist/action-primitives/doc-index.d.ts.map +1 -0
  4. package/dist/action-primitives/doc-index.js +211 -0
  5. package/dist/action-primitives/engine.cjs +204 -0
  6. package/dist/action-primitives/engine.d.ts +71 -0
  7. package/dist/action-primitives/engine.d.ts.map +1 -0
  8. package/dist/action-primitives/engine.js +196 -0
  9. package/dist/action-primitives/receipt.cjs +39 -0
  10. package/dist/action-primitives/receipt.d.ts +49 -0
  11. package/dist/action-primitives/receipt.d.ts.map +1 -0
  12. package/dist/action-primitives/receipt.js +32 -0
  13. package/dist/action-primitives/resolve.cjs +252 -0
  14. package/dist/action-primitives/resolve.d.ts +56 -0
  15. package/dist/action-primitives/resolve.d.ts.map +1 -0
  16. package/dist/action-primitives/resolve.js +246 -0
  17. package/dist/action-primitives/session-cache.cjs +43 -0
  18. package/dist/action-primitives/session-cache.d.ts +19 -0
  19. package/dist/action-primitives/session-cache.d.ts.map +1 -0
  20. package/dist/action-primitives/session-cache.js +37 -0
  21. package/dist/action-primitives/tools/list-transform.cjs +661 -0
  22. package/dist/action-primitives/tools/list-transform.d.ts +98 -0
  23. package/dist/action-primitives/tools/list-transform.d.ts.map +1 -0
  24. package/dist/action-primitives/tools/list-transform.js +656 -0
  25. package/dist/action-primitives/tools/structure-insert.cjs +1343 -0
  26. package/dist/action-primitives/tools/structure-insert.d.ts +183 -0
  27. package/dist/action-primitives/tools/structure-insert.d.ts.map +1 -0
  28. package/dist/action-primitives/tools/structure-insert.js +1338 -0
  29. package/dist/action-primitives/tools/text-transform.cjs +669 -0
  30. package/dist/action-primitives/tools/text-transform.d.ts +64 -0
  31. package/dist/action-primitives/tools/text-transform.d.ts.map +1 -0
  32. package/dist/action-primitives/tools/text-transform.js +664 -0
  33. package/dist/action-primitives/types.d.ts +36 -0
  34. package/dist/action-primitives/types.d.ts.map +1 -0
  35. package/dist/action-primitives/types.js +15 -0
  36. package/dist/agent/actions.cjs +5381 -0
  37. package/dist/agent/actions.d.ts +404 -0
  38. package/dist/agent/actions.d.ts.map +1 -0
  39. package/dist/agent/actions.js +5373 -0
  40. package/dist/agent/catalog.cjs +483 -0
  41. package/dist/agent/catalog.d.ts +103 -0
  42. package/dist/agent/catalog.d.ts.map +1 -0
  43. package/dist/agent/catalog.js +471 -0
  44. package/dist/agent/doc-snapshot.cjs +663 -0
  45. package/dist/agent/doc-snapshot.d.ts +247 -0
  46. package/dist/agent/doc-snapshot.d.ts.map +1 -0
  47. package/dist/agent/doc-snapshot.js +657 -0
  48. package/dist/agent/index.d.ts +16 -0
  49. package/dist/agent/index.d.ts.map +1 -0
  50. package/dist/agent/index.js +15 -0
  51. package/dist/agent/ir.cjs +170 -0
  52. package/dist/agent/ir.d.ts +216 -0
  53. package/dist/agent/ir.d.ts.map +1 -0
  54. package/dist/agent/ir.js +181 -0
  55. package/dist/agent/operation-catalog.cjs +418 -0
  56. package/dist/agent/operation-catalog.d.ts +36 -0
  57. package/dist/agent/operation-catalog.d.ts.map +1 -0
  58. package/dist/agent/operation-catalog.js +446 -0
  59. package/dist/agent/runtime.cjs +501 -0
  60. package/dist/agent/runtime.d.ts +120 -0
  61. package/dist/agent/runtime.d.ts.map +1 -0
  62. package/dist/agent/runtime.js +493 -0
  63. package/dist/embedded-prompts.generated.cjs +13 -0
  64. package/dist/embedded-prompts.generated.d.ts +4 -0
  65. package/dist/embedded-prompts.generated.d.ts.map +1 -0
  66. package/dist/embedded-prompts.generated.js +9 -0
  67. package/dist/generated/client.cjs +18 -0
  68. package/dist/generated/client.d.ts +134 -0
  69. package/dist/generated/client.d.ts.map +1 -1
  70. package/dist/generated/client.js +18 -0
  71. package/dist/generated/contract.cjs +622 -3
  72. package/dist/generated/contract.d.ts.map +1 -1
  73. package/dist/generated/contract.js +622 -3
  74. package/dist/index.cjs +3 -7
  75. package/dist/index.d.ts +8 -6
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +2 -8
  78. package/dist/presets/core.cjs +454 -0
  79. package/dist/presets/core.d.ts +20 -0
  80. package/dist/presets/core.d.ts.map +1 -0
  81. package/dist/presets/core.js +447 -0
  82. package/dist/presets.cjs +55 -8
  83. package/dist/presets.d.ts +39 -8
  84. package/dist/presets.d.ts.map +1 -1
  85. package/dist/presets.js +53 -8
  86. package/dist/prompts/mcp-prompt.md +23 -0
  87. package/dist/prompts/system-prompt.md +108 -0
  88. package/dist/runtime/transport-common.cjs +8 -0
  89. package/dist/runtime/transport-common.d.ts.map +1 -1
  90. package/dist/runtime/transport-common.js +8 -0
  91. package/dist/tools.cjs +46 -11
  92. package/dist/tools.d.ts +55 -8
  93. package/dist/tools.d.ts.map +1 -1
  94. package/dist/tools.js +45 -13
  95. package/package.json +9 -8
  96. package/tools/__pycache__/__init__.cpython-312.pyc +0 -0
  97. package/tools/__pycache__/intent_dispatch_generated.cpython-312.pyc +0 -0
  98. package/tools/catalog.json +14 -0
  99. package/tools/tools-policy.json +1 -1
  100. package/tools/tools.anthropic.json +14 -0
  101. package/tools/tools.generic.json +14 -0
  102. package/tools/tools.openai.json +14 -0
  103. package/tools/tools.vercel.json +14 -0
@@ -0,0 +1,252 @@
1
+ 'use strict';
2
+
3
+ function failure(code, message, details) {
4
+ return { ok: false, code, message, details };
5
+ }
6
+ function isResolveFailure(value) {
7
+ return value.ok === false;
8
+ }
9
+ function parseOrdinal(value) {
10
+ if (typeof value !== 'number' || !Number.isInteger(value) || value < 1) {
11
+ return undefined;
12
+ }
13
+ return value;
14
+ }
15
+ function parseWorkflowTargetRequest(raw) {
16
+ if (typeof raw === 'string') {
17
+ const ref = raw.trim();
18
+ if (ref.length === 0) {
19
+ return failure('TARGET_UNSUPPORTED', 'Target reference cannot be empty.');
20
+ }
21
+ return { mode: 'ref', ref };
22
+ }
23
+ if (raw == null || typeof raw !== 'object') {
24
+ return failure('TARGET_UNSUPPORTED', 'Target must be a string ref or a supported target object.', {
25
+ receivedType: raw == null ? 'nullish' : typeof raw,
26
+ });
27
+ }
28
+ const target = raw;
29
+ if (typeof target.by === 'string' && 'value' in target) {
30
+ const by = target.by;
31
+ const value = target.value;
32
+ if (by === 'ref' && typeof value === 'string') {
33
+ return parseWorkflowTargetRequest(value);
34
+ }
35
+ if (by === 'nodeId' && typeof value === 'string' && value.length > 0) {
36
+ return { mode: 'nodeId', nodeId: value };
37
+ }
38
+ if (by === 'blockOrdinal') {
39
+ const parsed = parseOrdinal(value);
40
+ if (parsed != null)
41
+ return { mode: 'blockOrdinal', blockOrdinal: parsed };
42
+ }
43
+ if (by === 'paragraphOrdinal') {
44
+ const parsed = parseOrdinal(value);
45
+ if (parsed != null)
46
+ return { mode: 'paragraphOrdinal', paragraphOrdinal: parsed };
47
+ }
48
+ if (by === 'bodyParagraphOrdinal') {
49
+ const parsed = parseOrdinal(value);
50
+ if (parsed != null)
51
+ return { mode: 'bodyParagraphOrdinal', bodyParagraphOrdinal: parsed };
52
+ }
53
+ if (by === 'headingOrdinal') {
54
+ const parsed = parseOrdinal(value);
55
+ if (parsed != null)
56
+ return { mode: 'headingOrdinal', headingOrdinal: parsed };
57
+ }
58
+ if (by === 'listOrdinal') {
59
+ const parsed = parseOrdinal(value);
60
+ if (parsed != null)
61
+ return { mode: 'listOrdinal', listOrdinal: parsed };
62
+ }
63
+ if (by === 'tableOrdinal') {
64
+ const parsed = parseOrdinal(value);
65
+ if (parsed != null)
66
+ return { mode: 'tableOrdinal', tableOrdinal: parsed };
67
+ }
68
+ return failure('TARGET_UNSUPPORTED', 'Target object has unsupported {by,value} shape.', {
69
+ by,
70
+ valueType: typeof value,
71
+ });
72
+ }
73
+ const supportedKeys = [
74
+ 'ref',
75
+ 'nodeId',
76
+ 'blockOrdinal',
77
+ 'paragraphOrdinal',
78
+ 'bodyParagraphOrdinal',
79
+ 'headingOrdinal',
80
+ 'listOrdinal',
81
+ 'tableOrdinal',
82
+ ];
83
+ const presentKeys = supportedKeys.filter((key) => target[key] != null);
84
+ if (presentKeys.length !== 1) {
85
+ return failure('TARGET_UNSUPPORTED', 'Target object must include exactly one supported key: ref, nodeId, blockOrdinal, paragraphOrdinal, bodyParagraphOrdinal, headingOrdinal, listOrdinal, tableOrdinal.', { presentKeys });
86
+ }
87
+ const key = presentKeys[0];
88
+ if (key === 'ref') {
89
+ return parseWorkflowTargetRequest(target.ref);
90
+ }
91
+ if (key === 'nodeId' && typeof target.nodeId === 'string' && target.nodeId.length > 0) {
92
+ return { mode: 'nodeId', nodeId: target.nodeId };
93
+ }
94
+ if (key === 'blockOrdinal') {
95
+ const parsed = parseOrdinal(target.blockOrdinal);
96
+ if (parsed != null)
97
+ return { mode: 'blockOrdinal', blockOrdinal: parsed };
98
+ }
99
+ if (key === 'paragraphOrdinal') {
100
+ const parsed = parseOrdinal(target.paragraphOrdinal);
101
+ if (parsed != null)
102
+ return { mode: 'paragraphOrdinal', paragraphOrdinal: parsed };
103
+ }
104
+ if (key === 'bodyParagraphOrdinal') {
105
+ const parsed = parseOrdinal(target.bodyParagraphOrdinal);
106
+ if (parsed != null)
107
+ return { mode: 'bodyParagraphOrdinal', bodyParagraphOrdinal: parsed };
108
+ }
109
+ if (key === 'headingOrdinal') {
110
+ const parsed = parseOrdinal(target.headingOrdinal);
111
+ if (parsed != null)
112
+ return { mode: 'headingOrdinal', headingOrdinal: parsed };
113
+ }
114
+ if (key === 'listOrdinal') {
115
+ const parsed = parseOrdinal(target.listOrdinal);
116
+ if (parsed != null)
117
+ return { mode: 'listOrdinal', listOrdinal: parsed };
118
+ }
119
+ if (key === 'tableOrdinal') {
120
+ const parsed = parseOrdinal(target.tableOrdinal);
121
+ if (parsed != null)
122
+ return { mode: 'tableOrdinal', tableOrdinal: parsed };
123
+ }
124
+ return failure('TARGET_UNSUPPORTED', `Target ${key} value is invalid.`, {
125
+ key,
126
+ value: target[key],
127
+ });
128
+ }
129
+ function toResolvedTarget(mode, entity) {
130
+ if (entity.kind === 'block') {
131
+ return {
132
+ mode,
133
+ entityKind: entity.kind,
134
+ nodeId: entity.nodeId,
135
+ ref: entity.ref,
136
+ blockOrdinal: entity.ordinal,
137
+ paragraphOrdinal: entity.paragraphOrdinal,
138
+ bodyParagraphOrdinal: entity.bodyParagraphOrdinal,
139
+ headingOrdinal: entity.headingOrdinal,
140
+ tableOrdinal: entity.tableOrdinal,
141
+ entity,
142
+ };
143
+ }
144
+ if (entity.kind === 'listItem') {
145
+ return {
146
+ mode,
147
+ entityKind: entity.kind,
148
+ nodeId: entity.nodeId,
149
+ ref: entity.ref,
150
+ listOrdinal: entity.apiOrdinal,
151
+ entity,
152
+ };
153
+ }
154
+ return {
155
+ mode,
156
+ entityKind: entity.kind,
157
+ nodeId: entity.nodeId,
158
+ ref: entity.ref,
159
+ blockOrdinal: entity.blockOrdinal,
160
+ tableOrdinal: entity.tableOrdinal,
161
+ entity,
162
+ };
163
+ }
164
+ function resolveUnique(request, candidates, details) {
165
+ const mode = request.mode;
166
+ if (candidates.length === 0) {
167
+ return failure('TARGET_NOT_FOUND', `No workflow target matched ${mode}.`, details);
168
+ }
169
+ if (candidates.length > 1) {
170
+ return failure('TARGET_AMBIGUOUS', `Multiple workflow targets matched ${mode}.`, {
171
+ ...details,
172
+ candidateCount: candidates.length,
173
+ candidateKinds: candidates.map((candidate) => candidate.kind),
174
+ candidateNodeIds: candidates.map((candidate) => candidate.nodeId),
175
+ });
176
+ }
177
+ const matched = candidates[0];
178
+ if (matched == null) {
179
+ return failure('TARGET_NOT_FOUND', `No workflow target matched ${mode}.`, details);
180
+ }
181
+ return { ok: true, request, target: toResolvedTarget(mode, matched) };
182
+ }
183
+ function resolveWorkflowTarget(index, request) {
184
+ if (request.mode === 'ref') {
185
+ const candidates = index.lookup.byRef.get(request.ref) ?? [];
186
+ if (candidates.length > 0) {
187
+ return resolveUnique(request, candidates, { ref: request.ref });
188
+ }
189
+ const nodeIdCandidates = index.lookup.byNodeId.get(request.ref) ?? [];
190
+ return resolveUnique(request, nodeIdCandidates, { ref: request.ref, nodeIdFallback: true });
191
+ }
192
+ if (request.mode === 'nodeId') {
193
+ const candidates = index.lookup.byNodeId.get(request.nodeId) ?? [];
194
+ return resolveUnique(request, candidates, { nodeId: request.nodeId });
195
+ }
196
+ if (request.mode === 'blockOrdinal') {
197
+ // Requests use the 1-based convention (parseOrdinal rejects < 1); the
198
+ // index keys on the doc-api block.ordinal, which is 0-based.
199
+ const block = index.lookup.byBlockOrdinal.get(request.blockOrdinal - 1);
200
+ return resolveUnique(request, block == null ? [] : [block], {
201
+ blockOrdinal: request.blockOrdinal,
202
+ });
203
+ }
204
+ if (request.mode === 'paragraphOrdinal') {
205
+ const block = index.lookup.byParagraphOrdinal.get(request.paragraphOrdinal);
206
+ return resolveUnique(request, block == null ? [] : [block], {
207
+ paragraphOrdinal: request.paragraphOrdinal,
208
+ });
209
+ }
210
+ if (request.mode === 'bodyParagraphOrdinal') {
211
+ const block = index.lookup.byBodyParagraphOrdinal.get(request.bodyParagraphOrdinal);
212
+ return resolveUnique(request, block == null ? [] : [block], {
213
+ bodyParagraphOrdinal: request.bodyParagraphOrdinal,
214
+ });
215
+ }
216
+ if (request.mode === 'headingOrdinal') {
217
+ const block = index.lookup.byHeadingOrdinal.get(request.headingOrdinal);
218
+ return resolveUnique(request, block == null ? [] : [block], {
219
+ headingOrdinal: request.headingOrdinal,
220
+ });
221
+ }
222
+ if (request.mode === 'listOrdinal') {
223
+ if (index.lookup.byListOrdinal.size === 0) {
224
+ return failure('TARGET_MODE_UNAVAILABLE', 'List ordinal resolution is unavailable: index has no API list ordinals.', {
225
+ listCount: index.lists.length,
226
+ });
227
+ }
228
+ const candidates = index.lookup.byListOrdinal.get(request.listOrdinal) ?? [];
229
+ return resolveUnique(request, candidates, { listOrdinal: request.listOrdinal });
230
+ }
231
+ if (index.lookup.byTableOrdinal.size === 0) {
232
+ return failure('TARGET_MODE_UNAVAILABLE', 'Table ordinal resolution is unavailable: index has no tables.', {
233
+ tableCount: index.tables.length,
234
+ });
235
+ }
236
+ const table = index.lookup.byTableOrdinal.get(request.tableOrdinal);
237
+ return resolveUnique(request, table == null ? [] : [table], { tableOrdinal: request.tableOrdinal });
238
+ }
239
+ function resolveWorkflowTargetFromUnknown(index, rawTarget) {
240
+ if (rawTarget == null) {
241
+ return failure('TARGET_REQUIRED', 'No target value was provided.');
242
+ }
243
+ const parsed = parseWorkflowTargetRequest(rawTarget);
244
+ if (isResolveFailure(parsed)) {
245
+ return parsed;
246
+ }
247
+ return resolveWorkflowTarget(index, parsed);
248
+ }
249
+
250
+ exports.parseWorkflowTargetRequest = parseWorkflowTargetRequest;
251
+ exports.resolveWorkflowTarget = resolveWorkflowTarget;
252
+ exports.resolveWorkflowTargetFromUnknown = resolveWorkflowTargetFromUnknown;
@@ -0,0 +1,56 @@
1
+ import type { WorkflowDocIndex, WorkflowIndexedEntity } from './doc-index.js';
2
+ export type WorkflowTargetRequest = {
3
+ mode: 'ref';
4
+ ref: string;
5
+ } | {
6
+ mode: 'nodeId';
7
+ nodeId: string;
8
+ } | {
9
+ mode: 'blockOrdinal';
10
+ blockOrdinal: number;
11
+ } | {
12
+ mode: 'paragraphOrdinal';
13
+ paragraphOrdinal: number;
14
+ } | {
15
+ mode: 'bodyParagraphOrdinal';
16
+ bodyParagraphOrdinal: number;
17
+ } | {
18
+ mode: 'headingOrdinal';
19
+ headingOrdinal: number;
20
+ } | {
21
+ mode: 'listOrdinal';
22
+ listOrdinal: number;
23
+ } | {
24
+ mode: 'tableOrdinal';
25
+ tableOrdinal: number;
26
+ };
27
+ export type WorkflowResolveFailureCode = 'TARGET_REQUIRED' | 'TARGET_UNSUPPORTED' | 'TARGET_NOT_FOUND' | 'TARGET_AMBIGUOUS' | 'TARGET_MODE_UNAVAILABLE';
28
+ export type WorkflowResolveFailure = {
29
+ ok: false;
30
+ code: WorkflowResolveFailureCode;
31
+ message: string;
32
+ details?: Record<string, unknown>;
33
+ };
34
+ export type WorkflowResolvedTarget = {
35
+ mode: WorkflowTargetRequest['mode'];
36
+ entityKind: WorkflowIndexedEntity['kind'];
37
+ nodeId: string;
38
+ ref?: string;
39
+ blockOrdinal?: number;
40
+ paragraphOrdinal?: number;
41
+ bodyParagraphOrdinal?: number;
42
+ headingOrdinal?: number;
43
+ listOrdinal?: number;
44
+ tableOrdinal?: number;
45
+ entity: WorkflowIndexedEntity;
46
+ };
47
+ export type WorkflowResolveSuccess = {
48
+ ok: true;
49
+ request: WorkflowTargetRequest;
50
+ target: WorkflowResolvedTarget;
51
+ };
52
+ export type WorkflowResolveResult = WorkflowResolveSuccess | WorkflowResolveFailure;
53
+ export declare function parseWorkflowTargetRequest(raw: unknown): WorkflowTargetRequest | WorkflowResolveFailure;
54
+ export declare function resolveWorkflowTarget(index: WorkflowDocIndex, request: WorkflowTargetRequest): WorkflowResolveResult;
55
+ export declare function resolveWorkflowTargetFromUnknown(index: WorkflowDocIndex, rawTarget: unknown): WorkflowResolveResult;
56
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/action-primitives/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE9E,MAAM,MAAM,qBAAqB,GAC7B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,oBAAoB,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnD,MAAM,MAAM,0BAA0B,GAClC,iBAAiB,GACjB,oBAAoB,GACpB,kBAAkB,GAClB,kBAAkB,GAClB,yBAAyB,CAAC;AAE9B,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,EAAE,KAAK,CAAC;IACV,IAAI,EAAE,0BAA0B,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACpC,UAAU,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,qBAAqB,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,EAAE,IAAI,CAAC;IACT,OAAO,EAAE,qBAAqB,CAAC;IAC/B,MAAM,EAAE,sBAAsB,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,sBAAsB,GAAG,sBAAsB,CAAC;AAqBpF,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,OAAO,GAAG,qBAAqB,GAAG,sBAAsB,CAqHvG;AAiED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,qBAAqB,GAAG,qBAAqB,CAkEpH;AAED,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,OAAO,GAAG,qBAAqB,CASnH"}
@@ -0,0 +1,246 @@
1
+ function failure(code, message, details) {
2
+ return { ok: false, code, message, details };
3
+ }
4
+ function isResolveFailure(value) {
5
+ return value.ok === false;
6
+ }
7
+ function parseOrdinal(value) {
8
+ if (typeof value !== 'number' || !Number.isInteger(value) || value < 1) {
9
+ return undefined;
10
+ }
11
+ return value;
12
+ }
13
+ export function parseWorkflowTargetRequest(raw) {
14
+ if (typeof raw === 'string') {
15
+ const ref = raw.trim();
16
+ if (ref.length === 0) {
17
+ return failure('TARGET_UNSUPPORTED', 'Target reference cannot be empty.');
18
+ }
19
+ return { mode: 'ref', ref };
20
+ }
21
+ if (raw == null || typeof raw !== 'object') {
22
+ return failure('TARGET_UNSUPPORTED', 'Target must be a string ref or a supported target object.', {
23
+ receivedType: raw == null ? 'nullish' : typeof raw,
24
+ });
25
+ }
26
+ const target = raw;
27
+ if (typeof target.by === 'string' && 'value' in target) {
28
+ const by = target.by;
29
+ const value = target.value;
30
+ if (by === 'ref' && typeof value === 'string') {
31
+ return parseWorkflowTargetRequest(value);
32
+ }
33
+ if (by === 'nodeId' && typeof value === 'string' && value.length > 0) {
34
+ return { mode: 'nodeId', nodeId: value };
35
+ }
36
+ if (by === 'blockOrdinal') {
37
+ const parsed = parseOrdinal(value);
38
+ if (parsed != null)
39
+ return { mode: 'blockOrdinal', blockOrdinal: parsed };
40
+ }
41
+ if (by === 'paragraphOrdinal') {
42
+ const parsed = parseOrdinal(value);
43
+ if (parsed != null)
44
+ return { mode: 'paragraphOrdinal', paragraphOrdinal: parsed };
45
+ }
46
+ if (by === 'bodyParagraphOrdinal') {
47
+ const parsed = parseOrdinal(value);
48
+ if (parsed != null)
49
+ return { mode: 'bodyParagraphOrdinal', bodyParagraphOrdinal: parsed };
50
+ }
51
+ if (by === 'headingOrdinal') {
52
+ const parsed = parseOrdinal(value);
53
+ if (parsed != null)
54
+ return { mode: 'headingOrdinal', headingOrdinal: parsed };
55
+ }
56
+ if (by === 'listOrdinal') {
57
+ const parsed = parseOrdinal(value);
58
+ if (parsed != null)
59
+ return { mode: 'listOrdinal', listOrdinal: parsed };
60
+ }
61
+ if (by === 'tableOrdinal') {
62
+ const parsed = parseOrdinal(value);
63
+ if (parsed != null)
64
+ return { mode: 'tableOrdinal', tableOrdinal: parsed };
65
+ }
66
+ return failure('TARGET_UNSUPPORTED', 'Target object has unsupported {by,value} shape.', {
67
+ by,
68
+ valueType: typeof value,
69
+ });
70
+ }
71
+ const supportedKeys = [
72
+ 'ref',
73
+ 'nodeId',
74
+ 'blockOrdinal',
75
+ 'paragraphOrdinal',
76
+ 'bodyParagraphOrdinal',
77
+ 'headingOrdinal',
78
+ 'listOrdinal',
79
+ 'tableOrdinal',
80
+ ];
81
+ const presentKeys = supportedKeys.filter((key) => target[key] != null);
82
+ if (presentKeys.length !== 1) {
83
+ return failure('TARGET_UNSUPPORTED', 'Target object must include exactly one supported key: ref, nodeId, blockOrdinal, paragraphOrdinal, bodyParagraphOrdinal, headingOrdinal, listOrdinal, tableOrdinal.', { presentKeys });
84
+ }
85
+ const key = presentKeys[0];
86
+ if (key === 'ref') {
87
+ return parseWorkflowTargetRequest(target.ref);
88
+ }
89
+ if (key === 'nodeId' && typeof target.nodeId === 'string' && target.nodeId.length > 0) {
90
+ return { mode: 'nodeId', nodeId: target.nodeId };
91
+ }
92
+ if (key === 'blockOrdinal') {
93
+ const parsed = parseOrdinal(target.blockOrdinal);
94
+ if (parsed != null)
95
+ return { mode: 'blockOrdinal', blockOrdinal: parsed };
96
+ }
97
+ if (key === 'paragraphOrdinal') {
98
+ const parsed = parseOrdinal(target.paragraphOrdinal);
99
+ if (parsed != null)
100
+ return { mode: 'paragraphOrdinal', paragraphOrdinal: parsed };
101
+ }
102
+ if (key === 'bodyParagraphOrdinal') {
103
+ const parsed = parseOrdinal(target.bodyParagraphOrdinal);
104
+ if (parsed != null)
105
+ return { mode: 'bodyParagraphOrdinal', bodyParagraphOrdinal: parsed };
106
+ }
107
+ if (key === 'headingOrdinal') {
108
+ const parsed = parseOrdinal(target.headingOrdinal);
109
+ if (parsed != null)
110
+ return { mode: 'headingOrdinal', headingOrdinal: parsed };
111
+ }
112
+ if (key === 'listOrdinal') {
113
+ const parsed = parseOrdinal(target.listOrdinal);
114
+ if (parsed != null)
115
+ return { mode: 'listOrdinal', listOrdinal: parsed };
116
+ }
117
+ if (key === 'tableOrdinal') {
118
+ const parsed = parseOrdinal(target.tableOrdinal);
119
+ if (parsed != null)
120
+ return { mode: 'tableOrdinal', tableOrdinal: parsed };
121
+ }
122
+ return failure('TARGET_UNSUPPORTED', `Target ${key} value is invalid.`, {
123
+ key,
124
+ value: target[key],
125
+ });
126
+ }
127
+ function toResolvedTarget(mode, entity) {
128
+ if (entity.kind === 'block') {
129
+ return {
130
+ mode,
131
+ entityKind: entity.kind,
132
+ nodeId: entity.nodeId,
133
+ ref: entity.ref,
134
+ blockOrdinal: entity.ordinal,
135
+ paragraphOrdinal: entity.paragraphOrdinal,
136
+ bodyParagraphOrdinal: entity.bodyParagraphOrdinal,
137
+ headingOrdinal: entity.headingOrdinal,
138
+ tableOrdinal: entity.tableOrdinal,
139
+ entity,
140
+ };
141
+ }
142
+ if (entity.kind === 'listItem') {
143
+ return {
144
+ mode,
145
+ entityKind: entity.kind,
146
+ nodeId: entity.nodeId,
147
+ ref: entity.ref,
148
+ listOrdinal: entity.apiOrdinal,
149
+ entity,
150
+ };
151
+ }
152
+ return {
153
+ mode,
154
+ entityKind: entity.kind,
155
+ nodeId: entity.nodeId,
156
+ ref: entity.ref,
157
+ blockOrdinal: entity.blockOrdinal,
158
+ tableOrdinal: entity.tableOrdinal,
159
+ entity,
160
+ };
161
+ }
162
+ function resolveUnique(request, candidates, details) {
163
+ const mode = request.mode;
164
+ if (candidates.length === 0) {
165
+ return failure('TARGET_NOT_FOUND', `No workflow target matched ${mode}.`, details);
166
+ }
167
+ if (candidates.length > 1) {
168
+ return failure('TARGET_AMBIGUOUS', `Multiple workflow targets matched ${mode}.`, {
169
+ ...details,
170
+ candidateCount: candidates.length,
171
+ candidateKinds: candidates.map((candidate) => candidate.kind),
172
+ candidateNodeIds: candidates.map((candidate) => candidate.nodeId),
173
+ });
174
+ }
175
+ const matched = candidates[0];
176
+ if (matched == null) {
177
+ return failure('TARGET_NOT_FOUND', `No workflow target matched ${mode}.`, details);
178
+ }
179
+ return { ok: true, request, target: toResolvedTarget(mode, matched) };
180
+ }
181
+ export function resolveWorkflowTarget(index, request) {
182
+ if (request.mode === 'ref') {
183
+ const candidates = index.lookup.byRef.get(request.ref) ?? [];
184
+ if (candidates.length > 0) {
185
+ return resolveUnique(request, candidates, { ref: request.ref });
186
+ }
187
+ const nodeIdCandidates = index.lookup.byNodeId.get(request.ref) ?? [];
188
+ return resolveUnique(request, nodeIdCandidates, { ref: request.ref, nodeIdFallback: true });
189
+ }
190
+ if (request.mode === 'nodeId') {
191
+ const candidates = index.lookup.byNodeId.get(request.nodeId) ?? [];
192
+ return resolveUnique(request, candidates, { nodeId: request.nodeId });
193
+ }
194
+ if (request.mode === 'blockOrdinal') {
195
+ // Requests use the 1-based convention (parseOrdinal rejects < 1); the
196
+ // index keys on the doc-api block.ordinal, which is 0-based.
197
+ const block = index.lookup.byBlockOrdinal.get(request.blockOrdinal - 1);
198
+ return resolveUnique(request, block == null ? [] : [block], {
199
+ blockOrdinal: request.blockOrdinal,
200
+ });
201
+ }
202
+ if (request.mode === 'paragraphOrdinal') {
203
+ const block = index.lookup.byParagraphOrdinal.get(request.paragraphOrdinal);
204
+ return resolveUnique(request, block == null ? [] : [block], {
205
+ paragraphOrdinal: request.paragraphOrdinal,
206
+ });
207
+ }
208
+ if (request.mode === 'bodyParagraphOrdinal') {
209
+ const block = index.lookup.byBodyParagraphOrdinal.get(request.bodyParagraphOrdinal);
210
+ return resolveUnique(request, block == null ? [] : [block], {
211
+ bodyParagraphOrdinal: request.bodyParagraphOrdinal,
212
+ });
213
+ }
214
+ if (request.mode === 'headingOrdinal') {
215
+ const block = index.lookup.byHeadingOrdinal.get(request.headingOrdinal);
216
+ return resolveUnique(request, block == null ? [] : [block], {
217
+ headingOrdinal: request.headingOrdinal,
218
+ });
219
+ }
220
+ if (request.mode === 'listOrdinal') {
221
+ if (index.lookup.byListOrdinal.size === 0) {
222
+ return failure('TARGET_MODE_UNAVAILABLE', 'List ordinal resolution is unavailable: index has no API list ordinals.', {
223
+ listCount: index.lists.length,
224
+ });
225
+ }
226
+ const candidates = index.lookup.byListOrdinal.get(request.listOrdinal) ?? [];
227
+ return resolveUnique(request, candidates, { listOrdinal: request.listOrdinal });
228
+ }
229
+ if (index.lookup.byTableOrdinal.size === 0) {
230
+ return failure('TARGET_MODE_UNAVAILABLE', 'Table ordinal resolution is unavailable: index has no tables.', {
231
+ tableCount: index.tables.length,
232
+ });
233
+ }
234
+ const table = index.lookup.byTableOrdinal.get(request.tableOrdinal);
235
+ return resolveUnique(request, table == null ? [] : [table], { tableOrdinal: request.tableOrdinal });
236
+ }
237
+ export function resolveWorkflowTargetFromUnknown(index, rawTarget) {
238
+ if (rawTarget == null) {
239
+ return failure('TARGET_REQUIRED', 'No target value was provided.');
240
+ }
241
+ const parsed = parseWorkflowTargetRequest(rawTarget);
242
+ if (isResolveFailure(parsed)) {
243
+ return parsed;
244
+ }
245
+ return resolveWorkflowTarget(index, parsed);
246
+ }
@@ -0,0 +1,43 @@
1
+ 'use strict';
2
+
3
+ class WorkflowSessionCache {
4
+ states = new WeakMap();
5
+ nextId = 1;
6
+ getState(documentHandle) {
7
+ const cached = this.states.get(documentHandle);
8
+ if (cached != null) {
9
+ return cached;
10
+ }
11
+ const now = Date.now();
12
+ const created = {
13
+ documentKey: `workflow-doc-${this.nextId++}`,
14
+ createdAtMs: now,
15
+ updatedAtMs: now,
16
+ indexesByRevision: new Map(),
17
+ };
18
+ this.states.set(documentHandle, created);
19
+ return created;
20
+ }
21
+ getCachedIndex(documentHandle, revision) {
22
+ const state = this.getState(documentHandle);
23
+ if (revision == null) {
24
+ return state.latestIndex;
25
+ }
26
+ return state.indexesByRevision.get(revision);
27
+ }
28
+ setCachedIndex(documentHandle, index) {
29
+ const state = this.getState(documentHandle);
30
+ state.indexesByRevision.set(index.revision, index);
31
+ state.latestIndex = index;
32
+ state.updatedAtMs = Date.now();
33
+ return state;
34
+ }
35
+ }
36
+ function createWorkflowSessionCache() {
37
+ return new WorkflowSessionCache();
38
+ }
39
+ const workflowPocSessionCache = createWorkflowSessionCache();
40
+
41
+ exports.WorkflowSessionCache = WorkflowSessionCache;
42
+ exports.createWorkflowSessionCache = createWorkflowSessionCache;
43
+ exports.workflowPocSessionCache = workflowPocSessionCache;
@@ -0,0 +1,19 @@
1
+ import type { BoundDocApi } from '../generated/client.js';
2
+ import type { WorkflowDocIndex } from './doc-index.js';
3
+ export type WorkflowSessionState = {
4
+ documentKey: string;
5
+ createdAtMs: number;
6
+ updatedAtMs: number;
7
+ latestIndex?: WorkflowDocIndex;
8
+ indexesByRevision: Map<string, WorkflowDocIndex>;
9
+ };
10
+ export declare class WorkflowSessionCache {
11
+ private readonly states;
12
+ private nextId;
13
+ getState(documentHandle: BoundDocApi): WorkflowSessionState;
14
+ getCachedIndex(documentHandle: BoundDocApi, revision?: string): WorkflowDocIndex | undefined;
15
+ setCachedIndex(documentHandle: BoundDocApi, index: WorkflowDocIndex): WorkflowSessionState;
16
+ }
17
+ export declare function createWorkflowSessionCache(): WorkflowSessionCache;
18
+ export declare const workflowPocSessionCache: WorkflowSessionCache;
19
+ //# sourceMappingURL=session-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-cache.d.ts","sourceRoot":"","sources":["../../src/action-primitives/session-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAClD,CAAC;AAEF,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoD;IAC3E,OAAO,CAAC,MAAM,CAAK;IAEnB,QAAQ,CAAC,cAAc,EAAE,WAAW,GAAG,oBAAoB;IAiB3D,cAAc,CAAC,cAAc,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAQ5F,cAAc,CAAC,cAAc,EAAE,WAAW,EAAE,KAAK,EAAE,gBAAgB,GAAG,oBAAoB;CAO3F;AAED,wBAAgB,0BAA0B,IAAI,oBAAoB,CAEjE;AAED,eAAO,MAAM,uBAAuB,sBAA+B,CAAC"}
@@ -0,0 +1,37 @@
1
+ export class WorkflowSessionCache {
2
+ states = new WeakMap();
3
+ nextId = 1;
4
+ getState(documentHandle) {
5
+ const cached = this.states.get(documentHandle);
6
+ if (cached != null) {
7
+ return cached;
8
+ }
9
+ const now = Date.now();
10
+ const created = {
11
+ documentKey: `workflow-doc-${this.nextId++}`,
12
+ createdAtMs: now,
13
+ updatedAtMs: now,
14
+ indexesByRevision: new Map(),
15
+ };
16
+ this.states.set(documentHandle, created);
17
+ return created;
18
+ }
19
+ getCachedIndex(documentHandle, revision) {
20
+ const state = this.getState(documentHandle);
21
+ if (revision == null) {
22
+ return state.latestIndex;
23
+ }
24
+ return state.indexesByRevision.get(revision);
25
+ }
26
+ setCachedIndex(documentHandle, index) {
27
+ const state = this.getState(documentHandle);
28
+ state.indexesByRevision.set(index.revision, index);
29
+ state.latestIndex = index;
30
+ state.updatedAtMs = Date.now();
31
+ return state;
32
+ }
33
+ }
34
+ export function createWorkflowSessionCache() {
35
+ return new WorkflowSessionCache();
36
+ }
37
+ export const workflowPocSessionCache = createWorkflowSessionCache();