@oka-core/reason 0.2.14 → 0.2.16

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 (163) hide show
  1. package/dist/abort-controller.d.ts +19 -0
  2. package/dist/abort-controller.d.ts.map +1 -0
  3. package/dist/abort-controller.js +53 -0
  4. package/dist/activity-tracker.d.ts +48 -0
  5. package/dist/activity-tracker.d.ts.map +1 -0
  6. package/dist/activity-tracker.js +80 -0
  7. package/dist/analytics.d.ts +49 -0
  8. package/dist/analytics.d.ts.map +1 -0
  9. package/dist/analytics.js +88 -0
  10. package/dist/array.d.ts +12 -0
  11. package/dist/array.d.ts.map +1 -0
  12. package/dist/array.js +20 -0
  13. package/dist/async-context.d.ts +20 -0
  14. package/dist/async-context.d.ts.map +1 -0
  15. package/dist/async-context.js +25 -0
  16. package/dist/auth.d.ts +15 -0
  17. package/dist/auth.d.ts.map +1 -1
  18. package/dist/auth.js +77 -0
  19. package/dist/binary-check.d.ts +16 -0
  20. package/dist/binary-check.d.ts.map +1 -0
  21. package/dist/binary-check.js +43 -0
  22. package/dist/buffered-writer.d.ts +30 -0
  23. package/dist/buffered-writer.d.ts.map +1 -0
  24. package/dist/buffered-writer.js +87 -0
  25. package/dist/circular-buffer.d.ts +28 -0
  26. package/dist/circular-buffer.d.ts.map +1 -0
  27. package/dist/circular-buffer.js +61 -0
  28. package/dist/cleanup-registry.d.ts +23 -0
  29. package/dist/cleanup-registry.d.ts.map +1 -0
  30. package/dist/cleanup-registry.js +34 -0
  31. package/dist/client.d.ts +6 -5
  32. package/dist/client.d.ts.map +1 -1
  33. package/dist/client.js +51 -64
  34. package/dist/combined-abort-signal.d.ts +25 -0
  35. package/dist/combined-abort-signal.d.ts.map +1 -0
  36. package/dist/combined-abort-signal.js +47 -0
  37. package/dist/cron-lock.d.ts +29 -0
  38. package/dist/cron-lock.d.ts.map +1 -0
  39. package/dist/cron-lock.js +127 -0
  40. package/dist/cron-scheduler.d.ts +41 -0
  41. package/dist/cron-scheduler.d.ts.map +1 -0
  42. package/dist/cron-scheduler.js +189 -0
  43. package/dist/cron-tasks.d.ts +86 -0
  44. package/dist/cron-tasks.d.ts.map +1 -0
  45. package/dist/cron-tasks.js +205 -0
  46. package/dist/cron.d.ts +35 -0
  47. package/dist/cron.d.ts.map +1 -0
  48. package/dist/cron.js +215 -0
  49. package/dist/env.d.ts +26 -0
  50. package/dist/env.d.ts.map +1 -0
  51. package/dist/env.js +50 -0
  52. package/dist/errors.d.ts +99 -0
  53. package/dist/errors.d.ts.map +1 -0
  54. package/dist/errors.js +214 -0
  55. package/dist/format.d.ts +21 -0
  56. package/dist/format.d.ts.map +1 -0
  57. package/dist/format.js +48 -0
  58. package/dist/fps-tracker.d.ts +22 -0
  59. package/dist/fps-tracker.d.ts.map +1 -0
  60. package/dist/fps-tracker.js +44 -0
  61. package/dist/graceful-shutdown.d.ts +35 -0
  62. package/dist/graceful-shutdown.d.ts.map +1 -0
  63. package/dist/graceful-shutdown.js +89 -0
  64. package/dist/hash.d.ts +21 -0
  65. package/dist/hash.d.ts.map +1 -0
  66. package/dist/hash.js +31 -0
  67. package/dist/heap-diagnostics.d.ts +68 -0
  68. package/dist/heap-diagnostics.d.ts.map +1 -0
  69. package/dist/heap-diagnostics.js +110 -0
  70. package/dist/idle-timeout.d.ts +21 -0
  71. package/dist/idle-timeout.d.ts.map +1 -0
  72. package/dist/idle-timeout.js +42 -0
  73. package/dist/index.d.ts +2 -1
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +5 -0
  76. package/dist/intl.d.ts +18 -0
  77. package/dist/intl.d.ts.map +1 -0
  78. package/dist/intl.js +75 -0
  79. package/dist/jsonl.d.ts +16 -0
  80. package/dist/jsonl.d.ts.map +1 -0
  81. package/dist/jsonl.js +60 -0
  82. package/dist/lazy-schema.d.ts +6 -0
  83. package/dist/lazy-schema.d.ts.map +1 -0
  84. package/dist/lazy-schema.js +8 -0
  85. package/dist/memo.d.ts +64 -0
  86. package/dist/memo.d.ts.map +1 -0
  87. package/dist/memo.js +162 -0
  88. package/dist/pkce.d.ts +13 -0
  89. package/dist/pkce.d.ts.map +1 -0
  90. package/dist/pkce.js +28 -0
  91. package/dist/priority-queue.d.ts +36 -0
  92. package/dist/priority-queue.d.ts.map +1 -0
  93. package/dist/priority-queue.js +97 -0
  94. package/dist/process-utils.d.ts +20 -0
  95. package/dist/process-utils.d.ts.map +1 -0
  96. package/dist/process-utils.js +54 -0
  97. package/dist/query-guard.d.ts +34 -0
  98. package/dist/query-guard.d.ts.map +1 -0
  99. package/dist/query-guard.js +74 -0
  100. package/dist/retry.d.ts +60 -0
  101. package/dist/retry.d.ts.map +1 -0
  102. package/dist/retry.js +89 -0
  103. package/dist/schemas.d.ts +6 -6
  104. package/dist/secrets.d.ts +44 -0
  105. package/dist/secrets.d.ts.map +1 -0
  106. package/dist/secrets.js +115 -0
  107. package/dist/semantic-types.d.ts +39 -0
  108. package/dist/semantic-types.d.ts.map +1 -0
  109. package/dist/semantic-types.js +49 -0
  110. package/dist/sequential.d.ts +21 -0
  111. package/dist/sequential.d.ts.map +1 -0
  112. package/dist/sequential.js +49 -0
  113. package/dist/signal.d.ts +29 -0
  114. package/dist/signal.d.ts.map +1 -0
  115. package/dist/signal.js +39 -0
  116. package/dist/sleep.d.ts +21 -0
  117. package/dist/sleep.d.ts.map +1 -0
  118. package/dist/sleep.js +58 -0
  119. package/dist/slow-ops.d.ts +41 -0
  120. package/dist/slow-ops.d.ts.map +1 -0
  121. package/dist/slow-ops.js +133 -0
  122. package/dist/store.d.ts +20 -0
  123. package/dist/store.d.ts.map +1 -0
  124. package/dist/store.js +34 -0
  125. package/dist/stream.d.ts +29 -0
  126. package/dist/stream.d.ts.map +1 -0
  127. package/dist/stream.js +92 -0
  128. package/dist/string-utils.d.ts +46 -0
  129. package/dist/string-utils.d.ts.map +1 -0
  130. package/dist/string-utils.js +69 -0
  131. package/dist/strip-bom.d.ts +8 -0
  132. package/dist/strip-bom.d.ts.map +1 -0
  133. package/dist/strip-bom.js +10 -0
  134. package/dist/subprocess-env.d.ts +25 -0
  135. package/dist/subprocess-env.d.ts.map +1 -0
  136. package/dist/subprocess-env.js +55 -0
  137. package/dist/temp-file.d.ts +18 -0
  138. package/dist/temp-file.d.ts.map +1 -0
  139. package/dist/temp-file.js +26 -0
  140. package/dist/tool-contract.d.ts +85 -0
  141. package/dist/tool-contract.d.ts.map +1 -0
  142. package/dist/tool-contract.js +101 -0
  143. package/dist/tools/auth.d.ts.map +1 -1
  144. package/dist/tools/auth.js +8 -7
  145. package/dist/tools/read.d.ts +2 -10
  146. package/dist/tools/read.d.ts.map +1 -1
  147. package/dist/tools/read.js +662 -537
  148. package/dist/tools/write.d.ts +3 -2
  149. package/dist/tools/write.d.ts.map +1 -1
  150. package/dist/tools/write.js +329 -177
  151. package/dist/uuid.d.ts +20 -0
  152. package/dist/uuid.d.ts.map +1 -0
  153. package/dist/uuid.js +28 -0
  154. package/dist/validation.d.ts +64 -0
  155. package/dist/validation.d.ts.map +1 -0
  156. package/dist/validation.js +236 -0
  157. package/dist/with-resolvers.d.ts +12 -0
  158. package/dist/with-resolvers.d.ts.map +1 -0
  159. package/dist/with-resolvers.js +14 -0
  160. package/dist/xml-escape.d.ts +12 -0
  161. package/dist/xml-escape.d.ts.map +1 -0
  162. package/dist/xml-escape.js +15 -0
  163. package/package.json +1 -1
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Secret-aware environment scrubbing for subprocess spawning.
3
+ *
4
+ * Strips sensitive variables (API keys, cloud credentials, OIDC tokens)
5
+ * from child process environments to prevent exfiltration via shell
6
+ * expansion in CI/CD and agent contexts.
7
+ *
8
+ * Inspired by Claude Code's `src/utils/subprocessEnv.ts`.
9
+ */
10
+ export type SubprocessEnvOptions = {
11
+ /** Environment variable that gates scrubbing. Default: OKA_SUBPROCESS_ENV_SCRUB. */
12
+ enableEnvVar?: string;
13
+ /** Additional variables to scrub beyond defaults. */
14
+ extraScrubList?: readonly string[];
15
+ /** Completely replace the default scrub list. */
16
+ scrubList?: readonly string[];
17
+ };
18
+ /**
19
+ * Create a scrubbed copy of `process.env` for subprocess spawning.
20
+ *
21
+ * Scrubbing is only active when the gate env var is truthy.
22
+ * Also scrubs `INPUT_<NAME>` variants (GitHub Actions auto-creates these).
23
+ */
24
+ export declare function createSubprocessEnv(opts?: SubprocessEnvOptions): NodeJS.ProcessEnv;
25
+ //# sourceMappingURL=subprocess-env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subprocess-env.d.ts","sourceRoot":"","sources":["../src/subprocess-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA+BH,MAAM,MAAM,oBAAoB,GAAG;IACjC,oFAAoF;IACpF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,iDAAiD;IACjD,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,CAAC,EAAE,oBAAoB,GAC1B,MAAM,CAAC,UAAU,CAmBnB"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Secret-aware environment scrubbing for subprocess spawning.
3
+ *
4
+ * Strips sensitive variables (API keys, cloud credentials, OIDC tokens)
5
+ * from child process environments to prevent exfiltration via shell
6
+ * expansion in CI/CD and agent contexts.
7
+ *
8
+ * Inspired by Claude Code's `src/utils/subprocessEnv.ts`.
9
+ */
10
+ import { isEnvTruthy } from "./env.js";
11
+ /** Default variables to scrub from subprocess environments. */
12
+ const DEFAULT_SCRUB_LIST = [
13
+ // API keys
14
+ "ANTHROPIC_API_KEY",
15
+ "OPENAI_API_KEY",
16
+ "OPENROUTER_API_KEY",
17
+ // Cloud provider credentials
18
+ "AWS_SECRET_ACCESS_KEY",
19
+ "AWS_SESSION_TOKEN",
20
+ "GOOGLE_APPLICATION_CREDENTIALS",
21
+ "AZURE_CLIENT_SECRET",
22
+ "AZURE_CLIENT_CERTIFICATE_PATH",
23
+ // OTEL exporter headers (may carry Bearer tokens)
24
+ "OTEL_EXPORTER_OTLP_HEADERS",
25
+ "OTEL_EXPORTER_OTLP_LOGS_HEADERS",
26
+ "OTEL_EXPORTER_OTLP_METRICS_HEADERS",
27
+ "OTEL_EXPORTER_OTLP_TRACES_HEADERS",
28
+ // GitHub Actions OIDC + runtime tokens
29
+ "ACTIONS_ID_TOKEN_REQUEST_TOKEN",
30
+ "ACTIONS_ID_TOKEN_REQUEST_URL",
31
+ "ACTIONS_RUNTIME_TOKEN",
32
+ "ACTIONS_RUNTIME_URL",
33
+ ];
34
+ /**
35
+ * Create a scrubbed copy of `process.env` for subprocess spawning.
36
+ *
37
+ * Scrubbing is only active when the gate env var is truthy.
38
+ * Also scrubs `INPUT_<NAME>` variants (GitHub Actions auto-creates these).
39
+ */
40
+ export function createSubprocessEnv(opts) {
41
+ const gateVar = opts?.enableEnvVar ?? "OKA_SUBPROCESS_ENV_SCRUB";
42
+ if (!isEnvTruthy(process.env[gateVar])) {
43
+ return process.env;
44
+ }
45
+ const env = { ...process.env };
46
+ const scrubList = opts?.scrubList ?? [
47
+ ...DEFAULT_SCRUB_LIST,
48
+ ...(opts?.extraScrubList ?? []),
49
+ ];
50
+ for (const k of scrubList) {
51
+ delete env[k];
52
+ delete env[`INPUT_${k}`];
53
+ }
54
+ return env;
55
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Temporary file path generation — deterministic (content-hashed) or random.
3
+ *
4
+ * Inspired by Claude Code's `src/utils/tempfile.ts`.
5
+ */
6
+ /**
7
+ * Generate a temporary file path.
8
+ *
9
+ * @param prefix File name prefix (default: "oka-tmp")
10
+ * @param extension File extension including dot (default: ".md")
11
+ * @param options.contentHash When provided, the ID is a stable SHA-256
12
+ * prefix of this string. Same content → same path across processes.
13
+ * Use when the path is included in API payloads (avoids cache busting).
14
+ */
15
+ export declare function generateTempFilePath(prefix?: string, extension?: string, options?: {
16
+ contentHash?: string;
17
+ }): string;
18
+ //# sourceMappingURL=temp-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temp-file.d.ts","sourceRoot":"","sources":["../src/temp-file.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,SAAY,EAClB,SAAS,SAAQ,EACjB,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACjC,MAAM,CAQR"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Temporary file path generation — deterministic (content-hashed) or random.
3
+ *
4
+ * Inspired by Claude Code's `src/utils/tempfile.ts`.
5
+ */
6
+ import { createHash, randomUUID } from "crypto";
7
+ import { tmpdir } from "os";
8
+ import { join } from "path";
9
+ /**
10
+ * Generate a temporary file path.
11
+ *
12
+ * @param prefix File name prefix (default: "oka-tmp")
13
+ * @param extension File extension including dot (default: ".md")
14
+ * @param options.contentHash When provided, the ID is a stable SHA-256
15
+ * prefix of this string. Same content → same path across processes.
16
+ * Use when the path is included in API payloads (avoids cache busting).
17
+ */
18
+ export function generateTempFilePath(prefix = "oka-tmp", extension = ".md", options) {
19
+ const id = options?.contentHash
20
+ ? createHash("sha256")
21
+ .update(options.contentHash)
22
+ .digest("hex")
23
+ .slice(0, 16)
24
+ : randomUUID();
25
+ return join(tmpdir(), `${prefix}-${id}${extension}`);
26
+ }
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Tool contract pattern — typed, composable MCP tool definitions.
3
+ *
4
+ * ZERO external dependencies beyond Zod (already required by MCP SDK).
5
+ *
6
+ * Inspired by Claude Code's Tool<Input,Output> pattern:
7
+ * - Separates tool definition from MCP registration
8
+ * - Permission pipeline (allow/deny/ask)
9
+ * - Input validation lifecycle
10
+ * - Lazy schema construction
11
+ * - Concurrency and read-only markers for pool assembly
12
+ */
13
+ import type { z, ZodRawShape } from "zod";
14
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
15
+ export type PermissionResult = {
16
+ decision: "allow";
17
+ } | {
18
+ decision: "deny";
19
+ reason: string;
20
+ } | {
21
+ decision: "ask";
22
+ prompt: string;
23
+ };
24
+ /** A typed, framework-agnostic tool definition. */
25
+ export interface ToolDef<TShape extends ZodRawShape = ZodRawShape> {
26
+ /** Unique tool name (used as MCP tool ID). */
27
+ name: string;
28
+ /** Human-readable description for the agent. */
29
+ description: string;
30
+ /** Zod shape for input validation. */
31
+ inputSchema: TShape;
32
+ /** Whether this tool only reads data (no side effects). */
33
+ isReadOnly: boolean;
34
+ /** Whether concurrent invocations are safe. */
35
+ isConcurrencySafe: boolean;
36
+ /** Optional permission check before execution. */
37
+ checkPermissions?: (input: z.objectOutputType<TShape, z.ZodTypeAny>) => PermissionResult;
38
+ /** The tool handler. */
39
+ call: (input: z.objectOutputType<TShape, z.ZodTypeAny>) => Promise<{
40
+ content: Array<{
41
+ type: "text";
42
+ text: string;
43
+ }>;
44
+ }>;
45
+ }
46
+ interface BuildToolOpts<TShape extends ZodRawShape> {
47
+ name: string;
48
+ description: string;
49
+ inputSchema: TShape;
50
+ isReadOnly?: boolean;
51
+ isConcurrencySafe?: boolean;
52
+ checkPermissions?: ToolDef<TShape>["checkPermissions"];
53
+ call: ToolDef<TShape>["call"];
54
+ }
55
+ /** Build a typed tool definition with sensible defaults. */
56
+ export declare function buildTool<TShape extends ZodRawShape>(opts: BuildToolOpts<TShape>): ToolDef<TShape>;
57
+ /**
58
+ * Defer schema construction until first access.
59
+ * Useful when Zod shapes depend on runtime config.
60
+ */
61
+ export declare function lazySchema<TShape extends ZodRawShape>(factory: () => TShape): TShape;
62
+ /** A named deny rule that prevents certain tools from registering. */
63
+ export interface DenyRule {
64
+ /** Tool names to deny. */
65
+ names: string[];
66
+ reason: string;
67
+ }
68
+ /**
69
+ * Assemble a tool pool from definitions, applying deny rules and deduplication.
70
+ * Returns only tools that pass all rules.
71
+ */
72
+ export declare function assembleToolPool(tools: ToolDef[], denyRules?: DenyRule[]): ToolDef[];
73
+ /**
74
+ * Register a ToolDef on an MCP server instance.
75
+ *
76
+ * This is the thin adapter that bridges our typed tool definitions
77
+ * to the MCP SDK's `server.tool()` registration.
78
+ */
79
+ export declare function wrapForMcp(tool: ToolDef, server: McpServer): void;
80
+ /**
81
+ * Register all tools from a pool onto an MCP server.
82
+ */
83
+ export declare function registerToolPool(tools: ToolDef[], server: McpServer): void;
84
+ export {};
85
+ //# sourceMappingURL=tool-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-contract.d.ts","sourceRoot":"","sources":["../src/tool-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,MAAM,MAAM,gBAAgB,GACxB;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,GACrB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,QAAQ,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAIxC,mDAAmD;AACnD,MAAM,WAAW,OAAO,CAAC,MAAM,SAAS,WAAW,GAAG,WAAW;IAC/D,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,UAAU,EAAE,OAAO,CAAC;IACpB,+CAA+C;IAC/C,iBAAiB,EAAE,OAAO,CAAC;IAC3B,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,CACjB,KAAK,EAAE,CAAC,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,KAC5C,gBAAgB,CAAC;IACtB,wBAAwB;IACxB,IAAI,EAAE,CACJ,KAAK,EAAE,CAAC,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,KAC5C,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;CAClE;AAID,UAAU,aAAa,CAAC,MAAM,SAAS,WAAW;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IACvD,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;CAC/B;AAED,4DAA4D;AAC5D,wBAAgB,SAAS,CAAC,MAAM,SAAS,WAAW,EAClD,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAC1B,OAAO,CAAC,MAAM,CAAC,CAUjB;AAID;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,SAAS,WAAW,EACnD,OAAO,EAAE,MAAM,MAAM,GACpB,MAAM,CAgBR;AAID,sEAAsE;AACtE,MAAM,WAAW,QAAQ;IACvB,0BAA0B;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,OAAO,EAAE,EAChB,SAAS,CAAC,EAAE,QAAQ,EAAE,GACrB,OAAO,EAAE,CAeX;AAID;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAcjE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAI1E"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Tool contract pattern — typed, composable MCP tool definitions.
3
+ *
4
+ * ZERO external dependencies beyond Zod (already required by MCP SDK).
5
+ *
6
+ * Inspired by Claude Code's Tool<Input,Output> pattern:
7
+ * - Separates tool definition from MCP registration
8
+ * - Permission pipeline (allow/deny/ask)
9
+ * - Input validation lifecycle
10
+ * - Lazy schema construction
11
+ * - Concurrency and read-only markers for pool assembly
12
+ */
13
+ /** Build a typed tool definition with sensible defaults. */
14
+ export function buildTool(opts) {
15
+ return {
16
+ name: opts.name,
17
+ description: opts.description,
18
+ inputSchema: opts.inputSchema,
19
+ isReadOnly: opts.isReadOnly ?? false,
20
+ isConcurrencySafe: opts.isConcurrencySafe ?? true,
21
+ checkPermissions: opts.checkPermissions,
22
+ call: opts.call,
23
+ };
24
+ }
25
+ // ─── Lazy Schema ────────────────────────────────────────────────────
26
+ /**
27
+ * Defer schema construction until first access.
28
+ * Useful when Zod shapes depend on runtime config.
29
+ */
30
+ export function lazySchema(factory) {
31
+ let cached = null;
32
+ return new Proxy({}, {
33
+ get(_target, prop, receiver) {
34
+ if (!cached)
35
+ cached = factory();
36
+ return Reflect.get(cached, prop, receiver);
37
+ },
38
+ ownKeys() {
39
+ if (!cached)
40
+ cached = factory();
41
+ return Reflect.ownKeys(cached);
42
+ },
43
+ getOwnPropertyDescriptor(_target, prop) {
44
+ if (!cached)
45
+ cached = factory();
46
+ return Object.getOwnPropertyDescriptor(cached, prop);
47
+ },
48
+ });
49
+ }
50
+ /**
51
+ * Assemble a tool pool from definitions, applying deny rules and deduplication.
52
+ * Returns only tools that pass all rules.
53
+ */
54
+ export function assembleToolPool(tools, denyRules) {
55
+ const denied = new Set();
56
+ for (const rule of denyRules ?? []) {
57
+ for (const name of rule.names)
58
+ denied.add(name);
59
+ }
60
+ const seen = new Set();
61
+ const result = [];
62
+ for (const tool of tools) {
63
+ if (denied.has(tool.name))
64
+ continue;
65
+ if (seen.has(tool.name))
66
+ continue;
67
+ seen.add(tool.name);
68
+ result.push(tool);
69
+ }
70
+ return result;
71
+ }
72
+ // ─── MCP Adapter ────────────────────────────────────────────────────
73
+ /**
74
+ * Register a ToolDef on an MCP server instance.
75
+ *
76
+ * This is the thin adapter that bridges our typed tool definitions
77
+ * to the MCP SDK's `server.tool()` registration.
78
+ */
79
+ export function wrapForMcp(tool, server) {
80
+ server.tool(tool.name, tool.description, tool.inputSchema, async (input) => {
81
+ // Permission check
82
+ if (tool.checkPermissions) {
83
+ const perm = tool.checkPermissions(input);
84
+ if (perm.decision === "deny") {
85
+ return {
86
+ content: [{ type: "text", text: `Denied: ${perm.reason}` }],
87
+ isError: true,
88
+ };
89
+ }
90
+ }
91
+ return tool.call(input);
92
+ });
93
+ }
94
+ /**
95
+ * Register all tools from a pool onto an MCP server.
96
+ */
97
+ export function registerToolPool(tools, server) {
98
+ for (const tool of tools) {
99
+ wrapForMcp(tool, server);
100
+ }
101
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/tools/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAQ9C;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CA8I5E"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/tools/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAU9C;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CA8I5E"}
@@ -1,5 +1,6 @@
1
1
  import { z } from "zod";
2
- import { deviceAuthLogin, loadStoredCredentials, resolveApiKey, resolveApiKeyWithRefresh, } from "../auth.js";
2
+ import { McpTokenManager, deviceAuthLogin, loadStoredCredentials, resolveApiKey, } from "../auth.js";
3
+ const tokenManager = new McpTokenManager();
3
4
  /**
4
5
  * Register auth tools on the MCP server.
5
6
  */
@@ -29,10 +30,10 @@ export function registerAuthTools(server, client) {
29
30
  ],
30
31
  };
