@cat-factory/server 0.247.0 → 0.248.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 (37) hide show
  1. package/dist/app.js +1 -1
  2. package/dist/app.js.map +1 -1
  3. package/dist/modules/notificationWebhook/NotificationWebhookController.d.ts +1 -1
  4. package/dist/modules/notificationWebhook/NotificationWebhookController.js +1 -1
  5. package/dist/modules/publicApi/PublicApiController.d.ts.map +1 -1
  6. package/dist/modules/publicApi/PublicApiController.js +38 -9
  7. package/dist/modules/publicApi/PublicApiController.js.map +1 -1
  8. package/dist/modules/publicApi/PublicApiKeyController.d.ts +1 -0
  9. package/dist/modules/publicApi/PublicApiKeyController.d.ts.map +1 -1
  10. package/dist/modules/publicApi/PublicApiKeyController.js +2 -16
  11. package/dist/modules/publicApi/PublicApiKeyController.js.map +1 -1
  12. package/dist/modules/publicApi/PublicDecisionController.js +1 -1
  13. package/dist/modules/publicApi/PublicDecisionController.js.map +1 -1
  14. package/dist/modules/publicApi/PublicDiscoveryController.js +2 -2
  15. package/dist/modules/publicApi/PublicDiscoveryController.js.map +1 -1
  16. package/dist/modules/publicApi/PublicKeyController.d.ts.map +1 -1
  17. package/dist/modules/publicApi/PublicKeyController.js +7 -16
  18. package/dist/modules/publicApi/PublicKeyController.js.map +1 -1
  19. package/dist/modules/publicApi/keyProjection.d.ts +17 -0
  20. package/dist/modules/publicApi/keyProjection.d.ts.map +1 -0
  21. package/dist/modules/publicApi/keyProjection.js +29 -0
  22. package/dist/modules/publicApi/keyProjection.js.map +1 -0
  23. package/dist/modules/publicApi/openapiDocument.generated.d.ts +1 -1
  24. package/dist/modules/publicApi/openapiDocument.generated.d.ts.map +1 -1
  25. package/dist/modules/publicApi/openapiDocument.generated.js +1 -1
  26. package/dist/modules/publicApi/openapiDocument.generated.js.map +1 -1
  27. package/dist/modules/publicApi/publicApiAdmission.d.ts +1 -1
  28. package/dist/modules/publicApi/publicApiAdmission.js +2 -2
  29. package/dist/modules/publicApi/publicApiAdmission.js.map +1 -1
  30. package/dist/modules/publicApi/runIdentityVisibility.d.ts +48 -0
  31. package/dist/modules/publicApi/runIdentityVisibility.d.ts.map +1 -0
  32. package/dist/modules/publicApi/runIdentityVisibility.js +53 -0
  33. package/dist/modules/publicApi/runIdentityVisibility.js.map +1 -0
  34. package/dist/persistence/mappers.d.ts.map +1 -1
  35. package/dist/persistence/mappers.js +12 -0
  36. package/dist/persistence/mappers.js.map +1 -1
  37. package/package.json +8 -8
