@noodleseed/one 0.169.0 → 0.171.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.
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/capabilities.d.ts +19 -0
- package/dist/commands/capabilities.d.ts.map +1 -0
- package/dist/commands/capabilities.js +128 -0
- package/dist/commands/capabilities.js.map +1 -0
- package/dist/commands/catalog.d.ts.map +1 -1
- package/dist/commands/catalog.js +2 -1
- package/dist/commands/catalog.js.map +1 -1
- package/dist/commands/whatsapp-ops.d.ts +13 -0
- package/dist/commands/whatsapp-ops.d.ts.map +1 -0
- package/dist/commands/whatsapp-ops.js +244 -0
- package/dist/commands/whatsapp-ops.js.map +1 -0
- package/dist/commands/whatsapp-output.d.ts +3 -0
- package/dist/commands/whatsapp-output.d.ts.map +1 -0
- package/dist/commands/whatsapp-output.js +70 -0
- package/dist/commands/whatsapp-output.js.map +1 -0
- package/dist/dev.js +2 -0
- package/dist/dev.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/plugin-mode/plugin-operation-contract.d.ts +3 -3
- package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js +8 -0
- package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.js +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +2 -2
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +5 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js +3 -2
- package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-ref.js +6 -0
- package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
- package/node_modules/@noodle-borg/app-audit/dist/audit-embedded-assistant.js +2 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-configuration.js +2 -1
- package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-interactive.d.ts +1 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-interactive.js +4 -1
- package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-model-context.js +9 -4
- package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-turn-context.d.ts +16 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-turn-context.js +19 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/channel-coordinator.d.ts +145 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/channel-coordinator.js +378 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/channel-inbox.js +160 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/channel-provider-blocks.d.ts +18 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/channel-provider-blocks.js +69 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/channel-spend.js +82 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/channel-store.d.ts +42 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/channel-store.js +76 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/channel-types.d.ts +134 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/channel-types.js +72 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/channel-work.d.ts +20 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/channel-work.js +221 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/messaging-tool-dispatch.d.ts +15 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/messaging-tool-dispatch.js +34 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/model-request.d.ts +19 -1
- package/node_modules/@noodle-borg/assistant-gateway/dist/model-request.js +22 -6
- package/node_modules/@noodle-borg/assistant-gateway/dist/portable.d.ts +7 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/portable.js +7 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/postgres-assistant-appearance-store.js +83 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/postgres-assistant-elevation.js +151 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/postgres-assistant-interaction-writes.js +45 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/postgres-assistant-interactions.js +340 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/postgres-assistant.js +439 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/postgres-channel-store.js +102 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/postgres-continuity-store.js +159 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/postgres-elevation-store.js +110 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/postgres-embed-store.js +134 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/postgres.js +11 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/public-surface.d.ts +8 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/public-surface.js +23 -0
- package/node_modules/@noodle-borg/authoring/dist/assistant.d.ts +19 -4
- package/node_modules/@noodle-borg/authoring/dist/assistant.js +51 -20
- package/node_modules/@noodle-borg/authoring/dist/index.d.ts +2 -1
- package/node_modules/@noodle-borg/authoring/dist/index.js +2 -1
- package/node_modules/@noodle-borg/authoring/dist/load-authored.js +1 -1
- package/node_modules/@noodle-borg/authoring/dist/recording.d.ts +2 -1
- package/node_modules/@noodle-borg/authoring/dist/recording.js +29 -1
- package/node_modules/@noodle-borg/authoring/dist/server.d.ts +3 -0
- package/node_modules/@noodle-borg/authoring/dist/server.js +5 -1
- package/node_modules/@noodle-borg/authoring/dist/web-capabilities.d.ts +17 -0
- package/node_modules/@noodle-borg/authoring/dist/web-capabilities.js +15 -0
- package/node_modules/@noodle-borg/authoring/package.json +1 -0
- package/node_modules/@noodle-borg/capabilities/dist/index.js +7 -0
- package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-channels.js +121 -0
- package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-hosted-observability.js +102 -0
- package/node_modules/@noodle-borg/cli-catalog/dist/index.js +1 -0
- package/node_modules/@noodle-borg/compiler/dist/artifact/assemble.js +3 -0
- package/node_modules/@noodle-borg/compiler/dist/artifact/config.js +1 -1
- package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts +2 -0
- package/node_modules/@noodle-borg/compiler/dist/artifact/version.d.ts +2 -1
- package/node_modules/@noodle-borg/compiler/dist/artifact/version.js +2 -1
- package/node_modules/@noodle-borg/compiler/dist/compile.js +2 -0
- package/node_modules/@noodle-borg/compiler/dist/errors.d.ts +1 -1
- package/node_modules/@noodle-borg/compiler/dist/fulfilment-emit.js +18 -3
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts +106 -12
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js +60 -29
- package/node_modules/@noodle-borg/compiler/dist/manifest/website-projection.d.ts +1 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/website-projection.js +19 -0
- package/node_modules/@noodle-borg/compiler/dist/web-capabilities.js +55 -0
- package/node_modules/@noodle-borg/compiler/package.json +1 -0
- package/node_modules/@noodle-borg/connector-http/dist/ssrf.js +5 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/bounded-body.js +38 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/first-party.js +2 -3
- package/node_modules/@noodle-borg/knowledge-crawl/dist/html-text.js +10 -2
- package/node_modules/@noodle-borg/knowledge-crawl/dist/index.d.ts +1 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/index.js +1 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/page-reader.d.ts +26 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/page-reader.js +127 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/robots.js +48 -23
- package/node_modules/@noodle-borg/knowledge-crawl/package.json +1 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/budget.d.ts +29 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/budget.js +124 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/contracts.d.ts +212 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/contracts.js +113 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/errors.d.ts +8 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/errors.js +21 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/executor.d.ts +26 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/executor.js +156 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/limits.d.ts +15 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/limits.js +15 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/operator-contracts.d.ts +159 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/operator-contracts.js +69 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/operator-route.d.ts +5 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/operator-route.js +160 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/policy-store.d.ts +34 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/policy-store.js +61 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/portable.d.ts +10 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/portable.js +10 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/service.d.ts +83 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/service.js +139 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/urls.d.ts +3 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/urls.js +30 -0
- package/node_modules/@noodle-borg/managed-capabilities/package.json +49 -0
- package/node_modules/@noodle-borg/module/dist/contract.d.ts +11 -0
- package/node_modules/@noodle-borg/module-audit/dist/index.js +37 -0
- package/node_modules/@noodle-borg/module-audit/dist/postgres-audit.js +126 -0
- package/node_modules/@noodle-borg/module-audit/dist/route.js +66 -0
- package/node_modules/@noodle-borg/runtime/dist/confirmation.js +29 -0
- package/node_modules/@noodle-borg/runtime/dist/connector/types.d.ts +2 -0
- package/node_modules/@noodle-borg/runtime/dist/execute.d.ts +3 -0
- package/node_modules/@noodle-borg/runtime/dist/execute.js +6 -1
- package/node_modules/@noodle-borg/runtime/dist/index.d.ts +2 -1
- package/node_modules/@noodle-borg/runtime/dist/index.js +2 -1
- package/node_modules/@noodle-borg/runtime/dist/interactive.js +10 -1
- package/node_modules/@noodle-borg/runtime/dist/managed-origins.js +8 -4
- package/node_modules/@noodle-borg/runtime/dist/operation-execution.js +3 -0
- package/node_modules/@noodle-borg/runtime/dist/postgres-state-handles.js +311 -0
- package/node_modules/@noodle-borg/runtime/dist/postgres.js +4 -0
- package/node_modules/@noodle-borg/runtime/dist/result-meta.d.ts +2 -0
- package/node_modules/@noodle-borg/runtime/dist/result-meta.js +6 -0
- package/node_modules/@noodle-borg/runtime/dist/result.d.ts +4 -0
- package/node_modules/@noodle-borg/runtime/dist/web-capabilities.d.ts +71 -0
- package/node_modules/@noodle-borg/runtime/dist/web-capabilities.js +41 -0
- package/node_modules/@noodle-borg/runtime/package.json +1 -0
- package/node_modules/@noodle-borg/service/dist/assistant-composition.js +18 -0
- package/node_modules/@noodle-borg/service/dist/build-info.js +5 -2
- package/node_modules/@noodle-borg/service/dist/business-information/source-ingestion-coordinator.js +7 -0
- package/node_modules/@noodle-borg/service/dist/channels/360dialog.js +233 -0
- package/node_modules/@noodle-borg/service/dist/channels/cipher.js +37 -0
- package/node_modules/@noodle-borg/service/dist/channels/composition.js +37 -0
- package/node_modules/@noodle-borg/service/dist/channels/inference-guard.js +53 -0
- package/node_modules/@noodle-borg/service/dist/channels/runtime.js +337 -0
- package/node_modules/@noodle-borg/service/dist/channels/worker-loop.js +50 -0
- package/node_modules/@noodle-borg/service/dist/local-options.d.ts +1 -0
- package/node_modules/@noodle-borg/service/dist/local-web-capabilities.js +13 -0
- package/node_modules/@noodle-borg/service/dist/mcp-protocol-runtime.js +21 -0
- package/node_modules/@noodle-borg/service/dist/modules/route-dispatch.js +13 -0
- package/node_modules/@noodle-borg/service/dist/registry-compile.js +3 -0
- package/node_modules/@noodle-borg/service/dist/registry-types.d.ts +1 -0
- package/node_modules/@noodle-borg/service/dist/registry.js +3 -0
- package/node_modules/@noodle-borg/service/dist/routes/assistant-agent.js +66 -35
- package/node_modules/@noodle-borg/service/dist/routes/assistant-interactions.js +7 -4
- package/node_modules/@noodle-borg/service/dist/routes/assistant-model-binding.js +6 -2
- package/node_modules/@noodle-borg/service/dist/routes/business-information-channels.js +14 -1
- package/node_modules/@noodle-borg/service/dist/routes/whatsapp.js +238 -0
- package/node_modules/@noodle-borg/service/dist/serve-local.js +14 -0
- package/node_modules/@noodle-borg/service/dist/serve-resource-auth.js +10 -0
- package/node_modules/@noodle-borg/service/dist/service.js +37 -33
- package/node_modules/@noodle-borg/service/dist/web-capabilities.js +39 -0
- package/node_modules/@noodle-borg/service/package.json +3 -1
- package/node_modules/@noodle-borg/wire-contracts/dist/application-channels.d.ts +33 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/application-channels.js +9 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/index.d.ts +2 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/index.js +2 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/service-info.d.ts +2 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/service-info.js +10 -2
- package/node_modules/@noodle-borg/wire-contracts/dist/whatsapp.d.ts +426 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/whatsapp.js +213 -0
- package/node_modules/@noodle-borg/wire-contracts/package.json +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { CAPABILITY_ERROR_CODES } from './errors.js';
|
|
3
|
+
import { WEB_EXTRACT_LIMITS as limits } from './limits.js';
|
|
4
|
+
const domainSchema = z
|
|
5
|
+
.string()
|
|
6
|
+
.max(253)
|
|
7
|
+
.regex(/^(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z][a-z0-9-]*$/);
|
|
8
|
+
export const capabilityNameSchema = z
|
|
9
|
+
.string()
|
|
10
|
+
.min(1)
|
|
11
|
+
.max(64)
|
|
12
|
+
.regex(/^[a-z][a-z0-9_]*$/);
|
|
13
|
+
export const webPolicySchema = z
|
|
14
|
+
.object({
|
|
15
|
+
maxUrls: z.number().int().min(1).max(limits.maxUrls).optional(),
|
|
16
|
+
maxCalls: z.number().int().min(1).max(limits.maxCalls).optional(),
|
|
17
|
+
timeoutMs: z.number().int().min(100).max(limits.timeoutMs).optional(),
|
|
18
|
+
maxTextBytes: z.number().int().min(256).max(limits.maxTextBytes).optional(),
|
|
19
|
+
domains: z.array(domainSchema).min(1).max(32).optional(),
|
|
20
|
+
})
|
|
21
|
+
.strict();
|
|
22
|
+
export const webCapabilityBaseSchema = z
|
|
23
|
+
.object({
|
|
24
|
+
name: capabilityNameSchema,
|
|
25
|
+
class: z.literal('web.extract.v1'),
|
|
26
|
+
title: z.string().trim().min(1).max(120),
|
|
27
|
+
description: z.string().trim().min(1).max(1000),
|
|
28
|
+
provider: z.object({ kind: z.literal('noodle-managed') }).strict(),
|
|
29
|
+
policy: webPolicySchema.optional(),
|
|
30
|
+
})
|
|
31
|
+
.strict();
|
|
32
|
+
export const webExtractRequestSchema = z
|
|
33
|
+
.object({
|
|
34
|
+
urls: z.array(z.string().min(1).max(limits.maxUrlCharacters)).min(1).max(limits.maxUrls),
|
|
35
|
+
domains: z.array(domainSchema).min(1).max(32).optional(),
|
|
36
|
+
})
|
|
37
|
+
.strict();
|
|
38
|
+
const sourceSchema = z
|
|
39
|
+
.object({
|
|
40
|
+
ref: z.string().min(1).max(80),
|
|
41
|
+
url: z.string().max(limits.maxUrlCharacters).url(),
|
|
42
|
+
title: z.string().max(512).optional(),
|
|
43
|
+
retrievedAt: z.iso.datetime(),
|
|
44
|
+
publishedAt: z.iso.datetime().optional(),
|
|
45
|
+
observedAt: z.iso.datetime().optional(),
|
|
46
|
+
expiresAt: z.iso.datetime().optional(),
|
|
47
|
+
attribution: z.string().max(512).optional(),
|
|
48
|
+
rights: z.string().max(512).optional(),
|
|
49
|
+
})
|
|
50
|
+
.strict();
|
|
51
|
+
export const webExtractResultSchema = z
|
|
52
|
+
.object({
|
|
53
|
+
status: z.enum(['complete', 'partial']),
|
|
54
|
+
items: z
|
|
55
|
+
.array(z
|
|
56
|
+
.object({
|
|
57
|
+
requestIndex: z
|
|
58
|
+
.number()
|
|
59
|
+
.int()
|
|
60
|
+
.min(0)
|
|
61
|
+
.max(limits.maxUrls - 1),
|
|
62
|
+
sourceRef: z.string().min(1).max(80),
|
|
63
|
+
content: z
|
|
64
|
+
.object({
|
|
65
|
+
format: z.literal('text'),
|
|
66
|
+
text: z.string().min(1).max(limits.maxTextBytes),
|
|
67
|
+
})
|
|
68
|
+
.strict(),
|
|
69
|
+
links: z
|
|
70
|
+
.array(z
|
|
71
|
+
.object({
|
|
72
|
+
url: z.string().max(limits.maxUrlCharacters).url(),
|
|
73
|
+
label: z.string().max(200).optional(),
|
|
74
|
+
})
|
|
75
|
+
.strict())
|
|
76
|
+
.max(limits.maxLinks),
|
|
77
|
+
truncated: z.boolean(),
|
|
78
|
+
})
|
|
79
|
+
.strict())
|
|
80
|
+
.min(1)
|
|
81
|
+
.max(limits.maxUrls),
|
|
82
|
+
sources: z.array(sourceSchema).min(1).max(limits.maxUrls),
|
|
83
|
+
warnings: z
|
|
84
|
+
.array(z
|
|
85
|
+
.object({
|
|
86
|
+
requestIndex: z
|
|
87
|
+
.number()
|
|
88
|
+
.int()
|
|
89
|
+
.min(0)
|
|
90
|
+
.max(limits.maxUrls - 1),
|
|
91
|
+
code: z.enum([...CAPABILITY_ERROR_CODES, 'content_truncated']),
|
|
92
|
+
})
|
|
93
|
+
.strict())
|
|
94
|
+
.max(limits.maxUrls * 2),
|
|
95
|
+
})
|
|
96
|
+
.strict();
|
|
97
|
+
export const WEB_CONNECTOR_ID = 'noodle_web';
|
|
98
|
+
export const WEB_CONNECTOR_VERSION = '1.0.0';
|
|
99
|
+
export const webOperationInputSchema = z
|
|
100
|
+
.object({ name: capabilityNameSchema, request: webExtractRequestSchema })
|
|
101
|
+
.strict();
|
|
102
|
+
export const WEB_OPERATION_SIGNATURE = {
|
|
103
|
+
type: 'read',
|
|
104
|
+
input: z.toJSONSchema(webOperationInputSchema),
|
|
105
|
+
output: z.toJSONSchema(webExtractResultSchema),
|
|
106
|
+
};
|
|
107
|
+
export const WEB_CATALOG_CONNECTOR = {
|
|
108
|
+
id: WEB_CONNECTOR_ID,
|
|
109
|
+
version: WEB_CONNECTOR_VERSION,
|
|
110
|
+
kind: 'builtin',
|
|
111
|
+
operations: { extract: WEB_OPERATION_SIGNATURE },
|
|
112
|
+
};
|
|
113
|
+
//# sourceMappingURL=contracts.js.map
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const CAPABILITY_ERROR_CODES: readonly ["capability_unavailable", "capability_binding_invalid", "capability_requirement_unsupported", "capability_policy_denied", "capability_budget_exhausted", "capability_source_rejected", "capability_provider_failed", "capability_result_invalid", "capability_cancelled"];
|
|
2
|
+
export type CapabilityErrorCode = (typeof CAPABILITY_ERROR_CODES)[number];
|
|
3
|
+
/** Messages are fixed safe codes: never retain a URL, provider payload or a nested cause. */
|
|
4
|
+
export declare class CapabilityError extends Error {
|
|
5
|
+
readonly code: CapabilityErrorCode;
|
|
6
|
+
constructor(code: CapabilityErrorCode);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export const CAPABILITY_ERROR_CODES = [
|
|
2
|
+
'capability_unavailable',
|
|
3
|
+
'capability_binding_invalid',
|
|
4
|
+
'capability_requirement_unsupported',
|
|
5
|
+
'capability_policy_denied',
|
|
6
|
+
'capability_budget_exhausted',
|
|
7
|
+
'capability_source_rejected',
|
|
8
|
+
'capability_provider_failed',
|
|
9
|
+
'capability_result_invalid',
|
|
10
|
+
'capability_cancelled',
|
|
11
|
+
];
|
|
12
|
+
/** Messages are fixed safe codes: never retain a URL, provider payload or a nested cause. */
|
|
13
|
+
export class CapabilityError extends Error {
|
|
14
|
+
code;
|
|
15
|
+
constructor(code) {
|
|
16
|
+
super(code);
|
|
17
|
+
this.code = code;
|
|
18
|
+
this.name = 'CapabilityError';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { CapabilityBudget } from './budget.js';
|
|
2
|
+
import { type WebCapability, type WebExtractResult, type WebPolicy } from './contracts.js';
|
|
3
|
+
export interface PublicPageReaderPort {
|
|
4
|
+
read(request: {
|
|
5
|
+
readonly url: string;
|
|
6
|
+
readonly domains?: readonly string[];
|
|
7
|
+
readonly signal: AbortSignal;
|
|
8
|
+
readonly beforeRequest: () => void;
|
|
9
|
+
readonly maxBytes: number;
|
|
10
|
+
}): Promise<unknown>;
|
|
11
|
+
}
|
|
12
|
+
export interface WebExtractDeps {
|
|
13
|
+
readonly reader: PublicPageReaderPort;
|
|
14
|
+
readonly budget: CapabilityBudget;
|
|
15
|
+
readonly enabled: boolean;
|
|
16
|
+
/** Computed from verified caller claims and the underlying declaration, never from tool arguments. */
|
|
17
|
+
readonly authorized: boolean;
|
|
18
|
+
readonly operatorPolicy: WebPolicy;
|
|
19
|
+
readonly signal?: AbortSignal;
|
|
20
|
+
/** Durable, attributable admission. A refusal or outage must not dispatch the reader. */
|
|
21
|
+
readonly admit: () => Promise<boolean>;
|
|
22
|
+
}
|
|
23
|
+
export declare function effectiveWebPolicy(developer?: WebPolicy, operator?: WebPolicy): WebPolicy;
|
|
24
|
+
/** One governed path for generated MCP tools, assistant calls and composed operations. */
|
|
25
|
+
export declare function executeWebExtract(declaration: WebCapability, input: unknown, deps: WebExtractDeps): Promise<WebExtractResult>;
|
|
26
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { webExtractRequestSchema, webExtractResultSchema, webPolicySchema, } from './contracts.js';
|
|
3
|
+
import { CapabilityError } from './errors.js';
|
|
4
|
+
import { WEB_EXTRACT_LIMITS as limits } from './limits.js';
|
|
5
|
+
import { publicPageUrl } from './urls.js';
|
|
6
|
+
const pageSchema = z
|
|
7
|
+
.object({
|
|
8
|
+
url: z.string().max(limits.maxUrlCharacters),
|
|
9
|
+
title: z.string().max(512),
|
|
10
|
+
text: z.string().min(1).max(limits.maxPageBytes),
|
|
11
|
+
retrievedAt: z.iso.datetime(),
|
|
12
|
+
links: z
|
|
13
|
+
.array(z
|
|
14
|
+
.object({
|
|
15
|
+
url: z.string().max(limits.maxUrlCharacters),
|
|
16
|
+
label: z.string().max(200).optional(),
|
|
17
|
+
})
|
|
18
|
+
.strict())
|
|
19
|
+
.max(limits.maxLinks),
|
|
20
|
+
})
|
|
21
|
+
.strict();
|
|
22
|
+
export function effectiveWebPolicy(developer = {}, operator = {}) {
|
|
23
|
+
const a = webPolicySchema.parse(developer);
|
|
24
|
+
const b = webPolicySchema.parse(operator);
|
|
25
|
+
const domains = intersectDomains(a.domains, b.domains);
|
|
26
|
+
return {
|
|
27
|
+
maxUrls: Math.min(a.maxUrls ?? limits.maxUrls, b.maxUrls ?? limits.maxUrls),
|
|
28
|
+
maxCalls: Math.min(a.maxCalls ?? limits.maxCalls, b.maxCalls ?? limits.maxCalls),
|
|
29
|
+
timeoutMs: Math.min(a.timeoutMs ?? limits.timeoutMs, b.timeoutMs ?? limits.timeoutMs),
|
|
30
|
+
maxTextBytes: Math.min(a.maxTextBytes ?? limits.maxTextBytes, b.maxTextBytes ?? limits.maxTextBytes),
|
|
31
|
+
...(domains === undefined ? {} : { domains }),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function intersectDomains(a, b) {
|
|
35
|
+
return a === undefined
|
|
36
|
+
? b === undefined
|
|
37
|
+
? undefined
|
|
38
|
+
: [...b]
|
|
39
|
+
: b === undefined
|
|
40
|
+
? [...a]
|
|
41
|
+
: a.filter((host) => b.includes(host));
|
|
42
|
+
}
|
|
43
|
+
/** One governed path for generated MCP tools, assistant calls and composed operations. */
|
|
44
|
+
export async function executeWebExtract(declaration, input, deps) {
|
|
45
|
+
if (!deps.enabled)
|
|
46
|
+
throw new CapabilityError('capability_unavailable');
|
|
47
|
+
if (!deps.authorized)
|
|
48
|
+
throw new CapabilityError('capability_policy_denied');
|
|
49
|
+
if (deps.signal?.aborted)
|
|
50
|
+
throw new CapabilityError('capability_cancelled');
|
|
51
|
+
const request = webExtractRequestSchema.safeParse(input);
|
|
52
|
+
if (!request.success)
|
|
53
|
+
throw new CapabilityError('capability_source_rejected');
|
|
54
|
+
const policy = effectiveWebPolicy(declaration.policy, deps.operatorPolicy);
|
|
55
|
+
const domains = intersectDomains(policy.domains, request.data.domains);
|
|
56
|
+
if (request.data.urls.length > (policy.maxUrls ?? limits.maxUrls))
|
|
57
|
+
throw new CapabilityError('capability_policy_denied');
|
|
58
|
+
const urls = request.data.urls.map((url) => publicPageUrl(url, domains).href);
|
|
59
|
+
if (new Set(urls).size !== urls.length)
|
|
60
|
+
throw new CapabilityError('capability_source_rejected');
|
|
61
|
+
const deadline = deps.budget.reserve(urls, policy);
|
|
62
|
+
const signal = deps.signal === undefined ? deadline : AbortSignal.any([deadline, deps.signal]);
|
|
63
|
+
let admitted;
|
|
64
|
+
try {
|
|
65
|
+
admitted = await withinSignal(signal, deps.admit);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
if (signal.aborted)
|
|
69
|
+
throw new CapabilityError(deps.signal?.aborted ? 'capability_cancelled' : 'capability_budget_exhausted');
|
|
70
|
+
throw new CapabilityError('capability_unavailable');
|
|
71
|
+
}
|
|
72
|
+
if (!admitted)
|
|
73
|
+
throw new CapabilityError('capability_budget_exhausted');
|
|
74
|
+
const parts = await Promise.all(urls.map(async (url, requestIndex) => {
|
|
75
|
+
try {
|
|
76
|
+
return await deps.budget.withSlot(signal, async () => {
|
|
77
|
+
const raw = await withinSignal(signal, () => deps.reader.read({
|
|
78
|
+
url,
|
|
79
|
+
signal,
|
|
80
|
+
maxBytes: limits.maxPageBytes,
|
|
81
|
+
beforeRequest: () => {
|
|
82
|
+
signal.throwIfAborted();
|
|
83
|
+
deps.budget.beforeRequest();
|
|
84
|
+
},
|
|
85
|
+
...(domains === undefined ? {} : { domains }),
|
|
86
|
+
}));
|
|
87
|
+
const parsed = pageSchema.safeParse(raw);
|
|
88
|
+
if (!parsed.success)
|
|
89
|
+
throw new CapabilityError('capability_result_invalid');
|
|
90
|
+
const page = parsed.data;
|
|
91
|
+
const sourceUrl = publicPageUrl(page.url, domains);
|
|
92
|
+
for (const link of page.links) {
|
|
93
|
+
if (publicPageUrl(link.url, domains).origin !== sourceUrl.origin)
|
|
94
|
+
throw new CapabilityError('capability_result_invalid');
|
|
95
|
+
}
|
|
96
|
+
const content = deps.budget.text(page.text, policy.maxTextBytes ?? limits.maxTextBytes);
|
|
97
|
+
const ref = `source_${requestIndex + 1}`;
|
|
98
|
+
return {
|
|
99
|
+
item: {
|
|
100
|
+
requestIndex,
|
|
101
|
+
sourceRef: ref,
|
|
102
|
+
content: { format: 'text', text: content.text },
|
|
103
|
+
links: page.links,
|
|
104
|
+
truncated: content.truncated,
|
|
105
|
+
},
|
|
106
|
+
source: {
|
|
107
|
+
ref,
|
|
108
|
+
url: sourceUrl.href,
|
|
109
|
+
retrievedAt: page.retrievedAt,
|
|
110
|
+
...(page.title === '' ? {} : { title: page.title }),
|
|
111
|
+
},
|
|
112
|
+
warnings: content.truncated
|
|
113
|
+
? [{ requestIndex, code: 'content_truncated' }]
|
|
114
|
+
: [],
|
|
115
|
+
};
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
const code = error instanceof CapabilityError ? error.code : 'capability_provider_failed';
|
|
120
|
+
return { warnings: [{ requestIndex, code }] };
|
|
121
|
+
}
|
|
122
|
+
}));
|
|
123
|
+
if (signal.aborted)
|
|
124
|
+
throw new CapabilityError(deps.signal?.aborted ? 'capability_cancelled' : 'capability_budget_exhausted');
|
|
125
|
+
const items = parts.flatMap((part) => ('item' in part ? [part.item] : []));
|
|
126
|
+
const sources = parts.flatMap((part) => ('source' in part ? [part.source] : []));
|
|
127
|
+
const warnings = parts.flatMap((part) => part.warnings);
|
|
128
|
+
if (items.length === 0)
|
|
129
|
+
throw new CapabilityError('capability_provider_failed');
|
|
130
|
+
const result = webExtractResultSchema.safeParse({
|
|
131
|
+
status: warnings.length === 0 ? 'complete' : 'partial',
|
|
132
|
+
items,
|
|
133
|
+
sources,
|
|
134
|
+
warnings,
|
|
135
|
+
});
|
|
136
|
+
if (!result.success)
|
|
137
|
+
throw new CapabilityError('capability_result_invalid');
|
|
138
|
+
return result.data;
|
|
139
|
+
}
|
|
140
|
+
/** A late/misbehaving adapter cannot hold the caller past cancellation or the trusted deadline. */
|
|
141
|
+
function withinSignal(signal, run) {
|
|
142
|
+
if (signal.aborted)
|
|
143
|
+
return Promise.reject(signal.reason);
|
|
144
|
+
return new Promise((resolve, reject) => {
|
|
145
|
+
const abort = () => reject(signal.reason);
|
|
146
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
147
|
+
Promise.resolve()
|
|
148
|
+
.then(() => {
|
|
149
|
+
signal.throwIfAborted();
|
|
150
|
+
return run();
|
|
151
|
+
})
|
|
152
|
+
.then(resolve, reject)
|
|
153
|
+
.finally(() => signal.removeEventListener('abort', abort));
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const WEB_EXTRACT_LIMITS: {
|
|
2
|
+
readonly maxUrls: 5;
|
|
3
|
+
readonly maxCalls: 3;
|
|
4
|
+
readonly maxConcurrency: 2;
|
|
5
|
+
readonly maxPageBytes: number;
|
|
6
|
+
readonly maxTextBytes: number;
|
|
7
|
+
readonly maxTurnTextBytes: number;
|
|
8
|
+
readonly maxRobotsBytes: number;
|
|
9
|
+
readonly maxUrlCharacters: 2048;
|
|
10
|
+
readonly maxLinks: 30;
|
|
11
|
+
readonly maxRedirects: 2;
|
|
12
|
+
readonly maxHttpAttempts: 20;
|
|
13
|
+
readonly timeoutMs: 30000;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=limits.d.ts.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const WEB_EXTRACT_LIMITS = {
|
|
2
|
+
maxUrls: 5,
|
|
3
|
+
maxCalls: 3,
|
|
4
|
+
maxConcurrency: 2,
|
|
5
|
+
maxPageBytes: 1024 * 1024,
|
|
6
|
+
maxTextBytes: 32 * 1024,
|
|
7
|
+
maxTurnTextBytes: 128 * 1024,
|
|
8
|
+
maxRobotsBytes: 512 * 1024,
|
|
9
|
+
maxUrlCharacters: 2048,
|
|
10
|
+
maxLinks: 30,
|
|
11
|
+
maxRedirects: 2,
|
|
12
|
+
maxHttpAttempts: 20,
|
|
13
|
+
timeoutMs: 30_000,
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=limits.js.map
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const capabilityScopeSchema: z.ZodObject<{
|
|
3
|
+
org: z.ZodString;
|
|
4
|
+
app: z.ZodString;
|
|
5
|
+
env: z.ZodString;
|
|
6
|
+
name: z.ZodString;
|
|
7
|
+
}, z.core.$strict>;
|
|
8
|
+
export type CapabilityScope = z.infer<typeof capabilityScopeSchema>;
|
|
9
|
+
export declare const operatorCapabilityPolicySchema: z.ZodObject<{
|
|
10
|
+
maxUrls: z.ZodOptional<z.ZodNumber>;
|
|
11
|
+
maxCalls: z.ZodOptional<z.ZodNumber>;
|
|
12
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
13
|
+
maxTextBytes: z.ZodOptional<z.ZodNumber>;
|
|
14
|
+
domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
15
|
+
enabled: z.ZodBoolean;
|
|
16
|
+
dailyCalls: z.ZodNumber;
|
|
17
|
+
}, z.core.$strict>;
|
|
18
|
+
export type OperatorCapabilityPolicy = z.infer<typeof operatorCapabilityPolicySchema>;
|
|
19
|
+
export declare const capabilityPolicyUpdateSchema: z.ZodObject<{
|
|
20
|
+
expectedRevision: z.ZodNumber;
|
|
21
|
+
mutationId: z.ZodString;
|
|
22
|
+
policy: z.ZodObject<{
|
|
23
|
+
maxUrls: z.ZodOptional<z.ZodNumber>;
|
|
24
|
+
maxCalls: z.ZodOptional<z.ZodNumber>;
|
|
25
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
26
|
+
maxTextBytes: z.ZodOptional<z.ZodNumber>;
|
|
27
|
+
domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
28
|
+
enabled: z.ZodBoolean;
|
|
29
|
+
dailyCalls: z.ZodNumber;
|
|
30
|
+
}, z.core.$strict>;
|
|
31
|
+
}, z.core.$strict>;
|
|
32
|
+
export type CapabilityPolicyUpdate = z.infer<typeof capabilityPolicyUpdateSchema> & {
|
|
33
|
+
readonly actor: string;
|
|
34
|
+
};
|
|
35
|
+
export declare const capabilityPolicyRecordSchema: z.ZodObject<{
|
|
36
|
+
revision: z.ZodNumber;
|
|
37
|
+
policy: z.ZodObject<{
|
|
38
|
+
maxUrls: z.ZodOptional<z.ZodNumber>;
|
|
39
|
+
maxCalls: z.ZodOptional<z.ZodNumber>;
|
|
40
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
41
|
+
maxTextBytes: z.ZodOptional<z.ZodNumber>;
|
|
42
|
+
domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
43
|
+
enabled: z.ZodBoolean;
|
|
44
|
+
dailyCalls: z.ZodNumber;
|
|
45
|
+
}, z.core.$strict>;
|
|
46
|
+
actor: z.ZodString;
|
|
47
|
+
updatedAt: z.ZodISODateTime;
|
|
48
|
+
}, z.core.$strict>;
|
|
49
|
+
export type CapabilityPolicyRecord = z.infer<typeof capabilityPolicyRecordSchema>;
|
|
50
|
+
export declare const capabilityInspectionSchema: z.ZodObject<{
|
|
51
|
+
name: z.ZodString;
|
|
52
|
+
class: z.ZodLiteral<"web.extract.v1">;
|
|
53
|
+
title: z.ZodString;
|
|
54
|
+
serviceKey: z.ZodString;
|
|
55
|
+
available: z.ZodBoolean;
|
|
56
|
+
profile: z.ZodEnum<{
|
|
57
|
+
"managed-learning-cohort": "managed-learning-cohort";
|
|
58
|
+
"local-first-party": "local-first-party";
|
|
59
|
+
}>;
|
|
60
|
+
revision: z.ZodNumber;
|
|
61
|
+
developerPolicy: z.ZodObject<{
|
|
62
|
+
maxUrls: z.ZodOptional<z.ZodNumber>;
|
|
63
|
+
maxCalls: z.ZodOptional<z.ZodNumber>;
|
|
64
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
65
|
+
maxTextBytes: z.ZodOptional<z.ZodNumber>;
|
|
66
|
+
domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
67
|
+
}, z.core.$strict>;
|
|
68
|
+
operatorPolicy: z.ZodObject<{
|
|
69
|
+
maxUrls: z.ZodOptional<z.ZodNumber>;
|
|
70
|
+
maxCalls: z.ZodOptional<z.ZodNumber>;
|
|
71
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
72
|
+
maxTextBytes: z.ZodOptional<z.ZodNumber>;
|
|
73
|
+
domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
74
|
+
enabled: z.ZodBoolean;
|
|
75
|
+
dailyCalls: z.ZodNumber;
|
|
76
|
+
}, z.core.$strict>;
|
|
77
|
+
effectivePolicy: z.ZodObject<{
|
|
78
|
+
maxUrls: z.ZodOptional<z.ZodNumber>;
|
|
79
|
+
maxCalls: z.ZodOptional<z.ZodNumber>;
|
|
80
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
81
|
+
maxTextBytes: z.ZodOptional<z.ZodNumber>;
|
|
82
|
+
domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
83
|
+
}, z.core.$strict>;
|
|
84
|
+
actor: z.ZodOptional<z.ZodString>;
|
|
85
|
+
updatedAt: z.ZodOptional<z.ZodISODateTime>;
|
|
86
|
+
}, z.core.$strict>;
|
|
87
|
+
export declare const capabilityListResponseSchema: z.ZodObject<{
|
|
88
|
+
deploymentId: z.ZodString;
|
|
89
|
+
capabilities: z.ZodArray<z.ZodObject<{
|
|
90
|
+
name: z.ZodString;
|
|
91
|
+
class: z.ZodLiteral<"web.extract.v1">;
|
|
92
|
+
title: z.ZodString;
|
|
93
|
+
serviceKey: z.ZodString;
|
|
94
|
+
available: z.ZodBoolean;
|
|
95
|
+
profile: z.ZodEnum<{
|
|
96
|
+
"managed-learning-cohort": "managed-learning-cohort";
|
|
97
|
+
"local-first-party": "local-first-party";
|
|
98
|
+
}>;
|
|
99
|
+
revision: z.ZodNumber;
|
|
100
|
+
developerPolicy: z.ZodObject<{
|
|
101
|
+
maxUrls: z.ZodOptional<z.ZodNumber>;
|
|
102
|
+
maxCalls: z.ZodOptional<z.ZodNumber>;
|
|
103
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
104
|
+
maxTextBytes: z.ZodOptional<z.ZodNumber>;
|
|
105
|
+
domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
106
|
+
}, z.core.$strict>;
|
|
107
|
+
operatorPolicy: z.ZodObject<{
|
|
108
|
+
maxUrls: z.ZodOptional<z.ZodNumber>;
|
|
109
|
+
maxCalls: z.ZodOptional<z.ZodNumber>;
|
|
110
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
111
|
+
maxTextBytes: z.ZodOptional<z.ZodNumber>;
|
|
112
|
+
domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
113
|
+
enabled: z.ZodBoolean;
|
|
114
|
+
dailyCalls: z.ZodNumber;
|
|
115
|
+
}, z.core.$strict>;
|
|
116
|
+
effectivePolicy: z.ZodObject<{
|
|
117
|
+
maxUrls: z.ZodOptional<z.ZodNumber>;
|
|
118
|
+
maxCalls: z.ZodOptional<z.ZodNumber>;
|
|
119
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
120
|
+
maxTextBytes: z.ZodOptional<z.ZodNumber>;
|
|
121
|
+
domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
122
|
+
}, z.core.$strict>;
|
|
123
|
+
actor: z.ZodOptional<z.ZodString>;
|
|
124
|
+
updatedAt: z.ZodOptional<z.ZodISODateTime>;
|
|
125
|
+
}, z.core.$strict>>;
|
|
126
|
+
}, z.core.$strict>;
|
|
127
|
+
export type CapabilityListResponse = z.infer<typeof capabilityListResponseSchema>;
|
|
128
|
+
export declare const capabilityTestRequestSchema: z.ZodObject<{
|
|
129
|
+
mode: z.ZodEnum<{
|
|
130
|
+
fixture: "fixture";
|
|
131
|
+
live: "live";
|
|
132
|
+
}>;
|
|
133
|
+
request: z.ZodObject<{
|
|
134
|
+
urls: z.ZodArray<z.ZodString>;
|
|
135
|
+
domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
136
|
+
}, z.core.$strict>;
|
|
137
|
+
}, z.core.$strict>;
|
|
138
|
+
export declare const capabilityTestResponseSchema: z.ZodObject<{
|
|
139
|
+
mode: z.ZodEnum<{
|
|
140
|
+
fixture: "fixture";
|
|
141
|
+
live: "live";
|
|
142
|
+
}>;
|
|
143
|
+
status: z.ZodEnum<{
|
|
144
|
+
complete: "complete";
|
|
145
|
+
partial: "partial";
|
|
146
|
+
}>;
|
|
147
|
+
pages: z.ZodNumber;
|
|
148
|
+
sources: z.ZodArray<z.ZodObject<{
|
|
149
|
+
ref: z.ZodString;
|
|
150
|
+
url: z.ZodString;
|
|
151
|
+
retrievedAt: z.ZodISODateTime;
|
|
152
|
+
}, z.core.$strict>>;
|
|
153
|
+
warnings: z.ZodArray<z.ZodObject<{
|
|
154
|
+
requestIndex: z.ZodNumber;
|
|
155
|
+
code: z.ZodString;
|
|
156
|
+
}, z.core.$strict>>;
|
|
157
|
+
}, z.core.$strict>;
|
|
158
|
+
export type CapabilityTestResponse = z.infer<typeof capabilityTestResponseSchema>;
|
|
159
|
+
//# sourceMappingURL=operator-contracts.d.ts.map
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { capabilityNameSchema, webExtractRequestSchema, webPolicySchema } from './contracts.js';
|
|
3
|
+
const scopePart = z
|
|
4
|
+
.string()
|
|
5
|
+
.min(1)
|
|
6
|
+
.max(128)
|
|
7
|
+
.regex(/^[a-zA-Z0-9_-]+$/);
|
|
8
|
+
export const capabilityScopeSchema = z
|
|
9
|
+
.object({ org: scopePart, app: scopePart, env: scopePart, name: capabilityNameSchema })
|
|
10
|
+
.strict();
|
|
11
|
+
export const operatorCapabilityPolicySchema = webPolicySchema.extend({
|
|
12
|
+
enabled: z.boolean(),
|
|
13
|
+
dailyCalls: z.number().int().min(0).max(1000),
|
|
14
|
+
});
|
|
15
|
+
export const capabilityPolicyUpdateSchema = z
|
|
16
|
+
.object({
|
|
17
|
+
expectedRevision: z
|
|
18
|
+
.number()
|
|
19
|
+
.int()
|
|
20
|
+
.min(0)
|
|
21
|
+
.max(Number.MAX_SAFE_INTEGER - 1),
|
|
22
|
+
mutationId: z
|
|
23
|
+
.string()
|
|
24
|
+
.min(1)
|
|
25
|
+
.max(128)
|
|
26
|
+
.regex(/^[a-zA-Z0-9_-]+$/),
|
|
27
|
+
policy: operatorCapabilityPolicySchema,
|
|
28
|
+
})
|
|
29
|
+
.strict();
|
|
30
|
+
export const capabilityPolicyRecordSchema = z
|
|
31
|
+
.object({
|
|
32
|
+
revision: z.number().int().positive(),
|
|
33
|
+
policy: operatorCapabilityPolicySchema,
|
|
34
|
+
actor: z.string().min(1).max(512),
|
|
35
|
+
updatedAt: z.iso.datetime(),
|
|
36
|
+
})
|
|
37
|
+
.strict();
|
|
38
|
+
export const capabilityInspectionSchema = z
|
|
39
|
+
.object({
|
|
40
|
+
name: capabilityNameSchema,
|
|
41
|
+
class: z.literal('web.extract.v1'),
|
|
42
|
+
title: z.string(),
|
|
43
|
+
serviceKey: z.string(),
|
|
44
|
+
available: z.boolean(),
|
|
45
|
+
profile: z.enum(['managed-learning-cohort', 'local-first-party']),
|
|
46
|
+
revision: z.number().int().nonnegative(),
|
|
47
|
+
developerPolicy: webPolicySchema,
|
|
48
|
+
operatorPolicy: operatorCapabilityPolicySchema,
|
|
49
|
+
effectivePolicy: webPolicySchema.extend({ domains: z.array(z.string()).max(32).optional() }),
|
|
50
|
+
actor: z.string().optional(),
|
|
51
|
+
updatedAt: z.iso.datetime().optional(),
|
|
52
|
+
})
|
|
53
|
+
.strict();
|
|
54
|
+
export const capabilityListResponseSchema = z
|
|
55
|
+
.object({ deploymentId: z.string(), capabilities: z.array(capabilityInspectionSchema) })
|
|
56
|
+
.strict();
|
|
57
|
+
export const capabilityTestRequestSchema = z
|
|
58
|
+
.object({ mode: z.enum(['fixture', 'live']), request: webExtractRequestSchema })
|
|
59
|
+
.strict();
|
|
60
|
+
export const capabilityTestResponseSchema = z
|
|
61
|
+
.object({
|
|
62
|
+
mode: z.enum(['fixture', 'live']),
|
|
63
|
+
status: z.enum(['complete', 'partial']),
|
|
64
|
+
pages: z.number().int().nonnegative(),
|
|
65
|
+
sources: z.array(z.object({ ref: z.string(), url: z.string().url(), retrievedAt: z.iso.datetime() }).strict()),
|
|
66
|
+
warnings: z.array(z.object({ requestIndex: z.number().int(), code: z.string() }).strict()),
|
|
67
|
+
})
|
|
68
|
+
.strict();
|
|
69
|
+
//# sourceMappingURL=operator-contracts.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ModuleRoute } from '@noodle-borg/module';
|
|
2
|
+
import type { CapabilityService } from './service.js';
|
|
3
|
+
/** Operator diagnostic commands share policy/admission; they never expose source bodies. */
|
|
4
|
+
export declare function capabilityOperatorRoute(service: CapabilityService): ModuleRoute;
|
|
5
|
+
//# sourceMappingURL=operator-route.d.ts.map
|