31
32
  }
32
- // Token might be expired — try refresh before opening browser
33
+ // Token might be expired — try proactive refresh before opening browser
33
34
  const stored = loadStoredCredentials();
34
35
  if (stored?.refresh_token) {
35
- const refreshed = await resolveApiKeyWithRefresh();
36
+ const refreshed = await tokenManager.getValidToken();
36
37
  if (refreshed) {
37
38
  client.updateApiKey(refreshed);
38
39
  return {
@@ -83,11 +84,11 @@ export function registerAuthTools(server, client) {
83
84
  }
84
85
  });
85
86
  server.tool("whoami", "Check current authentication status — whether the MCP server has valid credentials.", {}, async () => {
86
- // First try sync resolution
87
- let key = resolveApiKey();
88
- // If no key found, try async refresh
87
+ // Try token manager (proactive refresh)
88
+ let key = await tokenManager.getValidToken();
89
+ // If token manager returned empty, key might still be in sync path
89
90
  if (!key) {
90
- key = await resolveApiKeyWithRefresh();
91
+ key = resolveApiKey();
91
92
  if (key) {
92
93
  return {
93
94
  content: [
@@ -1,17 +1,9 @@
1
1
  import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import type { OkaClient } from "../client.js";
3
+ import { type ToolDef } from "../tool-contract.js";
4
+ export declare function buildReadTools(client: OkaClient): ToolDef[];
3
5
  /**
4
6
  * Register read tools on the MCP server.
5
- *
6
- * Tools:
7
- * - context — ranked learnings for a topic (flagship query)
8
- * - learnings — browse institutional knowledge
9
- * - decisions — decision log
10
- * - patterns — recurring patterns
11
- * - suggest — evidence-ranked priorities
12
- * - backlog — agentic product backlog
13
- * - priorities — evidence-ranked priorities from approved backlog
14
- * - consolidate — manually trigger a consolidation run
15
7
  */
16
8
  export declare function registerReadTools(server: McpServer, client: OkaClient): void;
17
9
  //# sourceMappingURL=read.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/tools/read.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EACV,SAAS,EAKV,MAAM,cAAc,CAAC;AAiItB;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAopB5E"}
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/tools/read.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EACV,SAAS,EAKV,MAAM,cAAc,CAAC;AAKtB,OAAO,EAA+B,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAgIhF,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,EAAE,CAivB3D;AAID;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAE5E"}