aimeat 1.2.6 → 1.3.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 (128) hide show
  1. package/dist/.env.example +4 -0
  2. package/dist/locales/en.json +74 -2
  3. package/dist/locales/fi.json +74 -2
  4. package/dist/public/css/views/capabilities.css +211 -0
  5. package/dist/public/llms-template.txt +152 -89
  6. package/dist/public/spa.html +1 -0
  7. package/dist/public/views/admin/capabilities-tab.js +114 -0
  8. package/dist/public/views/admin.js +2 -0
  9. package/dist/public/views/aimeat-os.js +194 -34
  10. package/dist/public/views/profile/capabilities-tab.js +252 -0
  11. package/dist/public/views/profile/extensions-tab.js +404 -50
  12. package/dist/public/views/profile/landing-page.js +2 -0
  13. package/dist/public/views/profile.js +2 -0
  14. package/dist/src/config.d.ts +11 -0
  15. package/dist/src/config.d.ts.map +1 -1
  16. package/dist/src/config.js +11 -0
  17. package/dist/src/config.js.map +1 -1
  18. package/dist/src/mcp/apps.d.ts +18 -0
  19. package/dist/src/mcp/apps.d.ts.map +1 -0
  20. package/dist/src/mcp/apps.js +241 -0
  21. package/dist/src/mcp/apps.js.map +1 -0
  22. package/dist/src/mcp/capabilities.d.ts +12 -0
  23. package/dist/src/mcp/capabilities.d.ts.map +1 -0
  24. package/dist/src/mcp/capabilities.js +187 -0
  25. package/dist/src/mcp/capabilities.js.map +1 -0
  26. package/dist/src/mcp/cortex.d.ts +17 -0
  27. package/dist/src/mcp/cortex.d.ts.map +1 -0
  28. package/dist/src/mcp/cortex.js +237 -0
  29. package/dist/src/mcp/cortex.js.map +1 -0
  30. package/dist/src/mcp/extensions.d.ts +4 -3
  31. package/dist/src/mcp/extensions.d.ts.map +1 -1
  32. package/dist/src/mcp/extensions.js +233 -3
  33. package/dist/src/mcp/extensions.js.map +1 -1
  34. package/dist/src/mcp/index.d.ts.map +1 -1
  35. package/dist/src/mcp/index.js +6 -0
  36. package/dist/src/mcp/index.js.map +1 -1
  37. package/dist/src/routes/admin-capabilities.d.ts +11 -0
  38. package/dist/src/routes/admin-capabilities.d.ts.map +1 -0
  39. package/dist/src/routes/admin-capabilities.js +54 -0
  40. package/dist/src/routes/admin-capabilities.js.map +1 -0
  41. package/dist/src/routes/capabilities.d.ts +11 -0
  42. package/dist/src/routes/capabilities.d.ts.map +1 -0
  43. package/dist/src/routes/capabilities.js +289 -0
  44. package/dist/src/routes/capabilities.js.map +1 -0
  45. package/dist/src/routes/cortex.d.ts.map +1 -1
  46. package/dist/src/routes/cortex.js +2 -0
  47. package/dist/src/routes/cortex.js.map +1 -1
  48. package/dist/src/routes/extensions.d.ts.map +1 -1
  49. package/dist/src/routes/extensions.js +9 -0
  50. package/dist/src/routes/extensions.js.map +1 -1
  51. package/dist/src/routes/lib-capabilities.d.ts +9 -0
  52. package/dist/src/routes/lib-capabilities.d.ts.map +1 -0
  53. package/dist/src/routes/lib-capabilities.js +190 -0
  54. package/dist/src/routes/lib-capabilities.js.map +1 -0
  55. package/dist/src/routes/libs.d.ts.map +1 -1
  56. package/dist/src/routes/libs.js +13 -0
  57. package/dist/src/routes/libs.js.map +1 -1
  58. package/dist/src/routes/verification.d.ts +10 -1
  59. package/dist/src/routes/verification.d.ts.map +1 -1
  60. package/dist/src/routes/verification.js +174 -24
  61. package/dist/src/routes/verification.js.map +1 -1
  62. package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
  63. package/dist/src/server-bootstrap/routes-loader.js +35 -2
  64. package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
  65. package/dist/src/services/capability-aggregator.d.ts +8 -0
  66. package/dist/src/services/capability-aggregator.d.ts.map +1 -0
  67. package/dist/src/services/capability-aggregator.js +239 -0
  68. package/dist/src/services/capability-aggregator.js.map +1 -0
  69. package/dist/src/services/capability-invoke.d.ts +20 -0
  70. package/dist/src/services/capability-invoke.d.ts.map +1 -0
  71. package/dist/src/services/capability-invoke.js +95 -0
  72. package/dist/src/services/capability-invoke.js.map +1 -0
  73. package/dist/src/services/config-schema.d.ts.map +1 -1
  74. package/dist/src/services/config-schema.js +4 -0
  75. package/dist/src/services/config-schema.js.map +1 -1
  76. package/dist/src/services/core-jobs.d.ts.map +1 -1
  77. package/dist/src/services/core-jobs.js +16 -0
  78. package/dist/src/services/core-jobs.js.map +1 -1
  79. package/dist/src/services/did-document.d.ts +25 -0
  80. package/dist/src/services/did-document.d.ts.map +1 -0
  81. package/dist/src/services/did-document.js +31 -0
  82. package/dist/src/services/did-document.js.map +1 -0
  83. package/dist/src/services/eudiw.d.ts +11 -1
  84. package/dist/src/services/eudiw.d.ts.map +1 -1
  85. package/dist/src/services/eudiw.js +43 -48
  86. package/dist/src/services/eudiw.js.map +1 -1
  87. package/dist/src/services/extension-runtime.d.ts.map +1 -1
  88. package/dist/src/services/extension-runtime.js +8 -5
  89. package/dist/src/services/extension-runtime.js.map +1 -1
  90. package/dist/src/services/job-seeding.d.ts.map +1 -1
  91. package/dist/src/services/job-seeding.js +4 -0
  92. package/dist/src/services/job-seeding.js.map +1 -1
  93. package/dist/src/services/oidc-client.d.ts +32 -0
  94. package/dist/src/services/oidc-client.d.ts.map +1 -0
  95. package/dist/src/services/oidc-client.js +67 -0
  96. package/dist/src/services/oidc-client.js.map +1 -0
  97. package/dist/src/services/sd-jwt.d.ts +21 -0
  98. package/dist/src/services/sd-jwt.d.ts.map +1 -0
  99. package/dist/src/services/sd-jwt.js +87 -0
  100. package/dist/src/services/sd-jwt.js.map +1 -0
  101. package/dist/src/services/vc-issuer.d.ts +20 -1
  102. package/dist/src/services/vc-issuer.d.ts.map +1 -1
  103. package/dist/src/services/vc-issuer.js +75 -15
  104. package/dist/src/services/vc-issuer.js.map +1 -1
  105. package/dist/src/storage/interface.d.ts +118 -1
  106. package/dist/src/storage/interface.d.ts.map +1 -1
  107. package/dist/src/storage/providers/mongodb/index.d.ts +37 -1
  108. package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
  109. package/dist/src/storage/providers/mongodb/index.js +282 -0
  110. package/dist/src/storage/providers/mongodb/index.js.map +1 -1
  111. package/dist/src/storage/providers/sqlite/index.d.ts +37 -1
  112. package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
  113. package/dist/src/storage/providers/sqlite/index.js +241 -0
  114. package/dist/src/storage/providers/sqlite/index.js.map +1 -1
  115. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  116. package/dist/src/storage/providers/sqlite/schema.js +77 -0
  117. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  118. package/dist/src/storage/repositories/capability.repository.d.ts +35 -0
  119. package/dist/src/storage/repositories/capability.repository.d.ts.map +1 -0
  120. package/dist/src/storage/repositories/capability.repository.js +2 -0
  121. package/dist/src/storage/repositories/capability.repository.js.map +1 -0
  122. package/dist/src/storage/repositories/index.d.ts +1 -0
  123. package/dist/src/storage/repositories/index.d.ts.map +1 -1
  124. package/dist/src/storage/repositories/node.repository.d.ts +5 -1
  125. package/dist/src/storage/repositories/node.repository.d.ts.map +1 -1
  126. package/dist/static/app-catalog.html +156 -29
  127. package/package.json +6 -1
  128. package/prisma/schema.prisma +86 -0
