@shipfox/api-agent-access 21.0.0 → 21.2.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 (45) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +38 -0
  3. package/dist/core/log-tools.d.ts +10 -0
  4. package/dist/core/log-tools.d.ts.map +1 -0
  5. package/dist/core/log-tools.js +165 -0
  6. package/dist/core/log-tools.js.map +1 -0
  7. package/dist/core/paged-tools.d.ts.map +1 -1
  8. package/dist/core/paged-tools.js +8 -50
  9. package/dist/core/paged-tools.js.map +1 -1
  10. package/dist/core/response.d.ts.map +1 -1
  11. package/dist/core/response.js +57 -18
  12. package/dist/core/response.js.map +1 -1
  13. package/dist/core/tool-utils.d.ts +37 -0
  14. package/dist/core/tool-utils.d.ts.map +1 -0
  15. package/dist/core/tool-utils.js +73 -0
  16. package/dist/core/tool-utils.js.map +1 -0
  17. package/dist/core/workflow-diagnostic-tools.d.ts +5 -0
  18. package/dist/core/workflow-diagnostic-tools.d.ts.map +1 -0
  19. package/dist/core/workflow-diagnostic-tools.js +631 -0
  20. package/dist/core/workflow-diagnostic-tools.js.map +1 -0
  21. package/dist/core/workflow-tools.d.ts +4 -0
  22. package/dist/core/workflow-tools.d.ts.map +1 -0
  23. package/dist/core/workflow-tools.js +434 -0
  24. package/dist/core/workflow-tools.js.map +1 -0
  25. package/dist/index.d.ts +2 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +2 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/tsconfig.test.tsbuildinfo +1 -1
  30. package/package.json +7 -6
  31. package/src/core/diagnostic-tools.test.ts +33 -0
  32. package/src/core/log-tools.test.ts +370 -0
  33. package/src/core/log-tools.ts +271 -0
  34. package/src/core/paged-tools.test.ts +19 -2
  35. package/src/core/paged-tools.ts +18 -67
  36. package/src/core/response.ts +67 -19
  37. package/src/core/tool-utils.ts +115 -0
  38. package/src/core/workflow-diagnostic-tools.test.ts +693 -0
  39. package/src/core/workflow-diagnostic-tools.ts +840 -0
  40. package/src/core/workflow-execution-event-tools.test.ts +324 -0
  41. package/src/core/workflow-tools.test.ts +531 -0
  42. package/src/core/workflow-tools.ts +514 -0
  43. package/src/index.ts +5 -0
  44. package/src/presentation/mcp-server.test.ts +57 -1
  45. package/tsconfig.build.tsbuildinfo +1 -1