@@ -2,6 +2,7 @@ import { createPublicKeyContract, listPublicKeysContract, revokePublicKeyContrac
2
2
  import { buildHonoRoute } from '@toad-contracts/hono';
3
3
  import { Hono } from 'hono';
4
4
  import { requireCapability } from '../../http/guards.js';
5
+ import { publicApiKeyToWire } from './keyProjection.js';
5
6
  import { authorize, refuse } from './publicApiAuth.js';
6
7
  // HEADLESS key provisioning (`GET|POST|DELETE /api/v1/keys`): the external counterpart of the
7
8
  // session-authed `/workspaces/:ws/public-api-keys` routes, delegating to the SAME
@@ -29,21 +30,6 @@ import { authorize, refuse } from './publicApiAuth.js';
29
30
  // What this surface still cannot do, deliberately: mint an `admin` key (that needs a human
30
31
  // session and the `secrets.manage` workspace permission), or reach another workspace: every
31
32
  // route is bound to the calling key's own.
32
- /** Project a stored record onto the secret-free wire type. */
33
- function publicApiKeyToWire(record) {
34
- return {
35
- id: record.id,
36
- accountId: record.accountId,
37
- workspaceId: record.workspaceId,
38
- label: record.label,
39
- scope: record.scope,
40
- createdByUserId: record.createdByUserId,
41
- createdByKeyId: record.createdByKeyId,
42
- createdAt: record.createdAt,
43
- lastUsedAt: record.lastUsedAt,
44
- revokedAt: record.revokedAt,
45
- };
46
- }
47
33
  /**
48
34
  * The key store. `authorize` has already proven it is wired (it resolves the caller's key
49
35
  * through it and answers 503 when it is absent), so this is the total accessor that carries that
@@ -73,7 +59,7 @@ export function publicKeyController() {
73
59
  if ('fail' in gate)
74
60
  return refuse(c, gate.fail);
75
61
  const keys = keyStore(c);
76
- const { label, scope } = c.req.valid('json');
62
+ const { label, scope, externalIdentity } = c.req.valid('json');
77
63
  // The account and workspace come from the KEY, never from the body: this surface mints into
78
64
  // the caller's own workspace and has no vocabulary for another one.
79
65
  const { record, secret } = await keys.issue({
@@ -84,6 +70,11 @@ export function publicKeyController() {
84
70
  // recorded, and that is also what the revocation cascade follows.
85
71
  createdByUserId: null,
86
72
  createdByKeyId: gate.auth.keyId,
73
+ // Whoever the caller says this key acts for, stored verbatim and never resolved. It is
74
+ // NOT inherited from the provisioning key: a provisioner mints for many identities, so
75
+ // defaulting to its own would attribute every minted key (and every run they start) to
76
+ // the integration itself, which is exactly the answer this field exists to improve on.
77
+ externalIdentity: externalIdentity ?? null,
87
78
  }, label, scope ?? DEFAULT_MINTED_SCOPE);
88
79
  return c.json({ key: publicApiKeyToWire(record), secret }, 201);
89
80
  });
@@ -1 +1 @@
1
- {"version":3,"file":"PublicKeyController.js","sourceRoot":"","sources":["../../../src/modules/publicApi/PublicKeyController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PublicKeyController.js","sourceRoot":"","sources":["../../../src/modules/publicApi/PublicKeyController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { PublicApiKey } from '@cat-factory/contracts';
2
+ import type { PublicApiKeyRecord } from '@cat-factory/kernel';
3
+ /**
4
+ * Project a stored public-API key onto the secret-free wire resource.
5
+ *
6
+ * ONE projection for both surfaces that expose a key: the session-authed management routes
7
+ * (`PublicApiKeyController`) and the headless provisioning routes (`PublicKeyController`). They
8
+ * had a copy each, which is how a field comes to be echoed on one and silently absent on the
9
+ * other: `externalIdentity` is set by the headless mint and read on both, so a caller listing its
10
+ * keys in the app would have seen every one of them claim to act for nobody.
11
+ *
12
+ * `secretHash` is the field this exists to leave behind. It is the only member of the record the
13
+ * wire type has no place for, so an explicit projection (never a spread of the row) is what keeps
14
+ * a future column from arriving on the wire by default.
15
+ */
16
+ export declare function publicApiKeyToWire(record: PublicApiKeyRecord): PublicApiKey;
17
+ //# sourceMappingURL=keyProjection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyProjection.d.ts","sourceRoot":"","sources":["../../../src/modules/publicApi/keyProjection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAE7D;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,CAc3E"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Project a stored public-API key onto the secret-free wire resource.
3
+ *
4
+ * ONE projection for both surfaces that expose a key: the session-authed management routes
5
+ * (`PublicApiKeyController`) and the headless provisioning routes (`PublicKeyController`). They
6
+ * had a copy each, which is how a field comes to be echoed on one and silently absent on the
7
+ * other: `externalIdentity` is set by the headless mint and read on both, so a caller listing its
8
+ * keys in the app would have seen every one of them claim to act for nobody.
9
+ *
10
+ * `secretHash` is the field this exists to leave behind. It is the only member of the record the
11
+ * wire type has no place for, so an explicit projection (never a spread of the row) is what keeps
12
+ * a future column from arriving on the wire by default.
13
+ */
14
+ export function publicApiKeyToWire(record) {
15
+ return {
16
+ id: record.id,
17
+ accountId: record.accountId,
18
+ workspaceId: record.workspaceId,
19
+ label: record.label,
20
+ scope: record.scope,
21
+ createdByUserId: record.createdByUserId,
22
+ createdByKeyId: record.createdByKeyId,
23
+ externalIdentity: record.externalIdentity,
24
+ createdAt: record.createdAt,
25
+ lastUsedAt: record.lastUsedAt,
26
+ revokedAt: record.revokedAt,
27
+ };
28
+ }
29
+ //# sourceMappingURL=keyProjection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyProjection.js","sourceRoot":"","sources":["../../../src/modules/publicApi/keyProjection.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAA0B;IAC3D,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAA;AACH,CAAC"}