@cat-factory/local-server 0.110.0 → 0.111.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.
Files changed (51) hide show
  1. package/dist/LocalContainerRunnerTransport.d.ts +21 -1
  2. package/dist/LocalContainerRunnerTransport.d.ts.map +1 -1
  3. package/dist/LocalContainerRunnerTransport.js +26 -11
  4. package/dist/LocalContainerRunnerTransport.js.map +1 -1
  5. package/dist/LocalPreviewTransport.d.ts +9 -1
  6. package/dist/LocalPreviewTransport.d.ts.map +1 -1
  7. package/dist/LocalPreviewTransport.js +9 -8
  8. package/dist/LocalPreviewTransport.js.map +1 -1
  9. package/dist/config.js +1 -1
  10. package/dist/config.js.map +1 -1
  11. package/dist/container.d.ts +11 -1
  12. package/dist/container.d.ts.map +1 -1
  13. package/dist/container.js +224 -107
  14. package/dist/container.js.map +1 -1
  15. package/dist/gateProviderFollowing.d.ts +39 -0
  16. package/dist/gateProviderFollowing.d.ts.map +1 -0
  17. package/dist/gateProviderFollowing.js +62 -0
  18. package/dist/gateProviderFollowing.js.map +1 -0
  19. package/dist/github.d.ts +44 -47
  20. package/dist/github.d.ts.map +1 -1
  21. package/dist/github.js +77 -95
  22. package/dist/github.js.map +1 -1
  23. package/dist/index.d.ts +1 -1
  24. package/dist/index.js +1 -1
  25. package/dist/installations.d.ts +21 -6
  26. package/dist/installations.d.ts.map +1 -1
  27. package/dist/installations.js +15 -5
  28. package/dist/installations.js.map +1 -1
  29. package/dist/mothership.d.ts.map +1 -1
  30. package/dist/mothership.js +1 -16
  31. package/dist/mothership.js.map +1 -1
  32. package/dist/server.d.ts.map +1 -1
  33. package/dist/server.js +17 -9
  34. package/dist/server.js.map +1 -1
  35. package/dist/sqlite/db.d.ts +6 -0
  36. package/dist/sqlite/db.d.ts.map +1 -1
  37. package/dist/sqlite/db.js +20 -3
  38. package/dist/sqlite/db.js.map +1 -1
  39. package/dist/sqlite/vcsCredentialStore.d.ts +29 -0
  40. package/dist/sqlite/vcsCredentialStore.d.ts.map +1 -0
  41. package/dist/sqlite/vcsCredentialStore.js +145 -0
  42. package/dist/sqlite/vcsCredentialStore.js.map +1 -0
  43. package/dist/vcsClientRouter.d.ts +14 -0
  44. package/dist/vcsClientRouter.d.ts.map +1 -0
  45. package/dist/vcsClientRouter.js +65 -0
  46. package/dist/vcsClientRouter.js.map +1 -0
  47. package/dist/vcsCredential.d.ts +40 -0
  48. package/dist/vcsCredential.d.ts.map +1 -0
  49. package/dist/vcsCredential.js +168 -0
  50. package/dist/vcsCredential.js.map +1 -0
  51. package/package.json +11 -11