@@ -42,34 +42,73 @@ export function serializedAgentAccessEnvelopeByteLength(envelope) {
42
42
  if (!params.envelope.ok || !isRecord(params.envelope.result)) {
43
43
  return agentAccessError('content-too-large');
44
44
  }
45
- const itemCounts = params.items.length === 0 ? [
46
- 0
47
- ] : Array.from({
48
- length: Math.max(0, params.items.length - 1)
49
- }, (_, index)=>params.items.length - index - 1);
50
- for (const itemCount of itemCounts){
51
- const retained = params.items.slice(0, itemCount);
52
- const last = retained.at(-1);
53
- const nextCursor = last === undefined ? null : params.cursorForItem(last, itemCount - 1);
54
- const candidate = {
55
- ...params.envelope,
45
+ const producerResult = params.envelope.result;
46
+ const fitState = buildPagedResponseFitState(params, producerResult, initialBytes);
47
+ const itemCount = largestFittingItemCount(fitState.candidateBytes, params.items.length, maxBytes);
48
+ if (itemCount !== undefined) {
49
+ const nextCursor = itemCount === 0 ? null : fitState.itemCursors[itemCount - 1];
50
+ if (nextCursor === undefined && itemCount > 0) return agentAccessError('content-too-large');
51
+ return {
52
+ ...fitState.emptyCandidate,
56
53
  result: {
57
- ...params.envelope.result,
58
- [params.itemKey]: retained,
59
- next_cursor: nextCursor
60
- },
61
- response_truncated: true,
62
- response_total_bytes: initialBytes
54
+ ...fitState.emptyResult,
55
+ [params.itemKey]: params.items.slice(0, itemCount),
56
+ next_cursor: nextCursor ?? null
57
+ }
63
58
  };
64
- if (serializedAgentAccessEnvelopeByteLength(candidate) <= maxBytes) return candidate;
65
59
  }
66
60
  return agentAccessError('content-too-large');
67
61
  }
62
+ function buildPagedResponseFitState(params, producerResult, initialBytes) {
63
+ const emptyResult = {
64
+ ...producerResult,
65
+ [params.itemKey]: [],
66
+ next_cursor: null
67
+ };
68
+ const emptyCandidate = {
69
+ ...params.envelope,
70
+ result: emptyResult,
71
+ response_truncated: true,
72
+ response_total_bytes: initialBytes
73
+ };
74
+ const emptyCandidateBytes = serializedAgentAccessEnvelopeByteLength(emptyCandidate);
75
+ const nullCursorBytes = serializedJsonByteLength(null);
76
+ const candidateBytes = [
77
+ emptyCandidateBytes
78
+ ];
79
+ const itemCursors = [];
80
+ let retainedItemBytes = 0;
81
+ for (const [index, item] of params.items.entries()){
82
+ retainedItemBytes += serializedJsonByteLength(item) + (index === 0 ? 0 : 1);
83
+ const cursor = params.cursorForItem(item, index);
84
+ itemCursors.push(cursor);
85
+ candidateBytes.push(emptyCandidateBytes + retainedItemBytes + serializedJsonByteLength(cursor) - nullCursorBytes);
86
+ }
87
+ return {
88
+ emptyCandidate,
89
+ emptyResult,
90
+ candidateBytes,
91
+ itemCursors
92
+ };
93
+ }
94
+ function largestFittingItemCount(candidateBytes, itemCount, maxBytes) {
95
+ const minimumItemCount = itemCount === 0 ? 0 : 1;
96
+ for(let count = itemCount; count >= minimumItemCount; count -= 1){
97
+ const candidateByteLength = candidateBytes[count];
98
+ if (candidateByteLength !== undefined && candidateByteLength <= maxBytes) return count;
99
+ }
100
+ return undefined;
101
+ }
68
102
  export function fitAgentAccessResponseToCeiling(envelope, maxBytes = AGENT_ACCESS_RESPONSE_MAX_BYTES) {
69
103
  return serializedAgentAccessEnvelopeByteLength(envelope) <= maxBytes ? envelope : agentAccessError('content-too-large');
70
104
  }
71
105
  function isRecord(value) {
72
106
  return typeof value === 'object' && value !== null && !Array.isArray(value);
73
107
  }
108
+ function serializedJsonByteLength(value) {
109
+ const serialized = JSON.stringify(value);
110
+ if (serialized === undefined) throw new Error('Agent-access value is not serializable');
111
+ return utf8Encoder.encode(serialized).byteLength;
112
+ }
74
113
 
75
114
  //# sourceMappingURL=response.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/response.ts"],"sourcesContent":["import {\n AGENT_ACCESS_RESPONSE_MAX_BYTES,\n type AgentAccessEnvelopeDto,\n} from '@shipfox/api-agent-access-dto';\nimport {agentAccessError} from './envelope.js';\n\nconst utf8Encoder = new TextEncoder();\n\nexport interface AgentAccessUtf8Truncation {\n value: string;\n truncated: boolean;\n totalBytes: number;\n}\n\nexport function truncateAgentAccessUtf8(\n value: string,\n maxBytes: number,\n): AgentAccessUtf8Truncation {\n const totalBytes = utf8Encoder.encode(value).byteLength;\n if (totalBytes <= maxBytes) return {value, truncated: false, totalBytes};\n if (maxBytes <= 0) return {value: '', truncated: true, totalBytes};\n\n let bytes = 0;\n let result = '';\n for (const codePoint of value) {\n const codePointBytes = utf8Encoder.encode(codePoint).byteLength;\n if (bytes + codePointBytes > maxBytes) break;\n result += codePoint;\n bytes += codePointBytes;\n }\n\n return {value: result, truncated: true, totalBytes};\n}\n\nexport function serializedAgentAccessEnvelopeByteLength(envelope: AgentAccessEnvelopeDto): number {\n const serialized = JSON.stringify(envelope);\n if (serialized === undefined) throw new Error('Agent-access envelope is not serializable');\n return utf8Encoder.encode(serialized).byteLength;\n}\n\nexport interface ReducePagedAgentAccessResponseParams {\n envelope: AgentAccessEnvelopeDto;\n itemKey: string;\n items: readonly Record<string, unknown>[];\n cursorForItem: (item: Record<string, unknown>, index: number) => string;\n maxBytes?: number | undefined;\n}\n\n/**\n * Fits a paged success response without reusing a producer cursor that points past dropped rows.\n * The cursor is always rebuilt from the final retained item.\n */\nexport function reducePagedAgentAccessResponse(\n params: ReducePagedAgentAccessResponseParams,\n): AgentAccessEnvelopeDto {\n const maxBytes = params.maxBytes ?? AGENT_ACCESS_RESPONSE_MAX_BYTES;\n const initialBytes = serializedAgentAccessEnvelopeByteLength(params.envelope);\n if (initialBytes <= maxBytes) return params.envelope;\n if (!params.envelope.ok || !isRecord(params.envelope.result)) {\n return agentAccessError('content-too-large');\n }\n\n const itemCounts =\n params.items.length === 0\n ? [0]\n : Array.from(\n {length: Math.max(0, params.items.length - 1)},\n (_, index) => params.items.length - index - 1,\n );\n for (const itemCount of itemCounts) {\n const retained = params.items.slice(0, itemCount);\n const last = retained.at(-1);\n const nextCursor = last === undefined ? null : params.cursorForItem(last, itemCount - 1);\n const candidate: AgentAccessEnvelopeDto = {\n ...params.envelope,\n result: {\n ...params.envelope.result,\n [params.itemKey]: retained,\n next_cursor: nextCursor,\n },\n response_truncated: true,\n response_total_bytes: initialBytes,\n };\n if (serializedAgentAccessEnvelopeByteLength(candidate) <= maxBytes) return candidate;\n }\n\n return agentAccessError('content-too-large');\n}\n\nexport function fitAgentAccessResponseToCeiling(\n envelope: AgentAccessEnvelopeDto,\n maxBytes = AGENT_ACCESS_RESPONSE_MAX_BYTES,\n): AgentAccessEnvelopeDto {\n return serializedAgentAccessEnvelopeByteLength(envelope) <= maxBytes\n ? envelope\n : agentAccessError('content-too-large');\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"],"names":["AGENT_ACCESS_RESPONSE_MAX_BYTES","agentAccessError","utf8Encoder","TextEncoder","truncateAgentAccessUtf8","value","maxBytes","totalBytes","encode","byteLength","truncated","bytes","result","codePoint","codePointBytes","serializedAgentAccessEnvelopeByteLength","envelope","serialized","JSON","stringify","undefined","Error","reducePagedAgentAccessResponse","params","initialBytes","ok","isRecord","itemCounts","items","length","Array","from","Math","max","_","index","itemCount","retained","slice","last","at","nextCursor","cursorForItem","candidate","itemKey","next_cursor","response_truncated","response_total_bytes","fitAgentAccessResponseToCeiling","isArray"],"mappings":"AAAA,SACEA,+BAA+B,QAE1B,gCAAgC;AACvC,SAAQC,gBAAgB,QAAO,gBAAgB;AAE/C,MAAMC,cAAc,IAAIC;AAQxB,OAAO,SAASC,wBACdC,KAAa,EACbC,QAAgB;IAEhB,MAAMC,aAAaL,YAAYM,MAAM,CAACH,OAAOI,UAAU;IACvD,IAAIF,cAAcD,UAAU,OAAO;QAACD;QAAOK,WAAW;QAAOH;IAAU;IACvE,IAAID,YAAY,GAAG,OAAO;QAACD,OAAO;QAAIK,WAAW;QAAMH;IAAU;IAEjE,IAAII,QAAQ;IACZ,IAAIC,SAAS;IACb,KAAK,MAAMC,aAAaR,MAAO;QAC7B,MAAMS,iBAAiBZ,YAAYM,MAAM,CAACK,WAAWJ,UAAU;QAC/D,IAAIE,QAAQG,iBAAiBR,UAAU;QACvCM,UAAUC;QACVF,SAASG;IACX;IAEA,OAAO;QAACT,OAAOO;QAAQF,WAAW;QAAMH;IAAU;AACpD;AAEA,OAAO,SAASQ,wCAAwCC,QAAgC;IACtF,MAAMC,aAAaC,KAAKC,SAAS,CAACH;IAClC,IAAIC,eAAeG,WAAW,MAAM,IAAIC,MAAM;IAC9C,OAAOnB,YAAYM,MAAM,CAACS,YAAYR,UAAU;AAClD;AAUA;;;CAGC,GACD,OAAO,SAASa,+BACdC,MAA4C;IAE5C,MAAMjB,WAAWiB,OAAOjB,QAAQ,IAAIN;IACpC,MAAMwB,eAAeT,wCAAwCQ,OAAOP,QAAQ;IAC5E,IAAIQ,gBAAgBlB,UAAU,OAAOiB,OAAOP,QAAQ;IACpD,IAAI,CAACO,OAAOP,QAAQ,CAACS,EAAE,IAAI,CAACC,SAASH,OAAOP,QAAQ,CAACJ,MAAM,GAAG;QAC5D,OAAOX,iBAAiB;IAC1B;IAEA,MAAM0B,aACJJ,OAAOK,KAAK,CAACC,MAAM,KAAK,IACpB;QAAC;KAAE,GACHC,MAAMC,IAAI,CACR;QAACF,QAAQG,KAAKC,GAAG,CAAC,GAAGV,OAAOK,KAAK,CAACC,MAAM,GAAG;IAAE,GAC7C,CAACK,GAAGC,QAAUZ,OAAOK,KAAK,CAACC,MAAM,GAAGM,QAAQ;IAEpD,KAAK,MAAMC,aAAaT,WAAY;QAClC,MAAMU,WAAWd,OAAOK,KAAK,CAACU,KAAK,CAAC,GAAGF;QACvC,MAAMG,OAAOF,SAASG,EAAE,CAAC,CAAC;QAC1B,MAAMC,aAAaF,SAASnB,YAAY,OAAOG,OAAOmB,aAAa,CAACH,MAAMH,YAAY;QACtF,MAAMO,YAAoC;YACxC,GAAGpB,OAAOP,QAAQ;YAClBJ,QAAQ;gBACN,GAAGW,OAAOP,QAAQ,CAACJ,MAAM;gBACzB,CAACW,OAAOqB,OAAO,CAAC,EAAEP;gBAClBQ,aAAaJ;YACf;YACAK,oBAAoB;YACpBC,sBAAsBvB;QACxB;QACA,IAAIT,wCAAwC4B,cAAcrC,UAAU,OAAOqC;IAC7E;IAEA,OAAO1C,iBAAiB;AAC1B;AAEA,OAAO,SAAS+C,gCACdhC,QAAgC,EAChCV,WAAWN,+BAA+B;IAE1C,OAAOe,wCAAwCC,aAAaV,WACxDU,WACAf,iBAAiB;AACvB;AAEA,SAASyB,SAASrB,KAAc;IAC9B,OAAO,OAAOA,UAAU,YAAYA,UAAU,QAAQ,CAACyB,MAAMmB,OAAO,CAAC5C;AACvE"}
1
+ {"version":3,"sources":["../../src/core/response.ts"],"sourcesContent":["import {\n AGENT_ACCESS_RESPONSE_MAX_BYTES,\n type AgentAccessEnvelopeDto,\n} from '@shipfox/api-agent-access-dto';\nimport {agentAccessError} from './envelope.js';\n\nconst utf8Encoder = new TextEncoder();\n\nexport interface AgentAccessUtf8Truncation {\n value: string;\n truncated: boolean;\n totalBytes: number;\n}\n\nexport function truncateAgentAccessUtf8(\n value: string,\n maxBytes: number,\n): AgentAccessUtf8Truncation {\n const totalBytes = utf8Encoder.encode(value).byteLength;\n if (totalBytes <= maxBytes) return {value, truncated: false, totalBytes};\n if (maxBytes <= 0) return {value: '', truncated: true, totalBytes};\n\n let bytes = 0;\n let result = '';\n for (const codePoint of value) {\n const codePointBytes = utf8Encoder.encode(codePoint).byteLength;\n if (bytes + codePointBytes > maxBytes) break;\n result += codePoint;\n bytes += codePointBytes;\n }\n\n return {value: result, truncated: true, totalBytes};\n}\n\nexport function serializedAgentAccessEnvelopeByteLength(envelope: AgentAccessEnvelopeDto): number {\n const serialized = JSON.stringify(envelope);\n if (serialized === undefined) throw new Error('Agent-access envelope is not serializable');\n return utf8Encoder.encode(serialized).byteLength;\n}\n\nexport interface ReducePagedAgentAccessResponseParams {\n envelope: AgentAccessEnvelopeDto;\n itemKey: string;\n items: readonly Record<string, unknown>[];\n cursorForItem: (item: Record<string, unknown>, index: number) => string;\n maxBytes?: number | undefined;\n}\n\ninterface PagedResponseFitState {\n emptyCandidate: AgentAccessEnvelopeDto;\n emptyResult: Record<string, unknown>;\n candidateBytes: readonly number[];\n itemCursors: readonly string[];\n}\n\n/**\n * Fits a paged success response without reusing a producer cursor that points past dropped rows.\n * The cursor is always rebuilt from the final retained item.\n */\nexport function reducePagedAgentAccessResponse(\n params: ReducePagedAgentAccessResponseParams,\n): AgentAccessEnvelopeDto {\n const maxBytes = params.maxBytes ?? AGENT_ACCESS_RESPONSE_MAX_BYTES;\n const initialBytes = serializedAgentAccessEnvelopeByteLength(params.envelope);\n if (initialBytes <= maxBytes) return params.envelope;\n if (!params.envelope.ok || !isRecord(params.envelope.result)) {\n return agentAccessError('content-too-large');\n }\n\n const producerResult = params.envelope.result;\n const fitState = buildPagedResponseFitState(params, producerResult, initialBytes);\n const itemCount = largestFittingItemCount(fitState.candidateBytes, params.items.length, maxBytes);\n if (itemCount !== undefined) {\n const nextCursor = itemCount === 0 ? null : fitState.itemCursors[itemCount - 1];\n if (nextCursor === undefined && itemCount > 0) return agentAccessError('content-too-large');\n return {\n ...fitState.emptyCandidate,\n result: {\n ...fitState.emptyResult,\n [params.itemKey]: params.items.slice(0, itemCount),\n next_cursor: nextCursor ?? null,\n },\n };\n }\n\n return agentAccessError('content-too-large');\n}\n\nfunction buildPagedResponseFitState(\n params: ReducePagedAgentAccessResponseParams,\n producerResult: Record<string, unknown>,\n initialBytes: number,\n): PagedResponseFitState {\n const emptyResult = {...producerResult, [params.itemKey]: [], next_cursor: null};\n const emptyCandidate: AgentAccessEnvelopeDto = {\n ...params.envelope,\n result: emptyResult,\n response_truncated: true,\n response_total_bytes: initialBytes,\n };\n const emptyCandidateBytes = serializedAgentAccessEnvelopeByteLength(emptyCandidate);\n const nullCursorBytes = serializedJsonByteLength(null);\n const candidateBytes: number[] = [emptyCandidateBytes];\n const itemCursors: string[] = [];\n let retainedItemBytes = 0;\n\n for (const [index, item] of params.items.entries()) {\n retainedItemBytes += serializedJsonByteLength(item) + (index === 0 ? 0 : 1);\n const cursor = params.cursorForItem(item, index);\n itemCursors.push(cursor);\n candidateBytes.push(\n emptyCandidateBytes + retainedItemBytes + serializedJsonByteLength(cursor) - nullCursorBytes,\n );\n }\n\n return {emptyCandidate, emptyResult, candidateBytes, itemCursors};\n}\n\nfunction largestFittingItemCount(\n candidateBytes: readonly number[],\n itemCount: number,\n maxBytes: number,\n): number | undefined {\n const minimumItemCount = itemCount === 0 ? 0 : 1;\n for (let count = itemCount; count >= minimumItemCount; count -= 1) {\n const candidateByteLength = candidateBytes[count];\n if (candidateByteLength !== undefined && candidateByteLength <= maxBytes) return count;\n }\n return undefined;\n}\n\nexport function fitAgentAccessResponseToCeiling(\n envelope: AgentAccessEnvelopeDto,\n maxBytes = AGENT_ACCESS_RESPONSE_MAX_BYTES,\n): AgentAccessEnvelopeDto {\n return serializedAgentAccessEnvelopeByteLength(envelope) <= maxBytes\n ? envelope\n : agentAccessError('content-too-large');\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction serializedJsonByteLength(value: unknown): number {\n const serialized = JSON.stringify(value);\n if (serialized === undefined) throw new Error('Agent-access value is not serializable');\n return utf8Encoder.encode(serialized).byteLength;\n}\n"],"names":["AGENT_ACCESS_RESPONSE_MAX_BYTES","agentAccessError","utf8Encoder","TextEncoder","truncateAgentAccessUtf8","value","maxBytes","totalBytes","encode","byteLength","truncated","bytes","result","codePoint","codePointBytes","serializedAgentAccessEnvelopeByteLength","envelope","serialized","JSON","stringify","undefined","Error","reducePagedAgentAccessResponse","params","initialBytes","ok","isRecord","producerResult","fitState","buildPagedResponseFitState","itemCount","largestFittingItemCount","candidateBytes","items","length","nextCursor","itemCursors","emptyCandidate","emptyResult","itemKey","slice","next_cursor","response_truncated","response_total_bytes","emptyCandidateBytes","nullCursorBytes","serializedJsonByteLength","retainedItemBytes","index","item","entries","cursor","cursorForItem","push","minimumItemCount","count","candidateByteLength","fitAgentAccessResponseToCeiling","Array","isArray"],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { type AgentAccessEnvelopeDto } from '@shipfox/api-agent-access-dto';
2
+ import { truncateAgentAccessUtf8 } from './response.js';
3
+ export { truncateAgentAccessUtf8 };
4
+ export interface SafeParseSchema<T> {
5
+ safeParse(value: unknown): {
6
+ success: true;
7
+ data: T;
8
+ } | {
9
+ success: false;
10
+ };
11
+ }
12
+ export declare function parseInput<T>(schema: SafeParseSchema<T>, value: unknown): T | undefined;
13
+ export declare function reducePage(envelope: AgentAccessEnvelopeDto, itemKey: string, items: readonly Record<string, unknown>[], cursorForItem: (item: Record<string, unknown>, index: number) => string): AgentAccessEnvelopeDto;
14
+ export declare function decodeTimestampCursor(value: string | undefined): {
15
+ createdAt: string;
16
+ id: string;
17
+ } | undefined;
18
+ export declare function validateTimestampCursor(value: string | undefined): string | undefined;
19
+ export declare function decodeStringCursor(value: string | undefined): {
20
+ value: string;
21
+ id: string;
22
+ } | undefined;
23
+ export declare function decodeNumberCursor(value: string | undefined): {
24
+ value: number;
25
+ id: string;
26
+ } | undefined;
27
+ export declare function validateBoundedNumberCursor(value: string | undefined, bounds: {
28
+ minValue: number;
29
+ maxValue: number;
30
+ }): string | undefined;
31
+ export declare function validateBoundedPositionCursor(value: string | undefined, maxValue: number): string | undefined;
32
+ export declare function encodeTimestampCursor(createdAt: string, id: string): string;
33
+ export declare function cap(value: string, maxBytes?: number): string;
34
+ export declare function capNullable(value: string | null, maxBytes?: number): string | null;
35
+ export declare function invalidRequest(): AgentAccessEnvelopeDto;
36
+ export declare function notFound(): AgentAccessEnvelopeDto;
37
+ //# sourceMappingURL=tool-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-utils.d.ts","sourceRoot":"","sources":["../../src/core/tool-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,+BAA+B,CAAC;AAQvC,OAAO,EAAiC,uBAAuB,EAAC,MAAM,eAAe,CAAC;AAEtF,OAAO,EAAC,uBAAuB,EAAC,CAAC;AAKjC,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG;QAAC,OAAO,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,CAAC,CAAA;KAAC,GAAG;QAAC,OAAO,EAAE,KAAK,CAAA;KAAC,CAAC;CACxE;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,GAAG,SAAS,CAGvF;AAED,wBAAgB,UAAU,CACxB,QAAQ,EAAE,sBAAsB,EAChC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EACzC,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,GACtE,sBAAsB,CAExB;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAC,GAAG,SAAS,CAI7C;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAIrF;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAC,GAAG,SAAS,CAEzC;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAC,GAAG,SAAS,CAGzC;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,GAC3C,MAAM,GAAG,SAAS,CAUpB;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,SAAS,CAUpB;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAA8B,GAAG,MAAM,CAEjF;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,QAAQ,SAA8B,GACrC,MAAM,GAAG,IAAI,CAEf;AAED,wBAAgB,cAAc,IAAI,sBAAsB,CAEvD;AAED,wBAAgB,QAAQ,IAAI,sBAAsB,CAEjD"}
@@ -0,0 +1,73 @@
1
+ import { AGENT_ACCESS_TEXT_MAX_BYTES } from '@shipfox/api-agent-access-dto';
2
+ import { decodeNumberIdCursor, decodeStringIdCursor, decodeTimestampIdCursor, encodeTimestampIdCursor } from '@shipfox/node-drizzle';
3
+ import { agentAccessError } from './envelope.js';
4
+ import { reducePagedAgentAccessResponse, truncateAgentAccessUtf8 } from './response.js';
5
+ export { truncateAgentAccessUtf8 };
6
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu;
7
+ const DECIMAL_RE = /^\d+$/u;
8
+ export function parseInput(schema, value) {
9
+ const parsed = schema.safeParse(value);
10
+ return parsed.success ? parsed.data : undefined;
11
+ }
12
+ export function reducePage(envelope, itemKey, items, cursorForItem) {
13
+ return reducePagedAgentAccessResponse({
14
+ envelope,
15
+ itemKey,
16
+ items,
17
+ cursorForItem
18
+ });
19
+ }
20
+ export function decodeTimestampCursor(value) {
21
+ if (value === undefined) return undefined;
22
+ const cursor = decodeTimestampIdCursor(value);
23
+ return cursor ? {
24
+ createdAt: cursor.createdAt.toISOString(),
25
+ id: cursor.id
26
+ } : undefined;
27
+ }
28
+ export function validateTimestampCursor(value) {
29
+ if (value === undefined) return undefined;
30
+ const cursor = decodeTimestampCursor(value);
31
+ return cursor !== undefined && UUID_RE.test(cursor.id) ? value : undefined;
32
+ }
33
+ export function decodeStringCursor(value) {
34
+ return value === undefined ? undefined : decodeStringIdCursor(value);
35
+ }
36
+ export function decodeNumberCursor(value) {
37
+ const cursor = value === undefined ? undefined : decodeNumberIdCursor(value);
38
+ return cursor !== undefined && Number.isSafeInteger(cursor.value) ? cursor : undefined;
39
+ }
40
+ export function validateBoundedNumberCursor(value, bounds) {
41
+ if (value === undefined) return undefined;
42
+ const cursor = decodeNumberCursor(value);
43
+ return cursor !== undefined && UUID_RE.test(cursor.id) && Number.isSafeInteger(cursor.value) && cursor.value >= bounds.minValue && cursor.value <= bounds.maxValue ? value : undefined;
44
+ }
45
+ export function validateBoundedPositionCursor(value, maxValue) {
46
+ if (value === undefined) return undefined;
47
+ const cursor = decodeStringCursor(value);
48
+ if (cursor === undefined || !UUID_RE.test(cursor.id) || !DECIMAL_RE.test(cursor.value)) {
49
+ return undefined;
50
+ }
51
+ const position = Number(cursor.value);
52
+ return Number.isSafeInteger(position) && position >= 0 && position <= maxValue ? value : undefined;
53
+ }
54
+ export function encodeTimestampCursor(createdAt, id) {
55
+ return encodeTimestampIdCursor({
56
+ createdAt: new Date(createdAt),
57
+ id
58
+ });
59
+ }
60
+ export function cap(value, maxBytes = AGENT_ACCESS_TEXT_MAX_BYTES) {
61
+ return truncateAgentAccessUtf8(value, maxBytes).value;
62
+ }
63
+ export function capNullable(value, maxBytes = AGENT_ACCESS_TEXT_MAX_BYTES) {
64
+ return value === null ? null : cap(value, maxBytes);
65
+ }
66
+ export function invalidRequest() {
67
+ return agentAccessError('invalid-request');
68
+ }
69
+ export function notFound() {
70
+ return agentAccessError('not-found');
71
+ }
72
+
73
+ //# sourceMappingURL=tool-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/tool-utils.ts"],"sourcesContent":["import {\n AGENT_ACCESS_TEXT_MAX_BYTES,\n type AgentAccessEnvelopeDto,\n} from '@shipfox/api-agent-access-dto';\nimport {\n decodeNumberIdCursor,\n decodeStringIdCursor,\n decodeTimestampIdCursor,\n encodeTimestampIdCursor,\n} from '@shipfox/node-drizzle';\nimport {agentAccessError} from './envelope.js';\nimport {reducePagedAgentAccessResponse, truncateAgentAccessUtf8} from './response.js';\n\nexport {truncateAgentAccessUtf8};\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu;\nconst DECIMAL_RE = /^\\d+$/u;\n\nexport interface SafeParseSchema<T> {\n safeParse(value: unknown): {success: true; data: T} | {success: false};\n}\n\nexport function parseInput<T>(schema: SafeParseSchema<T>, value: unknown): T | undefined {\n const parsed = schema.safeParse(value);\n return parsed.success ? parsed.data : undefined;\n}\n\nexport function reducePage(\n envelope: AgentAccessEnvelopeDto,\n itemKey: string,\n items: readonly Record<string, unknown>[],\n cursorForItem: (item: Record<string, unknown>, index: number) => string,\n): AgentAccessEnvelopeDto {\n return reducePagedAgentAccessResponse({envelope, itemKey, items, cursorForItem});\n}\n\nexport function decodeTimestampCursor(\n value: string | undefined,\n): {createdAt: string; id: string} | undefined {\n if (value === undefined) return undefined;\n const cursor = decodeTimestampIdCursor(value);\n return cursor ? {createdAt: cursor.createdAt.toISOString(), id: cursor.id} : undefined;\n}\n\nexport function validateTimestampCursor(value: string | undefined): string | undefined {\n if (value === undefined) return undefined;\n const cursor = decodeTimestampCursor(value);\n return cursor !== undefined && UUID_RE.test(cursor.id) ? value : undefined;\n}\n\nexport function decodeStringCursor(\n value: string | undefined,\n): {value: string; id: string} | undefined {\n return value === undefined ? undefined : decodeStringIdCursor(value);\n}\n\nexport function decodeNumberCursor(\n value: string | undefined,\n): {value: number; id: string} | undefined {\n const cursor = value === undefined ? undefined : decodeNumberIdCursor(value);\n return cursor !== undefined && Number.isSafeInteger(cursor.value) ? cursor : undefined;\n}\n\nexport function validateBoundedNumberCursor(\n value: string | undefined,\n bounds: {minValue: number; maxValue: number},\n): string | undefined {\n if (value === undefined) return undefined;\n const cursor = decodeNumberCursor(value);\n return cursor !== undefined &&\n UUID_RE.test(cursor.id) &&\n Number.isSafeInteger(cursor.value) &&\n cursor.value >= bounds.minValue &&\n cursor.value <= bounds.maxValue\n ? value\n : undefined;\n}\n\nexport function validateBoundedPositionCursor(\n value: string | undefined,\n maxValue: number,\n): string | undefined {\n if (value === undefined) return undefined;\n const cursor = decodeStringCursor(value);\n if (cursor === undefined || !UUID_RE.test(cursor.id) || !DECIMAL_RE.test(cursor.value)) {\n return undefined;\n }\n const position = Number(cursor.value);\n return Number.isSafeInteger(position) && position >= 0 && position <= maxValue\n ? value\n : undefined;\n}\n\nexport function encodeTimestampCursor(createdAt: string, id: string): string {\n return encodeTimestampIdCursor({createdAt: new Date(createdAt), id});\n}\n\nexport function cap(value: string, maxBytes = AGENT_ACCESS_TEXT_MAX_BYTES): string {\n return truncateAgentAccessUtf8(value, maxBytes).value;\n}\n\nexport function capNullable(\n value: string | null,\n maxBytes = AGENT_ACCESS_TEXT_MAX_BYTES,\n): string | null {\n return value === null ? null : cap(value, maxBytes);\n}\n\nexport function invalidRequest(): AgentAccessEnvelopeDto {\n return agentAccessError('invalid-request');\n}\n\nexport function notFound(): AgentAccessEnvelopeDto {\n return agentAccessError('not-found');\n}\n"],"names":["AGENT_ACCESS_TEXT_MAX_BYTES","decodeNumberIdCursor","decodeStringIdCursor","decodeTimestampIdCursor","encodeTimestampIdCursor","agentAccessError","reducePagedAgentAccessResponse","truncateAgentAccessUtf8","UUID_RE","DECIMAL_RE","parseInput","schema","value","parsed","safeParse","success","data","undefined","reducePage","envelope","itemKey","items","cursorForItem","decodeTimestampCursor","cursor","createdAt","toISOString","id","validateTimestampCursor","test","decodeStringCursor","decodeNumberCursor","Number","isSafeInteger","validateBoundedNumberCursor","bounds","minValue","maxValue","validateBoundedPositionCursor","position","encodeTimestampCursor","Date","cap","maxBytes","capNullable","invalidRequest","notFound"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { WorkflowsModuleClient } from '@shipfox/api-workflows-dto/inter-module';
2
+ import type { AgentAccessTool } from './tools.js';
3
+ /** Creates the lazy workflow diagnostic tools for later gateway composition. */
4
+ export declare function createAgentAccessWorkflowDiagnosticTools(workflows: WorkflowsModuleClient): readonly AgentAccessTool[];
5
+ //# sourceMappingURL=workflow-diagnostic-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-diagnostic-tools.d.ts","sourceRoot":"","sources":["../../src/core/workflow-diagnostic-tools.ts"],"names":[],"mappings":"AAwDA,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,yCAAyC,CAAC;AAenF,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,YAAY,CAAC;AAKhD,gFAAgF;AAChF,wBAAgB,wCAAwC,CACtD,SAAS,EAAE,qBAAqB,GAC/B,SAAS,eAAe,EAAE,CAS5B"}