@@ -17,6 +17,10 @@ export async function seedCoreScheduledJobs(config, storage) {
17
17
  if (config.personalNodesEnabled) {
18
18
  jobs.push({ id: 'core:mailbox-cleanup', name: 'Mailbox Cleanup', coreHandler: 'mailbox-cleanup', cron: '*/10 * * * *' });
19
19
  }
20
+ jobs.push({ id: 'core:capability-aggregation', name: 'Capability Aggregation', coreHandler: 'capability-aggregation', cron: '*/5 * * * *' });
21
+ if (config.eudiwEnabled || config.ftnEnabled) {
22
+ jobs.push({ id: 'core:nonce-cleanup', name: 'Verification Nonce Cleanup', coreHandler: 'nonce-cleanup', cron: '*/5 * * * *' });
23
+ }
20
24
  const now = new Date().toISOString();
21
25
  for (const def of jobs) {
22
26
  const existing = await storage.getScheduledJob(def.id);
@@ -1 +1 @@
1
- {"version":3,"file":"job-seeding.js","sourceRoot":"","sources":["../../../src/services/job-seeding.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAS5C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAAoB,EAAE,OAAgB;IAChF,MAAM,IAAI,GAAiB;QACzB,EAAE,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,iBAAiB,EAAE,IAAI,EAAE,WAAW,EAAE;QAC1G,EAAE,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE;QACxG,EAAE,EAAE,EAAE,yBAAyB,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,oBAAoB,EAAE,IAAI,EAAE,aAAa,EAAE;QACrH,EAAE,EAAE,EAAE,6BAA6B,EAAE,IAAI,EAAE,wBAAwB,EAAE,WAAW,EAAE,wBAAwB,EAAE,IAAI,EAAE,cAAc,EAAE;QAClI,EAAE,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,yBAAyB,EAAE,WAAW,EAAE,iBAAiB,EAAE,IAAI,EAAE,WAAW,EAAE;QAClH,EAAE,EAAE,EAAE,0BAA0B,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,qBAAqB,EAAE,IAAI,EAAE,WAAW,EAAE;KACvH,CAAC;IAEF,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,qBAAqB,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;IACxH,CAAC;IAED,IAAI,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,iBAAiB,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;IAC3H,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,OAAO,CAAC,kBAAkB,CAAC;gBAC/B,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE;gBACpC,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,GAAG;aACf,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,8BAA8B,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"job-seeding.js","sourceRoot":"","sources":["../../../src/services/job-seeding.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAS5C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAAoB,EAAE,OAAgB;IAChF,MAAM,IAAI,GAAiB;QACzB,EAAE,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,iBAAiB,EAAE,IAAI,EAAE,WAAW,EAAE;QAC1G,EAAE,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE;QACxG,EAAE,EAAE,EAAE,yBAAyB,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,oBAAoB,EAAE,IAAI,EAAE,aAAa,EAAE;QACrH,EAAE,EAAE,EAAE,6BAA6B,EAAE,IAAI,EAAE,wBAAwB,EAAE,WAAW,EAAE,wBAAwB,EAAE,IAAI,EAAE,cAAc,EAAE;QAClI,EAAE,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,yBAAyB,EAAE,WAAW,EAAE,iBAAiB,EAAE,IAAI,EAAE,WAAW,EAAE;QAClH,EAAE,EAAE,EAAE,0BAA0B,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,qBAAqB,EAAE,IAAI,EAAE,WAAW,EAAE;KACvH,CAAC;IAEF,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,qBAAqB,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;IACxH,CAAC;IAED,IAAI,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,iBAAiB,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;IAC3H,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,6BAA6B,EAAE,IAAI,EAAE,wBAAwB,EAAE,WAAW,EAAE,wBAAwB,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;IAE7I,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAC7C,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,4BAA4B,EAAE,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;IACjI,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,OAAO,CAAC,kBAAkB,CAAC;gBAC/B,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE;gBACpC,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,GAAG;aACf,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,8BAA8B,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @file oidc-client.ts
3
+ * @description Generic OIDC Relying Party wrapper built on openid-client v6.
4
+ * Broker-agnostic: works with any standard OIDC provider (FTN, BankID, MitID).
5
+ * @version-history
6
+ * v1.0.0 — 2026-05-02 — Initial implementation
7
+ */
8
+ export interface OidcClientConfig {
9
+ issuerUrl: string;
10
+ clientId: string;
11
+ clientSecret: string;
12
+ redirectUri: string;
13
+ scopes: string[];
14
+ }
15
+ export interface OidcAuthRequest {
16
+ authorizationUrl: string;
17
+ state: string;
18
+ nonce: string;
19
+ }
20
+ export interface OidcTokenResult {
21
+ valid: boolean;
22
+ claims?: Record<string, unknown>;
23
+ error?: string;
24
+ }
25
+ export interface OidcClient {
26
+ readonly initialized: boolean;
27
+ initialize(): Promise<void>;
28
+ createAuthRequest(): OidcAuthRequest;
29
+ exchangeCode(code: string, state: string, expectedNonce: string): Promise<OidcTokenResult>;
30
+ }
31
+ export declare function createOidcClient(clientConfig: OidcClientConfig): OidcClient;
32
+ //# sourceMappingURL=oidc-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oidc-client.d.ts","sourceRoot":"","sources":["../../../src/services/oidc-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,iBAAiB,IAAI,eAAe,CAAC;IACrC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAC5F;AAED,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,gBAAgB,GAAG,UAAU,CAsE3E"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @file oidc-client.ts
3
+ * @description Generic OIDC Relying Party wrapper built on openid-client v6.
4
+ * Broker-agnostic: works with any standard OIDC provider (FTN, BankID, MitID).
5
+ * @version-history
6
+ * v1.0.0 — 2026-05-02 — Initial implementation
7
+ */
8
+ import * as oidc from 'openid-client';
9
+ import { randomUUID } from 'node:crypto';
10
+ import { logger } from '../utils/logger.js';
11
+ export function createOidcClient(clientConfig) {
12
+ let serverConfig = null;
13
+ let isInitialized = false;
14
+ return {
15
+ get initialized() { return isInitialized; },
16
+ async initialize() {
17
+ try {
18
+ serverConfig = await oidc.discovery(new URL(clientConfig.issuerUrl), clientConfig.clientId, clientConfig.clientSecret);
19
+ isInitialized = true;
20
+ logger.info(`OIDC client initialized for issuer: ${clientConfig.issuerUrl}`);
21
+ }
22
+ catch (err) {
23
+ logger.error('OIDC discovery failed', { issuer: clientConfig.issuerUrl, error: String(err) });
24
+ throw err;
25
+ }
26
+ },
27
+ createAuthRequest() {
28
+ if (!serverConfig)
29
+ throw new Error('OIDC client not initialized');
30
+ const state = randomUUID();
31
+ const nonce = randomUUID();
32
+ const params = new URLSearchParams({
33
+ response_type: 'code',
34
+ client_id: clientConfig.clientId,
35
+ redirect_uri: clientConfig.redirectUri,
36
+ scope: clientConfig.scopes.join(' '),
37
+ state,
38
+ nonce,
39
+ });
40
+ const authEndpoint = serverConfig.serverMetadata().authorization_endpoint;
41
+ if (!authEndpoint)
42
+ throw new Error('Authorization endpoint not found in OIDC discovery');
43
+ const authorizationUrl = `${authEndpoint}?${params.toString()}`;
44
+ return { authorizationUrl, state, nonce };
45
+ },
46
+ async exchangeCode(code, _state, expectedNonce) {
47
+ if (!serverConfig)
48
+ throw new Error('OIDC client not initialized');
49
+ try {
50
+ const tokens = await oidc.authorizationCodeGrant(serverConfig, new URL(`${clientConfig.redirectUri}?code=${encodeURIComponent(code)}`), { expectedNonce });
51
+ const claims = tokens.claims();
52
+ if (!claims) {
53
+ return { valid: false, error: 'No claims in token response' };
54
+ }
55
+ return {
56
+ valid: true,
57
+ claims: claims,
58
+ };
59
+ }
60
+ catch (err) {
61
+ logger.error('OIDC code exchange failed', { error: String(err) });
62
+ return { valid: false, error: `Token exchange failed: ${String(err)}` };
63
+ }
64
+ },
65
+ };
66
+ }
67
+ //# sourceMappingURL=oidc-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oidc-client.js","sourceRoot":"","sources":["../../../src/services/oidc-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AA6B5C,MAAM,UAAU,gBAAgB,CAAC,YAA8B;IAC7D,IAAI,YAAY,GAA8B,IAAI,CAAC;IACnD,IAAI,aAAa,GAAG,KAAK,CAAC;IAE1B,OAAO;QACL,IAAI,WAAW,KAAK,OAAO,aAAa,CAAC,CAAC,CAAC;QAE3C,KAAK,CAAC,UAAU;YACd,IAAI,CAAC;gBACH,YAAY,GAAG,MAAM,IAAI,CAAC,SAAS,CACjC,IAAI,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,EAC/B,YAAY,CAAC,QAAQ,EACrB,YAAY,CAAC,YAAY,CAC1B,CAAC;gBACF,aAAa,GAAG,IAAI,CAAC;gBACrB,MAAM,CAAC,IAAI,CAAC,uCAAuC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC;YAC/E,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC9F,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;QAED,iBAAiB;YACf,IAAI,CAAC,YAAY;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAElE,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;YAE3B,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;gBACjC,aAAa,EAAE,MAAM;gBACrB,SAAS,EAAE,YAAY,CAAC,QAAQ;gBAChC,YAAY,EAAE,YAAY,CAAC,WAAW;gBACtC,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;gBACpC,KAAK;gBACL,KAAK;aACN,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,YAAY,CAAC,cAAc,EAAE,CAAC,sBAAsB,CAAC;YAC1E,IAAI,CAAC,YAAY;gBAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;YAEzF,MAAM,gBAAgB,GAAG,GAAG,YAAY,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;YAEhE,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC5C,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,IAAY,EAAE,MAAc,EAAE,aAAqB;YACpE,IAAI,CAAC,YAAY;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAElE,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAC9C,YAAY,EACZ,IAAI,GAAG,CAAC,GAAG,YAAY,CAAC,WAAW,SAAS,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,EACvE,EAAE,aAAa,EAAE,CAClB,CAAC;gBAEF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC;gBAChE,CAAC;gBAED,OAAO;oBACL,KAAK,EAAE,IAAI;oBACX,MAAM,EAAE,MAA4C;iBACrD,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAClE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,0BAA0B,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YAC1E,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @file sd-jwt.ts
3
+ * @description SD-JWT decode and cryptographic signature verification for EUDIW VP tokens.
4
+ * Uses @sd-jwt/decode for token parsing and jose for signature validation.
5
+ * @version-history
6
+ * v1.0.0 — 2026-05-02 — Initial implementation
7
+ */
8
+ import type { JWK } from 'jose';
9
+ export interface SdJwtVerificationResult {
10
+ valid: boolean;
11
+ payload?: Record<string, unknown>;
12
+ disclosedClaims?: Record<string, unknown>;
13
+ issuer?: string;
14
+ keyBinding?: boolean;
15
+ error?: string;
16
+ }
17
+ export interface SdJwtVerifier {
18
+ verify(sdJwtToken: string, trustedIssuerKeys: Map<string, JWK>): Promise<SdJwtVerificationResult>;
19
+ }
20
+ export declare function createSdJwtVerifier(): SdJwtVerifier;
21
+ //# sourceMappingURL=sd-jwt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sd-jwt.d.ts","sourceRoot":"","sources":["../../../src/services/sd-jwt.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAIhC,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;CACnG;AAOD,wBAAgB,mBAAmB,IAAI,aAAa,CA4EnD"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * @file sd-jwt.ts
3
+ * @description SD-JWT decode and cryptographic signature verification for EUDIW VP tokens.
4
+ * Uses @sd-jwt/decode for token parsing and jose for signature validation.
5
+ * @version-history
6
+ * v1.0.0 — 2026-05-02 — Initial implementation
7
+ */
8
+ import { decodeSdJwt } from '@sd-jwt/decode';
9
+ import * as jose from 'jose';
10
+ import { createHash } from 'node:crypto';
11
+ import { logger } from '../utils/logger.js';
12
+ const sha256Hasher = (data, _alg) => {
13
+ const input = typeof data === 'string' ? data : Buffer.from(data);
14
+ return new Uint8Array(createHash('sha256').update(input).digest());
15
+ };
16
+ export function createSdJwtVerifier() {
17
+ return {
18
+ async verify(sdJwtToken, trustedIssuerKeys) {
19
+ try {
20
+ // 1. Decode the SD-JWT
21
+ let decoded;
22
+ try {
23
+ decoded = await decodeSdJwt(sdJwtToken, sha256Hasher);
24
+ }
25
+ catch {
26
+ return { valid: false, error: 'Invalid SD-JWT format' };
27
+ }
28
+ const payload = decoded.jwt.payload;
29
+ const header = decoded.jwt.header;
30
+ // 2. Extract issuer
31
+ const issuer = payload.iss ?? '';
32
+ if (!issuer) {
33
+ return { valid: false, error: 'Missing issuer in SD-JWT' };
34
+ }
35
+ // 3. Look up trusted issuer key
36
+ const issuerJwk = trustedIssuerKeys.get(issuer);
37
+ if (!issuerJwk) {
38
+ return { valid: false, error: 'Untrusted issuer' };
39
+ }
40
+ // 4. Verify the issuer signature on the JWT portion
41
+ const alg = header.alg ?? 'ES256';
42
+ try {
43
+ const publicKey = await jose.importJWK(issuerJwk, alg);
44
+ const jwtPart = sdJwtToken.split('~')[0];
45
+ await jose.jwtVerify(jwtPart, publicKey, { algorithms: [alg] });
46
+ }
47
+ catch (err) {
48
+ return { valid: false, error: `Signature verification failed: ${String(err)}` };
49
+ }
50
+ // 5. Check expiry
51
+ const exp = payload.exp;
52
+ if (exp && exp * 1000 < Date.now()) {
53
+ return { valid: false, error: 'Credential expired' };
54
+ }
55
+ // 6. Reconstruct disclosed claims
56
+ const disclosedClaims = {};
57
+ for (const disclosure of (decoded.disclosures ?? [])) {
58
+ if (disclosure.key) {
59
+ disclosedClaims[disclosure.key] = disclosure.value;
60
+ }
61
+ }
62
+ // Include direct payload claims (non-selective)
63
+ const vc = payload.vc;
64
+ const subject = (vc?.credentialSubject ?? payload.credentialSubject ?? {});
65
+ for (const [key, value] of Object.entries(subject)) {
66
+ if (key !== 'id' && key !== 'type' && key !== '_sd' && key !== '_sd_alg') {
67
+ if (!(key in disclosedClaims)) {
68
+ disclosedClaims[key] = value;
69
+ }
70
+ }
71
+ }
72
+ return {
73
+ valid: true,
74
+ payload,
75
+ disclosedClaims,
76
+ issuer,
77
+ keyBinding: !!decoded.kbJwt,
78
+ };
79
+ }
80
+ catch (err) {
81
+ logger.error('SD-JWT verification failed', { error: String(err) });
82
+ return { valid: false, error: 'Verification failed' };
83
+ }
84
+ },
85
+ };
86
+ }
87
+ //# sourceMappingURL=sd-jwt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sd-jwt.js","sourceRoot":"","sources":["../../../src/services/sd-jwt.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,12 @@
1
+ /**
2
+ * @file vc-issuer.ts
3
+ * @description W3C Verifiable Credential issuer service. Issues AIMEATIdentityCredential
4
+ * as unsigned JSON or signed vc+ld+jwt using the node's Ed25519 keypair.
5
+ * @version-history
6
+ * v1.0.0 — 2026-03-01 — Initial unsigned JSON implementation
7
+ * v2.0.0 — 2026-05-02 — Add JWT signing with Ed25519
8
+ */
9
+ import { type JWK } from 'jose';
1
10
  import type { AimeatConfig } from '../config.js';
2
11
  import type { GHIIRecord } from '../storage/interface.js';
3
12
  export interface VerifiableCredential {
@@ -9,6 +18,16 @@ export interface VerifiableCredential {
9
18
  }
10
19
  export interface VcIssuerService {
11
20
  issueIdentityCredential(ghiiRecord: GHIIRecord): VerifiableCredential;
21
+ issueSignedCredential(ghiiRecord: GHIIRecord): Promise<string>;
22
+ getIssuerDid(): string;
23
+ getPublicJwk(): Promise<JWK>;
24
+ setNodeKeyPair(kp: {
25
+ publicKey: string;
26
+ privateKey: string;
27
+ }): void;
12
28
  }
13
- export declare function createVcIssuerService(config: AimeatConfig): VcIssuerService;
29
+ export declare function createVcIssuerService(config: AimeatConfig, initialNodeKeyPair?: {
30
+ publicKey: string;
31
+ privateKey: string;
32
+ } | null): VcIssuerService;
14
33
  //# sourceMappingURL=vc-issuer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vc-issuer.d.ts","sourceRoot":"","sources":["../../../src/services/vc-issuer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,eAAe;IAC9B,uBAAuB,CAAC,UAAU,EAAE,UAAU,GAAG,oBAAoB,CAAC;CACvE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,eAAe,CAuB3E"}
1
+ {"version":3,"file":"vc-issuer.d.ts","sourceRoot":"","sources":["../../../src/services/vc-issuer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAsB,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,eAAe;IAC9B,uBAAuB,CAAC,UAAU,EAAE,UAAU,GAAG,oBAAoB,CAAC;IACtE,qBAAqB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/D,YAAY,IAAI,MAAM,CAAC;IACvB,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7B,cAAc,CAAC,EAAE,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACrE;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,kBAAkB,GAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAW,GAC1E,eAAe,CAgFjB"}
@@ -1,24 +1,84 @@
1
- export function createVcIssuerService(config) {
1
+ /**
2
+ * @file vc-issuer.ts
3
+ * @description W3C Verifiable Credential issuer service. Issues AIMEATIdentityCredential
4
+ * as unsigned JSON or signed vc+ld+jwt using the node's Ed25519 keypair.
5
+ * @version-history
6
+ * v1.0.0 — 2026-03-01 — Initial unsigned JSON implementation
7
+ * v2.0.0 — 2026-05-02 — Add JWT signing with Ed25519
8
+ */
9
+ import { SignJWT, importJWK } from 'jose';
10
+ export function createVcIssuerService(config, initialNodeKeyPair = null) {
2
11
  const issuerDid = config.vcIssuerDid || `did:web:${config.nodeId}.aimeat.example`;
12
+ let nodeKeyPair = initialNodeKeyPair;
13
+ function buildCredentialPayload(ghiiRecord) {
14
+ return {
15
+ '@context': [
16
+ 'https://www.w3.org/ns/credentials/v2',
17
+ 'https://aimeat.spechops.com/ns/credentials/v1',
18
+ ],
19
+ type: ['VerifiableCredential', 'AIMEATIdentityCredential'],
20
+ issuer: issuerDid,
21
+ issuanceDate: new Date().toISOString(),
22
+ credentialSubject: {
23
+ id: `did:aimeat:${ghiiRecord.ghii}`,
24
+ type: 'AIMEATUser',
25
+ verificationLevel: ghiiRecord.verificationLevel,
26
+ memberSince: ghiiRecord.createdAt.split('T')[0],
27
+ displayName: ghiiRecord.displayName,
28
+ },
29
+ };
30
+ }
31
+ async function getPrivateKey() {
32
+ if (!nodeKeyPair)
33
+ throw new Error('Node keypair not available for VC signing');
34
+ const privateKeyBytes = Buffer.from(nodeKeyPair.privateKey, 'base64');
35
+ const publicKeyBytes = Buffer.from(nodeKeyPair.publicKey, 'base64');
36
+ const jwk = {
37
+ kty: 'OKP',
38
+ crv: 'Ed25519',
39
+ x: Buffer.from(publicKeyBytes).toString('base64url'),
40
+ d: Buffer.from(privateKeyBytes).toString('base64url'),
41
+ };
42
+ return importJWK(jwk, 'EdDSA');
43
+ }
3
44
  return {
4
45
  issueIdentityCredential(ghiiRecord) {
46
+ return buildCredentialPayload(ghiiRecord);
47
+ },
48
+ async issueSignedCredential(ghiiRecord) {
49
+ const credential = buildCredentialPayload(ghiiRecord);
50
+ const privateKey = await getPrivateKey();
51
+ const now = Math.floor(Date.now() / 1000);
52
+ const validityDays = 365;
53
+ return new SignJWT({ vc: credential })
54
+ .setProtectedHeader({
55
+ alg: 'EdDSA',
56
+ typ: 'vc+ld+jwt',
57
+ kid: `${issuerDid}#key-1`,
58
+ })
59
+ .setIssuer(issuerDid)
60
+ .setSubject(`did:aimeat:${ghiiRecord.ghii}`)
61
+ .setNotBefore(now)
62
+ .setExpirationTime(now + validityDays * 86400)
63
+ .setIssuedAt(now)
64
+ .sign(privateKey);
65
+ },
66
+ getIssuerDid() {
67
+ return issuerDid;
68
+ },
69
+ async getPublicJwk() {
70
+ if (!nodeKeyPair)
71
+ throw new Error('Node keypair not available');
72
+ const publicKeyBytes = Buffer.from(nodeKeyPair.publicKey, 'base64');
5
73
  return {
6
- '@context': [
7
- 'https://www.w3.org/ns/credentials/v2',
8
- 'https://aimeat.spechops.com/ns/credentials/v1',
9
- ],
10
- type: ['VerifiableCredential', 'AIMEATIdentityCredential'],
11
- issuer: issuerDid,
12
- issuanceDate: new Date().toISOString(),
13
- credentialSubject: {
14
- id: `did:aimeat:${ghiiRecord.ghii}`,
15
- type: 'AIMEATUser',
16
- verificationLevel: ghiiRecord.verificationLevel,
17
- memberSince: ghiiRecord.createdAt.split('T')[0],
18
- displayName: ghiiRecord.displayName,
19
- },
74
+ kty: 'OKP',
75
+ crv: 'Ed25519',
76
+ x: Buffer.from(publicKeyBytes).toString('base64url'),
20
77
  };
21
78
  },
79
+ setNodeKeyPair(kp) {
80
+ nodeKeyPair = kp;
81
+ },
22
82
  };
23
83
  }
24
84
  //# sourceMappingURL=vc-issuer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vc-issuer.js","sourceRoot":"","sources":["../../../src/services/vc-issuer.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,qBAAqB,CAAC,MAAoB;IACxD,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,IAAI,WAAW,MAAM,CAAC,MAAM,iBAAiB,CAAC;IAElF,OAAO;QACL,uBAAuB,CAAC,UAAsB;YAC5C,OAAO;gBACL,UAAU,EAAE;oBACV,sCAAsC;oBACtC,+CAA+C;iBAChD;gBACD,IAAI,EAAE,CAAC,sBAAsB,EAAE,0BAA0B,CAAC;gBAC1D,MAAM,EAAE,SAAS;gBACjB,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACtC,iBAAiB,EAAE;oBACjB,EAAE,EAAE,cAAc,UAAU,CAAC,IAAI,EAAE;oBACnC,IAAI,EAAE,YAAY;oBAClB,iBAAiB,EAAE,UAAU,CAAC,iBAAiB;oBAC/C,WAAW,EAAE,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC/C,WAAW,EAAE,UAAU,CAAC,WAAW;iBACpC;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"vc-issuer.js","sourceRoot":"","sources":["../../../src/services/vc-issuer.ts"],"names":[],"mappings":"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"}
@@ -664,6 +664,16 @@ export interface TrustedIssuerRecord {
664
664
  addedBy: string;
665
665
  createdAt: string;
666
666
  }
667
+ export interface VerificationNonceRecord {
668
+ id: string;
669
+ owner: string;
670
+ type: 'eudiw' | 'ftn';
671
+ state: string;
672
+ nonce: string;
673
+ redirectUri: string;
674
+ createdAt: string;
675
+ expiresAt: string;
676
+ }
667
677
  export interface GenesisPeerRecord {
668
678
  id: string;
669
679
  genesisNodeId: string;
@@ -1119,6 +1129,112 @@ export interface InstanceFilter {
1119
1129
  limit?: number;
1120
1130
  offset?: number;
1121
1131
  }
1132
+ export interface CapabilitySource {
1133
+ type: 'extension' | 'action' | 'cortex' | 'app' | 'manual';
1134
+ ref: string;
1135
+ version: string;
1136
+ }
1137
+ export interface CapabilityExport {
1138
+ name: string;
1139
+ description: string;
1140
+ inputSchema: Record<string, unknown>;
1141
+ outputSchema: Record<string, unknown>;
1142
+ example: {
1143
+ input: Record<string, unknown>;
1144
+ output: Record<string, unknown>;
1145
+ } | null;
1146
+ }
1147
+ export interface CapabilityDependency {
1148
+ type: 'sdk' | 'capability';
1149
+ id: string;
1150
+ required: boolean;
1151
+ minVersion: string | null;
1152
+ }
1153
+ export interface CapabilityTrust {
1154
+ operatorReviewed: boolean;
1155
+ reviewedAt: string | null;
1156
+ vouchCount: number;
1157
+ publisherTrustScore: number;
1158
+ codeAudited: boolean;
1159
+ auditNotes: string | null;
1160
+ }
1161
+ export interface CapabilityStats {
1162
+ totalInvocations: number;
1163
+ successCount: number;
1164
+ errorCount: number;
1165
+ lastInvokedAt: string | null;
1166
+ avgResponseMs: number;
1167
+ lastError: string | null;
1168
+ }
1169
+ export interface CapabilityOverride {
1170
+ summary?: string;
1171
+ visibility?: 'private' | 'owner' | 'public';
1172
+ disabled?: boolean;
1173
+ notes?: string;
1174
+ }
1175
+ export interface CapabilityRecord {
1176
+ id: string;
1177
+ name: string;
1178
+ summary: string;
1179
+ ownerGhii: string;
1180
+ visibility: 'private' | 'owner' | 'public';
1181
+ scope: 'local';
1182
+ status: 'draft' | 'pending_review' | 'active' | 'deprecated' | 'rejected' | 'disabled';
1183
+ rejectionReason: string | null;
1184
+ deprecationMessage: string | null;
1185
+ replacedBy: string | null;
1186
+ source: CapabilitySource;
1187
+ authRequired: 'none' | 'anonymous' | 'registered';
1188
+ callable: boolean;
1189
+ inputSchema: Record<string, unknown> | null;
1190
+ outputSchema: Record<string, unknown> | null;
1191
+ exports: CapabilityExport[] | null;
1192
+ usage: string;
1193
+ whenToUse: string;
1194
+ whenNotToUse: string;
1195
+ examples: Array<{
1196
+ description: string;
1197
+ input: Record<string, unknown>;
1198
+ output: Record<string, unknown>;
1199
+ }>;
1200
+ dependencies: CapabilityDependency[];
1201
+ schemaHash: string;
1202
+ webhookUrl: string | null;
1203
+ cost: {
1204
+ morsels: number;
1205
+ perUnit?: string;
1206
+ } | null;
1207
+ trustRequired: number | null;
1208
+ trust: CapabilityTrust;
1209
+ redactedFields: string[];
1210
+ operatorOverride: CapabilityOverride | null;
1211
+ stats: CapabilityStats;
1212
+ tags: string[];
1213
+ createdAt: string;
1214
+ updatedAt: string;
1215
+ }
1216
+ export interface CapabilityLogEntry {
1217
+ id: string;
1218
+ capabilityId: string;
1219
+ callerGhii: string;
1220
+ input: Record<string, unknown>;
1221
+ status: 'success' | 'error';
1222
+ durationMs: number;
1223
+ error: string | null;
1224
+ timestamp: string;
1225
+ }
1226
+ export interface CapabilityFilter {
1227
+ ownerGhii?: string;
1228
+ visibility?: string;
1229
+ status?: string;
1230
+ sourceType?: string;
1231
+ callable?: boolean;
1232
+ authRequired?: string;
1233
+ tags?: string[];
1234
+ search?: string;
1235
+ page?: number;
1236
+ perPage?: number;
1237
+ }
1122
1238
  import type { OwnerRepository } from './repositories/owner.repository.js';
1123
1239
  import type { AgentRepository } from './repositories/agent.repository.js';
1124
1240
  import type { MemoryRepository } from './repositories/memory.repository.js';
@@ -1156,6 +1272,7 @@ import type { SystemPromptRepository } from './repositories/system-prompt.reposi
1156
1272
  import type { PackageRepository } from './repositories/package.repository.js';
1157
1273
  import type { TemplateListingRepository } from './repositories/template-listing.repository.js';
1158
1274
  import type { PackageInstanceRepository } from './repositories/package-instance.repository.js';
1159
- export interface Storage extends OwnerRepository, AgentRepository, MemoryRepository, ActionRepository, WorkRepository, WalletRepository, BoardRepository, OtkRepository, DisputeRepository, MicroMemoryRepository, FileRepository, IdentityRepository, SchemaRepository, ConsentRepository, CatalogueRepository, ModerationRepository, OrganismRepository, MarketplaceRepository, FederationRepository, NodeRepository, NotificationRepository, AuthRepository, SessionRepository, AppRepository, AppMarketplaceRepository, ConfigRepository, NotificationTemplateRepository, KnowledgeRepository, SchedulerRepository, ExtensionInstanceRepository, ReplicationQueueRepository, DeviceAuthRepository, OAuthRepository, SystemPromptRepository, PackageRepository, TemplateListingRepository, PackageInstanceRepository {
1275
+ import type { CapabilityRepository } from './repositories/capability.repository.js';
1276
+ export interface Storage extends OwnerRepository, AgentRepository, MemoryRepository, ActionRepository, WorkRepository, WalletRepository, BoardRepository, OtkRepository, DisputeRepository, MicroMemoryRepository, FileRepository, IdentityRepository, SchemaRepository, ConsentRepository, CatalogueRepository, ModerationRepository, OrganismRepository, MarketplaceRepository, FederationRepository, NodeRepository, NotificationRepository, AuthRepository, SessionRepository, AppRepository, AppMarketplaceRepository, ConfigRepository, NotificationTemplateRepository, KnowledgeRepository, SchedulerRepository, ExtensionInstanceRepository, ReplicationQueueRepository, DeviceAuthRepository, OAuthRepository, SystemPromptRepository, PackageRepository, TemplateListingRepository, PackageInstanceRepository, CapabilityRepository {
1160
1277
  }
1161
1278
  //# sourceMappingURL=interface.d.ts.map