@getopencrawl/sdk 0.0.0-stage → 0.2.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 (88) hide show
  1. package/README.md +598 -2
  2. package/dist/agentPlatform.d.ts +146 -0
  3. package/dist/agentPlatform.d.ts.map +1 -0
  4. package/dist/agentPlatform.js +48 -0
  5. package/dist/agentPlatform.js.map +1 -0
  6. package/dist/agents.d.ts +237 -0
  7. package/dist/agents.d.ts.map +1 -0
  8. package/dist/agents.js +279 -0
  9. package/dist/agents.js.map +1 -0
  10. package/dist/answerContract.d.ts +85 -0
  11. package/dist/answerContract.d.ts.map +1 -0
  12. package/dist/answerContract.js +112 -0
  13. package/dist/answerContract.js.map +1 -0
  14. package/dist/answerView.d.ts +40 -0
  15. package/dist/answerView.d.ts.map +1 -0
  16. package/dist/answerView.js +118 -0
  17. package/dist/answerView.js.map +1 -0
  18. package/dist/configuration.d.ts +5 -0
  19. package/dist/configuration.d.ts.map +1 -0
  20. package/dist/configuration.js +29 -0
  21. package/dist/configuration.js.map +1 -0
  22. package/dist/customers.d.ts +176 -0
  23. package/dist/customers.d.ts.map +1 -0
  24. package/dist/customers.js +286 -0
  25. package/dist/customers.js.map +1 -0
  26. package/dist/errors.d.ts +35 -0
  27. package/dist/errors.d.ts.map +1 -0
  28. package/dist/errors.js +58 -0
  29. package/dist/errors.js.map +1 -0
  30. package/dist/eventEvidence.d.ts +10 -0
  31. package/dist/eventEvidence.d.ts.map +1 -0
  32. package/dist/eventEvidence.js +52 -0
  33. package/dist/eventEvidence.js.map +1 -0
  34. package/dist/index.d.ts +98 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +139 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/productMonitors.d.ts +258 -0
  39. package/dist/productMonitors.d.ts.map +1 -0
  40. package/dist/productMonitors.js +68 -0
  41. package/dist/productMonitors.js.map +1 -0
  42. package/dist/researchAnswerContract.d.ts +8 -0
  43. package/dist/researchAnswerContract.d.ts.map +1 -0
  44. package/dist/researchAnswerContract.js +23 -0
  45. package/dist/researchAnswerContract.js.map +1 -0
  46. package/dist/researchAnswerView.d.ts +8 -0
  47. package/dist/researchAnswerView.d.ts.map +1 -0
  48. package/dist/researchAnswerView.js +27 -0
  49. package/dist/researchAnswerView.js.map +1 -0
  50. package/dist/researchCompletion.d.ts +114 -0
  51. package/dist/researchCompletion.d.ts.map +1 -0
  52. package/dist/researchCompletion.js +94 -0
  53. package/dist/researchCompletion.js.map +1 -0
  54. package/dist/serviceTenants.d.ts +15 -0
  55. package/dist/serviceTenants.d.ts.map +1 -0
  56. package/dist/serviceTenants.js +58 -0
  57. package/dist/serviceTenants.js.map +1 -0
  58. package/dist/tools.d.ts +59 -0
  59. package/dist/tools.d.ts.map +1 -0
  60. package/dist/tools.js +60 -0
  61. package/dist/tools.js.map +1 -0
  62. package/dist/transport.d.ts +34 -0
  63. package/dist/transport.d.ts.map +1 -0
  64. package/dist/transport.js +227 -0
  65. package/dist/transport.js.map +1 -0
  66. package/dist/types.d.ts +399 -0
  67. package/dist/types.d.ts.map +1 -0
  68. package/dist/types.js +2 -0
  69. package/dist/types.js.map +1 -0
  70. package/dist/webhooks.d.ts +38 -0
  71. package/dist/webhooks.d.ts.map +1 -0
  72. package/dist/webhooks.js +73 -0
  73. package/dist/webhooks.js.map +1 -0
  74. package/examples/letter-customer-research-demo.mjs +54 -0
  75. package/examples/letter-customer-research-store.d.mts +38 -0
  76. package/examples/letter-customer-research-store.mjs +186 -0
  77. package/examples/letter-customer-research.d.mts +39 -0
  78. package/examples/letter-customer-research.mjs +194 -0
  79. package/examples/letter-event-receiver.d.mts +10 -0
  80. package/examples/letter-event-receiver.mjs +55 -0
  81. package/examples/letter-event-store.d.mts +35 -0
  82. package/examples/letter-event-store.mjs +84 -0
  83. package/examples/letter-seer.d.mts +31 -0
  84. package/examples/letter-seer.mjs +78 -0
  85. package/examples/letter-service-tenants.d.mts +12 -0
  86. package/examples/letter-service-tenants.mjs +49 -0
  87. package/examples/research-webhook-receiver.mjs +29 -0
  88. package/package.json +75 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"researchAnswerView.js","sourceRoot":"","sources":["../src/researchAnswerView.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,0BAA0B,EAAC,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAC,mBAAmB,EAAC,cAAc,EAA+B,MAAM,iBAAiB,CAAC;AAGjG;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,GAAqB;IACjE,IAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAC,aAAa,CAAC;QAAC,OAAO,EAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,EAAC,IAAI,EAAC,QAAQ,EAAC,EAAE,EAAC,CAAC;IACzF,IAAG,CAAC;QACH,MAAM,QAAQ,GAAC,MAAM,0BAA0B,CAAC,GAAG,CAAC,EAAC,MAAM,GAAC,IAAI,GAAG,EAAiB,CAAC;QACrF,IAAG,QAAQ,CAAC,KAAK,KAAG,wBAAwB;YAAC,OAAO,EAAC,KAAK,EAAC,SAAS,EAAC,IAAI,EAAC,IAAI,EAAC,QAAQ,EAAC,EAAE,EAAC,CAAC;QAC5F,MAAM,QAAQ,GAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,CAAC,KAAK,EAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAClE,IAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAC,CAAC,IAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,UAAU,CAAC,MAAM,GAAC,CAAC,CAAC,IAAE,QAAQ,CAAC,MAAM,GAAC,EAAE,IAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,OAAO,CAAC,KAAG,QAAQ,IAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAC,IAAI,CAAC;YAAC,OAAO,EAAC,KAAK,EAAC,SAAS,EAAC,IAAI,EAAC,IAAI,EAAC,QAAQ,EAAC,EAAE,EAAC,CAAC;QAC3M,MAAM,KAAK,GAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,EAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAC,GAAG,QAAQ,CAAC,CAAC;QAC3G,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAC,IAAI,EAAA,EAAE;YACrD,MAAM,KAAK,GAAC,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YACjF,MAAM,CAAC,GAAG,CAAC,IAAI,EAAC,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,EAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/F,CAAC,CAAC,CAAC,CAAC;QACJ,OAAO,cAAc,CAAC,GAAG,EAAC,QAAQ,EAAC,IAAI,CAAA,EAAE,CAAA,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAE,EAAE,CAAC,CAAC;IAChE,CAAC;IAAA,MAAK,CAAC;QAAA,OAAO,EAAC,KAAK,EAAC,SAAS,EAAC,IAAI,EAAC,IAAI,EAAC,QAAQ,EAAC,EAAE,EAAC,CAAA;IAAA,CAAC;AACvD,CAAC"}
