@wtfalch/foundry 0.78.1 → 0.79.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/catalogue/copy-en.js +5 -0
- package/dist/catalogue/integrations.js +5 -0
- package/dist/mcp-resources/client.d.ts +16 -0
- package/dist/mcp-resources/client.js +69 -0
- package/dist/mcp-resources/index.d.ts +3 -0
- package/dist/mcp-resources/index.js +3 -0
- package/dist/mcp-resources/schema.d.ts +1707 -0
- package/dist/mcp-resources/schema.js +253 -0
- package/dist/mcp-resources/validation.d.ts +21 -0
- package/dist/mcp-resources/validation.js +97 -0
- package/dist/modules/ai.js +14 -3
- package/dist/modules/customer-grants.js +1 -1
- package/dist/modules/email.d.ts +2 -1
- package/dist/modules/email.js +3 -2
- package/dist/modules/files.js +4 -1
- package/dist/modules/index.js +4 -1
- package/dist/modules/jobs.js +1 -1
- package/dist/modules/mcp-resources.d.ts +2 -0
- package/dist/modules/mcp-resources.js +61 -0
- package/dist/modules/outputs.js +1 -0
- package/dist/modules/repository.d.ts +2 -0
- package/dist/modules/repository.js +3 -1
- package/dist/modules/workspaces.js +1 -1
- package/dist/org.d.ts +3 -0
- package/dist/org.js +10 -7
- package/dist/plan/ai-apps-minter.d.ts +79 -0
- package/dist/plan/ai-apps-minter.js +263 -0
- package/dist/plan/ai-boule-key.d.ts +1 -1
- package/dist/plan/ai-boule-key.js +10 -3
- package/dist/plan/broker-entries.js +4 -4
- package/dist/plan/diff.d.ts +6 -0
- package/dist/plan/diff.js +33 -13
- package/dist/plan/entry-ai-key.d.ts +2 -0
- package/dist/plan/entry-ai-key.js +4 -2
- package/dist/plan/entry-customer-grants.d.ts +1 -1
- package/dist/plan/entry-customer-grants.js +4 -2
- package/dist/plan/entry-files-key.d.ts +10 -0
- package/dist/plan/entry-files-key.js +6 -1
- package/dist/plan/entry-jobs-boule-key.js +1 -1
- package/dist/plan/entry-jobs.js +1 -1
- package/dist/plan/entry-repo-key.js +2 -2
- package/dist/plan/entry-workspaces.d.ts +5 -0
- package/dist/plan/entry-workspaces.js +3 -1
- package/dist/plan/executor.d.ts +27 -0
- package/dist/plan/executor.js +125 -4
- package/dist/plan/files-apps-minter.d.ts +131 -0
- package/dist/plan/files-apps-minter.js +336 -0
- package/dist/plan/files-boule-key.js +2 -2
- package/dist/plan/files-space-alert.js +3 -3
- package/dist/plan/jobs-apps-key.d.ts +29 -0
- package/dist/plan/jobs-apps-key.js +228 -0
- package/dist/plan/jobs-project-settings.js +2 -0
- package/dist/plan/jobs-scheduler-http.d.ts +7 -0
- package/dist/plan/jobs-scheduler-http.js +32 -1
- package/dist/plan/own-jobs-route.d.ts +1 -1
- package/dist/plan/own-jobs-route.js +1 -1
- package/dist/plan/plan-apply.d.ts +6 -0
- package/dist/plan/plan-apply.js +45 -3
- package/dist/plan/platform-diff.d.ts +1 -1
- package/dist/plan/platform-diff.js +3 -2
- package/dist/release/state.d.ts +1 -1
- package/dist/store/schema.d.ts +2 -2
- package/dist/worker-app-config.js +11 -2
- package/package.json +5 -1
|
@@ -17,6 +17,11 @@ const INTEGRATION_COPY = {
|
|
|
17
17
|
ours: 'Run by us',
|
|
18
18
|
outputs: { 'mcp-url': 'The address AI assistants connect to.' },
|
|
19
19
|
},
|
|
20
|
+
'mcp-resources': {
|
|
21
|
+
name: 'Configurable MCP resources',
|
|
22
|
+
summary: 'Your app configures independent assistant connections for customers.',
|
|
23
|
+
ours: 'Run by us',
|
|
24
|
+
},
|
|
20
25
|
workspaces: {
|
|
21
26
|
name: 'Workspaces',
|
|
22
27
|
summary: 'Customers make shared workspaces and invite people in.',
|
|
@@ -33,6 +33,11 @@ const EXTRA = {
|
|
|
33
33
|
price: { class: 'free', meters: [] },
|
|
34
34
|
advanced: [],
|
|
35
35
|
},
|
|
36
|
+
'mcp-resources': {
|
|
37
|
+
providers: [ours('mcp-resources')],
|
|
38
|
+
price: { class: 'free', meters: [] },
|
|
39
|
+
advanced: [],
|
|
40
|
+
},
|
|
36
41
|
workspaces: {
|
|
37
42
|
providers: [ours('workspaces')],
|
|
38
43
|
price: { class: 'free', meters: [] },
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type McpResourceApplyRequest, type McpResourceApplyResult, type McpResourceListRequest, type McpResourceListResult, type McpResourceOperationRequest, type McpResourceOperationResult, type McpResourceReadRequest, type McpResourceReadResult } from './schema.js';
|
|
2
|
+
export interface McpResourceManagementPort {
|
|
3
|
+
apply(request: McpResourceApplyRequest): Promise<McpResourceApplyResult>;
|
|
4
|
+
read(request: McpResourceReadRequest): Promise<McpResourceReadResult>;
|
|
5
|
+
list(request: McpResourceListRequest): Promise<McpResourceListResult>;
|
|
6
|
+
getOperation(request: McpResourceOperationRequest): Promise<McpResourceOperationResult>;
|
|
7
|
+
}
|
|
8
|
+
/** Owns actual service routes, server credentials, bounded response size and an abort timeout. */
|
|
9
|
+
export interface McpResourceManagementTransport {
|
|
10
|
+
request(method: keyof McpResourceManagementPort, input: McpResourceApplyRequest | McpResourceReadRequest | McpResourceListRequest | McpResourceOperationRequest): Promise<unknown>;
|
|
11
|
+
}
|
|
12
|
+
export declare class McpResourceContractError extends Error {
|
|
13
|
+
constructor();
|
|
14
|
+
}
|
|
15
|
+
/** No Auth wire routes are assumed. Transport failures may have committed: recover the same operation. */
|
|
16
|
+
export declare function createMcpResourceClient(transport: McpResourceManagementTransport): McpResourceManagementPort;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { McpResourceApplyRequestSchema, McpResourceApplyResultSchema, McpResourceListRequestSchema, McpResourceListResultSchema, McpResourceOperationRequestSchema, McpResourceOperationResultSchema, McpResourceReadRequestSchema, McpResourceReadResultSchema, } from './schema.js';
|
|
2
|
+
import { sameMcpResourceDesired, sameMcpResourceKey, sameMcpResourceNamespace, } from './validation.js';
|
|
3
|
+
export class McpResourceContractError extends Error {
|
|
4
|
+
constructor() {
|
|
5
|
+
super('Invalid MCP resource management request');
|
|
6
|
+
this.name = 'McpResourceContractError';
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
function converged(snapshot) {
|
|
10
|
+
const { desired, observed } = snapshot;
|
|
11
|
+
return (snapshot.identity !== null &&
|
|
12
|
+
desired.state === observed.state &&
|
|
13
|
+
desired.configurationRevision === observed.configurationRevision &&
|
|
14
|
+
desired.policyRevision === observed.policyRevision &&
|
|
15
|
+
desired.denyEpoch === observed.denyEpoch &&
|
|
16
|
+
observed.phase === 'complete' &&
|
|
17
|
+
observed.revocation !== 'pending' &&
|
|
18
|
+
observed.cleanup !== 'pending');
|
|
19
|
+
}
|
|
20
|
+
/** No Auth wire routes are assumed. Transport failures may have committed: recover the same operation. */
|
|
21
|
+
export function createMcpResourceClient(transport) {
|
|
22
|
+
async function call(method, input, inputSchema, outputSchema, bound, unavailable) {
|
|
23
|
+
const checked = inputSchema.safeParse(input);
|
|
24
|
+
if (!checked.success)
|
|
25
|
+
throw new McpResourceContractError();
|
|
26
|
+
let raw;
|
|
27
|
+
try {
|
|
28
|
+
raw = await transport.request(method, checked.data);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return unavailable('transport-failure');
|
|
32
|
+
}
|
|
33
|
+
const parsed = outputSchema.safeParse(raw);
|
|
34
|
+
return parsed.success && bound(parsed.data) ? parsed.data : unavailable('invalid-response');
|
|
35
|
+
}
|
|
36
|
+
const failure = (code) => ({
|
|
37
|
+
version: 1,
|
|
38
|
+
outcome: 'unavailable',
|
|
39
|
+
failure: { code, phase: 'registration' },
|
|
40
|
+
recovery: { action: 'retry-same-operation', afterMs: 1000 },
|
|
41
|
+
});
|
|
42
|
+
const operationBound = (request, result) => result.operationId === request.operationId &&
|
|
43
|
+
(!('snapshot' in result) ||
|
|
44
|
+
result.snapshot === null ||
|
|
45
|
+
sameMcpResourceKey(request.key, result.snapshot.key)) &&
|
|
46
|
+
(result.outcome !== 'applied' || converged(result.snapshot));
|
|
47
|
+
return {
|
|
48
|
+
apply: (request) => call('apply', request, McpResourceApplyRequestSchema, McpResourceApplyResultSchema, (result) => operationBound(request, result) &&
|
|
49
|
+
(!['applied', 'pending', 'partial'].includes(result.outcome) ||
|
|
50
|
+
('snapshot' in result &&
|
|
51
|
+
result.snapshot !== null &&
|
|
52
|
+
result.snapshot.generation === (request.expectedGeneration ?? 0) + 1 &&
|
|
53
|
+
sameMcpResourceDesired(request.desired, result.snapshot.desired))), (code) => ({
|
|
54
|
+
...failure(code),
|
|
55
|
+
operationId: request.operationId,
|
|
56
|
+
recovery: { action: 'poll-operation', afterMs: 1000 },
|
|
57
|
+
})),
|
|
58
|
+
read: (request) => call('read', request, McpResourceReadRequestSchema, McpResourceReadResultSchema, (result) => result.outcome !== 'found' || sameMcpResourceKey(request.key, result.snapshot.key), failure),
|
|
59
|
+
list: (request) => call('list', request, McpResourceListRequestSchema, McpResourceListResultSchema, (result) => result.outcome !== 'listed' ||
|
|
60
|
+
(result.resources.every((snapshot) => sameMcpResourceNamespace(request.namespace, snapshot.key)) &&
|
|
61
|
+
new Set(result.resources.map((snapshot) => snapshot.key.resourceId)).size ===
|
|
62
|
+
result.resources.length), failure),
|
|
63
|
+
getOperation: (request) => call('getOperation', request, McpResourceOperationRequestSchema, McpResourceOperationResultSchema, (result) => operationBound(request, result), (code) => ({
|
|
64
|
+
...failure(code),
|
|
65
|
+
operationId: request.operationId,
|
|
66
|
+
recovery: { action: 'poll-operation', afterMs: 1000 },
|
|
67
|
+
})),
|
|
68
|
+
};
|
|
69
|
+
}
|