@matimo/core 0.1.0-alpha.9 → 0.1.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 (169) hide show
  1. package/README.md +341 -14
  2. package/dist/approval/approval-handler.d.ts +5 -1
  3. package/dist/approval/approval-handler.d.ts.map +1 -1
  4. package/dist/approval/approval-handler.js +6 -0
  5. package/dist/approval/approval-handler.js.map +1 -1
  6. package/dist/core/schema.d.ts +41 -10
  7. package/dist/core/schema.d.ts.map +1 -1
  8. package/dist/core/schema.js +40 -4
  9. package/dist/core/schema.js.map +1 -1
  10. package/dist/core/skill-content-parser.d.ts +91 -0
  11. package/dist/core/skill-content-parser.d.ts.map +1 -0
  12. package/dist/core/skill-content-parser.js +248 -0
  13. package/dist/core/skill-content-parser.js.map +1 -0
  14. package/dist/core/skill-loader.d.ts +46 -0
  15. package/dist/core/skill-loader.d.ts.map +1 -0
  16. package/dist/core/skill-loader.js +310 -0
  17. package/dist/core/skill-loader.js.map +1 -0
  18. package/dist/core/skill-registry.d.ts +131 -0
  19. package/dist/core/skill-registry.d.ts.map +1 -0
  20. package/dist/core/skill-registry.js +316 -0
  21. package/dist/core/skill-registry.js.map +1 -0
  22. package/dist/core/tfidf-embedding.d.ts +45 -0
  23. package/dist/core/tfidf-embedding.d.ts.map +1 -0
  24. package/dist/core/tfidf-embedding.js +199 -0
  25. package/dist/core/tfidf-embedding.js.map +1 -0
  26. package/dist/core/tool-loader.d.ts +3 -1
  27. package/dist/core/tool-loader.d.ts.map +1 -1
  28. package/dist/core/tool-loader.js +33 -10
  29. package/dist/core/tool-loader.js.map +1 -1
  30. package/dist/core/types.d.ts +203 -6
  31. package/dist/core/types.d.ts.map +1 -1
  32. package/dist/encodings/parameter-encoding.d.ts +1 -1
  33. package/dist/encodings/parameter-encoding.d.ts.map +1 -1
  34. package/dist/encodings/parameter-encoding.js +9 -4
  35. package/dist/encodings/parameter-encoding.js.map +1 -1
  36. package/dist/errors/matimo-error.d.ts +11 -2
  37. package/dist/errors/matimo-error.d.ts.map +1 -1
  38. package/dist/errors/matimo-error.js +25 -1
  39. package/dist/errors/matimo-error.js.map +1 -1
  40. package/dist/executors/command-executor.d.ts +9 -2
  41. package/dist/executors/command-executor.d.ts.map +1 -1
  42. package/dist/executors/command-executor.js +29 -5
  43. package/dist/executors/command-executor.js.map +1 -1
  44. package/dist/executors/function-executor.d.ts +10 -3
  45. package/dist/executors/function-executor.d.ts.map +1 -1
  46. package/dist/executors/function-executor.js +44 -24
  47. package/dist/executors/function-executor.js.map +1 -1
  48. package/dist/executors/http-executor.d.ts +79 -4
  49. package/dist/executors/http-executor.d.ts.map +1 -1
  50. package/dist/executors/http-executor.js +232 -28
  51. package/dist/executors/http-executor.js.map +1 -1
  52. package/dist/index.d.ts +25 -3
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +19 -1
  55. package/dist/index.js.map +1 -1
  56. package/dist/integrations/langchain.d.ts +55 -0
  57. package/dist/integrations/langchain.d.ts.map +1 -1
  58. package/dist/integrations/langchain.js +71 -4
  59. package/dist/integrations/langchain.js.map +1 -1
  60. package/dist/logging/winston-logger.d.ts.map +1 -1
  61. package/dist/logging/winston-logger.js +9 -1
  62. package/dist/logging/winston-logger.js.map +1 -1
  63. package/dist/matimo-instance.d.ts +230 -18
  64. package/dist/matimo-instance.d.ts.map +1 -1
  65. package/dist/matimo-instance.js +739 -40
  66. package/dist/matimo-instance.js.map +1 -1
  67. package/dist/mcp/index.d.ts +18 -0
  68. package/dist/mcp/index.d.ts.map +1 -0
  69. package/dist/mcp/index.js +24 -0
  70. package/dist/mcp/index.js.map +1 -0
  71. package/dist/mcp/mcp-server.d.ts +141 -0
  72. package/dist/mcp/mcp-server.d.ts.map +1 -0
  73. package/dist/mcp/mcp-server.js +754 -0
  74. package/dist/mcp/mcp-server.js.map +1 -0
  75. package/dist/mcp/secrets/aws-resolver.d.ts +41 -0
  76. package/dist/mcp/secrets/aws-resolver.d.ts.map +1 -0
  77. package/dist/mcp/secrets/aws-resolver.js +141 -0
  78. package/dist/mcp/secrets/aws-resolver.js.map +1 -0
  79. package/dist/mcp/secrets/dotenv-resolver.d.ts +23 -0
  80. package/dist/mcp/secrets/dotenv-resolver.d.ts.map +1 -0
  81. package/dist/mcp/secrets/dotenv-resolver.js +94 -0
  82. package/dist/mcp/secrets/dotenv-resolver.js.map +1 -0
  83. package/dist/mcp/secrets/env-resolver.d.ts +14 -0
  84. package/dist/mcp/secrets/env-resolver.d.ts.map +1 -0
  85. package/dist/mcp/secrets/env-resolver.js +27 -0
  86. package/dist/mcp/secrets/env-resolver.js.map +1 -0
  87. package/dist/mcp/secrets/index.d.ts +14 -0
  88. package/dist/mcp/secrets/index.d.ts.map +1 -0
  89. package/dist/mcp/secrets/index.js +13 -0
  90. package/dist/mcp/secrets/index.js.map +1 -0
  91. package/dist/mcp/secrets/resolver-chain.d.ts +34 -0
  92. package/dist/mcp/secrets/resolver-chain.d.ts.map +1 -0
  93. package/dist/mcp/secrets/resolver-chain.js +141 -0
  94. package/dist/mcp/secrets/resolver-chain.js.map +1 -0
  95. package/dist/mcp/secrets/types.d.ts +73 -0
  96. package/dist/mcp/secrets/types.d.ts.map +1 -0
  97. package/dist/mcp/secrets/types.js +8 -0
  98. package/dist/mcp/secrets/types.js.map +1 -0
  99. package/dist/mcp/secrets/vault-resolver.d.ts +43 -0
  100. package/dist/mcp/secrets/vault-resolver.d.ts.map +1 -0
  101. package/dist/mcp/secrets/vault-resolver.js +127 -0
  102. package/dist/mcp/secrets/vault-resolver.js.map +1 -0
  103. package/dist/mcp/tool-converter.d.ts +40 -0
  104. package/dist/mcp/tool-converter.d.ts.map +1 -0
  105. package/dist/mcp/tool-converter.js +185 -0
  106. package/dist/mcp/tool-converter.js.map +1 -0
  107. package/dist/policy/approval-manifest.d.ts +76 -0
  108. package/dist/policy/approval-manifest.d.ts.map +1 -0
  109. package/dist/policy/approval-manifest.js +197 -0
  110. package/dist/policy/approval-manifest.js.map +1 -0
  111. package/dist/policy/content-validator.d.ts +19 -0
  112. package/dist/policy/content-validator.d.ts.map +1 -0
  113. package/dist/policy/content-validator.js +196 -0
  114. package/dist/policy/content-validator.js.map +1 -0
  115. package/dist/policy/default-policy.d.ts +46 -0
  116. package/dist/policy/default-policy.d.ts.map +1 -0
  117. package/dist/policy/default-policy.js +241 -0
  118. package/dist/policy/default-policy.js.map +1 -0
  119. package/dist/policy/events.d.ts +71 -0
  120. package/dist/policy/events.d.ts.map +1 -0
  121. package/dist/policy/events.js +8 -0
  122. package/dist/policy/events.js.map +1 -0
  123. package/dist/policy/index.d.ts +13 -0
  124. package/dist/policy/index.d.ts.map +1 -0
  125. package/dist/policy/index.js +9 -0
  126. package/dist/policy/index.js.map +1 -0
  127. package/dist/policy/integrity-tracker.d.ts +62 -0
  128. package/dist/policy/integrity-tracker.d.ts.map +1 -0
  129. package/dist/policy/integrity-tracker.js +79 -0
  130. package/dist/policy/integrity-tracker.js.map +1 -0
  131. package/dist/policy/policy-loader.d.ts +58 -0
  132. package/dist/policy/policy-loader.d.ts.map +1 -0
  133. package/dist/policy/policy-loader.js +156 -0
  134. package/dist/policy/policy-loader.js.map +1 -0
  135. package/dist/policy/risk-classifier.d.ts +18 -0
  136. package/dist/policy/risk-classifier.d.ts.map +1 -0
  137. package/dist/policy/risk-classifier.js +47 -0
  138. package/dist/policy/risk-classifier.js.map +1 -0
  139. package/dist/policy/types.d.ts +131 -0
  140. package/dist/policy/types.d.ts.map +1 -0
  141. package/dist/policy/types.js +8 -0
  142. package/dist/policy/types.js.map +1 -0
  143. package/package.json +22 -6
  144. package/tools/matimo_approve_tool/definition.yaml +36 -0
  145. package/tools/matimo_approve_tool/matimo_approve_tool.ts +90 -0
  146. package/tools/matimo_create_skill/definition.yaml +46 -0
  147. package/tools/matimo_create_skill/matimo_create_skill.ts +75 -0
  148. package/tools/matimo_create_tool/definition.yaml +48 -0
  149. package/tools/matimo_create_tool/matimo_create_tool.ts +137 -0
  150. package/tools/matimo_get_skill/definition.yaml +60 -0
  151. package/tools/matimo_get_skill/matimo_get_skill.ts +182 -0
  152. package/tools/matimo_get_tool/definition.yaml +36 -0
  153. package/tools/matimo_get_tool/matimo_get_tool.ts +56 -0
  154. package/tools/matimo_get_tool_status/definition.yaml +42 -0
  155. package/tools/matimo_get_tool_status/matimo_get_tool_status.ts +101 -0
  156. package/tools/matimo_list_skills/definition.yaml +52 -0
  157. package/tools/matimo_list_skills/matimo_list_skills.ts +138 -0
  158. package/tools/matimo_list_user_tools/definition.yaml +32 -0
  159. package/tools/matimo_list_user_tools/matimo_list_user_tools.ts +74 -0
  160. package/tools/matimo_reload_tools/definition.yaml +35 -0
  161. package/tools/matimo_reload_tools/matimo_reload_tools.ts +29 -0
  162. package/tools/matimo_search_tools/definition.yaml +32 -0
  163. package/tools/matimo_search_tools/matimo_search_tools.ts +82 -0
  164. package/tools/matimo_validate_skill/definition.yaml +43 -0
  165. package/tools/matimo_validate_skill/matimo_validate_skill.ts +137 -0
  166. package/tools/matimo_validate_tool/definition.yaml +34 -0
  167. package/tools/matimo_validate_tool/matimo_validate_tool.ts +168 -0
  168. package/tools/shared/skill-validation.ts +335 -0
  169. package/LICENSE +0 -21
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver-chain.js","sourceRoot":"","sources":["../../../src/mcp/secrets/resolver-chain.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD;;GAEG;AACH,SAAS,cAAc,CAAC,MAA4B;IAClD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,KAAK;YACR,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACjC,KAAK,QAAQ;YACX,OAAO,IAAI,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/C,KAAK,OAAO;YACV,OAAO,IAAI,mBAAmB,CAAC;gBAC7B,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B,CAAC,CAAC;QACL,KAAK,KAAK;YACR,OAAO,IAAI,yBAAyB,CAAC;gBACnC,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B,CAAC,CAAC;QACL;YACE,MAAM,IAAI,KAAK,CAAC,iCAAkC,MAAkC,CAAC,IAAI,EAAE,CAAC,CAAC;IACjG,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,mBAAmB;IAI9B,YAAY,SAA2B;QAH9B,SAAI,GAAG,OAAO,CAAC;QAItB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW;QACvB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAC1C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;gBACvC,MAAM,CAAC,IAAI,CAAC,oBAAoB,QAAQ,CAAC,IAAI,qBAAqB,GAAG,GAAG,EAAE;oBACxE,QAAQ,EAAE,QAAQ,CAAC,IAAI;oBACvB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC9D,CAAC,CAAC;gBACH,4BAA4B;YAC9B,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAc;QAC7B,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QAEhC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC;gBAAE,MAAM;YAEhC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;gBAC3D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACpD,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC;wBACrB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;wBACpB,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBACxB,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;gBACvC,MAAM,CAAC,IAAI,CAAC,oBAAoB,QAAQ,CAAC,IAAI,yBAAyB,EAAE;oBACtE,QAAQ,EAAE,QAAQ,CAAC,IAAI;oBACvB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC9D,CAAC,CAAC;gBACH,4BAA4B;YAC9B,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACrB,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,cAAc;QAClB,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;QACvC,IAAI,MAAM,GAAG,CAAC,CAAC;QAEf,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAGtC,IACE,eAAe,IAAI,QAAQ;gBAC3B,OAAQ,QAA8B,CAAC,aAAa,KAAK,UAAU,EACnE,CAAC;gBACD,MAAM,OAAO,GAAI,QAA8B,CAAC,aAAa,EAAE,CAAC;gBAChE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;oBACnD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;wBACtB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;wBACzB,MAAM,EAAE,CAAC;oBACX,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,UAAU,MAAM,0BAA0B,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAkC;IACpE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7C,OAAO,IAAI,mBAAmB,CAAC,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACvD,OAAO,IAAI,mBAAmB,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Secret Resolver Types for Matimo MCP Server
3
+ *
4
+ * Defines the interface that all secret resolvers implement.
5
+ * Env vars are the default; enterprise teams can plug in Vault, AWS SM, etc.
6
+ */
7
+ /**
8
+ * Interface for resolving secrets from any backend.
9
+ *
10
+ * Implementations should be stateless per-call (caching is allowed internally).
11
+ * resolve() returns undefined for missing keys — the chain tries the next resolver.
12
+ */
13
+ export interface SecretResolver {
14
+ /** Human-readable name for logging (e.g., 'env', 'vault', 'aws-sm') */
15
+ readonly name: string;
16
+ /**
17
+ * Resolve a single secret by key.
18
+ * @returns The secret value, or undefined if not found in this resolver.
19
+ */
20
+ resolve(key: string): Promise<string | undefined>;
21
+ /**
22
+ * Resolve multiple secrets at once.
23
+ * Default implementation calls resolve() for each key.
24
+ * Backends with batch APIs should override for efficiency.
25
+ */
26
+ resolveAll(keys: string[]): Promise<Record<string, string>>;
27
+ /**
28
+ * Optional cleanup (close connections, flush caches).
29
+ * Called when the MCP server shuts down.
30
+ */
31
+ dispose?(): Promise<void>;
32
+ }
33
+ export interface EnvResolverConfig {
34
+ type: 'env';
35
+ }
36
+ export interface DotenvResolverConfig {
37
+ type: 'dotenv';
38
+ /** Path to .env file. Defaults to `process.cwd()/.env` */
39
+ path?: string;
40
+ }
41
+ export interface VaultResolverConfig {
42
+ type: 'vault';
43
+ /** Vault server URL. Falls back to VAULT_ADDR env var. */
44
+ addr?: string;
45
+ /** Vault authentication token. Falls back to VAULT_TOKEN env var. */
46
+ token?: string;
47
+ /** KV v2 secret path. Default: 'secret/data/matimo' */
48
+ secretPath?: string;
49
+ /** Vault namespace (enterprise). Falls back to VAULT_NAMESPACE env var. */
50
+ namespace?: string;
51
+ /** TTL for cached secrets in ms. Default: 300_000 (5 min) */
52
+ cacheTtlMs?: number;
53
+ }
54
+ export interface AwsSecretsManagerResolverConfig {
55
+ type: 'aws';
56
+ /** AWS region. Falls back to AWS_REGION env var. Default: 'us-east-1' */
57
+ region?: string;
58
+ /** Secrets Manager secret ID. Default: 'matimo/credentials' */
59
+ secretId?: string;
60
+ /** TTL for cached secrets in ms. Default: 300_000 (5 min) */
61
+ cacheTtlMs?: number;
62
+ }
63
+ /** Union of all resolver configs */
64
+ export type SecretResolverConfig = EnvResolverConfig | DotenvResolverConfig | VaultResolverConfig | AwsSecretsManagerResolverConfig;
65
+ /**
66
+ * Configuration for the resolver chain.
67
+ * Resolvers are tried in order; first non-undefined value wins per key.
68
+ */
69
+ export interface SecretResolverChainConfig {
70
+ /** Ordered list of resolvers to try. Default: [{ type: 'env' }] */
71
+ resolvers: SecretResolverConfig[];
72
+ }
73
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/mcp/secrets/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,uEAAuE;IACvE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAElD;;;;OAIG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAE5D;;;OAGG;IACH,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAID,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,KAAK,CAAC;CACb;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,QAAQ,CAAC;IACf,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,+BAA+B;IAC9C,IAAI,EAAE,KAAK,CAAC;IACZ,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,oCAAoC;AACpC,MAAM,MAAM,oBAAoB,GAC5B,iBAAiB,GACjB,oBAAoB,GACpB,mBAAmB,GACnB,+BAA+B,CAAC;AAEpC;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACxC,mEAAmE;IACnE,SAAS,EAAE,oBAAoB,EAAE,CAAC;CACnC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Secret Resolver Types for Matimo MCP Server
3
+ *
4
+ * Defines the interface that all secret resolvers implement.
5
+ * Env vars are the default; enterprise teams can plug in Vault, AWS SM, etc.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/mcp/secrets/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * HashiCorp Vault Secret Resolver
3
+ *
4
+ * Reads secrets from Vault KV v2 engine.
5
+ * Lazy-imports node-vault — optional peer dependency.
6
+ * Implements TTL-based caching to support rotation without process restart.
7
+ *
8
+ * Required peer dep: node-vault >= 0.10.0
9
+ * Install: pnpm add node-vault
10
+ */
11
+ import type { SecretResolver } from './types';
12
+ export interface VaultResolverOptions {
13
+ addr?: string;
14
+ token?: string;
15
+ secretPath?: string;
16
+ namespace?: string;
17
+ cacheTtlMs?: number;
18
+ }
19
+ export declare class VaultSecretResolver implements SecretResolver {
20
+ readonly name = "vault";
21
+ private client;
22
+ private readonly addr;
23
+ private readonly token;
24
+ private readonly secretPath;
25
+ private readonly namespace?;
26
+ private readonly cacheTtlMs;
27
+ private cache;
28
+ private cacheTimestamp;
29
+ constructor(options?: VaultResolverOptions);
30
+ /**
31
+ * Lazy-import node-vault and create client.
32
+ * Throws a clear error if the package is not installed.
33
+ */
34
+ private getClient;
35
+ /**
36
+ * Fetch all secrets from Vault and cache them.
37
+ */
38
+ private fetchSecrets;
39
+ resolve(key: string): Promise<string | undefined>;
40
+ resolveAll(keys: string[]): Promise<Record<string, string>>;
41
+ dispose(): Promise<void>;
42
+ }
43
+ //# sourceMappingURL=vault-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-resolver.d.ts","sourceRoot":"","sources":["../../../src/mcp/secrets/vault-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAa9C,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,mBAAoB,YAAW,cAAc;IACxD,QAAQ,CAAC,IAAI,WAAW;IAExB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,cAAc,CAAK;gBAEf,OAAO,GAAE,oBAAyB;IAQ9C;;;OAGG;YACW,SAAS;IAwCvB;;OAEG;YACW,YAAY;IAkDpB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAKjD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAW3D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAK/B"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * HashiCorp Vault Secret Resolver
3
+ *
4
+ * Reads secrets from Vault KV v2 engine.
5
+ * Lazy-imports node-vault — optional peer dependency.
6
+ * Implements TTL-based caching to support rotation without process restart.
7
+ *
8
+ * Required peer dep: node-vault >= 0.10.0
9
+ * Install: pnpm add node-vault
10
+ */
11
+ import { MatimoError, ErrorCode } from '../../errors/matimo-error';
12
+ import { getGlobalMatimoLogger } from '../../logging';
13
+ /** Default cache TTL: 5 minutes */
14
+ const DEFAULT_CACHE_TTL_MS = 300000;
15
+ /** Default KV v2 secret path */
16
+ const DEFAULT_SECRET_PATH = 'secret/data/matimo';
17
+ export class VaultSecretResolver {
18
+ constructor(options = {}) {
19
+ this.name = 'vault';
20
+ this.client = null;
21
+ this.cache = null;
22
+ this.cacheTimestamp = 0;
23
+ this.addr = options.addr ?? process.env.VAULT_ADDR ?? 'http://127.0.0.1:8200';
24
+ this.token = options.token ?? process.env.VAULT_TOKEN ?? '';
25
+ this.secretPath = options.secretPath ?? DEFAULT_SECRET_PATH;
26
+ this.namespace = options.namespace ?? process.env.VAULT_NAMESPACE;
27
+ this.cacheTtlMs = options.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;
28
+ }
29
+ /**
30
+ * Lazy-import node-vault and create client.
31
+ * Throws a clear error if the package is not installed.
32
+ */
33
+ async getClient() {
34
+ if (this.client) {
35
+ return this.client;
36
+ }
37
+ try {
38
+ // Dynamic import — only loaded when Vault resolver is actually used
39
+ // @ts-ignore — optional peer dependency, may not be installed
40
+ const vaultModule = await import('node-vault');
41
+ const vaultFactory = vaultModule.default ?? vaultModule;
42
+ const clientOptions = {
43
+ apiVersion: 'v1',
44
+ endpoint: this.addr,
45
+ token: this.token,
46
+ };
47
+ if (this.namespace) {
48
+ clientOptions.namespace = this.namespace;
49
+ }
50
+ this.client = vaultFactory(clientOptions);
51
+ return this.client;
52
+ }
53
+ catch (error) {
54
+ if (error instanceof Error &&
55
+ (error.message.includes('Cannot find module') ||
56
+ error.message.includes('MODULE_NOT_FOUND') ||
57
+ error.message.includes('ERR_MODULE_NOT_FOUND'))) {
58
+ throw new MatimoError('node-vault package is required for Vault secret resolution. Install: pnpm add node-vault', ErrorCode.AUTH_FAILED, { resolver: this.name });
59
+ }
60
+ throw error;
61
+ }
62
+ }
63
+ /**
64
+ * Fetch all secrets from Vault and cache them.
65
+ */
66
+ async fetchSecrets() {
67
+ const now = Date.now();
68
+ // Return cache if still valid
69
+ if (this.cache && now - this.cacheTimestamp < this.cacheTtlMs) {
70
+ return this.cache;
71
+ }
72
+ const logger = getGlobalMatimoLogger();
73
+ logger.debug('Fetching secrets from Vault', {
74
+ resolver: this.name,
75
+ path: this.secretPath,
76
+ addr: this.addr,
77
+ });
78
+ try {
79
+ const client = await this.getClient();
80
+ const result = await client.read(this.secretPath);
81
+ // KV v2 returns data.data (first data is metadata wrapper)
82
+ this.cache = result.data.data;
83
+ this.cacheTimestamp = now;
84
+ logger.debug('Vault secrets loaded', {
85
+ resolver: this.name,
86
+ keyCount: Object.keys(this.cache).length,
87
+ });
88
+ return this.cache;
89
+ }
90
+ catch (error) {
91
+ // If it's our own MatimoError (missing package), re-throw
92
+ if (error instanceof MatimoError) {
93
+ throw error;
94
+ }
95
+ logger.warn('Vault resolver unreachable — falling back to next resolver', {
96
+ resolver: this.name,
97
+ error: error instanceof Error ? error.message : String(error),
98
+ });
99
+ // Return stale cache if available, otherwise empty
100
+ if (this.cache) {
101
+ logger.warn('Using stale Vault cache', { resolver: this.name });
102
+ return this.cache;
103
+ }
104
+ return {};
105
+ }
106
+ }
107
+ async resolve(key) {
108
+ const secrets = await this.fetchSecrets();
109
+ return secrets[key];
110
+ }
111
+ async resolveAll(keys) {
112
+ const secrets = await this.fetchSecrets();
113
+ const result = {};
114
+ for (const key of keys) {
115
+ if (key in secrets) {
116
+ result[key] = secrets[key];
117
+ }
118
+ }
119
+ return result;
120
+ }
121
+ async dispose() {
122
+ this.cache = null;
123
+ this.cacheTimestamp = 0;
124
+ this.client = null;
125
+ }
126
+ }
127
+ //# sourceMappingURL=vault-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-resolver.js","sourceRoot":"","sources":["../../../src/mcp/secrets/vault-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Tool Schema Converter
3
+ *
4
+ * Converts Matimo ToolDefinition parameters to MCP-compatible Zod schemas.
5
+ * The MCP SDK's registerTool() accepts { [key]: ZodType } as inputSchema.
6
+ * Reuses the same parameterToZod logic as the LangChain integration.
7
+ */
8
+ import { z } from 'zod';
9
+ import type { Parameter } from '../core/types';
10
+ import type { ToolDefinition } from '../core/schema';
11
+ /**
12
+ * Convert a single Matimo Parameter to a Zod schema.
13
+ * Handles: string, number, boolean, array, object, enum, defaults, optionals.
14
+ */
15
+ export declare function parameterToZod(param: Parameter): z.ZodType<unknown>;
16
+ /**
17
+ * Convert a ToolDefinition's parameters to MCP inputSchema format.
18
+ * Excludes auth parameters — those are injected server-side.
19
+ *
20
+ * @returns A plain object mapping param names to Zod types,
21
+ * which is what MCP SDK's registerTool() expects for inputSchema.
22
+ */
23
+ export declare function convertParametersToMcpSchema(parameters: Record<string, Parameter>): Record<string, z.ZodTypeAny>;
24
+ /**
25
+ * Build the full MCP tool registration metadata from a ToolDefinition.
26
+ *
27
+ * @returns Object ready for server.registerTool(name, metadata, handler)
28
+ */
29
+ export declare function toolToMcpRegistration(tool: ToolDefinition): {
30
+ title: string;
31
+ description: string;
32
+ inputSchema: Record<string, z.ZodTypeAny>;
33
+ };
34
+ /**
35
+ * Extract auth placeholder names from a tool's execution config.
36
+ * These are the env var names the tool needs (e.g., SLACK_BOT_TOKEN, GITHUB_TOKEN).
37
+ * Used by `matimo mcp setup` to generate config templates.
38
+ */
39
+ export declare function extractAuthPlaceholders(tool: ToolDefinition): string[];
40
+ //# sourceMappingURL=tool-converter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-converter.d.ts","sourceRoot":"","sources":["../../src/mcp/tool-converter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAgEnE;AAyBD;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GACpC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAY9B;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,cAAc,GAAG;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;CAC3C,CAiBA;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,EAAE,CAyCtE"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Tool Schema Converter
3
+ *
4
+ * Converts Matimo ToolDefinition parameters to MCP-compatible Zod schemas.
5
+ * The MCP SDK's registerTool() accepts { [key]: ZodType } as inputSchema.
6
+ * Reuses the same parameterToZod logic as the LangChain integration.
7
+ */
8
+ import { z } from 'zod';
9
+ /**
10
+ * Convert a single Matimo Parameter to a Zod schema.
11
+ * Handles: string, number, boolean, array, object, enum, defaults, optionals.
12
+ */
13
+ export function parameterToZod(param) {
14
+ let schema;
15
+ // Handle enum constraints
16
+ if (param.enum && param.enum.length > 0) {
17
+ if (param.enum.length === 1) {
18
+ // z.union requires at least 2 schemas — handle single-value enum explicitly
19
+ schema = z.literal(param.enum[0]);
20
+ }
21
+ else {
22
+ const enumSchemas = param.enum.map((value) => z.literal(value));
23
+ schema = z.union(enumSchemas);
24
+ }
25
+ }
26
+ else {
27
+ switch (param.type) {
28
+ case 'string':
29
+ schema = z.string();
30
+ break;
31
+ case 'number':
32
+ schema = z.number();
33
+ break;
34
+ case 'boolean':
35
+ schema = z.boolean();
36
+ break;
37
+ case 'array': {
38
+ const itemSchema = param.items ? parameterToZod(param.items) : z.unknown();
39
+ schema = z.array(itemSchema);
40
+ break;
41
+ }
42
+ case 'object': {
43
+ if (param.properties) {
44
+ const props = {};
45
+ for (const [key, prop] of Object.entries(param.properties)) {
46
+ props[key] = parameterToZod(prop);
47
+ }
48
+ schema = z.object(props);
49
+ }
50
+ else {
51
+ schema = z.record(z.string(), z.unknown());
52
+ }
53
+ break;
54
+ }
55
+ default:
56
+ schema = z.unknown();
57
+ }
58
+ }
59
+ // Add description
60
+ if (param.description) {
61
+ schema = schema.describe(param.description);
62
+ }
63
+ // Make optional before applying default.
64
+ // Order matters: .optional().default(val) produces ZodDefault(ZodOptional(...)),
65
+ // so parse(undefined) triggers the default. Reversing the order wraps ZodDefault
66
+ // in ZodOptional, causing undefined to be absorbed before the default is reached.
67
+ if (!param.required) {
68
+ schema = schema.optional();
69
+ }
70
+ // Apply default after optional so parse(undefined) returns the default value.
71
+ if (param.default !== undefined) {
72
+ schema = schema.default(param.default);
73
+ }
74
+ return schema;
75
+ }
76
+ /**
77
+ * Auth-related parameter name patterns.
78
+ * Parameters matching these are excluded from the MCP input schema
79
+ * because they are injected server-side by the secret resolver.
80
+ */
81
+ const AUTH_PATTERNS = ['token', 'key', 'secret', 'password', 'credential', 'auth', 'bearer'];
82
+ /**
83
+ * Check if a parameter name looks like a secret/auth parameter.
84
+ * Normalises camelCase to segments first (e.g. apiKey → ['api','key']),
85
+ * then splits on word separators (_ - .) and checks each segment for an
86
+ * exact match against AUTH_PATTERNS, preventing false positives such as
87
+ * "monkey" matching "key" or "author" matching "auth".
88
+ */
89
+ function isAuthParameter(paramName) {
90
+ const segments = paramName
91
+ .replace(/([a-z])([A-Z])/g, '$1_$2') // camelCase → snake_case (apiKey → api_Key)
92
+ .toLowerCase()
93
+ .split(/[_\-.]+/)
94
+ .filter(Boolean);
95
+ return segments.some((segment) => AUTH_PATTERNS.includes(segment));
96
+ }
97
+ /**
98
+ * Convert a ToolDefinition's parameters to MCP inputSchema format.
99
+ * Excludes auth parameters — those are injected server-side.
100
+ *
101
+ * @returns A plain object mapping param names to Zod types,
102
+ * which is what MCP SDK's registerTool() expects for inputSchema.
103
+ */
104
+ export function convertParametersToMcpSchema(parameters) {
105
+ const schema = {};
106
+ for (const [name, param] of Object.entries(parameters)) {
107
+ // Skip auth parameters — they are injected by the MCP server
108
+ if (isAuthParameter(name)) {
109
+ continue;
110
+ }
111
+ schema[name] = parameterToZod(param);
112
+ }
113
+ return schema;
114
+ }
115
+ /**
116
+ * Build the full MCP tool registration metadata from a ToolDefinition.
117
+ *
118
+ * @returns Object ready for server.registerTool(name, metadata, handler)
119
+ */
120
+ export function toolToMcpRegistration(tool) {
121
+ const schema = convertParametersToMcpSchema(tool.parameters || {});
122
+ // Tools with requires_approval need the _matimo_approved parameter in
123
+ // the MCP schema so clients can confirm destructive operations.
124
+ if (tool.requires_approval) {
125
+ schema._matimo_approved = z
126
+ .boolean()
127
+ .optional()
128
+ .describe('Set to true to confirm execution of this approval-required tool');
129
+ }
130
+ return {
131
+ title: tool.name,
132
+ description: tool.description || tool.name,
133
+ inputSchema: schema,
134
+ };
135
+ }
136
+ /**
137
+ * Extract auth placeholder names from a tool's execution config.
138
+ * These are the env var names the tool needs (e.g., SLACK_BOT_TOKEN, GITHUB_TOKEN).
139
+ * Used by `matimo mcp setup` to generate config templates.
140
+ */
141
+ export function extractAuthPlaceholders(tool) {
142
+ const placeholders = [];
143
+ // Use \w+ (word chars only) instead of [^}]+ to avoid polynomial backtracking (ReDoS) on
144
+ // uncontrolled input — placeholder names are always alphanumeric identifiers anyway.
145
+ const placeholderRegex = /\{(\w+)\}/g;
146
+ const execution = tool.execution;
147
+ const scanString = (str) => {
148
+ placeholderRegex.lastIndex = 0; // reset before each scan to avoid stale lastIndex from /g flag
149
+ let match;
150
+ while ((match = placeholderRegex.exec(str)) !== null) {
151
+ const name = match[1];
152
+ if (isAuthParameter(name) && !placeholders.includes(name)) {
153
+ placeholders.push(name);
154
+ }
155
+ }
156
+ };
157
+ const scanObject = (obj) => {
158
+ if (typeof obj === 'string') {
159
+ scanString(obj);
160
+ }
161
+ else if (obj && typeof obj === 'object') {
162
+ for (const value of Object.values(obj)) {
163
+ scanObject(value);
164
+ }
165
+ }
166
+ };
167
+ // Scan URL, headers, body, query_params
168
+ if ('url' in execution)
169
+ scanString(execution.url);
170
+ if ('headers' in execution && execution.headers)
171
+ scanObject(execution.headers);
172
+ if ('body' in execution && execution.body)
173
+ scanObject(execution.body);
174
+ if ('query_params' in execution && execution.query_params)
175
+ scanObject(execution.query_params);
176
+ if ('args' in execution && execution.args) {
177
+ for (const arg of execution.args) {
178
+ scanString(arg);
179
+ }
180
+ }
181
+ if ('command' in execution)
182
+ scanString(execution.command);
183
+ return placeholders;
184
+ }
185
+ //# sourceMappingURL=tool-converter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-converter.js","sourceRoot":"","sources":["../../src/mcp/tool-converter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Approval Manifest for Matimo.
3
+ *
4
+ * Manages HMAC-signed approval records for agent-created tools.
5
+ * Prevents agent forgery of approvals via cryptographic verification.
6
+ */
7
+ export interface ApprovalRecord {
8
+ name: string;
9
+ hash: string;
10
+ signature: string;
11
+ approvedAt: string;
12
+ approvedBy?: string;
13
+ }
14
+ export declare class ApprovalManifest {
15
+ private readonly secret;
16
+ private readonly manifestPath;
17
+ private cache;
18
+ private pendingSet;
19
+ private readonly ttlSeconds;
20
+ /**
21
+ * @param approvalDir - Directory where `.matimo-approvals.json` lives
22
+ * @param secret - HMAC secret. If not provided, reads `MATIMO_APPROVAL_SECRET`
23
+ * from env. If that's also missing, generates one and logs it.
24
+ * @param ttlSeconds - Optional TTL in seconds. Approvals older than this are treated as expired.
25
+ */
26
+ constructor(approvalDir: string, secret?: string, ttlSeconds?: number);
27
+ /**
28
+ * Compute the HMAC signature for a tool approval.
29
+ */
30
+ private sign;
31
+ /**
32
+ * Compute SHA-256 hash of content.
33
+ */
34
+ computeHash(content: string): string;
35
+ /**
36
+ * Verify that an approval record has a valid HMAC signature and
37
+ * the stored hash matches the current YAML content hash.
38
+ */
39
+ isApproved(toolName: string, currentYamlHash: string): boolean;
40
+ /**
41
+ * Approve a tool. Creates an HMAC-signed record in the manifest.
42
+ */
43
+ approve(toolName: string, yamlHash: string, approvedBy?: string): void;
44
+ /**
45
+ * Revoke a tool's approval. Removes from both cache and pendingSet
46
+ * to ensure consistent state (tool no longer tracked as approved or pending).
47
+ */
48
+ revoke(toolName: string): boolean;
49
+ /**
50
+ * Get the approval record for a tool.
51
+ */
52
+ getApproval(toolName: string): ApprovalRecord | undefined;
53
+ /**
54
+ * List all approved tool names.
55
+ */
56
+ listApproved(): string[];
57
+ /**
58
+ * Mark a tool as pending approval. Called by matimo_create_tool after writing to disk.
59
+ */
60
+ markPending(toolName: string): void;
61
+ /**
62
+ * Return all tool names that have been proposed (written to disk) but not yet approved.
63
+ */
64
+ getPendingTools(): string[];
65
+ /**
66
+ * Load the manifest file from disk.
67
+ */
68
+ private loadFromDisk;
69
+ /**
70
+ * Save current approvals to disk using atomic write pattern.
71
+ * Writes to a temporary file first, then atomically renames it.
72
+ * This prevents data corruption if the process crashes mid-write.
73
+ */
74
+ private saveToDisk;
75
+ }
76
+ //# sourceMappingURL=approval-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-manifest.d.ts","sourceRoot":"","sources":["../../src/policy/approval-manifest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAQD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAEhD;;;;;OAKG;gBACS,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IAkCrE;;OAEG;IACH,OAAO,CAAC,IAAI;IAIZ;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAIpC;;;OAGG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO;IAsB9D;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAatE;;;OAGG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IASjC;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIzD;;OAEG;IACH,YAAY,IAAI,MAAM,EAAE;IAIxB;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKnC;;OAEG;IACH,eAAe,IAAI,MAAM,EAAE;IAI3B;;OAEG;IACH,OAAO,CAAC,YAAY;IA+BpB;;;;OAIG;IACH,OAAO,CAAC,UAAU;CAoBnB"}