@@ -0,0 +1,114 @@
1
+ /** Optional, versioned run metadata. It never changes the validity of literal findings. */
2
+ declare const POLICY_SHA256 = "1e465f634773191ff5e101b9589547d8af81c9c30f63fbc4febea477d58e009f";
3
+ declare const POLICY_V2_SHA256 = "e8793d22da1e547e689b17053f3cc7c8094f25ec77add02c79ce11243825dc21";
4
+ declare const POLICY_V3_SHA256 = "0a8dd4f97f60eea5afb38bfbc83e86fe6446610b2e3aa659e500c2c46c8c513b";
5
+ declare const LIMITS: {
6
+ readonly model_calls: 5;
7
+ readonly web_searches: 5;
8
+ readonly pages: 9;
9
+ readonly page_requests: 12;
10
+ readonly page_bytes: 6291456;
11
+ readonly work_seconds: 360;
12
+ readonly crawl_seconds: 60;
13
+ };
14
+ declare const LIMITS_V2: {
15
+ readonly model_calls: 7;
16
+ readonly web_searches: 5;
17
+ readonly pages: 9;
18
+ readonly page_requests: 12;
19
+ readonly page_bytes: 6291456;
20
+ readonly work_seconds: 480;
21
+ readonly crawl_seconds: 60;
22
+ };
23
+ declare const LIMITS_V3: {
24
+ readonly page_requests: 36;
25
+ readonly model_calls: 7;
26
+ readonly web_searches: 5;
27
+ readonly pages: 9;
28
+ readonly page_bytes: 6291456;
29
+ readonly work_seconds: 480;
30
+ readonly crawl_seconds: 60;
31
+ };
32
+ declare const NOTICE_TEXT: {
33
+ readonly bounded_sources: "This run inspected bounded saved source windows. It does not establish whole-question completeness.";
34
+ readonly evidence_omitted: "Some discovery, acquisition or source windows were omitted or unavailable. Read the saved gaps and evidence limits before using this answer.";
35
+ readonly repair_input_bound: "The completion pass could not use additional material within the input allowance. Earlier validated findings were retained.";
36
+ readonly unassessed: "Requested-detail coverage could not be assessed. No completion pass was inferred from that missing assessment.";
37
+ };
38
+ declare const REASONS: readonly ["admitted", "completion_reviewed", "no_eligible_repair", "no_identified_gap", "unassessed", "repair_input_bound", "no_new_admitted_source", "failed", "unknown", "cancelled"];
39
+ declare const PHASES_V2: readonly ["completion_discover", "synthesize", "completion_search", "completion_synthesize", "presentation_draft", "presentation_review"];
40
+ export type ResearchCompletionNoticeCode = keyof typeof NOTICE_TEXT;
41
+ export type ResearchCompletion = ({
42
+ version: 1;
43
+ policy: 'completion_v1';
44
+ policy_sha256: typeof POLICY_SHA256;
45
+ limits: typeof LIMITS;
46
+ } | {
47
+ version: 2;
48
+ policy: 'completion_v2';
49
+ policy_sha256: typeof POLICY_V2_SHA256;
50
+ limits: typeof LIMITS_V2;
51
+ } | {
52
+ version: 3;
53
+ policy: 'completion_v3';
54
+ policy_sha256: typeof POLICY_V3_SHA256;
55
+ limits: typeof LIMITS_V3;
56
+ }) & {
57
+ reason: typeof REASONS[number];
58
+ validated_passes: number;
59
+ whole_request_completeness: 'not_certified';
60
+ notices: ResearchCompletionNoticeCode[];
61
+ acquisition?: {
62
+ version: 1;
63
+ stages: {
64
+ stage: 'initial' | 'repair';
65
+ requests: number;
66
+ pages: number;
67
+ bytes: number;
68
+ elapsed_ms: number;
69
+ }[];
70
+ };
71
+ timing_ms?: {
72
+ total: number;
73
+ phases: {
74
+ phase: typeof PHASES_V2[number];
75
+ elapsed_ms: number;
76
+ }[];
77
+ };
78
+ completed_usage_lower_bound?: {
79
+ model_calls: number;
80
+ web_searches: number;
81
+ input_tokens: number;
82
+ output_tokens: number;
83
+ };
84
+ };
85
+ export type ResearchCompletionView = {
86
+ completion: ResearchCompletion | null;
87
+ notices: {
88
+ code: ResearchCompletionNoticeCode;
89
+ text: string;
90
+ }[];
91
+ };
92
+ /** Missing or malformed optional metadata yields no notices; saved run fields stay untouched. */
93
+ export declare function readResearchCompletion(run: {
94
+ usage?: unknown;
95
+ }): ResearchCompletionView;
96
+ declare const PRESENTATION_STATUSES: readonly ["reviewed", "partial", "refused", "skipped_no_eligible", "skipped_bound", "skipped_capacity", "unavailable", "unknown", "deadline", "interrupted"];
97
+ export type ResearchPresentation = {
98
+ version: 1;
99
+ status: typeof PRESENTATION_STATUSES[number];
100
+ canonical_sha256: string;
101
+ calls_reserved: number;
102
+ calls_completed: number;
103
+ calls_uncertain: number;
104
+ known_input_tokens: number;
105
+ known_output_tokens: number;
106
+ usage_is_lower_bound: boolean;
107
+ elapsed_ms: number;
108
+ };
109
+ /** Optional usage only: its digest reports provenance, not a client recomputation of canonical content. */
110
+ export declare function readResearchPresentation(run: {
111
+ usage?: unknown;
112
+ }): ResearchPresentation | null;
113
+ export {};
114
+ //# sourceMappingURL=researchCompletion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"researchCompletion.d.ts","sourceRoot":"","sources":["../src/researchCompletion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ /** Optional, versioned run metadata. It never changes the validity of literal findings. */
2
+ const POLICY_SHA256 = '1e465f634773191ff5e101b9589547d8af81c9c30f63fbc4febea477d58e009f';
3
+ const POLICY_V2_SHA256 = 'e8793d22da1e547e689b17053f3cc7c8094f25ec77add02c79ce11243825dc21';
4
+ const POLICY_V3_SHA256 = '0a8dd4f97f60eea5afb38bfbc83e86fe6446610b2e3aa659e500c2c46c8c513b';
5
+ const LIMITS = { model_calls: 5, web_searches: 5, pages: 9, page_requests: 12, page_bytes: 6291456, work_seconds: 360, crawl_seconds: 60 };
6
+ const LIMITS_V2 = { model_calls: 7, web_searches: 5, pages: 9, page_requests: 12, page_bytes: 6291456, work_seconds: 480, crawl_seconds: 60 };
7
+ const LIMITS_V3 = { ...LIMITS_V2, page_requests: 36 };
8
+ const NOTICE_TEXT = {
9
+ bounded_sources: 'This run inspected bounded saved source windows. It does not establish whole-question completeness.',
10
+ evidence_omitted: 'Some discovery, acquisition or source windows were omitted or unavailable. Read the saved gaps and evidence limits before using this answer.',
11
+ repair_input_bound: 'The completion pass could not use additional material within the input allowance. Earlier validated findings were retained.',
12
+ unassessed: 'Requested-detail coverage could not be assessed. No completion pass was inferred from that missing assessment.',
13
+ };
14
+ const REASONS = ['admitted', 'completion_reviewed', 'no_eligible_repair', 'no_identified_gap', 'unassessed', 'repair_input_bound', 'no_new_admitted_source', 'failed', 'unknown', 'cancelled'];
15
+ const PHASES = ['completion_discover', 'synthesize', 'completion_search', 'completion_synthesize'];
16
+ const PHASES_V2 = [...PHASES, 'presentation_draft', 'presentation_review'];
17
+ const object = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
18
+ const integer = (value, max) => typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 && value <= max;
19
+ const keys = (value, required, optional = []) => required.every(key => Object.hasOwn(value, key)) && Object.keys(value).every(key => required.includes(key) || optional.includes(key));
20
+ /** Missing or malformed optional metadata yields no notices; saved run fields stay untouched. */
21
+ export function readResearchCompletion(run) {
22
+ const empty = { completion: null, notices: [] };
23
+ try {
24
+ if (!object(run?.usage))
25
+ return empty;
26
+ const value = run.usage.completion;
27
+ if (!object(value) || !keys(value, ['version', 'policy', 'policy_sha256', 'limits', 'reason', 'validated_passes', 'whole_request_completeness', 'notices'], ['timing_ms', 'completed_usage_lower_bound', 'acquisition']) || value.whole_request_completeness !== 'not_certified' || !REASONS.includes(value.reason) || !integer(value.validated_passes, 2))
28
+ return empty;
29
+ const v3 = value.version === 3, v2 = value.version === 2 || v3;
30
+ if (!(v3 ? value.policy === 'completion_v3' && value.policy_sha256 === POLICY_V3_SHA256 : v2 ? value.policy === 'completion_v2' && value.policy_sha256 === POLICY_V2_SHA256 : value.version === 1 && value.policy === 'completion_v1' && value.policy_sha256 === POLICY_SHA256))
31
+ return empty;
32
+ const limits = v3 ? LIMITS_V3 : v2 ? LIMITS_V2 : LIMITS, phases = v2 ? PHASES_V2 : PHASES;
33
+ if (!object(value.limits) || !keys(value.limits, Object.keys(limits)) || Object.entries(limits).some(([key, limit]) => value.limits[key] !== limit))
34
+ return empty;
35
+ if (!Array.isArray(value.notices) || value.notices.length > 4 || new Set(value.notices).size !== value.notices.length || !value.notices.every(code => typeof code === 'string' && Object.hasOwn(NOTICE_TEXT, code)))
36
+ return empty;
37
+ if (Object.hasOwn(value, 'timing_ms')) {
38
+ const timing = value.timing_ms;
39
+ if (!object(timing) || !keys(timing, ['total', 'phases']) || !integer(timing.total, v2 ? 600000 : 360000) || !Array.isArray(timing.phases) || timing.phases.length > (v2 ? 6 : 4) || !timing.phases.every(phase => object(phase) && keys(phase, ['phase', 'elapsed_ms']) && phases.includes(phase.phase) && integer(phase.elapsed_ms, v2 ? 300000 : 210000)))
40
+ return empty;
41
+ }
42
+ if (Object.hasOwn(value, 'acquisition')) {
43
+ const acquisition = value.acquisition;
44
+ if (!v3 || value.reason === 'admitted' || !object(acquisition) || !keys(acquisition, ['version', 'stages']) || acquisition.version !== 1 || !Array.isArray(acquisition.stages) || acquisition.stages.length < 1 || acquisition.stages.length > 2)
45
+ return empty;
46
+ let requests = 0, pages = 0, bytes = 0, elapsed = 0;
47
+ for (const [index, row] of acquisition.stages.entries()) {
48
+ if (!object(row) || !keys(row, ['stage', 'requests', 'pages', 'bytes', 'elapsed_ms']) || row.stage !== (index === 0 ? 'initial' : 'repair') || !integer(row.requests, index === 0 ? 24 : 36) || !integer(row.pages, index === 0 ? 6 : 3) || !integer(row.bytes, 6291456) || !integer(row.elapsed_ms, 360000))
49
+ return empty;
50
+ requests += Number(row.requests);
51
+ pages += Number(row.pages);
52
+ bytes += Number(row.bytes);
53
+ elapsed += Number(row.elapsed_ms);
54
+ }
55
+ if (requests > 36 || pages > 9 || bytes > 6291456 || elapsed > 360000 || requests !== run.usage.page_requests || pages !== run.usage.pages_fetched || bytes !== run.usage.page_bytes)
56
+ return empty;
57
+ if (object(value.timing_ms) && elapsed > Number(value.timing_ms.total))
58
+ return empty;
59
+ }
60
+ if (Object.hasOwn(value, 'completed_usage_lower_bound')) {
61
+ const usage = value.completed_usage_lower_bound;
62
+ if (!object(usage) || !keys(usage, ['model_calls', 'web_searches', 'input_tokens', 'output_tokens']) || !integer(usage.model_calls, limits.model_calls) || !integer(usage.web_searches, 5) || !integer(usage.input_tokens, 1000000000) || !integer(usage.output_tokens, 1000000000))
63
+ return empty;
64
+ }
65
+ if (value.reason === 'admitted' && (value.validated_passes !== 0 || value.notices.length !== 0 || Object.hasOwn(value, 'timing_ms') || Object.hasOwn(value, 'completed_usage_lower_bound')))
66
+ return empty;
67
+ // Detach the returned view from the saved receipt; only fixed local text is displayed.
68
+ const completion = structuredClone(value);
69
+ return { completion, notices: completion.notices.map(code => ({ code, text: NOTICE_TEXT[code] })) };
70
+ }
71
+ catch {
72
+ return empty;
73
+ }
74
+ }
75
+ const PRESENTATION_STATUSES = ['reviewed', 'partial', 'refused', 'skipped_no_eligible', 'skipped_bound', 'skipped_capacity', 'unavailable', 'unknown', 'deadline', 'interrupted'];
76
+ /** Optional usage only: its digest reports provenance, not a client recomputation of canonical content. */
77
+ export function readResearchPresentation(run) {
78
+ try {
79
+ if (!object(run?.usage))
80
+ return null;
81
+ const value = run.usage.presentation;
82
+ if (!object(value) || !keys(value, ['version', 'status', 'canonical_sha256', 'calls_reserved', 'calls_completed', 'calls_uncertain', 'known_input_tokens', 'known_output_tokens', 'usage_is_lower_bound', 'elapsed_ms']) || value.version !== 1 || !PRESENTATION_STATUSES.includes(value.status) || typeof value.canonical_sha256 !== 'string' || !/^[0-9a-f]{64}$/.test(value.canonical_sha256))
83
+ return null;
84
+ if (!integer(value.calls_reserved, 2) || !integer(value.calls_completed, 2) || !integer(value.calls_uncertain, 2) || Number(value.calls_completed) + Number(value.calls_uncertain) > Number(value.calls_reserved) || !integer(value.known_input_tokens, 1000000000) || !integer(value.known_output_tokens, 12000) || value.usage_is_lower_bound !== (Number(value.calls_uncertain) > 0) || !integer(value.elapsed_ms, 180000))
85
+ return null;
86
+ if (value.calls_completed === 0 && value.known_input_tokens !== 0 || Number(value.known_output_tokens) > Number(value.calls_completed) * 6000)
87
+ return null;
88
+ return structuredClone(value);
89
+ }
90
+ catch {
91
+ return null;
92
+ }
93
+ }
94
+ //# sourceMappingURL=researchCompletion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"researchCompletion.js","sourceRoot":"","sources":["../src/researchCompletion.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,MAAM,aAAa,GAAC,kEAAkE,CAAC;AACvF,MAAM,gBAAgB,GAAC,kEAAkE,CAAC;AAC1F,MAAM,gBAAgB,GAAC,kEAAkE,CAAC;AAC1F,MAAM,MAAM,GAAC,EAAC,WAAW,EAAC,CAAC,EAAC,YAAY,EAAC,CAAC,EAAC,KAAK,EAAC,CAAC,EAAC,aAAa,EAAC,EAAE,EAAC,UAAU,EAAC,OAAO,EAAC,YAAY,EAAC,GAAG,EAAC,aAAa,EAAC,EAAE,EAAU,CAAC;AACnI,MAAM,SAAS,GAAC,EAAC,WAAW,EAAC,CAAC,EAAC,YAAY,EAAC,CAAC,EAAC,KAAK,EAAC,CAAC,EAAC,aAAa,EAAC,EAAE,EAAC,UAAU,EAAC,OAAO,EAAC,YAAY,EAAC,GAAG,EAAC,aAAa,EAAC,EAAE,EAAU,CAAC;AACtI,MAAM,SAAS,GAAC,EAAC,GAAG,SAAS,EAAC,aAAa,EAAC,EAAE,EAAU,CAAC;AACzD,MAAM,WAAW,GAAC;IACjB,eAAe,EAAC,qGAAqG;IACrH,gBAAgB,EAAC,8IAA8I;IAC/J,kBAAkB,EAAC,6HAA6H;IAChJ,UAAU,EAAC,gHAAgH;CAClH,CAAC;AACX,MAAM,OAAO,GAAC,CAAC,UAAU,EAAC,qBAAqB,EAAC,oBAAoB,EAAC,mBAAmB,EAAC,YAAY,EAAC,oBAAoB,EAAC,wBAAwB,EAAC,QAAQ,EAAC,SAAS,EAAC,WAAW,CAAU,CAAC;AAC7L,MAAM,MAAM,GAAC,CAAC,qBAAqB,EAAC,YAAY,EAAC,mBAAmB,EAAC,uBAAuB,CAAU,CAAC;AACvG,MAAM,SAAS,GAAC,CAAC,GAAG,MAAM,EAAC,oBAAoB,EAAC,qBAAqB,CAAU,CAAC;AAShF,MAAM,MAAM,GAAC,CAAC,KAAa,EAAiC,EAAE,CAAA,KAAK,KAAG,IAAI,IAAE,OAAO,KAAK,KAAG,QAAQ,IAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC3H,MAAM,OAAO,GAAC,CAAC,KAAa,EAAC,GAAU,EAAC,EAAE,CAAA,OAAO,KAAK,KAAG,QAAQ,IAAE,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAE,KAAK,IAAE,CAAC,IAAE,KAAK,IAAE,GAAG,CAAC;AACrH,MAAM,IAAI,GAAC,CAAC,KAA4B,EAAC,QAAiB,EAAC,WAAkB,EAAE,EAAC,EAAE,CAAA,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAA,EAAE,CAAA,MAAM,CAAC,MAAM,CAAC,KAAK,EAAC,GAAG,CAAC,CAAC,IAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAA,EAAE,CAAA,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAE/M,iGAAiG;AACjG,MAAM,UAAU,sBAAsB,CAAC,GAAoB;IAC1D,MAAM,KAAK,GAAwB,EAAC,UAAU,EAAC,IAAI,EAAC,OAAO,EAAC,EAAE,EAAC,CAAC;IAChE,IAAG,CAAC;QACH,IAAG,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;YAAC,OAAO,KAAK,CAAC;QACpC,MAAM,KAAK,GAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC;QACjC,IAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAE,CAAC,IAAI,CAAC,KAAK,EAAC,CAAC,SAAS,EAAC,QAAQ,EAAC,eAAe,EAAC,QAAQ,EAAC,QAAQ,EAAC,kBAAkB,EAAC,4BAA4B,EAAC,SAAS,CAAC,EAAC,CAAC,WAAW,EAAC,6BAA6B,EAAC,aAAa,CAAC,CAAC,IAAE,KAAK,CAAC,0BAA0B,KAAG,eAAe,IAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAsC,CAAC,IAAE,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAC,CAAC,CAAC;YAAC,OAAO,KAAK,CAAC;QACjX,MAAM,EAAE,GAAC,KAAK,CAAC,OAAO,KAAG,CAAC,EAAC,EAAE,GAAC,KAAK,CAAC,OAAO,KAAG,CAAC,IAAE,EAAE,CAAC;QACpD,IAAG,CAAC,CAAC,EAAE,CAAA,CAAC,CAAA,KAAK,CAAC,MAAM,KAAG,eAAe,IAAE,KAAK,CAAC,aAAa,KAAG,gBAAgB,CAAA,CAAC,CAAA,EAAE,CAAA,CAAC,CAAA,KAAK,CAAC,MAAM,KAAG,eAAe,IAAE,KAAK,CAAC,aAAa,KAAG,gBAAgB,CAAA,CAAC,CAAA,KAAK,CAAC,OAAO,KAAG,CAAC,IAAE,KAAK,CAAC,MAAM,KAAG,eAAe,IAAE,KAAK,CAAC,aAAa,KAAG,aAAa,CAAC;YAAC,OAAO,KAAK,CAAC;QAC9P,MAAM,MAAM,GAAC,EAAE,CAAA,CAAC,CAAA,SAAS,CAAA,CAAC,CAAA,EAAE,CAAA,CAAC,CAAA,SAAS,CAAA,CAAC,CAAA,MAAM,EAAC,MAAM,GAAmB,EAAE,CAAA,CAAC,CAAA,SAAS,CAAA,CAAC,CAAA,MAAM,CAAC;QAC3F,IAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAC,KAAK,CAAC,EAAC,EAAE,CAAC,KAAK,CAAC,MAAiC,CAAC,GAAG,CAAC,KAAG,KAAK,CAAC;YAAC,OAAO,KAAK,CAAC;QAClL,IAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAE,KAAK,CAAC,OAAO,CAAC,MAAM,GAAC,CAAC,IAAE,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAG,KAAK,CAAC,OAAO,CAAC,MAAM,IAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAA,EAAE,CAAA,OAAO,IAAI,KAAG,QAAQ,IAAE,MAAM,CAAC,MAAM,CAAC,WAAW,EAAC,IAAI,CAAC,CAAC;YAAC,OAAO,KAAK,CAAC;QAC/M,IAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAC,WAAW,CAAC,EAAC,CAAC;YACpC,MAAM,MAAM,GAAC,KAAK,CAAC,SAAS,CAAC;YAC7B,IAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAE,CAAC,IAAI,CAAC,MAAM,EAAC,CAAC,OAAO,EAAC,QAAQ,CAAC,CAAC,IAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAC,EAAE,CAAA,CAAC,CAAA,MAAM,CAAA,CAAC,CAAA,MAAM,CAAC,IAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAC,CAAC,EAAE,CAAA,CAAC,CAAA,CAAC,CAAA,CAAC,CAAA,CAAC,CAAC,IAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAA,EAAE,CAAA,MAAM,CAAC,KAAK,CAAC,IAAE,IAAI,CAAC,KAAK,EAAC,CAAC,OAAO,EAAC,YAAY,CAAC,CAAC,IAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAe,CAAC,IAAE,OAAO,CAAC,KAAK,CAAC,UAAU,EAAC,EAAE,CAAA,CAAC,CAAA,MAAM,CAAA,CAAC,CAAA,MAAM,CAAC,CAAC;gBAAC,OAAO,KAAK,CAAC;QAC9U,CAAC;QACD,IAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAC,aAAa,CAAC,EAAC,CAAC;YACtC,MAAM,WAAW,GAAC,KAAK,CAAC,WAAW,CAAC;YACpC,IAAG,CAAC,EAAE,IAAE,KAAK,CAAC,MAAM,KAAG,UAAU,IAAE,CAAC,MAAM,CAAC,WAAW,CAAC,IAAE,CAAC,IAAI,CAAC,WAAW,EAAC,CAAC,SAAS,EAAC,QAAQ,CAAC,CAAC,IAAE,WAAW,CAAC,OAAO,KAAG,CAAC,IAAE,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,IAAE,WAAW,CAAC,MAAM,CAAC,MAAM,GAAC,CAAC,IAAE,WAAW,CAAC,MAAM,CAAC,MAAM,GAAC,CAAC;gBAAC,OAAO,KAAK,CAAC;YACrO,IAAI,QAAQ,GAAC,CAAC,EAAC,KAAK,GAAC,CAAC,EAAC,KAAK,GAAC,CAAC,EAAC,OAAO,GAAC,CAAC,CAAC;YACzC,KAAI,MAAM,CAAC,KAAK,EAAC,GAAG,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,EAAC,CAAC;gBACtD,IAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAE,CAAC,IAAI,CAAC,GAAG,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,OAAO,EAAC,OAAO,EAAC,YAAY,CAAC,CAAC,IAAE,GAAG,CAAC,KAAK,KAAG,CAAC,KAAK,KAAG,CAAC,CAAA,CAAC,CAAA,SAAS,CAAA,CAAC,CAAA,QAAQ,CAAC,IAAE,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAC,KAAK,KAAG,CAAC,CAAA,CAAC,CAAA,EAAE,CAAA,CAAC,CAAA,EAAE,CAAC,IAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAC,KAAK,KAAG,CAAC,CAAA,CAAC,CAAA,CAAC,CAAA,CAAC,CAAA,CAAC,CAAC,IAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAC,OAAO,CAAC,IAAE,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAC,MAAM,CAAC;oBAAC,OAAO,KAAK,CAAC;gBAChR,QAAQ,IAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAAA,KAAK,IAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAAA,KAAK,IAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAAA,OAAO,IAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAClH,CAAC;YACD,IAAG,QAAQ,GAAC,EAAE,IAAE,KAAK,GAAC,CAAC,IAAE,KAAK,GAAC,OAAO,IAAE,OAAO,GAAC,MAAM,IAAE,QAAQ,KAAG,GAAG,CAAC,KAAK,CAAC,aAAa,IAAE,KAAK,KAAG,GAAG,CAAC,KAAK,CAAC,aAAa,IAAE,KAAK,KAAG,GAAG,CAAC,KAAK,CAAC,UAAU;gBAAC,OAAO,KAAK,CAAC;YACvK,IAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAE,OAAO,GAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;gBAAC,OAAO,KAAK,CAAC;QAChF,CAAC;QACD,IAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAC,6BAA6B,CAAC,EAAC,CAAC;YACtD,MAAM,KAAK,GAAC,KAAK,CAAC,2BAA2B,CAAC;YAC9C,IAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAE,CAAC,IAAI,CAAC,KAAK,EAAC,CAAC,aAAa,EAAC,cAAc,EAAC,cAAc,EAAC,eAAe,CAAC,CAAC,IAAE,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAC,MAAM,CAAC,WAAW,CAAC,IAAE,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,EAAC,CAAC,CAAC,IAAE,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,EAAC,UAAU,CAAC,IAAE,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,EAAC,UAAU,CAAC;gBAAC,OAAO,KAAK,CAAC;QAC/Q,CAAC;QACD,IAAG,KAAK,CAAC,MAAM,KAAG,UAAU,IAAE,CAAC,KAAK,CAAC,gBAAgB,KAAG,CAAC,IAAE,KAAK,CAAC,OAAO,CAAC,MAAM,KAAG,CAAC,IAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAC,WAAW,CAAC,IAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAC,6BAA6B,CAAC,CAAC;YAAC,OAAO,KAAK,CAAC;QACxL,uFAAuF;QACvF,MAAM,UAAU,GAAC,eAAe,CAAC,KAAK,CAAuB,CAAC;QAC9D,OAAO,EAAC,UAAU,EAAC,OAAO,EAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAA,EAAE,CAAA,CAAC,EAAC,IAAI,EAAC,IAAI,EAAC,WAAW,CAAC,IAAI,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC;IAC3F,CAAC;IAAA,MAAK,CAAC;QAAA,OAAO,KAAK,CAAA;IAAA,CAAC;AACrB,CAAC;AAED,MAAM,qBAAqB,GAAC,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,qBAAqB,EAAC,eAAe,EAAC,kBAAkB,EAAC,aAAa,EAAC,SAAS,EAAC,UAAU,EAAC,aAAa,CAAU,CAAC;AAMhL,2GAA2G;AAC3G,MAAM,UAAU,wBAAwB,CAAC,GAAoB;IAC5D,IAAG,CAAC;QACH,IAAG,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;YAAC,OAAO,IAAI,CAAC;QACnC,MAAM,KAAK,GAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC;QACnC,IAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAE,CAAC,IAAI,CAAC,KAAK,EAAC,CAAC,SAAS,EAAC,QAAQ,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,iBAAiB,EAAC,iBAAiB,EAAC,oBAAoB,EAAC,qBAAqB,EAAC,sBAAsB,EAAC,YAAY,CAAC,CAAC,IAAE,KAAK,CAAC,OAAO,KAAG,CAAC,IAAE,CAAC,qBAAqB,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAwC,CAAC,IAAE,OAAO,KAAK,CAAC,gBAAgB,KAAG,QAAQ,IAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;YAAC,OAAO,IAAI,CAAC;QACtZ,IAAG,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,EAAC,CAAC,CAAC,IAAE,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,EAAC,CAAC,CAAC,IAAE,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,EAAC,CAAC,CAAC,IAAE,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,GAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,GAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,IAAE,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAC,UAAU,CAAC,IAAE,CAAC,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAC,KAAK,CAAC,IAAE,KAAK,CAAC,oBAAoB,KAAG,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,GAAC,CAAC,CAAC,IAAE,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,EAAC,MAAM,CAAC;YAAC,OAAO,IAAI,CAAC;QAC7Y,IAAG,KAAK,CAAC,eAAe,KAAG,CAAC,IAAE,KAAK,CAAC,kBAAkB,KAAG,CAAC,IAAE,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,GAAC,IAAI;YAAC,OAAO,IAAI,CAAC;QAC7I,OAAO,eAAe,CAAC,KAAK,CAAyB,CAAC;IACvD,CAAC;IAAA,MAAK,CAAC;QAAA,OAAO,IAAI,CAAA;IAAA,CAAC;AACpB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { Transport, type MutationOptions, type RequestOptions } from './transport.js';
2
+ import type { ServiceTenant, ServiceTenantInput, ServiceTenantRevision, ServiceTenantReceipt, ServiceTenantOperation, ServiceTenantPage, ServiceTenantListOptions } from './types.js';
3
+ /** Control-plane mutations never retry automatically, including keyed writes. */
4
+ export declare class ServiceTenantControl {
5
+ private readonly transport;
6
+ constructor(transport: Transport);
7
+ create(input: ServiceTenantInput, options: MutationOptions): Promise<ServiceTenantReceipt>;
8
+ list(options?: ServiceTenantListOptions & RequestOptions): Promise<ServiceTenantPage>;
9
+ get(id: string, options?: RequestOptions): Promise<ServiceTenant>;
10
+ rotate(id: string, input: ServiceTenantRevision, options: MutationOptions): Promise<ServiceTenantReceipt>;
11
+ revoke(id: string, input: ServiceTenantRevision, options: MutationOptions): Promise<ServiceTenantReceipt>;
12
+ private mutate;
13
+ recover(input: ServiceTenantOperation, options: MutationOptions): Promise<ServiceTenantReceipt>;
14
+ }
15
+ //# sourceMappingURL=serviceTenants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serviceTenants.d.ts","sourceRoot":"","sources":["../src/serviceTenants.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,SAAS,EAA+B,KAAK,eAAe,EAAC,KAAK,cAAc,EAAC,MAAM,gBAAgB,CAAC;AAChH,OAAO,KAAK,EAAC,aAAa,EAAC,kBAAkB,EAAC,qBAAqB,EAAC,oBAAoB,EAAC,sBAAsB,EAAC,iBAAiB,EAAC,wBAAwB,EAAC,MAAM,YAAY,CAAC;AAS9K,iFAAiF;AACjF,qBAAa,oBAAoB;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAC,SAAS;IAC1C,MAAM,CAAC,KAAK,EAAC,kBAAkB,EAAC,OAAO,EAAC,eAAe,GAAE,OAAO,CAAC,oBAAoB,CAAC;IAMtF,IAAI,CAAC,OAAO,GAAC,wBAAwB,GAAC,cAAiB,GAAE,OAAO,CAAC,iBAAiB,CAAC;IAMnF,GAAG,CAAC,EAAE,EAAC,MAAM,EAAC,OAAO,GAAC,cAAiB,GAAE,OAAO,CAAC,aAAa,CAAC;IAC/D,MAAM,CAAC,EAAE,EAAC,MAAM,EAAC,KAAK,EAAC,qBAAqB,EAAC,OAAO,EAAC,eAAe,GAAE,OAAO,CAAC,oBAAoB,CAAC;IACnG,MAAM,CAAC,EAAE,EAAC,MAAM,EAAC,KAAK,EAAC,qBAAqB,EAAC,OAAO,EAAC,eAAe,GAAE,OAAO,CAAC,oBAAoB,CAAC;YAC3F,MAAM;IACd,OAAO,CAAC,KAAK,EAAC,sBAAsB,EAAC,OAAO,EAAC,eAAe,GAAE,OAAO,CAAC,oBAAoB,CAAC;CACjG"}
@@ -0,0 +1,58 @@
1
+ import { OpenCrawlProtocolError, OpenCrawlValidationError } from './errors.js';
2
+ import { boundedInteger, idempotencyKey } from './transport.js';
3
+ const ROOT = '/api/v1/service-tenants';
4
+ function tenantId(value) { if (typeof value !== 'string' || !/^stn_[0-9a-f]{32}$/.test(value))
5
+ throw new OpenCrawlValidationError('A server-issued service tenant identifier is required.'); return value; }
6
+ function operation(value) { if (typeof value !== 'string' || !/^(create|(?:rotate|revoke):stn_[0-9a-f]{32})$/.test(value))
7
+ throw new OpenCrawlValidationError('Use create, rotate:<tenant ID>, or revoke:<tenant ID> for receipt recovery.'); return value; }
8
+ function tenant(value, expectedId) { if (!value || !/^stn_[0-9a-f]{32}$/.test(value.id) || !['active', 'revoked'].includes(value.status) || !['active', 'suspended', 'revoked'].includes(value.access_state) || !Number.isSafeInteger(value.revision) || value.revision < 1 || (expectedId && value.id !== expectedId))
9
+ throw new OpenCrawlProtocolError('OpenCrawl returned an invalid customer integration descriptor.'); return value; }
10
+ function receipt(value, expectedOperation, expectedId) {
11
+ if (!value || !value.receipt || value.receipt.operation !== expectedOperation || !Number.isSafeInteger(value.receipt.target_revision) || value.receipt.target_revision < 1 || typeof value.replayed !== 'boolean' || typeof value.secret_available !== 'boolean' || !(value.key === null || typeof value.key === 'string' && value.key.length > 0) || value.secret_available !== (value.key !== null) || (value.replayed && value.key !== null))
12
+ throw new OpenCrawlProtocolError('OpenCrawl returned an invalid customer provisioning receipt.');
13
+ tenant(value.tenant, expectedId);
14
+ if (value.receipt.tenant_id !== value.tenant.id)
15
+ throw new OpenCrawlProtocolError('The provisioning receipt does not match its customer integration.');
16
+ return value;
17
+ }
18
+ /** Control-plane mutations never retry automatically, including keyed writes. */
19
+ export class ServiceTenantControl {
20
+ transport;
21
+ constructor(transport) {
22
+ this.transport = transport;
23
+ }
24
+ async create(input, options) {
25
+ idempotencyKey(options?.idempotencyKey);
26
+ if (!input || typeof input.external_customer_id !== 'string' || !/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/.test(input.external_customer_id) || typeof input.name !== 'string' || !input.name.trim() || Array.from(input.name).length > 120 || /[\x00-\x1f\x7f]/.test(input.name))
27
+ throw new OpenCrawlValidationError('Provide a stable customer identifier and a nonempty display name of at most 120 characters.');
28
+ const result = receipt(await this.transport.request(ROOT, { ...options, method: 'POST', body: input, automaticRetry: false }), 'create');
29
+ if (result.tenant.external_customer_id !== input.external_customer_id)
30
+ throw new OpenCrawlProtocolError('The receipt belongs to a different external customer.');
31
+ return result;
32
+ }
33
+ async list(options = {}) {
34
+ const params = new URLSearchParams();
35
+ if (options.limit !== undefined)
36
+ params.set('limit', String(boundedInteger(options.limit, 'limit', 1, 100)));
37
+ if (options.offset !== undefined)
38
+ params.set('offset', String(boundedInteger(options.offset, 'offset', 0, 10000)));
39
+ if (options.external_customer_id !== undefined) {
40
+ if (typeof options.external_customer_id !== 'string' || !/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/.test(options.external_customer_id))
41
+ throw new OpenCrawlValidationError('Use an exact stable customer identifier.');
42
+ params.set('external_customer_id', options.external_customer_id);
43
+ }
44
+ const suffix = params.toString();
45
+ const value = await this.transport.request(ROOT + (suffix ? '?' + suffix : ''), options);
46
+ if (!value || !Array.isArray(value.items) || !(value.next_offset === null || Number.isSafeInteger(value.next_offset) && value.next_offset >= 0))
47
+ throw new OpenCrawlProtocolError('OpenCrawl returned an invalid customer integration page.');
48
+ value.items.forEach(item => tenant(item));
49
+ return value;
50
+ }
51
+ async get(id, options = {}) { return tenant(await this.transport.request(ROOT + '/' + tenantId(id), options), id); }
52
+ async rotate(id, input, options) { return this.mutate(id, 'rotate', input, options); }
53
+ async revoke(id, input, options) { return this.mutate(id, 'revoke', input, options); }
54
+ async mutate(id, action, input, options) { tenantId(id); idempotencyKey(options?.idempotencyKey); boundedInteger(input.expected_revision, 'expected_revision', 1, Number.MAX_SAFE_INTEGER); return receipt(await this.transport.request(`${ROOT}/${id}/${action}`, { ...options, method: 'POST', body: input, automaticRetry: false }), `${action}:${id}`, id); }
55
+ async recover(input, options) { const op = operation(input); idempotencyKey(options?.idempotencyKey); const value = receipt(await this.transport.request(`${ROOT}/receipts/by-key?operation=${encodeURIComponent(op)}`, { ...options, method: 'GET' }), op, op === 'create' ? undefined : op.slice(op.indexOf(':') + 1)); if (value.key !== null || !value.replayed)
56
+ throw new OpenCrawlProtocolError('A recovered provisioning receipt must not contain a secret.'); return value; }
57
+ }
58
+ //# sourceMappingURL=serviceTenants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serviceTenants.js","sourceRoot":"","sources":["../src/serviceTenants.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import type { Customer } from './customers.js';
2
+ export type JsonSchema = {
3
+ type: 'object';
4
+ properties: Record<string, unknown>;
5
+ required?: string[];
6
+ additionalProperties?: boolean;
7
+ };
8
+ export type AgentTool = {
9
+ name: string;
10
+ description: string;
11
+ inputSchema: JsonSchema;
12
+ execute(input: Record<string, unknown>, options?: {
13
+ signal?: AbortSignal;
14
+ }): Promise<unknown>;
15
+ };
16
+ export type ToolOptions = {
17
+ prefix?: string;
18
+ waitMs?: number;
19
+ };
20
+ export type AgentToolSet = {
21
+ /** Provider-neutral definitions with their handlers. */
22
+ readonly tools: AgentTool[];
23
+ /** Run a tool by name. Failures come back as {error} so the agent can recover. */
24
+ run(name: string, input: unknown, options?: {
25
+ signal?: AbortSignal;
26
+ }): Promise<unknown>;
27
+ /** Anthropic Messages API `tools`. */
28
+ anthropic(): {
29
+ name: string;
30
+ description: string;
31
+ input_schema: JsonSchema;
32
+ }[];
33
+ /** OpenAI Chat Completions `tools`. */
34
+ openai(): {
35
+ type: 'function';
36
+ function: {
37
+ name: string;
38
+ description: string;
39
+ parameters: JsonSchema;
40
+ };
41
+ }[];
42
+ /** OpenAI Responses API `tools`. */
43
+ openaiResponses(): {
44
+ type: 'function';
45
+ name: string;
46
+ description: string;
47
+ parameters: JsonSchema;
48
+ }[];
49
+ /** Vercel AI SDK `tools`; pass its `jsonSchema` helper from 'ai'. */
50
+ vercel(jsonSchema: (schema: JsonSchema) => unknown): Record<string, {
51
+ description: string;
52
+ inputSchema: unknown;
53
+ parameters: unknown;
54
+ execute: (input: Record<string, unknown>) => Promise<unknown>;
55
+ }>;
56
+ };
57
+ /** Tools an LLM agent can call to watch competitors and research a customer's market. */
58
+ export declare function agentTools(customer: Customer, options?: ToolOptions): AgentToolSet;
59
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,QAAQ,EAAqB,MAAM,gBAAgB,CAAC;AAEjE,MAAM,MAAM,UAAU,GAAC;IAAC,IAAI,EAAC,QAAQ,CAAC;IAAA,UAAU,EAAC,MAAM,CAAC,MAAM,EAAC,OAAO,CAAC,CAAC;IAAA,QAAQ,CAAC,EAAC,MAAM,EAAE,CAAC;IAAA,oBAAoB,CAAC,EAAC,OAAO,CAAA;CAAC,CAAC;AAC1H,MAAM,MAAM,SAAS,GAAC;IAAC,IAAI,EAAC,MAAM,CAAC;IAAA,WAAW,EAAC,MAAM,CAAC;IAAA,WAAW,EAAC,UAAU,CAAC;IAAA,OAAO,CAAC,KAAK,EAAC,MAAM,CAAC,MAAM,EAAC,OAAO,CAAC,EAAC,OAAO,CAAC,EAAC;QAAC,MAAM,CAAC,EAAC,WAAW,CAAA;KAAC,GAAE,OAAO,CAAC,OAAO,CAAC,CAAA;CAAC,CAAC;AACpK,MAAM,MAAM,WAAW,GAAC;IAAC,MAAM,CAAC,EAAC,MAAM,CAAC;IAAA,MAAM,CAAC,EAAC,MAAM,CAAA;CAAC,CAAC;AACxD,MAAM,MAAM,YAAY,GAAC;IACxB,wDAAwD;IACxD,QAAQ,CAAC,KAAK,EAAC,SAAS,EAAE,CAAC;IAC3B,kFAAkF;IAClF,GAAG,CAAC,IAAI,EAAC,MAAM,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC;QAAC,MAAM,CAAC,EAAC,WAAW,CAAA;KAAC,GAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/E,sCAAsC;IACtC,SAAS,IAAG;QAAC,IAAI,EAAC,MAAM,CAAC;QAAA,WAAW,EAAC,MAAM,CAAC;QAAA,YAAY,EAAC,UAAU,CAAA;KAAC,EAAE,CAAC;IACvE,uCAAuC;IACvC,MAAM,IAAG;QAAC,IAAI,EAAC,UAAU,CAAC;QAAA,QAAQ,EAAC;YAAC,IAAI,EAAC,MAAM,CAAC;YAAA,WAAW,EAAC,MAAM,CAAC;YAAA,UAAU,EAAC,UAAU,CAAA;SAAC,CAAA;KAAC,EAAE,CAAC;IAC7F,oCAAoC;IACpC,eAAe,IAAG;QAAC,IAAI,EAAC,UAAU,CAAC;QAAA,IAAI,EAAC,MAAM,CAAC;QAAA,WAAW,EAAC,MAAM,CAAC;QAAA,UAAU,EAAC,UAAU,CAAA;KAAC,EAAE,CAAC;IAC3F,qEAAqE;IACrE,MAAM,CAAC,UAAU,EAAC,CAAC,MAAM,EAAC,UAAU,KAAG,OAAO,GAAE,MAAM,CAAC,MAAM,EAAC;QAAC,WAAW,EAAC,MAAM,CAAC;QAAA,WAAW,EAAC,OAAO,CAAC;QAAA,UAAU,EAAC,OAAO,CAAC;QAAA,OAAO,EAAC,CAAC,KAAK,EAAC,MAAM,CAAC,MAAM,EAAC,OAAO,CAAC,KAAG,OAAO,CAAC,OAAO,CAAC,CAAA;KAAC,CAAC,CAAC;CACpL,CAAC;AAYF,yFAAyF;AACzF,wBAAgB,UAAU,CAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO,GAAC,WAAc,GAAE,YAAY,CA+BhF"}
package/dist/tools.js ADDED
@@ -0,0 +1,60 @@
1
+ import { OpenCrawlError } from './errors.js';
2
+ const URLS = { type: 'array', items: { type: 'string', format: 'uri' } };
3
+ function signalView(s) {
4
+ return { id: s.id, watch: s.watchName, watch_id: s.watchId, url: s.url, kind: s.kind, observed_at: s.observedAt, headline: s.headline,
5
+ ...(s.relevance ? { relevance: s.relevance, relevance_reason: s.relevanceReason } : {}), changes: s.changes.slice(0, 5).map(h => ({ removed: h.removed.slice(0, 8), added: h.added.slice(0, 8) })), truncated: s.truncated || s.changes.length > 5 };
6
+ }
7
+ function answerView(a) {
8
+ return { answer_id: a.answerId, status: a.status, done: a.done, findings: a.findings.map(f => ({ claim: f.claim, qualifiers: f.qualifiers, sources: f.sources.map(s => ({ title: s.title, url: s.url, quote: s.quote, published_at: s.publishedAt })) })), gaps: a.gaps,
9
+ ...(a.done ? {} : { next: 'Research is still running. Call the get-research tool with this answer_id later.' }) };
10
+ }
11
+ function watchView(w) { return { watch_id: w.id, name: w.name, urls: w.urls, every: w.every, status: w.status, last_checked_at: w.lastCheckedAt }; }
12
+ function strings(value, field) { if (value === undefined)
13
+ return undefined; if (value === null)
14
+ throw new TypeError(`${field} must be a list of URLs.`); if (!Array.isArray(value) || !value.every(v => typeof v === 'string'))
15
+ throw new TypeError(`${field} must be a list of URLs.`); return value; }
16
+ function string(value, field) { if (typeof value !== 'string' || !value.trim())
17
+ throw new TypeError(`${field} is required.`); return value; }
18
+ function optional(value, field) { return value === undefined ? undefined : string(value, field); }
19
+ /** Tools an LLM agent can call to watch competitors and research a customer's market. */
20
+ export function agentTools(customer, options = {}) {
21
+ const p = options.prefix ?? 'opencrawl_', who = customer.profile.name;
22
+ const tools = [
23
+ { name: p + 'watch_pages', description: `Start watching public web pages (competitor changelogs, pricing, release notes, blogs, docs, status pages) for ${who}. OpenCrawl checks them on a schedule and reports what changed. Re-using the same name and pages returns the existing watch.`,
24
+ inputSchema: { type: 'object', properties: { name: { type: 'string', description: 'Short label, e.g. "Greptile changelog".' }, urls: { ...URLS, minItems: 1, maxItems: 20, description: 'Exact page URLs to watch.' }, every: { type: 'string', enum: ['hour', 'day', 'week'], description: 'How often to check. Default day.' }, why: { type: 'string', description: 'Optional: what matters on these pages, used to rate each change\'s relevance.' } }, required: ['name', 'urls'], additionalProperties: false },
25
+ execute: async (input, o) => watchView(await customer.watch({ name: string(input.name, 'name'), urls: strings(input.urls ?? null, 'urls') ?? [], every: input.every, brief: optional(input.why, 'why') }, o)) },
26
+ { name: p + 'list_watches', description: `List the pages being watched for ${who}.`, inputSchema: { type: 'object', properties: {}, additionalProperties: false },
27
+ execute: async (_, o) => ({ watches: (await customer.watches(o)).map(watchView) }) },
28
+ { name: p + 'get_signals', description: `Get what changed on watched pages for ${who}: new or edited text (removed and added lines), pages that could not be checked, and recoveries. Date, clock and "updated N days ago" edits are filtered out. Pass the returned cursor next time to get only newer signals.`,
29
+ inputSchema: { type: 'object', properties: { since: { type: 'string', description: 'Cursor from the previous call; omit for all history.' }, watch_id: { type: 'string', description: 'Limit to one watch.' } }, additionalProperties: false },
30
+ execute: async (input, o) => { const r = await customer.signals({ ...o, since: optional(input.since, 'since') ?? null, watchId: optional(input.watch_id, 'watch_id'), limit: 25 }); return { signals: r.signals.map(signalView), cursor: r.cursor, more: r.more }; } },
31
+ { name: p + 'stop_watch', description: 'Stop checking a watch. Its history is kept.', inputSchema: { type: 'object', properties: { watch_id: { type: 'string' } }, required: ['watch_id'], additionalProperties: false },
32
+ execute: async (input, o) => watchView(await customer.unwatch(string(input.watch_id, 'watch_id'), o)) },
33
+ { name: p + 'research', description: `Research a question about ${who}'s market or competitors on the public web and return cited findings (claim, qualifiers, source quotes) plus gaps. Name up to three exact pages, such as competitor changelogs, for the most reliable results. Takes one to four minutes.`,
34
+ inputSchema: { type: 'object', properties: { question: { type: 'string', description: 'A specific question, e.g. "What did Greptile and Graphite ship recently, with dates?"' }, urls: { ...URLS, maxItems: 3, description: 'Optional pages to read.' } }, required: ['question'], additionalProperties: false },
35
+ execute: async (input, o) => answerView(await customer.ask(string(input.question, 'question'), { ...o, urls: strings(input.urls, 'urls'), waitMs: options.waitMs ?? 240000 })) },
36
+ { name: p + 'get_research', description: 'Read a research answer that was still running.', inputSchema: { type: 'object', properties: { answer_id: { type: 'string' } }, required: ['answer_id'], additionalProperties: false },
37
+ execute: async (input, o) => answerView(await customer.answer(string(input.answer_id, 'answer_id'), { ...o, waitMs: 30000 })) },
38
+ ];
39
+ const byName = new Map(tools.map(t => [t.name, t]));
40
+ const run = async (name, input, o) => {
41
+ const tool = byName.get(name);
42
+ if (!tool)
43
+ return { error: { type: 'unknown_tool', message: `No tool named ${name}.` } };
44
+ try {
45
+ return await tool.execute(input && typeof input === 'object' && !Array.isArray(input) ? input : {}, o);
46
+ }
47
+ catch (error) {
48
+ if (error instanceof TypeError || error instanceof OpenCrawlError)
49
+ return { error: { type: error instanceof TypeError ? 'invalid_input' : error.name, message: error.message } };
50
+ throw error;
51
+ }
52
+ };
53
+ return { tools, run,
54
+ anthropic: () => tools.map(t => ({ name: t.name, description: t.description, input_schema: t.inputSchema })),
55
+ openai: () => tools.map(t => ({ type: 'function', function: { name: t.name, description: t.description, parameters: t.inputSchema } })),
56
+ openaiResponses: () => tools.map(t => ({ type: 'function', name: t.name, description: t.description, parameters: t.inputSchema })),
57
+ vercel: jsonSchema => Object.fromEntries(tools.map(t => { const schema = jsonSchema(t.inputSchema); return [t.name, { description: t.description, inputSchema: schema, parameters: schema, execute: (input) => run(t.name, input) }]; })),
58
+ };
59
+ }
60
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ export type Fetch = (input: string, init: RequestInit) => Promise<Response>;
2
+ /** baseUrl defaults to the hosted service, https://app.getopencrawl.com. */
3
+ export type ClientOptions = {
4
+ baseUrl?: string;
5
+ apiKey: string;
6
+ fetch?: Fetch;
7
+ timeoutMs?: number;
8
+ maxRetries?: number;
9
+ };
10
+ export type RequestOptions = {
11
+ signal?: AbortSignal;
12
+ timeoutMs?: number;
13
+ };
14
+ export type MutationOptions = RequestOptions & {
15
+ idempotencyKey: string;
16
+ };
17
+ export type InternalRequest = RequestOptions & {
18
+ method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
19
+ body?: unknown;
20
+ idempotencyKey?: string;
21
+ readOnly?: boolean;
22
+ automaticRetry?: boolean;
23
+ responseType?: 'png';
24
+ };
25
+ export declare function boundedInteger(value: number, name: string, min: number, max: number): number;
26
+ export declare function idPath(value: string): string;
27
+ export declare function idempotencyKey(value: string): string;
28
+ export declare class Transport {
29
+ #private;
30
+ readonly baseUrl: string;
31
+ constructor(options: ClientOptions);
32
+ request<T>(path: string, options?: InternalRequest): Promise<T>;
33
+ }
34
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,KAAK,GAAG,CAAC,KAAK,EAAC,MAAM,EAAC,IAAI,EAAC,WAAW,KAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AACvE,4EAA4E;AAC5E,MAAM,MAAM,aAAa,GAAC;IAAC,OAAO,CAAC,EAAC,MAAM,CAAC;IAAA,MAAM,EAAC,MAAM,CAAC;IAAA,KAAK,CAAC,EAAC,KAAK,CAAC;IAAA,SAAS,CAAC,EAAC,MAAM,CAAC;IAAA,UAAU,CAAC,EAAC,MAAM,CAAA;CAAC,CAAC;AAC5G,MAAM,MAAM,cAAc,GAAC;IAAC,MAAM,CAAC,EAAC,WAAW,CAAC;IAAA,SAAS,CAAC,EAAC,MAAM,CAAA;CAAC,CAAC;AACnE,MAAM,MAAM,eAAe,GAAC,cAAc,GAAC;IAAC,cAAc,EAAC,MAAM,CAAA;CAAC,CAAC;AACnE,MAAM,MAAM,eAAe,GAAC,cAAc,GAAC;IAAC,MAAM,CAAC,EAAC,KAAK,GAAC,MAAM,GAAC,KAAK,GAAC,OAAO,GAAC,QAAQ,CAAC;IAAA,IAAI,CAAC,EAAC,OAAO,CAAC;IAAA,cAAc,CAAC,EAAC,MAAM,CAAC;IAAA,QAAQ,CAAC,EAAC,OAAO,CAAC;IAAA,cAAc,CAAC,EAAC,OAAO,CAAC;IAAA,YAAY,CAAC,EAAC,KAAK,CAAA;CAAC,CAAC;AAG5L,wBAAgB,cAAc,CAAC,KAAK,EAAC,MAAM,EAAC,IAAI,EAAC,MAAM,EAAC,GAAG,EAAC,MAAM,EAAC,GAAG,EAAC,MAAM,UAAiK;AAC9O,wBAAgB,MAAM,CAAC,KAAK,EAAC,MAAM,UAAkO;AACrQ,wBAAgB,cAAc,CAAC,KAAK,EAAC,MAAM,UAA6N;AAyBxQ,qBAAa,SAAS;;IACrB,QAAQ,CAAC,OAAO,EAAC,MAAM,CAAC;gBAEZ,OAAO,EAAC,aAAa;IAQ3B,OAAO,CAAC,CAAC,EAAE,IAAI,EAAC,MAAM,EAAC,OAAO,GAAC,eAAkB,GAAE,OAAO,CAAC,CAAC,CAAC;CAwBnE"}