@noodleseed/one 0.168.0 → 0.170.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 +3 -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/deployment-delete-ops.d.ts +12 -0
- package/dist/commands/deployment-delete-ops.d.ts.map +1 -0
- package/dist/commands/deployment-delete-ops.js +230 -0
- package/dist/commands/deployment-delete-ops.js.map +1 -0
- package/dist/commands/deployment-delete-recovery.d.ts +35 -0
- package/dist/commands/deployment-delete-recovery.d.ts.map +1 -0
- package/dist/commands/deployment-delete-recovery.js +99 -0
- package/dist/commands/deployment-delete-recovery.js.map +1 -0
- package/dist/commands/deployments-ops.d.ts +2 -1
- package/dist/commands/deployments-ops.d.ts.map +1 -1
- package/dist/commands/deployments-ops.js +5 -1
- package/dist/commands/deployments-ops.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 +2 -2
- package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js +4 -0
- package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +2 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js +3 -2
- package/node_modules/@noodle-borg/agent-kit/package.json +1 -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/authoring/dist/assistant.d.ts +2 -2
- package/node_modules/@noodle-borg/authoring/dist/assistant.js +3 -1
- package/node_modules/@noodle-borg/authoring/dist/index.d.ts +1 -0
- package/node_modules/@noodle-borg/authoring/dist/index.js +1 -0
- 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-hosted-observability.js +102 -0
- package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-tenant-resources.js +27 -1
- package/node_modules/@noodle-borg/compiler/dist/artifact/assemble.js +3 -0
- 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/fulfilment-emit.js +18 -3
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts +34 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js +9 -2
- 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/control-plane/dist/delete-deployment.d.ts +44 -0
- package/node_modules/@noodle-borg/control-plane/dist/delete-deployment.js +105 -0
- package/node_modules/@noodle-borg/control-plane/dist/deployment-deletion-contracts.d.ts +20 -0
- package/node_modules/@noodle-borg/control-plane/dist/portable.d.ts +2 -0
- package/node_modules/@noodle-borg/control-plane/dist/portable.js +1 -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/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/operation-execution.js +3 -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/deployment-deletion.js +40 -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 +9 -0
- package/node_modules/@noodle-borg/service/dist/registry-deletion.js +75 -0
- package/node_modules/@noodle-borg/service/dist/registry-state.js +4 -2
- package/node_modules/@noodle-borg/service/dist/registry-targets.js +4 -0
- package/node_modules/@noodle-borg/service/dist/registry-types.d.ts +1 -0
- package/node_modules/@noodle-borg/service/dist/registry.d.ts +2 -0
- package/node_modules/@noodle-borg/service/dist/registry.js +10 -23
- package/node_modules/@noodle-borg/service/dist/routes/assistant-agent.js +5 -2
- package/node_modules/@noodle-borg/service/dist/routes/assistant-interactions.js +7 -4
- package/node_modules/@noodle-borg/service/dist/routes/deploy-dispatch.js +15 -1
- package/node_modules/@noodle-borg/service/dist/routes/deployment-delete.js +53 -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 +7 -1
- package/node_modules/@noodle-borg/service/dist/store/in-memory.d.ts +2 -1
- package/node_modules/@noodle-borg/service/dist/store/in-memory.js +8 -0
- package/node_modules/@noodle-borg/service/dist/store/json-file-deletion.js +64 -0
- package/node_modules/@noodle-borg/service/dist/store/json-file.d.ts +2 -1
- package/node_modules/@noodle-borg/service/dist/store/json-file.js +23 -5
- package/node_modules/@noodle-borg/service/dist/store.d.ts +5 -1
- 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/deployment-deletion.d.ts +29 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/deployment-deletion.js +33 -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/package.json +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const capabilityNameSchema: z.ZodString;
|
|
3
|
+
export declare const webPolicySchema: z.ZodObject<{
|
|
4
|
+
maxUrls: z.ZodOptional<z.ZodNumber>;
|
|
5
|
+
maxCalls: z.ZodOptional<z.ZodNumber>;
|
|
6
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
7
|
+
maxTextBytes: z.ZodOptional<z.ZodNumber>;
|
|
8
|
+
domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
9
|
+
}, z.core.$strict>;
|
|
10
|
+
export type WebPolicy = z.infer<typeof webPolicySchema>;
|
|
11
|
+
export declare const webCapabilityBaseSchema: z.ZodObject<{
|
|
12
|
+
name: z.ZodString;
|
|
13
|
+
class: z.ZodLiteral<"web.extract.v1">;
|
|
14
|
+
title: z.ZodString;
|
|
15
|
+
description: z.ZodString;
|
|
16
|
+
provider: z.ZodObject<{
|
|
17
|
+
kind: z.ZodLiteral<"noodle-managed">;
|
|
18
|
+
}, z.core.$strict>;
|
|
19
|
+
policy: z.ZodOptional<z.ZodObject<{
|
|
20
|
+
maxUrls: z.ZodOptional<z.ZodNumber>;
|
|
21
|
+
maxCalls: z.ZodOptional<z.ZodNumber>;
|
|
22
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
23
|
+
maxTextBytes: z.ZodOptional<z.ZodNumber>;
|
|
24
|
+
domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
25
|
+
}, z.core.$strict>>;
|
|
26
|
+
}, z.core.$strict>;
|
|
27
|
+
export interface CapabilityAuthorization {
|
|
28
|
+
readonly discovery?: 'authorized' | 'public' | undefined;
|
|
29
|
+
readonly requiredScopes?: readonly string[] | undefined;
|
|
30
|
+
readonly allowedRoles?: readonly string[] | undefined;
|
|
31
|
+
}
|
|
32
|
+
export type WebCapability = z.infer<typeof webCapabilityBaseSchema> & {
|
|
33
|
+
readonly authorization?: CapabilityAuthorization | undefined;
|
|
34
|
+
};
|
|
35
|
+
export declare const webExtractRequestSchema: z.ZodObject<{
|
|
36
|
+
urls: z.ZodArray<z.ZodString>;
|
|
37
|
+
domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
38
|
+
}, z.core.$strict>;
|
|
39
|
+
export type WebExtractRequest = z.infer<typeof webExtractRequestSchema>;
|
|
40
|
+
export declare const webExtractResultSchema: z.ZodObject<{
|
|
41
|
+
status: z.ZodEnum<{
|
|
42
|
+
complete: "complete";
|
|
43
|
+
partial: "partial";
|
|
44
|
+
}>;
|
|
45
|
+
items: z.ZodArray<z.ZodObject<{
|
|
46
|
+
requestIndex: z.ZodNumber;
|
|
47
|
+
sourceRef: z.ZodString;
|
|
48
|
+
content: z.ZodObject<{
|
|
49
|
+
format: z.ZodLiteral<"text">;
|
|
50
|
+
text: z.ZodString;
|
|
51
|
+
}, z.core.$strict>;
|
|
52
|
+
links: z.ZodArray<z.ZodObject<{
|
|
53
|
+
url: z.ZodString;
|
|
54
|
+
label: z.ZodOptional<z.ZodString>;
|
|
55
|
+
}, z.core.$strict>>;
|
|
56
|
+
truncated: z.ZodBoolean;
|
|
57
|
+
}, z.core.$strict>>;
|
|
58
|
+
sources: z.ZodArray<z.ZodObject<{
|
|
59
|
+
ref: z.ZodString;
|
|
60
|
+
url: z.ZodString;
|
|
61
|
+
title: z.ZodOptional<z.ZodString>;
|
|
62
|
+
retrievedAt: z.ZodISODateTime;
|
|
63
|
+
publishedAt: z.ZodOptional<z.ZodISODateTime>;
|
|
64
|
+
observedAt: z.ZodOptional<z.ZodISODateTime>;
|
|
65
|
+
expiresAt: z.ZodOptional<z.ZodISODateTime>;
|
|
66
|
+
attribution: z.ZodOptional<z.ZodString>;
|
|
67
|
+
rights: z.ZodOptional<z.ZodString>;
|
|
68
|
+
}, z.core.$strict>>;
|
|
69
|
+
warnings: z.ZodArray<z.ZodObject<{
|
|
70
|
+
requestIndex: z.ZodNumber;
|
|
71
|
+
code: z.ZodEnum<{
|
|
72
|
+
capability_unavailable: "capability_unavailable";
|
|
73
|
+
capability_binding_invalid: "capability_binding_invalid";
|
|
74
|
+
capability_requirement_unsupported: "capability_requirement_unsupported";
|
|
75
|
+
capability_policy_denied: "capability_policy_denied";
|
|
76
|
+
capability_budget_exhausted: "capability_budget_exhausted";
|
|
77
|
+
capability_source_rejected: "capability_source_rejected";
|
|
78
|
+
capability_provider_failed: "capability_provider_failed";
|
|
79
|
+
capability_result_invalid: "capability_result_invalid";
|
|
80
|
+
capability_cancelled: "capability_cancelled";
|
|
81
|
+
content_truncated: "content_truncated";
|
|
82
|
+
}>;
|
|
83
|
+
}, z.core.$strict>>;
|
|
84
|
+
}, z.core.$strict>;
|
|
85
|
+
export type WebExtractResult = z.infer<typeof webExtractResultSchema>;
|
|
86
|
+
export declare const WEB_CONNECTOR_ID = "noodle_web";
|
|
87
|
+
export declare const WEB_CONNECTOR_VERSION = "1.0.0";
|
|
88
|
+
export declare const webOperationInputSchema: z.ZodObject<{
|
|
89
|
+
name: z.ZodString;
|
|
90
|
+
request: z.ZodObject<{
|
|
91
|
+
urls: z.ZodArray<z.ZodString>;
|
|
92
|
+
domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
93
|
+
}, z.core.$strict>;
|
|
94
|
+
}, z.core.$strict>;
|
|
95
|
+
export declare const WEB_OPERATION_SIGNATURE: {
|
|
96
|
+
type: "read";
|
|
97
|
+
input: z.core.ZodStandardJSONSchemaPayload<z.ZodObject<{
|
|
98
|
+
name: z.ZodString;
|
|
99
|
+
request: z.ZodObject<{
|
|
100
|
+
urls: z.ZodArray<z.ZodString>;
|
|
101
|
+
domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
102
|
+
}, z.core.$strict>;
|
|
103
|
+
}, z.core.$strict>>;
|
|
104
|
+
output: z.core.ZodStandardJSONSchemaPayload<z.ZodObject<{
|
|
105
|
+
status: z.ZodEnum<{
|
|
106
|
+
complete: "complete";
|
|
107
|
+
partial: "partial";
|
|
108
|
+
}>;
|
|
109
|
+
items: z.ZodArray<z.ZodObject<{
|
|
110
|
+
requestIndex: z.ZodNumber;
|
|
111
|
+
sourceRef: z.ZodString;
|
|
112
|
+
content: z.ZodObject<{
|
|
113
|
+
format: z.ZodLiteral<"text">;
|
|
114
|
+
text: z.ZodString;
|
|
115
|
+
}, z.core.$strict>;
|
|
116
|
+
links: z.ZodArray<z.ZodObject<{
|
|
117
|
+
url: z.ZodString;
|
|
118
|
+
label: z.ZodOptional<z.ZodString>;
|
|
119
|
+
}, z.core.$strict>>;
|
|
120
|
+
truncated: z.ZodBoolean;
|
|
121
|
+
}, z.core.$strict>>;
|
|
122
|
+
sources: z.ZodArray<z.ZodObject<{
|
|
123
|
+
ref: z.ZodString;
|
|
124
|
+
url: z.ZodString;
|
|
125
|
+
title: z.ZodOptional<z.ZodString>;
|
|
126
|
+
retrievedAt: z.ZodISODateTime;
|
|
127
|
+
publishedAt: z.ZodOptional<z.ZodISODateTime>;
|
|
128
|
+
observedAt: z.ZodOptional<z.ZodISODateTime>;
|
|
129
|
+
expiresAt: z.ZodOptional<z.ZodISODateTime>;
|
|
130
|
+
attribution: z.ZodOptional<z.ZodString>;
|
|
131
|
+
rights: z.ZodOptional<z.ZodString>;
|
|
132
|
+
}, z.core.$strict>>;
|
|
133
|
+
warnings: z.ZodArray<z.ZodObject<{
|
|
134
|
+
requestIndex: z.ZodNumber;
|
|
135
|
+
code: z.ZodEnum<{
|
|
136
|
+
capability_unavailable: "capability_unavailable";
|
|
137
|
+
capability_binding_invalid: "capability_binding_invalid";
|
|
138
|
+
capability_requirement_unsupported: "capability_requirement_unsupported";
|
|
139
|
+
capability_policy_denied: "capability_policy_denied";
|
|
140
|
+
capability_budget_exhausted: "capability_budget_exhausted";
|
|
141
|
+
capability_source_rejected: "capability_source_rejected";
|
|
142
|
+
capability_provider_failed: "capability_provider_failed";
|
|
143
|
+
capability_result_invalid: "capability_result_invalid";
|
|
144
|
+
capability_cancelled: "capability_cancelled";
|
|
145
|
+
content_truncated: "content_truncated";
|
|
146
|
+
}>;
|
|
147
|
+
}, z.core.$strict>>;
|
|
148
|
+
}, z.core.$strict>>;
|
|
149
|
+
};
|
|
150
|
+
export declare const WEB_CATALOG_CONNECTOR: {
|
|
151
|
+
id: string;
|
|
152
|
+
version: string;
|
|
153
|
+
kind: "builtin";
|
|
154
|
+
operations: {
|
|
155
|
+
extract: {
|
|
156
|
+
type: "read";
|
|
157
|
+
input: z.core.ZodStandardJSONSchemaPayload<z.ZodObject<{
|
|
158
|
+
name: z.ZodString;
|
|
159
|
+
request: z.ZodObject<{
|
|
160
|
+
urls: z.ZodArray<z.ZodString>;
|
|
161
|
+
domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
162
|
+
}, z.core.$strict>;
|
|
163
|
+
}, z.core.$strict>>;
|
|
164
|
+
output: z.core.ZodStandardJSONSchemaPayload<z.ZodObject<{
|
|
165
|
+
status: z.ZodEnum<{
|
|
166
|
+
complete: "complete";
|
|
167
|
+
partial: "partial";
|
|
168
|
+
}>;
|
|
169
|
+
items: z.ZodArray<z.ZodObject<{
|
|
170
|
+
requestIndex: z.ZodNumber;
|
|
171
|
+
sourceRef: z.ZodString;
|
|
172
|
+
content: z.ZodObject<{
|
|
173
|
+
format: z.ZodLiteral<"text">;
|
|
174
|
+
text: z.ZodString;
|
|
175
|
+
}, z.core.$strict>;
|
|
176
|
+
links: z.ZodArray<z.ZodObject<{
|
|
177
|
+
url: z.ZodString;
|
|
178
|
+
label: z.ZodOptional<z.ZodString>;
|
|
179
|
+
}, z.core.$strict>>;
|
|
180
|
+
truncated: z.ZodBoolean;
|
|
181
|
+
}, z.core.$strict>>;
|
|
182
|
+
sources: z.ZodArray<z.ZodObject<{
|
|
183
|
+
ref: z.ZodString;
|
|
184
|
+
url: z.ZodString;
|
|
185
|
+
title: z.ZodOptional<z.ZodString>;
|
|
186
|
+
retrievedAt: z.ZodISODateTime;
|
|
187
|
+
publishedAt: z.ZodOptional<z.ZodISODateTime>;
|
|
188
|
+
observedAt: z.ZodOptional<z.ZodISODateTime>;
|
|
189
|
+
expiresAt: z.ZodOptional<z.ZodISODateTime>;
|
|
190
|
+
attribution: z.ZodOptional<z.ZodString>;
|
|
191
|
+
rights: z.ZodOptional<z.ZodString>;
|
|
192
|
+
}, z.core.$strict>>;
|
|
193
|
+
warnings: z.ZodArray<z.ZodObject<{
|
|
194
|
+
requestIndex: z.ZodNumber;
|
|
195
|
+
code: z.ZodEnum<{
|
|
196
|
+
capability_unavailable: "capability_unavailable";
|
|
197
|
+
capability_binding_invalid: "capability_binding_invalid";
|
|
198
|
+
capability_requirement_unsupported: "capability_requirement_unsupported";
|
|
199
|
+
capability_policy_denied: "capability_policy_denied";
|
|
200
|
+
capability_budget_exhausted: "capability_budget_exhausted";
|
|
201
|
+
capability_source_rejected: "capability_source_rejected";
|
|
202
|
+
capability_provider_failed: "capability_provider_failed";
|
|
203
|
+
capability_result_invalid: "capability_result_invalid";
|
|
204
|
+
capability_cancelled: "capability_cancelled";
|
|
205
|
+
content_truncated: "content_truncated";
|
|
206
|
+
}>;
|
|
207
|
+
}, z.core.$strict>>;
|
|
208
|
+
}, z.core.$strict>>;
|
|
209
|
+
};
|
|
210
|
+
};
|
|
211
|
+
};
|
|
212
|
+
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -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
|