@cat-factory/server 0.34.0 → 0.36.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/agents/CompositeAgentExecutor.d.ts.map +1 -1
- package/dist/agents/CompositeAgentExecutor.js +5 -3
- package/dist/agents/CompositeAgentExecutor.js.map +1 -1
- package/dist/agents/ContainerAgentExecutor.d.ts.map +1 -1
- package/dist/agents/ContainerAgentExecutor.js +61 -5
- package/dist/agents/ContainerAgentExecutor.js.map +1 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +10 -0
- package/dist/app.js.map +1 -1
- package/dist/config/types.d.ts +26 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/http/env.d.ts +9 -1
- package/dist/http/env.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modules/artifacts/ArtifactController.d.ts +11 -0
- package/dist/modules/artifacts/ArtifactController.d.ts.map +1 -0
- package/dist/modules/artifacts/ArtifactController.js +132 -0
- package/dist/modules/artifacts/ArtifactController.js.map +1 -0
- package/dist/modules/artifacts/HarnessArtifactController.d.ts +13 -0
- package/dist/modules/artifacts/HarnessArtifactController.d.ts.map +1 -0
- package/dist/modules/artifacts/HarnessArtifactController.js +138 -0
- package/dist/modules/artifacts/HarnessArtifactController.js.map +1 -0
- package/dist/modules/artifacts/imageArtifacts.d.ts +38 -0
- package/dist/modules/artifacts/imageArtifacts.d.ts.map +1 -0
- package/dist/modules/artifacts/imageArtifacts.js +73 -0
- package/dist/modules/artifacts/imageArtifacts.js.map +1 -0
- package/dist/modules/execution/ExecutionController.d.ts.map +1 -1
- package/dist/modules/execution/ExecutionController.js +2 -0
- package/dist/modules/execution/ExecutionController.js.map +1 -1
- package/dist/modules/visualConfirm/VisualConfirmationController.d.ts +11 -0
- package/dist/modules/visualConfirm/VisualConfirmationController.d.ts.map +1 -0
- package/dist/modules/visualConfirm/VisualConfirmationController.js +37 -0
- package/dist/modules/visualConfirm/VisualConfirmationController.js.map +1 -0
- package/package.json +8 -8
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,gFAAgF;AAChF,8EAA8E;AAC9E,qEAAqE;AACrE,OAAO,EAAE,MAAM,EAAe,MAAM,2BAA2B,CAAA;AAC/D,OAAO,EAAqC,MAAM,eAAe,CAAA;AACjE,OAAO,EAYN,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAA;AAC/E,OAAO,EAAE,WAAW,EAAqB,MAAM,mBAAmB,CAAA;AAClE,OAAO,EACL,WAAW,GAGZ,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,WAAW,GAGZ,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAA;AAC7E,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAA;AACxF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAA;AAC7E,OAAO,EACL,uBAAuB,EACvB,sBAAsB,GAGvB,MAAM,yCAAyC,CAAA;AAChD,mFAAmF;AACnF,kFAAkF;AAClF,oFAAoF;AACpF,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAA;AAC3E,OAAO,EACL,sBAAsB,GAMvB,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EAAE,uBAAuB,EAA8B,MAAM,8BAA8B,CAAA;AAClG,OAAO,EAAE,eAAe,EAA+B,MAAM,6BAA6B,CAAA;AAC1F,OAAO,EACL,iCAAiC,GAElC,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EACL,4BAA4B,GAE7B,MAAM,kCAAkC,CAAA;AACzC,OAAO,EACL,yBAAyB,GAE1B,MAAM,uCAAuC,CAAA;AAC9C,OAAO,EACL,sBAAsB,GAEvB,MAAM,+BAA+B,CAAA;AACtC,qFAAqF;AACrF,4FAA4F;AAC5F,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,yBAAyB,EACzB,UAAU,GACX,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAA;AAClD,OAAO,EACL,oBAAoB,GAErB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAA;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACpD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACvE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAClG,kFAAkF;AAClF,8EAA8E;AAC9E,kEAAkE;AAClE,OAAO,EACL,qBAAqB,GAEtB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,6BAA6B,EAAE,MAAM,2CAA2C,CAAA;AACzF,OAAO,EAAE,aAAa,EAAkC,MAAM,2BAA2B,CAAA;AACzF,OAAO,EACL,iBAAiB,GAIlB,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAA;AAC/E,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AACpF,gFAAgF;AAChF,kFAAkF;AAClF,qFAAqF;AACrF,6BAA6B;AAC7B,OAAO,EACL,iBAAiB,EACjB,cAAc,GAEf,MAAM,+BAA+B,CAAA;AACtC,oFAAoF;AACpF,qEAAqE;AACrE,OAAO,EACL,6BAA6B,GAE9B,MAAM,2CAA2C,CAAA;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAA;AAC/E,OAAO,EACL,sBAAsB,GAEvB,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EACL,+BAA+B,GAEhC,MAAM,6CAA6C,CAAA;AACpD,OAAO,EACL,0BAA0B,EAC1B,oBAAoB,GAErB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EACL,mBAAmB,GAEpB,MAAM,iCAAiC,CAAA;AACxC,OAAO,EACL,uBAAuB,GAExB,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EACL,UAAU,EACV,cAAc,GAIf,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,GAGb,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import type { AppEnv } from '../../http/env.js';
|
|
3
|
+
/**
|
|
4
|
+
* Workspace-scoped binary-artifact API backing the visual-confirmation gate: upload a
|
|
5
|
+
* reference design image, stream a stored blob, and list a run's artifacts (metadata).
|
|
6
|
+
* Mounted under `/workspaces/:workspaceId`. The blob bytes never expose the storage
|
|
7
|
+
* backend — they're streamed through this authenticated endpoint. The in-container
|
|
8
|
+
* screenshot ingest (container-token authed) is a separate route on the harness path.
|
|
9
|
+
*/
|
|
10
|
+
export declare function artifactController(): Hono<AppEnv>;
|
|
11
|
+
//# sourceMappingURL=ArtifactController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArtifactController.d.ts","sourceRoot":"","sources":["../../../src/modules/artifacts/ArtifactController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAI3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAuB/C;;;;;;GAMG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAAC,MAAM,CAAC,CAuHjD"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { bodyLimit } from 'hono/body-limit';
|
|
3
|
+
import { param } from '../../http/params.js';
|
|
4
|
+
import { MAX_REQUEST_BYTES, MAX_UPLOAD_BYTES, blobResponseHeaders, exceedsRequestSizeLimit, normalizeImageContentType, } from './imageArtifacts.js';
|
|
5
|
+
/** Resolve the binary-artifact store or send a 503, returning null when unconfigured. */
|
|
6
|
+
function requireStore(c) {
|
|
7
|
+
return c.get('container').binaryArtifactStore ?? null;
|
|
8
|
+
}
|
|
9
|
+
const unavailable = (c) => c.json({ error: { code: 'unavailable', message: 'Binary-artifact storage is not configured' } }, 503);
|
|
10
|
+
const ALLOWED_KINDS = ['screenshot', 'reference'];
|
|
11
|
+
/**
|
|
12
|
+
* Workspace-scoped binary-artifact API backing the visual-confirmation gate: upload a
|
|
13
|
+
* reference design image, stream a stored blob, and list a run's artifacts (metadata).
|
|
14
|
+
* Mounted under `/workspaces/:workspaceId`. The blob bytes never expose the storage
|
|
15
|
+
* backend — they're streamed through this authenticated endpoint. The in-container
|
|
16
|
+
* screenshot ingest (container-token authed) is a separate route on the harness path.
|
|
17
|
+
*/
|
|
18
|
+
export function artifactController() {
|
|
19
|
+
const app = new Hono();
|
|
20
|
+
// Upload a reference design image (multipart: `file` + `kind`/`view`/`blockId`/`executionId`).
|
|
21
|
+
app.post('/artifacts',
|
|
22
|
+
// Hard backstop on the buffered body: `bodyLimit` counts bytes as the stream is read, so a
|
|
23
|
+
// chunked body with NO Content-Length (or a spoofed header) can't buffer past the ceiling.
|
|
24
|
+
// The `exceedsRequestSizeLimit` precheck below is just the cheap early-out for honest clients.
|
|
25
|
+
bodyLimit({
|
|
26
|
+
maxSize: MAX_REQUEST_BYTES,
|
|
27
|
+
onError: (c) => c.json({ error: { code: 'too_large', message: 'Artifact exceeds size limit' } }, 413),
|
|
28
|
+
}), async (c) => {
|
|
29
|
+
const store = requireStore(c);
|
|
30
|
+
if (!store)
|
|
31
|
+
return unavailable(c);
|
|
32
|
+
// Refuse a grossly oversized body up-front (from Content-Length) so it is never buffered
|
|
33
|
+
// into memory; the exact per-file ceiling is still enforced after parsing below.
|
|
34
|
+
if (exceedsRequestSizeLimit(c.req.header('content-length'))) {
|
|
35
|
+
return c.json({ error: { code: 'too_large', message: 'Artifact exceeds size limit' } }, 413);
|
|
36
|
+
}
|
|
37
|
+
let form;
|
|
38
|
+
try {
|
|
39
|
+
form = await c.req.formData();
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return c.json({ error: { code: 'invalid_body', message: 'Expected multipart form' } }, 400);
|
|
43
|
+
}
|
|
44
|
+
const file = form.get('file');
|
|
45
|
+
if (!(file instanceof File)) {
|
|
46
|
+
return c.json({ error: { code: 'invalid_body', message: 'Missing `file`' } }, 400);
|
|
47
|
+
}
|
|
48
|
+
const kind = String(form.get('kind') ?? 'reference');
|
|
49
|
+
if (!ALLOWED_KINDS.includes(kind)) {
|
|
50
|
+
return c.json({ error: { code: 'invalid_kind', message: 'Unknown artifact kind' } }, 400);
|
|
51
|
+
}
|
|
52
|
+
// Reject anything that isn't an allowed raster image. An attacker-controlled content
|
|
53
|
+
// type (HTML, SVG) served back inline same-origin from the blob endpoint would be a
|
|
54
|
+
// stored-XSS vector, so the type is pinned to the allow-list at the write boundary.
|
|
55
|
+
const contentType = normalizeImageContentType(file.type);
|
|
56
|
+
if (!contentType) {
|
|
57
|
+
return c.json({
|
|
58
|
+
error: {
|
|
59
|
+
code: 'unsupported_media',
|
|
60
|
+
message: 'Only PNG/JPEG/WebP/GIF images are accepted',
|
|
61
|
+
},
|
|
62
|
+
}, 415);
|
|
63
|
+
}
|
|
64
|
+
const bytes = new Uint8Array(await file.arrayBuffer());
|
|
65
|
+
if (bytes.byteLength > MAX_UPLOAD_BYTES) {
|
|
66
|
+
return c.json({ error: { code: 'too_large', message: 'Artifact exceeds size limit' } }, 413);
|
|
67
|
+
}
|
|
68
|
+
const view = form.get('view');
|
|
69
|
+
const blockId = form.get('blockId');
|
|
70
|
+
// This human-facing endpoint uploads BLOCK-scoped reference design images, which precede any
|
|
71
|
+
// run, so `executionId` is always null here — a run-scoped capture goes through the
|
|
72
|
+
// token-authed harness ingest route instead, where the execution is derived from the verified
|
|
73
|
+
// session token (never the request body). We deliberately ignore any client-supplied
|
|
74
|
+
// `executionId` rather than trust it. `blockId` is non-authoritative but harmless: every read
|
|
75
|
+
// filters by the path's (authenticated) `workspaceId`, so a row tagged with a foreign/bogus
|
|
76
|
+
// block is simply never surfaced by the gate.
|
|
77
|
+
const record = await store.store({
|
|
78
|
+
meta: {
|
|
79
|
+
workspaceId: param(c, 'workspaceId'),
|
|
80
|
+
executionId: null,
|
|
81
|
+
blockId: typeof blockId === 'string' && blockId ? blockId : null,
|
|
82
|
+
kind,
|
|
83
|
+
view: typeof view === 'string' && view ? view : null,
|
|
84
|
+
contentType,
|
|
85
|
+
},
|
|
86
|
+
blob: bytes,
|
|
87
|
+
});
|
|
88
|
+
return c.json({ artifact: record }, 201);
|
|
89
|
+
});
|
|
90
|
+
// Stream a stored blob's bytes (the metadata names its content type).
|
|
91
|
+
app.get('/artifacts/:id/blob', async (c) => {
|
|
92
|
+
const store = requireStore(c);
|
|
93
|
+
if (!store)
|
|
94
|
+
return unavailable(c);
|
|
95
|
+
const workspaceId = param(c, 'workspaceId');
|
|
96
|
+
const id = param(c, 'id');
|
|
97
|
+
// Read metadata + bytes in a SINGLE metadata lookup (the serve path needs both the
|
|
98
|
+
// content type and the bytes).
|
|
99
|
+
const got = await store.getBlobWithMetadata(workspaceId, id);
|
|
100
|
+
if (!got)
|
|
101
|
+
return c.json({ error: { code: 'not_found', message: 'Artifact not found' } }, 404);
|
|
102
|
+
if (!got.bytes)
|
|
103
|
+
return c.json({ error: { code: 'not_found', message: 'Artifact bytes gone' } }, 404);
|
|
104
|
+
// Uint8Array is a valid BodyInit on both runtimes (workerd + Node/undici); the cast
|
|
105
|
+
// satisfies the narrower ambient BodyInit type this package compiles against. Headers
|
|
106
|
+
// clamp the type to the image allow-list + send `nosniff` so the bytes can never be
|
|
107
|
+
// sniffed/served as active content (defence-in-depth with the upload-time allow-list).
|
|
108
|
+
return new Response(got.bytes, {
|
|
109
|
+
status: 200,
|
|
110
|
+
headers: blobResponseHeaders(got.record.contentType),
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
// List a run's artifacts (metadata only; the gate pairs screenshots vs references by view).
|
|
114
|
+
app.get('/executions/:executionId/artifacts', async (c) => {
|
|
115
|
+
const store = requireStore(c);
|
|
116
|
+
if (!store)
|
|
117
|
+
return unavailable(c);
|
|
118
|
+
const artifacts = await store.listByExecution(param(c, 'workspaceId'), param(c, 'executionId'));
|
|
119
|
+
return c.json({ artifacts }, 200);
|
|
120
|
+
});
|
|
121
|
+
// List a block's artifacts (e.g. its uploaded reference design images, which carry no
|
|
122
|
+
// executionId because they're attached before any run).
|
|
123
|
+
app.get('/blocks/:blockId/artifacts', async (c) => {
|
|
124
|
+
const store = requireStore(c);
|
|
125
|
+
if (!store)
|
|
126
|
+
return unavailable(c);
|
|
127
|
+
const artifacts = await store.listByBlock(param(c, 'workspaceId'), param(c, 'blockId'));
|
|
128
|
+
return c.json({ artifacts }, 200);
|
|
129
|
+
});
|
|
130
|
+
return app;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=ArtifactController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArtifactController.js","sourceRoot":"","sources":["../../../src/modules/artifacts/ArtifactController.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import type { AppEnv } from '../../http/env.js';
|
|
3
|
+
/**
|
|
4
|
+
* The in-container screenshot ingest endpoint for the UI tester (`tester-ui`). It lives on
|
|
5
|
+
* the harness path (mounted at `/`, reachable at `${proxyBaseUrl}/artifacts/ingest`) and is
|
|
6
|
+
* authed by the SAME short-lived container session token the agent already carries for the
|
|
7
|
+
* LLM proxy — NOT a workspace session — so a container can upload its captured screenshots
|
|
8
|
+
* without holding any user credential. The token pins the workspace + execution, so a
|
|
9
|
+
* container can only write artifacts scoped to its own run. Screenshots are stored with
|
|
10
|
+
* `kind:'screenshot'`; the gate reads them back by the artifact ids the agent reports.
|
|
11
|
+
*/
|
|
12
|
+
export declare function harnessArtifactController(): Hono<AppEnv>;
|
|
13
|
+
//# sourceMappingURL=HarnessArtifactController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HarnessArtifactController.d.ts","sourceRoot":"","sources":["../../../src/modules/artifacts/HarnessArtifactController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAI3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAiB/C;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAAC,MAAM,CAAC,CAiJxD"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { bodyLimit } from 'hono/body-limit';
|
|
3
|
+
import { bearerToken } from '../../auth/middleware.js';
|
|
4
|
+
import { ContainerSessionService } from '../../containers/ContainerSessionService.js';
|
|
5
|
+
import { logger } from '../../observability/logger.js';
|
|
6
|
+
import { MAX_REQUEST_BYTES, MAX_UPLOAD_BYTES, exceedsRequestSizeLimit, normalizeImageContentType, } from './imageArtifacts.js';
|
|
7
|
+
/**
|
|
8
|
+
* Cap on how many screenshots a single run may upload. A `tester-ui` run captures one shot per
|
|
9
|
+
* distinct view, so a couple of dozen is generous; the ceiling stops a buggy or compromised
|
|
10
|
+
* container from filling the blob store with unbounded uploads before retention sweeps it. The
|
|
11
|
+
* count is read back from the store per ingest (cheap, indexed by execution).
|
|
12
|
+
*/
|
|
13
|
+
const MAX_SCREENSHOTS_PER_RUN = 100;
|
|
14
|
+
/**
|
|
15
|
+
* The in-container screenshot ingest endpoint for the UI tester (`tester-ui`). It lives on
|
|
16
|
+
* the harness path (mounted at `/`, reachable at `${proxyBaseUrl}/artifacts/ingest`) and is
|
|
17
|
+
* authed by the SAME short-lived container session token the agent already carries for the
|
|
18
|
+
* LLM proxy — NOT a workspace session — so a container can upload its captured screenshots
|
|
19
|
+
* without holding any user credential. The token pins the workspace + execution, so a
|
|
20
|
+
* container can only write artifacts scoped to its own run. Screenshots are stored with
|
|
21
|
+
* `kind:'screenshot'`; the gate reads them back by the artifact ids the agent reports.
|
|
22
|
+
*/
|
|
23
|
+
export function harnessArtifactController() {
|
|
24
|
+
const app = new Hono();
|
|
25
|
+
app.post('/v1/artifacts/ingest',
|
|
26
|
+
// Hard backstop on the buffered body: `bodyLimit` counts bytes as the stream is read, so a
|
|
27
|
+
// body with NO Content-Length (chunked) or a spoofed header can't buffer past the ceiling
|
|
28
|
+
// (the `exceedsRequestSizeLimit` precheck below is just the cheap early-out for honest clients).
|
|
29
|
+
bodyLimit({
|
|
30
|
+
maxSize: MAX_REQUEST_BYTES,
|
|
31
|
+
onError: (c) => c.json({ error: { code: 'too_large', message: 'Artifact exceeds size limit' } }, 413),
|
|
32
|
+
}), async (c) => {
|
|
33
|
+
const container = c.get('container');
|
|
34
|
+
const store = container.binaryArtifactStore;
|
|
35
|
+
if (!store) {
|
|
36
|
+
return c.json({ error: { code: 'unavailable', message: 'Artifact storage not configured' } }, 503);
|
|
37
|
+
}
|
|
38
|
+
const secret = container.config.auth.sessionSecret;
|
|
39
|
+
if (!secret) {
|
|
40
|
+
logger.error({ scope: 'artifactIngest' }, 'artifact ingest: session secret not configured');
|
|
41
|
+
return c.json({ error: { code: 'unavailable', message: 'Artifact ingest not configured' } }, 503);
|
|
42
|
+
}
|
|
43
|
+
const sessions = new ContainerSessionService({ secret });
|
|
44
|
+
const session = await sessions.verify(bearerToken(c));
|
|
45
|
+
if (!session) {
|
|
46
|
+
logger.warn({ scope: 'artifactIngest' }, 'artifact ingest: invalid or expired session token');
|
|
47
|
+
return c.json({ error: { code: 'unauthorized', message: 'Invalid or expired token' } }, 401);
|
|
48
|
+
}
|
|
49
|
+
// Refuse a grossly oversized body from Content-Length before it is buffered into memory; the
|
|
50
|
+
// exact per-file ceiling is still enforced after parsing below.
|
|
51
|
+
if (exceedsRequestSizeLimit(c.req.header('content-length'))) {
|
|
52
|
+
return c.json({ error: { code: 'too_large', message: 'Artifact exceeds size limit' } }, 413);
|
|
53
|
+
}
|
|
54
|
+
// Per-run upload ceiling (fast-path): a runaway/compromised container can't fill the store
|
|
55
|
+
// with unbounded screenshots scoped to its run. This pre-check rejects the steady-state case
|
|
56
|
+
// cheaply via an indexed COUNT (no row materialise); concurrent ingests that race past it are
|
|
57
|
+
// caught by the post-insert reconcile below, so the effective ceiling holds even without a
|
|
58
|
+
// DB-level atomic counter.
|
|
59
|
+
const existingCount = await store.countByExecution(session.workspaceId, session.executionId);
|
|
60
|
+
if (existingCount >= MAX_SCREENSHOTS_PER_RUN) {
|
|
61
|
+
logger.warn({ scope: 'artifactIngest', executionId: session.executionId, count: existingCount }, 'artifact ingest: per-run screenshot limit reached');
|
|
62
|
+
return c.json({ error: { code: 'too_many', message: 'Per-run screenshot limit reached' } }, 429);
|
|
63
|
+
}
|
|
64
|
+
let form;
|
|
65
|
+
try {
|
|
66
|
+
form = await c.req.formData();
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return c.json({ error: { code: 'invalid_body', message: 'Expected multipart form' } }, 400);
|
|
70
|
+
}
|
|
71
|
+
const file = form.get('file');
|
|
72
|
+
if (!(file instanceof File)) {
|
|
73
|
+
return c.json({ error: { code: 'invalid_body', message: 'Missing `file`' } }, 400);
|
|
74
|
+
}
|
|
75
|
+
// Screenshots are always PNGs. Tolerate a typeless upload (default to PNG), but REJECT a
|
|
76
|
+
// recognised non-image type rather than silently storing it mislabelled — keeping this path's
|
|
77
|
+
// content-type posture aligned with the workspace upload endpoint (both gate on the shared
|
|
78
|
+
// image allow-list in imageArtifacts.ts).
|
|
79
|
+
const declaredType = file.type?.trim();
|
|
80
|
+
let contentType;
|
|
81
|
+
if (!declaredType) {
|
|
82
|
+
contentType = 'image/png';
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
const normalized = normalizeImageContentType(declaredType);
|
|
86
|
+
if (!normalized) {
|
|
87
|
+
return c.json({
|
|
88
|
+
error: {
|
|
89
|
+
code: 'unsupported_media',
|
|
90
|
+
message: 'Only raster image screenshots are accepted',
|
|
91
|
+
},
|
|
92
|
+
}, 415);
|
|
93
|
+
}
|
|
94
|
+
contentType = normalized;
|
|
95
|
+
}
|
|
96
|
+
const bytes = new Uint8Array(await file.arrayBuffer());
|
|
97
|
+
if (bytes.byteLength > MAX_UPLOAD_BYTES) {
|
|
98
|
+
return c.json({ error: { code: 'too_large', message: 'Artifact exceeds size limit' } }, 413);
|
|
99
|
+
}
|
|
100
|
+
const view = form.get('view');
|
|
101
|
+
// Workspace + execution come from the verified token (never the request body), so a
|
|
102
|
+
// container can only attach to its own run. Screenshots are run-scoped (no blockId).
|
|
103
|
+
const record = await store.store({
|
|
104
|
+
meta: {
|
|
105
|
+
workspaceId: session.workspaceId,
|
|
106
|
+
executionId: session.executionId,
|
|
107
|
+
blockId: null,
|
|
108
|
+
kind: 'screenshot',
|
|
109
|
+
view: typeof view === 'string' && view ? view : null,
|
|
110
|
+
contentType,
|
|
111
|
+
},
|
|
112
|
+
blob: bytes,
|
|
113
|
+
});
|
|
114
|
+
// Reconcile the cap against concurrent inserts: the pre-check is check-then-act, so a burst
|
|
115
|
+
// of parallel ingests can each pass it before any row lands. We only need to run this
|
|
116
|
+
// (which materialises the run's rows to find the overflow tail) when the insert COULD have
|
|
117
|
+
// crossed the cap — i.e. the pre-check count was already at the edge. Steady-state uploads
|
|
118
|
+
// far below the cap skip it entirely, so the common path is one COUNT + one insert.
|
|
119
|
+
if (existingCount + 1 >= MAX_SCREENSHOTS_PER_RUN) {
|
|
120
|
+
// listByExecution is oldest-first, so anything at index >= the cap is overflow; if THIS
|
|
121
|
+
// record is in that tail, roll it back (delete its row + bytes) and reject. The oldest
|
|
122
|
+
// `MAX_SCREENSHOTS_PER_RUN` always survive, so the store is bounded to exactly the cap per
|
|
123
|
+
// run without dropping legitimate earlier shots.
|
|
124
|
+
const after = await store.listByExecution(session.workspaceId, session.executionId);
|
|
125
|
+
if (after.length > MAX_SCREENSHOTS_PER_RUN) {
|
|
126
|
+
const overflow = new Set(after.slice(MAX_SCREENSHOTS_PER_RUN).map((r) => r.id));
|
|
127
|
+
if (overflow.has(record.id)) {
|
|
128
|
+
await store.delete(session.workspaceId, record.id);
|
|
129
|
+
logger.warn({ scope: 'artifactIngest', executionId: session.executionId, count: after.length }, 'artifact ingest: per-run screenshot limit reached (post-insert reconcile)');
|
|
130
|
+
return c.json({ error: { code: 'too_many', message: 'Per-run screenshot limit reached' } }, 429);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return c.json({ artifactId: record.id }, 201);
|
|
135
|
+
});
|
|
136
|
+
return app;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=HarnessArtifactController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HarnessArtifactController.js","sourceRoot":"","sources":["../../../src/modules/artifacts/HarnessArtifactController.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The ONLY content types a binary artifact may carry. Screenshots are PNGs and reference
|
|
3
|
+
* designs are uploaded images; anything else (HTML, SVG — which can carry script and would
|
|
4
|
+
* execute when served inline same-origin) is rejected at the write boundary so the blob
|
|
5
|
+
* endpoint can never become a stored-XSS vector. SVG is deliberately excluded.
|
|
6
|
+
*/
|
|
7
|
+
export declare const ALLOWED_IMAGE_CONTENT_TYPES: ReadonlySet<string>;
|
|
8
|
+
/** A hard ceiling on a single artifact's bytes, enforced at every ingest point. */
|
|
9
|
+
export declare const MAX_UPLOAD_BYTES: number;
|
|
10
|
+
/**
|
|
11
|
+
* A coarse ceiling on the whole multipart request, checked from `Content-Length` BEFORE the
|
|
12
|
+
* body is buffered, so a grossly oversized upload is rejected without first materialising it
|
|
13
|
+
* in memory. It is `MAX_UPLOAD_BYTES` plus a generous slack for multipart framing (boundaries,
|
|
14
|
+
* the `view`/`kind` fields) so a legitimate ~16 MiB file is never falsely rejected; the exact
|
|
15
|
+
* per-file `MAX_UPLOAD_BYTES` check still runs after parsing as the authoritative limit.
|
|
16
|
+
*/
|
|
17
|
+
export declare const MAX_REQUEST_BYTES: number;
|
|
18
|
+
/**
|
|
19
|
+
* Reject (from the declared `Content-Length`) a request whose body is grossly larger than an
|
|
20
|
+
* artifact upload can legitimately be, BEFORE the body is read into memory. Returns true when
|
|
21
|
+
* the request should be refused (caller sends 413). A missing/unparseable header returns false
|
|
22
|
+
* — we can't pre-judge it, so the post-parse `MAX_UPLOAD_BYTES` check remains the backstop.
|
|
23
|
+
*/
|
|
24
|
+
export declare function exceedsRequestSizeLimit(contentLength: string | undefined | null): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Canonicalise a client-supplied content type to one of {@link ALLOWED_IMAGE_CONTENT_TYPES},
|
|
27
|
+
* or `null` when it isn't an allowed image type. Strips any `; charset=…` parameter and
|
|
28
|
+
* lower-cases before matching.
|
|
29
|
+
*/
|
|
30
|
+
export declare function normalizeImageContentType(raw: string | null | undefined): string | null;
|
|
31
|
+
/**
|
|
32
|
+
* Headers for serving a stored blob back. We clamp the Content-Type to the allow-list (so
|
|
33
|
+
* a row that somehow holds a non-image type is served as an inert download, never inline
|
|
34
|
+
* active content) and always send `X-Content-Type-Options: nosniff` so a browser can't
|
|
35
|
+
* MIME-sniff the bytes into something executable.
|
|
36
|
+
*/
|
|
37
|
+
export declare function blobResponseHeaders(storedContentType: string): Record<string, string>;
|
|
38
|
+
//# sourceMappingURL=imageArtifacts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imageArtifacts.d.ts","sourceRoot":"","sources":["../../../src/modules/artifacts/imageArtifacts.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,EAAE,WAAW,CAAC,MAAM,CAK1D,CAAA;AAEF,mFAAmF;AACnF,eAAO,MAAM,gBAAgB,QAAmB,CAAA;AAEhD;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,QAAiC,CAAA;AAE/D;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAIzF;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAIvF;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBrF"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// Shared validation + safe-serving helpers for binary-artifact images (UI screenshots +
|
|
2
|
+
// reference design images). Used by BOTH the workspace-scoped upload/serve controller and
|
|
3
|
+
// the container-token-authed harness ingest route, so the security posture can't drift
|
|
4
|
+
// between the two entry points.
|
|
5
|
+
/**
|
|
6
|
+
* The ONLY content types a binary artifact may carry. Screenshots are PNGs and reference
|
|
7
|
+
* designs are uploaded images; anything else (HTML, SVG — which can carry script and would
|
|
8
|
+
* execute when served inline same-origin) is rejected at the write boundary so the blob
|
|
9
|
+
* endpoint can never become a stored-XSS vector. SVG is deliberately excluded.
|
|
10
|
+
*/
|
|
11
|
+
export const ALLOWED_IMAGE_CONTENT_TYPES = new Set([
|
|
12
|
+
'image/png',
|
|
13
|
+
'image/jpeg',
|
|
14
|
+
'image/webp',
|
|
15
|
+
'image/gif',
|
|
16
|
+
]);
|
|
17
|
+
/** A hard ceiling on a single artifact's bytes, enforced at every ingest point. */
|
|
18
|
+
export const MAX_UPLOAD_BYTES = 16 * 1024 * 1024;
|
|
19
|
+
/**
|
|
20
|
+
* A coarse ceiling on the whole multipart request, checked from `Content-Length` BEFORE the
|
|
21
|
+
* body is buffered, so a grossly oversized upload is rejected without first materialising it
|
|
22
|
+
* in memory. It is `MAX_UPLOAD_BYTES` plus a generous slack for multipart framing (boundaries,
|
|
23
|
+
* the `view`/`kind` fields) so a legitimate ~16 MiB file is never falsely rejected; the exact
|
|
24
|
+
* per-file `MAX_UPLOAD_BYTES` check still runs after parsing as the authoritative limit.
|
|
25
|
+
*/
|
|
26
|
+
export const MAX_REQUEST_BYTES = MAX_UPLOAD_BYTES + 1024 * 1024;
|
|
27
|
+
/**
|
|
28
|
+
* Reject (from the declared `Content-Length`) a request whose body is grossly larger than an
|
|
29
|
+
* artifact upload can legitimately be, BEFORE the body is read into memory. Returns true when
|
|
30
|
+
* the request should be refused (caller sends 413). A missing/unparseable header returns false
|
|
31
|
+
* — we can't pre-judge it, so the post-parse `MAX_UPLOAD_BYTES` check remains the backstop.
|
|
32
|
+
*/
|
|
33
|
+
export function exceedsRequestSizeLimit(contentLength) {
|
|
34
|
+
if (!contentLength)
|
|
35
|
+
return false;
|
|
36
|
+
const n = Number(contentLength);
|
|
37
|
+
return Number.isFinite(n) && n > MAX_REQUEST_BYTES;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Canonicalise a client-supplied content type to one of {@link ALLOWED_IMAGE_CONTENT_TYPES},
|
|
41
|
+
* or `null` when it isn't an allowed image type. Strips any `; charset=…` parameter and
|
|
42
|
+
* lower-cases before matching.
|
|
43
|
+
*/
|
|
44
|
+
export function normalizeImageContentType(raw) {
|
|
45
|
+
if (!raw)
|
|
46
|
+
return null;
|
|
47
|
+
const base = raw.split(';', 1)[0].trim().toLowerCase();
|
|
48
|
+
return ALLOWED_IMAGE_CONTENT_TYPES.has(base) ? base : null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Headers for serving a stored blob back. We clamp the Content-Type to the allow-list (so
|
|
52
|
+
* a row that somehow holds a non-image type is served as an inert download, never inline
|
|
53
|
+
* active content) and always send `X-Content-Type-Options: nosniff` so a browser can't
|
|
54
|
+
* MIME-sniff the bytes into something executable.
|
|
55
|
+
*/
|
|
56
|
+
export function blobResponseHeaders(storedContentType) {
|
|
57
|
+
const safe = normalizeImageContentType(storedContentType);
|
|
58
|
+
return safe
|
|
59
|
+
? {
|
|
60
|
+
'Content-Type': safe,
|
|
61
|
+
'Content-Disposition': 'inline',
|
|
62
|
+
'X-Content-Type-Options': 'nosniff',
|
|
63
|
+
'Cache-Control': 'private, max-age=86400',
|
|
64
|
+
}
|
|
65
|
+
: {
|
|
66
|
+
// Not a recognised image: serve as an opaque attachment so nothing executes.
|
|
67
|
+
'Content-Type': 'application/octet-stream',
|
|
68
|
+
'Content-Disposition': 'attachment',
|
|
69
|
+
'X-Content-Type-Options': 'nosniff',
|
|
70
|
+
'Cache-Control': 'private, max-age=86400',
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=imageArtifacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imageArtifacts.js","sourceRoot":"","sources":["../../../src/modules/artifacts/imageArtifacts.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,0FAA0F;AAC1F,uFAAuF;AACvF,gCAAgC;AAEhC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAwB,IAAI,GAAG,CAAC;IACtE,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,WAAW;CACZ,CAAC,CAAA;AAEF,mFAAmF;AACnF,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAA;AAEhD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,GAAG,IAAI,GAAG,IAAI,CAAA;AAE/D;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,aAAwC;IAC9E,IAAI,CAAC,aAAa;QAAE,OAAO,KAAK,CAAA;IAChC,MAAM,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,CAAA;IAC/B,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAA;AACpD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,GAA8B;IACtE,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAA;IACrB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACvD,OAAO,2BAA2B,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;AAC5D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,iBAAyB;IAC3D,MAAM,IAAI,GAAG,yBAAyB,CAAC,iBAAiB,CAAC,CAAA;IACzD,OAAO,IAAI;QACT,CAAC,CAAC;YACE,cAAc,EAAE,IAAI;YACpB,qBAAqB,EAAE,QAAQ;YAC/B,wBAAwB,EAAE,SAAS;YACnC,eAAe,EAAE,wBAAwB;SAC1C;QACH,CAAC,CAAC;YACE,6EAA6E;YAC7E,cAAc,EAAE,0BAA0B;YAC1C,qBAAqB,EAAE,YAAY;YACnC,wBAAwB,EAAE,SAAS;YACnC,eAAe,EAAE,wBAAwB;SAC1C,CAAA;AACP,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExecutionController.d.ts","sourceRoot":"","sources":["../../../src/modules/execution/ExecutionController.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAS/C;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"ExecutionController.d.ts","sourceRoot":"","sources":["../../../src/modules/execution/ExecutionController.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAS/C;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAAC,MAAM,CAAC,CAkOlD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExecutionController.js","sourceRoot":"","sources":["../../../src/modules/execution/ExecutionController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,iCAAiC,EACjC,gCAAgC,EAChC,8BAA8B,EAC9B,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,EAClB,0BAA0B,EAC1B,uBAAuB,EACvB,wBAAwB,EACxB,mBAAmB,EACnB,sBAAsB,EACtB,2BAA2B,GAC5B,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAA;AAEtE,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC5C,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,wCAAwC,CAAA;AAE/C;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAU,CAAA;IAE9B,cAAc,CAAC,GAAG,EAAE,sBAAsB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACtD,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QACpC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;QAC3C,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAA;QAC5C,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAC1C,8EAA8E;QAC9E,iFAAiF;QACjF,mFAAmF;QACnF,yDAAyD;QACzD,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,MAAM,oBAAoB,CAC1D,SAAS,EACT,WAAW,EACX,OAAO,EACP,UAAU,EACV,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EACb,oBAAoB,CAAC,CAAC,CAAC,CACxB,CAAA;QACD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,KAAK,CACrD,WAAW,EACX,OAAO,EACP,UAAU,EACV,WAAW,EACX,QAAQ,CACT,CAAA;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,cAAc,CAAC,GAAG,EAAE,uBAAuB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACvD,MAAM,KAAK,GAAG,MAAM,CAAC;aAClB,GAAG,CAAC,WAAW,CAAC;aAChB,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAA;QACjF,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEF,cAAc,CAAC,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAClD,6EAA6E;QAC7E,uEAAuE;QACvE,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAC3D,CAAC;aACE,GAAG,CAAC,WAAW,CAAC;aAChB,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CACnF,CAAA;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEF,0EAA0E;IAC1E,cAAc,CAAC,GAAG,EAAE,sBAAsB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACtD,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC3F,CAAC,CAAC,CAAA;IAEF,6EAA6E;IAC7E,iFAAiF;IACjF,wEAAwE;IACxE,cAAc,CAAC,GAAG,EAAE,8BAA8B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC9D,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,WAAW,CAAA;QACpD,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,gBAAgB,CAAA;QACzD,MAAM,KAAK,GAAG,aAAa;YACzB,CAAC,CAAC,MAAM,aAAa,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,WAAW,CAAC;YAC3E,CAAC,CAAC,EAAE,CAAA;QACN,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,+EAA+E;IAC/E,mFAAmF;IACnF,iFAAiF;IACjF,0DAA0D;IAC1D,cAAc,CAAC,GAAG,EAAE,gCAAgC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAChE,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,WAAW,CAAA;QACpD,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,yBAAyB,CAAA;QAClE,MAAM,SAAS,GAAG,aAAa;YAC7B,CAAC,CAAC,MAAM,aAAa,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,WAAW,CAAC;YAC3E,CAAC,CAAC,EAAE,CAAA;QACN,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,GAAG,CAAC,CAAA;IAChD,CAAC,CAAC,CAAA;IAEF,+EAA+E;IAC/E,8EAA8E;IAC9E,qEAAqE;IACrE,cAAc,CAAC,GAAG,EAAE,iCAAiC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACjE,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,WAAW,CAAA;QACpD,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,gBAAgB,CAAA;QACzD,MAAM,QAAQ,GAAG,aAAa;YAC5B,CAAC,CAAC,MAAM,aAAa,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,WAAW,CAAC;YAC9E,CAAC,CAAC;gBACE,IAAI,EAAE,gCAAyC;gBAC/C,OAAO,EAAE,CAAU;gBACnB,WAAW;gBACX,WAAW,EAAE,CAAC;gBACd,MAAM,EAAE;oBACN,KAAK,EAAE,CAAC;oBACR,YAAY,EAAE,CAAC;oBACf,gBAAgB,EAAE,CAAC;oBACnB,UAAU,EAAE,CAAC;oBACb,UAAU,EAAE,CAAC;oBACb,sBAAsB,EAAE,IAAI;oBAC5B,MAAM,EAAE,CAAC;oBACT,QAAQ,EAAE,CAAC;oBACX,cAAc,EAAE,CAAC;iBAClB;gBACD,QAAQ,EAAE,EAAE;gBACZ,KAAK,EAAE,EAAE;aACV,CAAA;QACL,CAAC,CAAC,MAAM,CAAC,qBAAqB,EAAE,qCAAqC,WAAW,QAAQ,CAAC,CAAA;QACzF,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,+DAA+D;IAC/D,cAAc,CAAC,GAAG,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACnD,MAAM,SAAS,GAAG,MAAM,CAAC;aACtB,GAAG,CAAC,WAAW,CAAC;aAChB,gBAAgB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAA;QACzD,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;IAC/B,CAAC,CAAC,CAAA;IAEF,cAAc,CAAC,GAAG,EAAE,uBAAuB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACvD,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACxD,sFAAsF;QACtF,MAAM,iBAAiB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,WAAW,CAAC,CAAA;QAChE,MAAM,QAAQ,GAAG,MAAM,CAAC;aACrB,GAAG,CAAC,WAAW,CAAC;aAChB,gBAAgB,CAAC,eAAe,CAC/B,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EACvB,WAAW,EACX,UAAU,EACV,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAC3B,CAAA;QACH,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,6EAA6E;IAC7E,oEAAoE;IACpE,cAAc,CAAC,GAAG,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACnD,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACxD,sFAAsF;QACtF,MAAM,iBAAiB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,WAAW,CAAC,CAAA;QAChE,MAAM,QAAQ,GAAG,MAAM,CAAC;aACrB,GAAG,CAAC,WAAW,CAAC;aAChB,gBAAgB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE;YAC9E,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ;SACvC,CAAC,CAAA;QACJ,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,4EAA4E;IAC5E,+CAA+C;IAC/C,cAAc,CAAC,GAAG,EAAE,0BAA0B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1D,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACxD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAClD,sEAAsE;QACtE,MAAM,iBAAiB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,WAAW,CAAC,CAAA;QAChE,MAAM,QAAQ,GAAG,MAAM,CAAC;aACrB,GAAG,CAAC,WAAW,CAAC;aAChB,gBAAgB,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE;YACrF,QAAQ;YACR,QAAQ;SACT,CAAC,CAAA;QACJ,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,gFAAgF;IAChF,oFAAoF;IACpF,iFAAiF;IACjF,iDAAiD;IACjD,cAAc,CAAC,GAAG,EAAE,2BAA2B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC3D,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACxD,yEAAyE;QACzE,MAAM,iBAAiB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,WAAW,CAAC,CAAA;QAChE,MAAM,QAAQ,GAAG,MAAM,CAAC;aACrB,GAAG,CAAC,WAAW,CAAC;aAChB,gBAAgB,CAAC,wBAAwB,CACxC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EACvB,WAAW,EACX,UAAU,EACV,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAC3B,CAAA;QACH,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,kFAAkF;IAClF,+EAA+E;IAC/E,oFAAoF;IACpF,qFAAqF;IACrF,gFAAgF;IAChF,oFAAoF;IACpF,cAAc,CAAC,GAAG,EAAE,wBAAwB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACxD,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QACpC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;QAC3C,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,WAAW,CAAA;QACpD,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAC7C,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,MAAM,kBAAkB,CACxD,SAAS,EACT,WAAW,EACX,WAAW,EACX,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EACb,oBAAoB,CAAC,CAAC,CAAC,CACxB,CAAA;QACD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,eAAe,CAC/D,WAAW,EACX,WAAW,EACX,aAAa,EACb,WAAW,EACX,QAAQ,CACT,CAAA;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,mFAAmF;IACnF,cAAc,CAAC,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAClD,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACxD,MAAM,QAAQ,GAAG,MAAM,CAAC;aACrB,GAAG,CAAC,WAAW,CAAC;aAChB,gBAAgB,CAAC,UAAU,CAC1B,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EACvB,WAAW,EACX,UAAU,EACV,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAC3B,CAAA;QACH,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,OAAO,GAAG,CAAA;AACZ,CAAC"}
|
|
1
|
+
{"version":3,"file":"ExecutionController.js","sourceRoot":"","sources":["../../../src/modules/execution/ExecutionController.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import type { AppEnv } from '../../http/env.js';
|
|
3
|
+
/**
|
|
4
|
+
* Workspace-scoped run-driving endpoints for the visual-confirmation gate. Each acts on the
|
|
5
|
+
* block's parked `visual-confirmation` step via the execution service: approve (advance),
|
|
6
|
+
* request a fix from findings (dispatch the Tester's `fixer`), or recapture (refresh the
|
|
7
|
+
* actual-vs-reference pairs from the latest UI-tester report). They return the updated
|
|
8
|
+
* execution instance. Mounted under `/workspaces/:workspaceId`.
|
|
9
|
+
*/
|
|
10
|
+
export declare function visualConfirmationController(): Hono<AppEnv>;
|
|
11
|
+
//# sourceMappingURL=VisualConfirmationController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VisualConfirmationController.d.ts","sourceRoot":"","sources":["../../../src/modules/visualConfirm/VisualConfirmationController.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAG/C;;;;;;GAMG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CAAC,MAAM,CAAC,CAmC3D"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { approveVisualConfirmContract, recaptureVisualConfirmContract, requestVisualConfirmFixContract, } from '@cat-factory/contracts';
|
|
2
|
+
import { buildHonoRoute } from '@toad-contracts/hono';
|
|
3
|
+
import { Hono } from 'hono';
|
|
4
|
+
import { param } from '../../http/params.js';
|
|
5
|
+
/**
|
|
6
|
+
* Workspace-scoped run-driving endpoints for the visual-confirmation gate. Each acts on the
|
|
7
|
+
* block's parked `visual-confirmation` step via the execution service: approve (advance),
|
|
8
|
+
* request a fix from findings (dispatch the Tester's `fixer`), or recapture (refresh the
|
|
9
|
+
* actual-vs-reference pairs from the latest UI-tester report). They return the updated
|
|
10
|
+
* execution instance. Mounted under `/workspaces/:workspaceId`.
|
|
11
|
+
*/
|
|
12
|
+
export function visualConfirmationController() {
|
|
13
|
+
const app = new Hono();
|
|
14
|
+
// The human approved the screenshots: advance the pipeline.
|
|
15
|
+
buildHonoRoute(app, approveVisualConfirmContract, async (c) => {
|
|
16
|
+
const instance = await c
|
|
17
|
+
.get('container')
|
|
18
|
+
.executionService.approveVisualConfirm(param(c, 'workspaceId'), c.req.valid('param').blockId);
|
|
19
|
+
return c.json(instance, 200);
|
|
20
|
+
});
|
|
21
|
+
// Submit findings and request a fix: dispatch the fixer, then re-park.
|
|
22
|
+
buildHonoRoute(app, requestVisualConfirmFixContract, async (c) => {
|
|
23
|
+
const instance = await c
|
|
24
|
+
.get('container')
|
|
25
|
+
.executionService.requestVisualConfirmFix(param(c, 'workspaceId'), c.req.valid('param').blockId, c.req.valid('json').findings);
|
|
26
|
+
return c.json(instance, 200);
|
|
27
|
+
});
|
|
28
|
+
// Refresh the actual-vs-reference pairs from the latest UI-tester report.
|
|
29
|
+
buildHonoRoute(app, recaptureVisualConfirmContract, async (c) => {
|
|
30
|
+
const instance = await c
|
|
31
|
+
.get('container')
|
|
32
|
+
.executionService.recaptureVisualConfirm(param(c, 'workspaceId'), c.req.valid('param').blockId);
|
|
33
|
+
return c.json(instance, 200);
|
|
34
|
+
});
|
|
35
|
+
return app;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=VisualConfirmationController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VisualConfirmationController.js","sourceRoot":"","sources":["../../../src/modules/visualConfirm/VisualConfirmationController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4BAA4B,EAC5B,8BAA8B,EAC9B,+BAA+B,GAChC,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAE5C;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B;IAC1C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAU,CAAA;IAE9B,4DAA4D;IAC5D,cAAc,CAAC,GAAG,EAAE,4BAA4B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC5D,MAAM,QAAQ,GAAG,MAAM,CAAC;aACrB,GAAG,CAAC,WAAW,CAAC;aAChB,gBAAgB,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAA;QAC/F,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,uEAAuE;IACvE,cAAc,CAAC,GAAG,EAAE,+BAA+B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC/D,MAAM,QAAQ,GAAG,MAAM,CAAC;aACrB,GAAG,CAAC,WAAW,CAAC;aAChB,gBAAgB,CAAC,uBAAuB,CACvC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EACvB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,EAC5B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,CAC7B,CAAA;QACH,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,0EAA0E;IAC1E,cAAc,CAAC,GAAG,EAAE,8BAA8B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC9D,MAAM,QAAQ,GAAG,MAAM,CAAC;aACrB,GAAG,CAAC,WAAW,CAAC;aAChB,gBAAgB,CAAC,sBAAsB,CACtC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EACvB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAC7B,CAAA;QACH,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,OAAO,GAAG,CAAA;AACZ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cat-factory/server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.36.0",
|
|
4
4
|
"description": "Runtime-neutral HTTP layer for the Agent Architecture Board: the Hono controllers, middleware (auth/authz/CORS/error), request helpers and the gateway seams shared by every deployment facade (Cloudflare Worker, Node service).",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -30,13 +30,13 @@
|
|
|
30
30
|
"hono": "^4.12.27",
|
|
31
31
|
"pino": "^10.3.1",
|
|
32
32
|
"valibot": "^1.4.1",
|
|
33
|
-
"@cat-factory/agents": "0.
|
|
34
|
-
"@cat-factory/contracts": "0.
|
|
35
|
-
"@cat-factory/integrations": "0.
|
|
36
|
-
"@cat-factory/kernel": "0.
|
|
37
|
-
"@cat-factory/orchestration": "0.
|
|
38
|
-
"@cat-factory/prompt-fragments": "0.7.
|
|
39
|
-
"@cat-factory/spend": "0.10.
|
|
33
|
+
"@cat-factory/agents": "0.20.0",
|
|
34
|
+
"@cat-factory/contracts": "0.40.0",
|
|
35
|
+
"@cat-factory/integrations": "0.24.0",
|
|
36
|
+
"@cat-factory/kernel": "0.42.0",
|
|
37
|
+
"@cat-factory/orchestration": "0.32.0",
|
|
38
|
+
"@cat-factory/prompt-fragments": "0.7.38",
|
|
39
|
+
"@cat-factory/spend": "0.10.11"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"typescript": "7.0.1-rc",
|