@@ -0,0 +1,14 @@
1
+ import type { GitHubClient } from '@cat-factory/kernel';
2
+ /**
3
+ * A `GitHubClient` that forwards every call to `resolve()`'s answer at call time. When `resolve`
4
+ * answers undefined the deployment holds no credential, and every member is a function that
5
+ * REFUSES with {@link noVcsCredentialError} — the named, actionable cause — rather than resolving
6
+ * to `undefined` and surfacing as a type error deep in a gate probe.
7
+ *
8
+ * `has` reports the resolved client's own members, so the optional parts of the port
9
+ * (`listReposForToken`, `getRepoForToken`, `listSubIssues`) are advertised exactly as the backing
10
+ * client advertises them: the GitLab adapter omits them and callers that feature-test with `in`
11
+ * must keep seeing that.
12
+ */
13
+ export declare function credentialRoutedGitHubClient(resolve: () => GitHubClient | undefined): GitHubClient;
14
+ //# sourceMappingURL=vcsClientRouter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vcsClientRouter.d.ts","sourceRoot":"","sources":["../src/vcsClientRouter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAmCvD;;;;;;;;;;GAUG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,MAAM,YAAY,GAAG,SAAS,GACtC,YAAY,CAoBd"}
@@ -0,0 +1,65 @@
1
+ import { noVcsCredentialError } from './github.js';
2
+ // One `GitHubClient` whose backing client is chosen PER CALL from the deployment's current
3
+ // source-control credential.
4
+ //
5
+ // Local mode is single-provider, but which provider that is stops being a boot-time fact once a
6
+ // credential can be installed from the sign-in screen: a deployment that booted with nothing can
7
+ // become a GitHub one or a GitLab one, and the layers above hold the client object they were
8
+ // handed at build time. So the object has to be the stable one and the routing has to be inside
9
+ // it.
10
+ //
11
+ // It is a `Proxy` rather than a hand-written delegate on purpose. `GitHubClient` is a 40-method
12
+ // port that keeps growing, and a delegate that has to be edited for each addition fails SILENTLY
13
+ // when it isn't: the method resolves on neither client and a caller gets `undefined is not a
14
+ // function` on whichever path first uses it. Forwarding reflectively cannot drift.
15
+ // (`ProviderRoutingGitHubClient` in @cat-factory/server IS that hand-written delegate, and its
16
+ // routing key — an installation row's immutable stored provider — is a different question from
17
+ // this one, so it is not the seam to reuse here.)
18
+ /**
19
+ * Property names the no-client branch must answer `undefined` for rather than with a refusing
20
+ * function, because the LANGUAGE reads them as protocol rather than as a port method.
21
+ *
22
+ * `then` is the one that bites: an object with a callable `then` is a thenable, so `await client`
23
+ * or returning the client from an `async` function makes the promise machinery call it with
24
+ * `(resolve, reject)`. A function that ignores both and returns a rejected promise leaves the
25
+ * outer promise PENDING FOREVER and files an unhandled rejection, which is a strictly worse
26
+ * failure than the refusal it was trying to raise. `toJSON` is the same shape for a serializing
27
+ * logger, and a symbol key (`Symbol.toPrimitive`, `util.inspect.custom`) is never a port method.
28
+ */
29
+ function isProtocolKey(property) {
30
+ return typeof property === 'symbol' || property === 'then' || property === 'toJSON';
31
+ }
32
+ /**
33
+ * A `GitHubClient` that forwards every call to `resolve()`'s answer at call time. When `resolve`
34
+ * answers undefined the deployment holds no credential, and every member is a function that
35
+ * REFUSES with {@link noVcsCredentialError} — the named, actionable cause — rather than resolving
36
+ * to `undefined` and surfacing as a type error deep in a gate probe.
37
+ *
38
+ * `has` reports the resolved client's own members, so the optional parts of the port
39
+ * (`listReposForToken`, `getRepoForToken`, `listSubIssues`) are advertised exactly as the backing
40
+ * client advertises them: the GitLab adapter omits them and callers that feature-test with `in`
41
+ * must keep seeing that.
42
+ */
43
+ export function credentialRoutedGitHubClient(resolve) {
44
+ return new Proxy({}, {
45
+ get(_target, property) {
46
+ const client = resolve();
47
+ if (!client) {
48
+ if (isProtocolKey(property))
49
+ return undefined;
50
+ // A REJECTED promise, not a synchronous throw: every member of the port is an async
51
+ // method, so callers hold the failure with `await` / `.catch`. Throwing synchronously
52
+ // would escape a `.catch()` chain and surface as an unhandled exception in whatever
53
+ // happened to call it first.
54
+ return () => Promise.reject(noVcsCredentialError());
55
+ }
56
+ const member = Reflect.get(client, property, client);
57
+ return typeof member === 'function' ? member.bind(client) : member;
58
+ },
59
+ has(_target, property) {
60
+ const client = resolve();
61
+ return client ? Reflect.has(client, property) : false;
62
+ },
63
+ });
64
+ }
65
+ //# sourceMappingURL=vcsClientRouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vcsClientRouter.js","sourceRoot":"","sources":["../src/vcsClientRouter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAElD,2FAA2F;AAC3F,6BAA6B;AAC7B,EAAE;AACF,gGAAgG;AAChG,iGAAiG;AACjG,6FAA6F;AAC7F,gGAAgG;AAChG,MAAM;AACN,EAAE;AACF,gGAAgG;AAChG,iGAAiG;AACjG,6FAA6F;AAC7F,mFAAmF;AACnF,+FAA+F;AAC/F,+FAA+F;AAC/F,kDAAkD;AAElD;;;;;;;;;;GAUG;AACH,SAAS,aAAa,CAAC,QAAyB;IAC9C,OAAO,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,QAAQ,CAAA;AACrF,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,4BAA4B,CAC1C,OAAuC;IAEvC,OAAO,IAAI,KAAK,CAAC,EAAkB,EAAE;QACnC,GAAG,CAAC,OAAO,EAAE,QAAQ;YACnB,MAAM,MAAM,GAAG,OAAO,EAAE,CAAA;YACxB,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,IAAI,aAAa,CAAC,QAAQ,CAAC;oBAAE,OAAO,SAAS,CAAA;gBAC7C,oFAAoF;gBACpF,sFAAsF;gBACtF,oFAAoF;gBACpF,6BAA6B;gBAC7B,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAA;YACrD,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAgB,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;YAC9D,OAAO,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;QACpE,CAAC;QACD,GAAG,CAAC,OAAO,EAAE,QAAQ;YACnB,MAAM,MAAM,GAAG,OAAO,EAAE,CAAA;YACxB,OAAO,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAgB,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QACjE,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { LocalVcsSetup, VcsProvider } from '@cat-factory/kernel';
2
+ import { type LocalVcsCredentialStore } from './sqlite/vcsCredentialStore.js';
3
+ /** The source-control credential the local deployment operates with. */
4
+ export interface LocalVcsCredential {
5
+ provider: VcsProvider;
6
+ token: string;
7
+ /** Where it came from — the sign-in screen labels a stored credential differently from `.env`. */
8
+ origin: 'env' | 'stored';
9
+ }
10
+ export interface LocalVcsCredentialSource extends LocalVcsSetup {
11
+ /** The credential to operate with right now, or undefined when the deployment has none. */
12
+ current(): LocalVcsCredential | undefined;
13
+ /** Run `fn` after an install changed the resolved credential. */
14
+ onChange(fn: (credential: LocalVcsCredential | undefined) => void): void;
15
+ /** Release the underlying store handle (boot never opened one ⇒ a no-op). */
16
+ close(): void;
17
+ }
18
+ /**
19
+ * Build the deployment's credential source from `env` (+ the sealed local store). `storeFactory`
20
+ * is injectable so tests drive an in-memory store without touching the developer's home
21
+ * directory; by default the store lives at `LOCAL_VCS_CREDENTIAL_DB` or
22
+ * `~/.cat-factory/vcs-credential.sqlite`.
23
+ */
24
+ export declare function createLocalVcsCredentialSource(env: NodeJS.ProcessEnv, storeFactory?: () => LocalVcsCredentialStore): LocalVcsCredentialSource;
25
+ /**
26
+ * The host a GitLab deployment clones/pushes against, derived from `GITLAB_API_BASE`'s host (a
27
+ * self-managed instance) or the public `gitlab.com`. Single source of truth for BOTH the clone URL
28
+ * the server builds (`resolveRepoOrigin`) and the harness host allow-list, so they can never
29
+ * disagree. Returns undefined unless the credential in use is a GitLab one.
30
+ */
31
+ export declare function gitlabVcsHost(env: NodeJS.ProcessEnv, credential: LocalVcsCredential | undefined): string | undefined;
32
+ /**
33
+ * The comma-separated host allow-list the harness container is given (`GITHUB_ALLOWED_HOSTS`).
34
+ * The harness rejects any clone/push host not on this list (default github.com), so a GitLab
35
+ * deployment must add its host or every clone is refused. Combines any operator-set
36
+ * `GITHUB_ALLOWED_HOSTS` with the host the CURRENT credential clones from. Returns undefined when
37
+ * neither applies (GitHub mode with no extra hosts ⇒ the harness keeps its github.com default).
38
+ */
39
+ export declare function harnessAllowedHosts(env: NodeJS.ProcessEnv, credential: LocalVcsCredential | undefined): string | undefined;
40
+ //# sourceMappingURL=vcsCredential.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vcsCredential.d.ts","sourceRoot":"","sources":["../src/vcsCredential.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAGrE,OAAO,EACL,KAAK,uBAAuB,EAE7B,MAAM,gCAAgC,CAAA;AAoBvC,wEAAwE;AACxE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,WAAW,CAAA;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,kGAAkG;IAClG,MAAM,EAAE,KAAK,GAAG,QAAQ,CAAA;CACzB;AAcD,MAAM,WAAW,wBAAyB,SAAQ,aAAa;IAC7D,2FAA2F;IAC3F,OAAO,IAAI,kBAAkB,GAAG,SAAS,CAAA;IACzC,iEAAiE;IACjE,QAAQ,CAAC,EAAE,EAAE,CAAC,UAAU,EAAE,kBAAkB,GAAG,SAAS,KAAK,IAAI,GAAG,IAAI,CAAA;IACxE,6EAA6E;IAC7E,KAAK,IAAI,IAAI,CAAA;CACd;AAyDD;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,YAAY,CAAC,EAAE,MAAM,uBAAuB,GAC3C,wBAAwB,CAyE1B;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,UAAU,EAAE,kBAAkB,GAAG,SAAS,GACzC,MAAM,GAAG,SAAS,CAWpB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,UAAU,EAAE,kBAAkB,GAAG,SAAS,GACzC,MAAM,GAAG,SAAS,CASpB"}
@@ -0,0 +1,168 @@
1
+ import { ConflictError, UnavailableError } from '@cat-factory/kernel';
2
+ import { localDbPath } from './sqlite/db.js';
3
+ import { createLocalVcsCredentialStore, } from './sqlite/vcsCredentialStore.js';
4
+ /** Every provider a local deployment can be given a token for. */
5
+ const INSTALLABLE_PROVIDERS = ['github', 'gitlab'];
6
+ /** The env variable holding each provider's PAT. */
7
+ const PAT_ENV_VAR = {
8
+ github: 'GITHUB_PAT',
9
+ gitlab: 'GITLAB_PAT',
10
+ };
11
+ /** The env-configured credential, preferring GitHub — local mode operates on exactly one. */
12
+ function envCredential(env) {
13
+ for (const provider of INSTALLABLE_PROVIDERS) {
14
+ const token = env[PAT_ENV_VAR[provider]]?.trim();
15
+ if (token)
16
+ return { provider, token, origin: 'env' };
17
+ }
18
+ return undefined;
19
+ }
20
+ /**
21
+ * Open the store lazily and remember the failure, so a broken/unwritable sqlite file costs one
22
+ * attempt rather than one per read, and so a deployment that never installs anything never
23
+ * creates the file at all.
24
+ */
25
+ class LazyStore {
26
+ open;
27
+ store;
28
+ /** Set once the store may not be opened again: an open that failed, or a close. */
29
+ sealed = false;
30
+ constructor(open) {
31
+ this.open = open;
32
+ }
33
+ get() {
34
+ if (this.store || this.sealed)
35
+ return this.store;
36
+ try {
37
+ this.store = this.open();
38
+ }
39
+ catch {
40
+ // silent-catch-ok: an unopenable local store IS "the deployment has no stored credential",
41
+ // which the caller already renders (the sign-in screen offers to install one). The `.env`
42
+ // path is unaffected, so failing the boot over it would be strictly worse.
43
+ this.sealed = true;
44
+ }
45
+ return this.store;
46
+ }
47
+ /**
48
+ * Release the handle, permanently. `close()` is a shutdown (or a throwaway boot-time read), so a
49
+ * later `get()` must answer "no stored credential" rather than silently re-opening the file on a
50
+ * source its owner has already torn down.
51
+ */
52
+ close() {
53
+ this.store?.close();
54
+ this.store = undefined;
55
+ this.sealed = true;
56
+ }
57
+ }
58
+ /**
59
+ * Build the deployment's credential source from `env` (+ the sealed local store). `storeFactory`
60
+ * is injectable so tests drive an in-memory store without touching the developer's home
61
+ * directory; by default the store lives at `LOCAL_VCS_CREDENTIAL_DB` or
62
+ * `~/.cat-factory/vcs-credential.sqlite`.
63
+ */
64
+ export function createLocalVcsCredentialSource(env, storeFactory) {
65
+ const masterKey = env.ENCRYPTION_KEY?.trim();
66
+ const lazy = storeFactory || masterKey
67
+ ? new LazyStore(storeFactory ??
68
+ (() => createLocalVcsCredentialStore(localDbPath(env.LOCAL_VCS_CREDENTIAL_DB, 'vcs-credential.sqlite'), masterKey)))
69
+ : undefined;
70
+ const listeners = [];
71
+ // The resolved credential is cached because it is read on hot paths (every dispatch, every
72
+ // gate probe, every clone-URL build) and a sqlite read + AES open per call would be waste. It
73
+ // is invalidated on install — the only thing that can change it — so the cache can never be
74
+ // the reason a freshly installed token is not seen.
75
+ let cached = null;
76
+ const resolve = () => {
77
+ if (cached !== null)
78
+ return cached;
79
+ const fromEnv = envCredential(env);
80
+ if (fromEnv) {
81
+ cached = fromEnv;
82
+ return cached;
83
+ }
84
+ const stored = lazy?.get()?.read();
85
+ cached = stored
86
+ ? { provider: stored.provider, token: stored.token, origin: 'stored' }
87
+ : undefined;
88
+ return cached;
89
+ };
90
+ const blockedReason = () => {
91
+ if (envCredential(env))
92
+ return 'env_configured';
93
+ if (!lazy)
94
+ return 'no_encryption_key';
95
+ return undefined;
96
+ };
97
+ return {
98
+ current: resolve,
99
+ // Open while `.env` names no PAT — INCLUDING when a credential is already stored. The stored
100
+ // one can expire or be revoked, and the sign-in screen is the only surface a locked-out
101
+ // developer can reach, so refusing to replace it would recreate the dead end this exists to
102
+ // remove. It grants nothing extra: anyone who can reach that screen can already sign in with
103
+ // the stored token in one click.
104
+ installable: () => (blockedReason() ? [] : [...INSTALLABLE_PROVIDERS]),
105
+ // Both refusals are unreachable through the sign-in screen, which offers the box only for a
106
+ // provider `installable()` names. They are the port's own guard for any other caller, and
107
+ // they refuse by STATUS CLASS with no `details.reason`: the generic 409 / 503 copy is exactly
108
+ // right for both (a credential already owned elsewhere; a capability the deployment has not
109
+ // configured), so neither earns a place in the closed reason vocabularies the SPA translates.
110
+ install: async (provider, token, options) => {
111
+ if (blockedReason() === 'env_configured') {
112
+ throw new ConflictError(`${PAT_ENV_VAR[provider]} is set in this deployment's environment, so that token is the one in use. Change it there.`);
113
+ }
114
+ const store = lazy?.get();
115
+ if (!store) {
116
+ throw new UnavailableError('This deployment cannot store a source-control token (no ENCRYPTION_KEY is configured).');
117
+ }
118
+ store.write({ provider, token, login: options?.login ?? null });
119
+ cached = null;
120
+ const next = resolve();
121
+ for (const listener of listeners)
122
+ listener(next);
123
+ },
124
+ onChange: (fn) => listeners.push(fn),
125
+ close: () => lazy?.close(),
126
+ };
127
+ }
128
+ /**
129
+ * The host a GitLab deployment clones/pushes against, derived from `GITLAB_API_BASE`'s host (a
130
+ * self-managed instance) or the public `gitlab.com`. Single source of truth for BOTH the clone URL
131
+ * the server builds (`resolveRepoOrigin`) and the harness host allow-list, so they can never
132
+ * disagree. Returns undefined unless the credential in use is a GitLab one.
133
+ */
134
+ export function gitlabVcsHost(env, credential) {
135
+ if (credential?.provider !== 'gitlab')
136
+ return undefined;
137
+ const apiBase = env.GITLAB_API_BASE?.trim();
138
+ if (!apiBase)
139
+ return 'gitlab.com';
140
+ try {
141
+ return new URL(apiBase).host;
142
+ }
143
+ catch {
144
+ // silent-catch-ok: an unparseable API base is already reported where it is CONFIGURED; here
145
+ // the honest fallback is the public host, which is what an unset value means too.
146
+ return 'gitlab.com';
147
+ }
148
+ }
149
+ /**
150
+ * The comma-separated host allow-list the harness container is given (`GITHUB_ALLOWED_HOSTS`).
151
+ * The harness rejects any clone/push host not on this list (default github.com), so a GitLab
152
+ * deployment must add its host or every clone is refused. Combines any operator-set
153
+ * `GITHUB_ALLOWED_HOSTS` with the host the CURRENT credential clones from. Returns undefined when
154
+ * neither applies (GitHub mode with no extra hosts ⇒ the harness keeps its github.com default).
155
+ */
156
+ export function harnessAllowedHosts(env, credential) {
157
+ const hosts = new Set();
158
+ for (const h of (env.GITHUB_ALLOWED_HOSTS ?? '').split(',')) {
159
+ const t = h.trim();
160
+ if (t)
161
+ hosts.add(t);
162
+ }
163
+ const gitlab = gitlabVcsHost(env, credential);
164
+ if (gitlab)
165
+ hosts.add(gitlab);
166
+ return hosts.size > 0 ? [...hosts].join(',') : undefined;
167
+ }
168
+ //# sourceMappingURL=vcsCredential.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vcsCredential.js","sourceRoot":"","sources":["../src/vcsCredential.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/local-server",
3
- "version": "0.110.0",
3
+ "version": "0.111.0",
4
4
  "description": "Local-mode runtime facade for the Agent Architecture Board: the @cat-factory/node-server stack with agent jobs run as local Docker/Podman containers and GitHub accessed via a personal access token — a developer can run the whole product on their own machine.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -27,23 +27,23 @@
27
27
  "@hono/node-server": "^2.1.0",
28
28
  "drizzle-orm": "1.0.0-rc.4",
29
29
  "ws": "^8.21.2",
30
- "@cat-factory/agents": "0.113.0",
31
- "@cat-factory/contracts": "0.246.0",
32
30
  "@cat-factory/executor-harness": "1.92.2",
33
- "@cat-factory/gitlab": "0.15.42",
34
- "@cat-factory/integrations": "0.131.0",
35
- "@cat-factory/kernel": "0.244.0",
36
- "@cat-factory/node-server": "0.176.0",
37
- "@cat-factory/orchestration": "0.213.0",
38
- "@cat-factory/server": "0.223.0"
31
+ "@cat-factory/contracts": "0.248.0",
32
+ "@cat-factory/gitlab": "0.16.0",
33
+ "@cat-factory/integrations": "0.132.0",
34
+ "@cat-factory/agents": "0.114.1",
35
+ "@cat-factory/kernel": "0.246.0",
36
+ "@cat-factory/orchestration": "0.215.0",
37
+ "@cat-factory/node-server": "0.177.1",
38
+ "@cat-factory/server": "0.225.0"
39
39
  },
40
40
  "devDependencies": {
41
41
  "@types/node": "^26.1.2",
42
42
  "@types/ws": "^8.18.1",
43
43
  "typescript": "7.0.2",
44
44
  "vitest": "^4.1.10",
45
- "@cat-factory/conformance": "0.31.0",
46
- "@cat-factory/gates": "0.9.6"
45
+ "@cat-factory/conformance": "0.31.2",
46
+ "@cat-factory/gates": "0.9.8"
47
47
  },
48
48
  "scripts": {
49
49
  "build": "tsc -b tsconfig.build.json",