@jitera/connect 0.1.1 → 0.7.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 (111) hide show
  1. package/.claude-plugin/plugin.json +12 -9
  2. package/.codex-plugin/plugin.json +1 -1
  3. package/README.md +17 -3
  4. package/dist/adapters/codex.d.ts +4 -0
  5. package/dist/adapters/codex.d.ts.map +1 -0
  6. package/dist/adapters/codex.js +49 -0
  7. package/dist/adapters/codex.js.map +1 -0
  8. package/dist/adapters/cursor.d.ts +4 -0
  9. package/dist/adapters/cursor.d.ts.map +1 -0
  10. package/dist/adapters/cursor.js +47 -0
  11. package/dist/adapters/cursor.js.map +1 -0
  12. package/dist/adapters/types.d.ts +25 -0
  13. package/dist/adapters/types.d.ts.map +1 -0
  14. package/dist/adapters/types.js +2 -0
  15. package/dist/adapters/types.js.map +1 -0
  16. package/dist/bin/cli.d.ts +3 -0
  17. package/dist/bin/cli.d.ts.map +1 -0
  18. package/dist/bin/cli.js +164 -0
  19. package/dist/bin/cli.js.map +1 -0
  20. package/dist/bin/login.d.ts +3 -0
  21. package/dist/bin/login.d.ts.map +1 -0
  22. package/dist/bin/login.js +145 -0
  23. package/dist/bin/login.js.map +1 -0
  24. package/dist/bin/proxy.d.ts +3 -0
  25. package/dist/bin/proxy.d.ts.map +1 -0
  26. package/dist/bin/proxy.js +19 -0
  27. package/dist/bin/proxy.js.map +1 -0
  28. package/dist/bin/validate.d.ts +3 -0
  29. package/dist/bin/validate.d.ts.map +1 -0
  30. package/dist/bin/validate.js +13 -0
  31. package/dist/bin/validate.js.map +1 -0
  32. package/dist/device-flow.d.ts +30 -0
  33. package/dist/device-flow.d.ts.map +1 -0
  34. package/dist/device-flow.js +105 -0
  35. package/dist/device-flow.js.map +1 -0
  36. package/dist/discovery.d.ts +21 -0
  37. package/dist/discovery.d.ts.map +1 -0
  38. package/dist/discovery.js +58 -0
  39. package/dist/discovery.js.map +1 -0
  40. package/dist/environments.d.ts +18 -0
  41. package/dist/environments.d.ts.map +1 -0
  42. package/dist/environments.js +45 -0
  43. package/dist/environments.js.map +1 -0
  44. package/dist/graphql.d.ts +31 -0
  45. package/dist/graphql.d.ts.map +1 -0
  46. package/dist/graphql.js +100 -0
  47. package/dist/graphql.js.map +1 -0
  48. package/dist/hook-io.d.ts +22 -0
  49. package/dist/hook-io.d.ts.map +1 -0
  50. package/dist/hook-io.js +13 -0
  51. package/dist/hook-io.js.map +1 -0
  52. package/dist/hooks/session-start.d.ts +3 -0
  53. package/dist/hooks/session-start.d.ts.map +1 -0
  54. package/dist/hooks/session-start.js +16 -0
  55. package/dist/hooks/session-start.js.map +1 -0
  56. package/dist/hooks/stop.d.ts +3 -0
  57. package/dist/hooks/stop.d.ts.map +1 -0
  58. package/dist/hooks/stop.js +21 -0
  59. package/dist/hooks/stop.js.map +1 -0
  60. package/dist/hooks/user-prompt-submit.d.ts +3 -0
  61. package/dist/hooks/user-prompt-submit.d.ts.map +1 -0
  62. package/dist/hooks/user-prompt-submit.js +55 -0
  63. package/dist/hooks/user-prompt-submit.js.map +1 -0
  64. package/dist/install/agents-md.d.ts +25 -0
  65. package/dist/install/agents-md.d.ts.map +1 -0
  66. package/dist/install/agents-md.js +58 -0
  67. package/dist/install/agents-md.js.map +1 -0
  68. package/dist/install/render.d.ts +13 -0
  69. package/dist/install/render.d.ts.map +1 -0
  70. package/dist/install/render.js +22 -0
  71. package/dist/install/render.js.map +1 -0
  72. package/dist/install/skills.d.ts +16 -0
  73. package/dist/install/skills.d.ts.map +1 -0
  74. package/dist/install/skills.js +62 -0
  75. package/dist/install/skills.js.map +1 -0
  76. package/dist/manifest.d.ts +62 -0
  77. package/dist/manifest.d.ts.map +1 -0
  78. package/dist/manifest.js +5 -0
  79. package/dist/manifest.js.map +1 -0
  80. package/dist/mcp-client.d.ts +43 -0
  81. package/dist/mcp-client.d.ts.map +1 -0
  82. package/dist/mcp-client.js +85 -0
  83. package/dist/mcp-client.js.map +1 -0
  84. package/dist/mcp-config.d.ts +12 -0
  85. package/dist/mcp-config.d.ts.map +1 -0
  86. package/dist/mcp-config.js +45 -0
  87. package/dist/mcp-config.js.map +1 -0
  88. package/dist/proxy.d.ts +12 -0
  89. package/dist/proxy.d.ts.map +1 -0
  90. package/dist/proxy.js +54 -0
  91. package/dist/proxy.js.map +1 -0
  92. package/dist/session-marker.d.ts +4 -0
  93. package/dist/session-marker.d.ts.map +1 -0
  94. package/dist/session-marker.js +25 -0
  95. package/dist/session-marker.js.map +1 -0
  96. package/dist/toml-section.d.ts +12 -0
  97. package/dist/toml-section.d.ts.map +1 -0
  98. package/dist/toml-section.js +66 -0
  99. package/dist/toml-section.js.map +1 -0
  100. package/dist/validate.d.ts +11 -0
  101. package/dist/validate.d.ts.map +1 -0
  102. package/dist/validate.js +58 -0
  103. package/dist/validate.js.map +1 -0
  104. package/hooks/hooks.json +15 -2
  105. package/package.json +13 -6
  106. package/bin/jitera-connect.mjs +0 -120
  107. package/hooks/scripts/session-start.mjs +0 -36
  108. package/hooks/scripts/stop.mjs +0 -39
  109. package/src/adapters/cursor.mjs +0 -56
  110. package/src/environments.mjs +0 -46
  111. package/src/mcp-config.mjs +0 -45
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env node
2
+ import { callTool, McpCallError } from "../mcp-client.js";
3
+ import { discoverDeployment } from "../discovery.js";
4
+ import { emitContext, readHookInput } from "../hook-io.js";
5
+ import { claimOnce } from "../session-marker.js";
6
+ const MAX_CONTEXT_CHARS = 6000;
7
+ const RECALL_TIMEOUT_MS = 8000;
8
+ const input = readHookInput();
9
+ if (!claimOnce(input.session_id, "recall"))
10
+ process.exit(0);
11
+ const apiKey = process.env["CLAUDE_PLUGIN_OPTION_JITERA_API_KEY"] ?? "";
12
+ if (!apiKey)
13
+ process.exit(0);
14
+ let url;
15
+ const override = process.env["JITERA_MCP_URL"];
16
+ if (override) {
17
+ url = override;
18
+ }
19
+ else {
20
+ try {
21
+ const deployment = await discoverDeployment({
22
+ environment: process.env["CLAUDE_PLUGIN_OPTION_ENVIRONMENT"],
23
+ studioUrl: process.env["JITERA_STUDIO_URL"],
24
+ });
25
+ url = deployment.mcpUrl;
26
+ }
27
+ catch (error) {
28
+ process.stderr.write(`jitera-connect: ${error.message}\n`);
29
+ process.exit(0);
30
+ }
31
+ }
32
+ let memory;
33
+ try {
34
+ memory = await callTool({
35
+ url,
36
+ apiKey,
37
+ name: "recall_jitera_memory",
38
+ args: {},
39
+ timeoutMs: RECALL_TIMEOUT_MS,
40
+ });
41
+ }
42
+ catch (error) {
43
+ const message = error instanceof McpCallError ? error.message : String(error);
44
+ process.stderr.write(`jitera-connect: could not load project memory: ${message}\n`);
45
+ process.exit(0);
46
+ }
47
+ if (!memory)
48
+ process.exit(0);
49
+ const body = memory.length > MAX_CONTEXT_CHARS
50
+ ? `${memory.slice(0, MAX_CONTEXT_CHARS)}\n\n[truncated, call recall_jitera_memory for the rest]`
51
+ : memory;
52
+ emitContext("UserPromptSubmit", `Stored project memory for this workspace, loaded at session start:\n\n${body}\n\n` +
53
+ `Treat this as current. Call recall_jitera_memory again if you need a narrower or fuller view, ` +
54
+ `and persist new decisions with remember_jitera_memory.`);
55
+ //# sourceMappingURL=user-prompt-submit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-prompt-submit.js","sourceRoot":"","sources":["../../src/hooks/user-prompt-submit.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAC/B,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAE/B,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;AAE9B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC;IAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAE5D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,IAAI,EAAE,CAAC;AACxE,IAAI,CAAC,MAAM;IAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAE7B,IAAI,GAAW,CAAC;AAChB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAC/C,IAAI,QAAQ,EAAE,CAAC;IACb,GAAG,GAAG,QAAQ,CAAC;AACjB,CAAC;KAAM,CAAC;IACN,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC;YAC1C,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC;YAC5D,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;SAC5C,CAAC,CAAC;QACH,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAoB,KAAe,CAAC,OAAO,IAAI,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,MAAc,CAAC;AACnB,IAAI,CAAC;IACH,MAAM,GAAG,MAAM,QAAQ,CAAC;QACtB,GAAG;QACH,MAAM;QACN,IAAI,EAAE,sBAAsB;QAC5B,IAAI,EAAE,EAAE;QACR,SAAS,EAAE,iBAAiB;KAC7B,CAAC,CAAC;AACL,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,MAAM,OAAO,GAAG,KAAK,YAAY,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kDAAkD,OAAO,IAAI,CAAC,CAAC;IACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,CAAC,MAAM;IAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAE7B,MAAM,IAAI,GACR,MAAM,CAAC,MAAM,GAAG,iBAAiB;IAC/B,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,yDAAyD;IAChG,CAAC,CAAC,MAAM,CAAC;AAEb,WAAW,CACT,kBAAkB,EAClB,yEAAyE,IAAI,MAAM;IACjF,gGAAgG;IAChG,wDAAwD,CAC3D,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { type RenderValues } from "./render.ts";
2
+ export declare const BEGIN_MARKER = "<!-- BEGIN JITERA CONNECT -->";
3
+ export declare const END_MARKER = "<!-- END JITERA CONNECT -->";
4
+ export interface BlockUpsertResult {
5
+ readonly content: string;
6
+ readonly changed: boolean;
7
+ readonly action: "created" | "replaced" | "appended" | "unchanged";
8
+ }
9
+ export declare function upsertBlock(existing: string | undefined, block: string): BlockUpsertResult;
10
+ export declare function ensureClaudeImport(existing: string | undefined): BlockUpsertResult;
11
+ export interface AgentsMdOptions {
12
+ readonly packageRoot: string;
13
+ readonly projectRoot: string;
14
+ readonly values: RenderValues;
15
+ readonly dryRun?: boolean;
16
+ }
17
+ export interface AgentsMdResult {
18
+ readonly agentsPath: string;
19
+ readonly claudePath: string;
20
+ readonly agents: BlockUpsertResult;
21
+ readonly claude: BlockUpsertResult;
22
+ readonly changed: boolean;
23
+ }
24
+ export declare function writeAgentsMd({ packageRoot, projectRoot, values, dryRun, }: AgentsMdOptions): AgentsMdResult;
25
+ //# sourceMappingURL=agents-md.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-md.d.ts","sourceRoot":"","sources":["../../src/install/agents-md.ts"],"names":[],"mappings":"AAGA,OAAO,EAAU,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAExD,eAAO,MAAM,YAAY,kCAAkC,CAAC;AAC5D,eAAO,MAAM,UAAU,gCAAgC,CAAC;AAGxD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;CACpE;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAuB1F;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,iBAAiB,CAYlF;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAMD,wBAAgB,aAAa,CAAC,EAC5B,WAAW,EACX,WAAW,EACX,MAAM,EACN,MAAc,GACf,EAAE,eAAe,GAAG,cAAc,CAgBlC"}
@@ -0,0 +1,58 @@
1
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { render } from "./render.js";
4
+ export const BEGIN_MARKER = "<!-- BEGIN JITERA CONNECT -->";
5
+ export const END_MARKER = "<!-- END JITERA CONNECT -->";
6
+ const CLAUDE_IMPORT = "@AGENTS.md";
7
+ export function upsertBlock(existing, block) {
8
+ const trimmedBlock = block.trim();
9
+ if (existing === undefined || existing.trim() === "") {
10
+ return { content: `${trimmedBlock}\n`, changed: true, action: "created" };
11
+ }
12
+ const start = existing.indexOf(BEGIN_MARKER);
13
+ const end = existing.indexOf(END_MARKER);
14
+ if (start !== -1 && end !== -1 && end > start) {
15
+ const before = existing.slice(0, start);
16
+ const after = existing.slice(end + END_MARKER.length);
17
+ const content = `${before}${trimmedBlock}${after}`;
18
+ return {
19
+ content,
20
+ changed: content !== existing,
21
+ action: content === existing ? "unchanged" : "replaced",
22
+ };
23
+ }
24
+ const separator = existing.endsWith("\n") ? "\n" : "\n\n";
25
+ return { content: `${existing}${separator}${trimmedBlock}\n`, changed: true, action: "appended" };
26
+ }
27
+ export function ensureClaudeImport(existing) {
28
+ if (existing === undefined || existing.trim() === "") {
29
+ return { content: `${CLAUDE_IMPORT}\n`, changed: true, action: "created" };
30
+ }
31
+ if (existing.includes(CLAUDE_IMPORT)) {
32
+ return { content: existing, changed: false, action: "unchanged" };
33
+ }
34
+ return {
35
+ content: `${CLAUDE_IMPORT}\n\n${existing.replace(/^\n+/, "")}`,
36
+ changed: true,
37
+ action: "appended",
38
+ };
39
+ }
40
+ function readIfPresent(path) {
41
+ return existsSync(path) ? readFileSync(path, "utf8") : undefined;
42
+ }
43
+ export function writeAgentsMd({ packageRoot, projectRoot, values, dryRun = false, }) {
44
+ const template = readFileSync(join(packageRoot, "templates", "AGENTS.md.tmpl"), "utf8");
45
+ const block = render(template, values);
46
+ const agentsPath = join(projectRoot, "AGENTS.md");
47
+ const claudePath = join(projectRoot, "CLAUDE.md");
48
+ const agents = upsertBlock(readIfPresent(agentsPath), block);
49
+ const claude = ensureClaudeImport(readIfPresent(claudePath));
50
+ if (!dryRun) {
51
+ if (agents.changed)
52
+ writeFileSync(agentsPath, agents.content, "utf8");
53
+ if (claude.changed)
54
+ writeFileSync(claudePath, claude.content, "utf8");
55
+ }
56
+ return { agentsPath, claudePath, agents, claude, changed: agents.changed || claude.changed };
57
+ }
58
+ //# sourceMappingURL=agents-md.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-md.js","sourceRoot":"","sources":["../../src/install/agents-md.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare const DEFAULT_BRAND = "Jitera";
2
+ export interface RenderValues {
3
+ readonly BRAND?: string;
4
+ readonly MCP_URL?: string;
5
+ readonly DOCS_URL?: string;
6
+ }
7
+ export declare class UnresolvedTokenError extends Error {
8
+ readonly name = "UnresolvedTokenError";
9
+ readonly tokens: readonly string[];
10
+ constructor(tokens: readonly string[]);
11
+ }
12
+ export declare function render(text: string, values: RenderValues): string;
13
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/install/render.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,WAAW,CAAC;AAEtC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,SAAkB,IAAI,0BAA0B;IAChD,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAEnC,YAAY,MAAM,EAAE,SAAS,MAAM,EAAE,EAMpC;CACF;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAUjE"}
@@ -0,0 +1,22 @@
1
+ const TOKEN_PATTERN = /\{\{\s*([A-Za-z0-9_]+)\s*\}\}/g;
2
+ export const DEFAULT_BRAND = "Jitera";
3
+ export class UnresolvedTokenError extends Error {
4
+ name = "UnresolvedTokenError";
5
+ tokens;
6
+ constructor(tokens) {
7
+ super(`content still contains unresolved template tokens: ${tokens.join(", ")}. ` +
8
+ `Rendering with a missing value would teach the assistant a wrong brand or url.`);
9
+ this.tokens = tokens;
10
+ }
11
+ }
12
+ export function render(text, values) {
13
+ const rendered = text.replace(TOKEN_PATTERN, (match, token) => {
14
+ const value = values[token];
15
+ return value ?? match;
16
+ });
17
+ const unresolved = [...new Set([...rendered.matchAll(TOKEN_PATTERN)].map((m) => m[1] ?? ""))];
18
+ if (unresolved.length)
19
+ throw new UnresolvedTokenError(unresolved);
20
+ return rendered;
21
+ }
22
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/install/render.ts"],"names":[],"mappings":"AAAA,MAAM,aAAa,GAAG,gCAAgC,CAAC;AAEvD,MAAM,CAAC,MAAM,aAAa,GAAG,QAAQ,CAAC;AAQtC,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC3B,IAAI,GAAG,sBAAsB,CAAC;IACvC,MAAM,CAAoB;IAEnC,YAAY,MAAyB;QACnC,KAAK,CACH,sDAAsD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YACzE,gFAAgF,CACnF,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,MAAM,UAAU,MAAM,CAAC,IAAY,EAAE,MAAoB;IACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;QACpE,MAAM,KAAK,GAAI,MAA6C,CAAC,KAAK,CAAC,CAAC;QACpE,OAAO,KAAK,IAAI,KAAK,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9F,IAAI,UAAU,CAAC,MAAM;QAAE,MAAM,IAAI,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAElE,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type RenderValues } from "./render.ts";
2
+ export interface SkillInstallOptions {
3
+ readonly packageRoot: string;
4
+ readonly targetDirs: readonly string[];
5
+ readonly values: RenderValues;
6
+ readonly dryRun?: boolean;
7
+ }
8
+ export interface SkillInstallResult {
9
+ readonly skills: readonly string[];
10
+ readonly written: readonly string[];
11
+ readonly changed: boolean;
12
+ }
13
+ export declare function listSkills(packageRoot: string): string[];
14
+ export declare function installSkills({ packageRoot, targetDirs, values, dryRun, }: SkillInstallOptions): SkillInstallResult;
15
+ export declare function uninstallSkills({ packageRoot, targetDirs, dryRun, }: Omit<SkillInstallOptions, "values">): SkillInstallResult;
16
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/install/skills.ts"],"names":[],"mappings":"AAGA,OAAO,EAAU,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAOxD;AAED,wBAAgB,aAAa,CAAC,EAC5B,WAAW,EACX,UAAU,EACV,MAAM,EACN,MAAc,GACf,EAAE,mBAAmB,GAAG,kBAAkB,CAkC1C;AAED,wBAAgB,eAAe,CAAC,EAC9B,WAAW,EACX,UAAU,EACV,MAAc,GACf,EAAE,IAAI,CAAC,mBAAmB,EAAE,QAAQ,CAAC,GAAG,kBAAkB,CAgB1D"}
@@ -0,0 +1,62 @@
1
+ import { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { render } from "./render.js";
4
+ export function listSkills(packageRoot) {
5
+ const root = join(packageRoot, "skills");
6
+ if (!existsSync(root))
7
+ return [];
8
+ return readdirSync(root, { withFileTypes: true })
9
+ .filter((entry) => entry.isDirectory() && existsSync(join(root, entry.name, "SKILL.md")))
10
+ .map((entry) => entry.name)
11
+ .sort();
12
+ }
13
+ export function installSkills({ packageRoot, targetDirs, values, dryRun = false, }) {
14
+ const skills = listSkills(packageRoot);
15
+ const written = [];
16
+ let changed = false;
17
+ for (const target of targetDirs) {
18
+ for (const skill of skills) {
19
+ const source = join(packageRoot, "skills", skill);
20
+ const destination = join(target, skill);
21
+ const sourceSkill = render(readFileSync(join(source, "SKILL.md"), "utf8"), values);
22
+ const destinationSkill = join(destination, "SKILL.md");
23
+ const current = existsSync(destinationSkill)
24
+ ? readFileSync(destinationSkill, "utf8")
25
+ : undefined;
26
+ if (current !== sourceSkill)
27
+ changed = true;
28
+ written.push(destinationSkill);
29
+ if (dryRun)
30
+ continue;
31
+ mkdirSync(destination, { recursive: true });
32
+ for (const entry of readdirSync(source, { withFileTypes: true })) {
33
+ if (entry.name === "SKILL.md")
34
+ continue;
35
+ const from = join(source, entry.name);
36
+ const to = join(destination, entry.name);
37
+ rmSync(to, { recursive: true, force: true });
38
+ cpSync(from, to, { recursive: true });
39
+ }
40
+ writeFileSync(destinationSkill, sourceSkill, "utf8");
41
+ }
42
+ }
43
+ return { skills, written, changed };
44
+ }
45
+ export function uninstallSkills({ packageRoot, targetDirs, dryRun = false, }) {
46
+ const skills = listSkills(packageRoot);
47
+ const written = [];
48
+ let changed = false;
49
+ for (const target of targetDirs) {
50
+ for (const skill of skills) {
51
+ const destination = join(target, skill);
52
+ if (!existsSync(destination))
53
+ continue;
54
+ changed = true;
55
+ written.push(destination);
56
+ if (!dryRun)
57
+ rmSync(destination, { recursive: true, force: true });
58
+ }
59
+ }
60
+ return { skills, written, changed };
61
+ }
62
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/install/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ export interface UserConfigOption {
2
+ readonly type: "string" | "number" | "boolean" | "directory" | "file";
3
+ readonly title: string;
4
+ readonly description: string;
5
+ readonly sensitive?: boolean;
6
+ readonly required?: boolean;
7
+ readonly default?: string;
8
+ }
9
+ export interface StdioServer {
10
+ readonly command: string;
11
+ readonly args: readonly string[];
12
+ readonly env?: Readonly<Record<string, string>>;
13
+ readonly url?: never;
14
+ }
15
+ export interface HttpServer {
16
+ readonly type: "http" | "sse" | "ws";
17
+ readonly url: string;
18
+ readonly headers?: Readonly<Record<string, string>>;
19
+ readonly command?: never;
20
+ }
21
+ export type McpServer = StdioServer | HttpServer;
22
+ export interface PluginManifest {
23
+ readonly name: string;
24
+ readonly version: string;
25
+ readonly description: string;
26
+ readonly author?: {
27
+ readonly name: string;
28
+ };
29
+ readonly hooks?: string;
30
+ readonly skills?: string | readonly string[];
31
+ readonly mcpServers?: Readonly<Record<string, McpServer>>;
32
+ readonly userConfig?: Readonly<Record<string, UserConfigOption>>;
33
+ }
34
+ export interface MarketplaceEntry {
35
+ readonly name: string;
36
+ readonly source: string;
37
+ readonly description?: string;
38
+ }
39
+ export interface MarketplaceManifest {
40
+ readonly name: string;
41
+ readonly description?: string;
42
+ readonly owner?: {
43
+ readonly name: string;
44
+ };
45
+ readonly plugins: readonly MarketplaceEntry[];
46
+ }
47
+ export interface HookCommand {
48
+ readonly type: "command" | "mcp_tool" | "http" | "prompt" | "agent";
49
+ readonly command?: string;
50
+ readonly args?: readonly string[];
51
+ readonly timeout?: number;
52
+ readonly statusMessage?: string;
53
+ }
54
+ export interface HookMatcher {
55
+ readonly matcher?: string;
56
+ readonly hooks: readonly HookCommand[];
57
+ }
58
+ export interface HooksFile {
59
+ readonly hooks: Readonly<Record<string, readonly HookMatcher[]>>;
60
+ }
61
+ export declare function readJsonFile<T>(path: string): T;
62
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { readFileSync } from "node:fs";
2
+ export function readJsonFile(path) {
3
+ return JSON.parse(readFileSync(path, "utf8"));
4
+ }
5
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAoEvC,MAAM,UAAU,YAAY,CAAI,IAAY;IAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAM,CAAC;AACrD,CAAC"}
@@ -0,0 +1,43 @@
1
+ export interface JsonRpcRequest {
2
+ readonly jsonrpc: "2.0";
3
+ readonly id?: string | number;
4
+ readonly method: string;
5
+ readonly params?: unknown;
6
+ }
7
+ export interface JsonRpcResponse {
8
+ readonly jsonrpc: "2.0";
9
+ readonly id?: string | number;
10
+ readonly result?: ToolResult;
11
+ readonly error?: {
12
+ readonly code?: number;
13
+ readonly message?: string;
14
+ };
15
+ }
16
+ export interface ToolResult {
17
+ readonly content?: readonly ContentPart[];
18
+ readonly structuredContent?: unknown;
19
+ readonly isError?: boolean;
20
+ }
21
+ export interface ContentPart {
22
+ readonly type: string;
23
+ readonly text?: string;
24
+ }
25
+ export declare class McpCallError extends Error {
26
+ readonly name = "McpCallError";
27
+ readonly detail: unknown;
28
+ constructor(message: string, detail?: unknown);
29
+ }
30
+ export declare function parseBody(contentType: string, raw: string): JsonRpcResponse | undefined;
31
+ export declare function extractText(result: ToolResult | undefined): string;
32
+ export interface TransportOptions {
33
+ readonly url: string;
34
+ readonly apiKey: string;
35
+ readonly timeoutMs?: number;
36
+ }
37
+ export declare function postRpc(request: JsonRpcRequest, { url, apiKey, timeoutMs }: TransportOptions): Promise<JsonRpcResponse | undefined>;
38
+ export interface CallToolOptions extends TransportOptions {
39
+ readonly name: string;
40
+ readonly args?: Record<string, unknown>;
41
+ }
42
+ export declare function callTool({ name, args, ...transport }: CallToolOptions): Promise<string>;
43
+ //# sourceMappingURL=mcp-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-client.d.ts","sourceRoot":"","sources":["../src/mcp-client.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACxE;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,YAAa,SAAQ,KAAK;IACrC,SAAkB,IAAI,kBAAkB;IACxC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEzB,YAAY,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAG5C;CACF;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAWvF;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,CAQlE;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAsB,OAAO,CAC3B,OAAO,EAAE,cAAc,EACvB,EAAE,GAAG,EAAE,MAAM,EAAE,SAAgB,EAAE,EAAE,gBAAgB,GAClD,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CA0CtC;AAED,MAAM,WAAW,eAAgB,SAAQ,gBAAgB;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAED,wBAAsB,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAS,EAAE,GAAG,SAAS,EAAE,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBlG"}
@@ -0,0 +1,85 @@
1
+ export class McpCallError extends Error {
2
+ name = "McpCallError";
3
+ detail;
4
+ constructor(message, detail) {
5
+ super(message);
6
+ this.detail = detail;
7
+ }
8
+ }
9
+ export function parseBody(contentType, raw) {
10
+ if (raw.trim() === "")
11
+ return undefined;
12
+ if (contentType.includes("text/event-stream")) {
13
+ for (const line of raw.split("\n")) {
14
+ if (!line.startsWith("data:"))
15
+ continue;
16
+ const payload = line.slice(5).trim();
17
+ if (payload)
18
+ return JSON.parse(payload);
19
+ }
20
+ throw new McpCallError("event stream carried no data frame", raw.slice(0, 200));
21
+ }
22
+ return JSON.parse(raw);
23
+ }
24
+ export function extractText(result) {
25
+ return (result?.content ?? [])
26
+ .filter((part) => part.type === "text" && typeof part.text === "string")
27
+ .map((part) => part.text)
28
+ .join("\n")
29
+ .trim();
30
+ }
31
+ export async function postRpc(request, { url, apiKey, timeoutMs = 5000 }) {
32
+ if (!url)
33
+ throw new McpCallError("no mcp endpoint configured");
34
+ if (!apiKey)
35
+ throw new McpCallError("no api key configured");
36
+ const label = request.method === "tools/call"
37
+ ? request.params?.name ?? request.method
38
+ : request.method;
39
+ let response;
40
+ let raw;
41
+ try {
42
+ response = await fetch(url, {
43
+ method: "POST",
44
+ signal: AbortSignal.timeout(timeoutMs),
45
+ headers: {
46
+ "content-type": "application/json",
47
+ accept: "application/json, text/event-stream",
48
+ authorization: `Bearer ${apiKey}`,
49
+ },
50
+ body: JSON.stringify(request),
51
+ });
52
+ raw = await response.text();
53
+ }
54
+ catch (error) {
55
+ const cause = error;
56
+ throw new McpCallError(cause.name === "TimeoutError" || cause.name === "AbortError"
57
+ ? `${label} timed out after ${timeoutMs}ms`
58
+ : `${label} could not reach ${url}: ${cause.message}`, cause);
59
+ }
60
+ if (!response.ok) {
61
+ throw new McpCallError(`${label} returned HTTP ${response.status}`, raw.slice(0, 200));
62
+ }
63
+ try {
64
+ return parseBody(response.headers.get("content-type") ?? "", raw);
65
+ }
66
+ catch (error) {
67
+ if (error instanceof McpCallError)
68
+ throw error;
69
+ throw new McpCallError(`${label} returned an unreadable body`, error.message);
70
+ }
71
+ }
72
+ export async function callTool({ name, args = {}, ...transport }) {
73
+ const payload = await postRpc({ jsonrpc: "2.0", id: 1, method: "tools/call", params: { name, arguments: args } }, transport);
74
+ if (!payload) {
75
+ throw new McpCallError(`${name} returned an empty body where a result was required`);
76
+ }
77
+ if (payload.error) {
78
+ throw new McpCallError(`${name} failed: ${payload.error.message ?? "unknown error"}`, payload.error);
79
+ }
80
+ if (payload.result?.isError) {
81
+ throw new McpCallError(`${name} reported failure: ${extractText(payload.result)}`, payload.result);
82
+ }
83
+ return extractText(payload.result);
84
+ }
85
+ //# sourceMappingURL=mcp-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../src/mcp-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export type ServerEntry = Record<string, unknown>;
2
+ export type ClientConfig = Record<string, unknown>;
3
+ export declare class MalformedConfigError extends Error {
4
+ readonly name = "MalformedConfigError";
5
+ readonly path: string;
6
+ constructor(path: string, cause: Error);
7
+ }
8
+ export declare function readConfig(path: string): ClientConfig;
9
+ export declare function mergeServer(config: ClientConfig, key: string, name: string, server: ServerEntry): ClientConfig;
10
+ export declare function removeServer(config: ClientConfig, key: string, name: string): ClientConfig;
11
+ export declare function writeConfig(path: string, config: ClientConfig): void;
12
+ //# sourceMappingURL=mcp-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config.d.ts","sourceRoot":"","sources":["../src/mcp-config.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAClD,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEnD,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,SAAkB,IAAI,0BAA0B;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,YAAY,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAMrC;CACF;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CASrD;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,WAAW,GAClB,YAAY,CAId;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAQ1F;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAGpE"}
@@ -0,0 +1,45 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ export class MalformedConfigError extends Error {
4
+ name = "MalformedConfigError";
5
+ path;
6
+ constructor(path, cause) {
7
+ super(`${path} exists but is not valid JSON, so it cannot be merged safely. ` +
8
+ `Fix or move the file, then run again. Parser said: ${cause.message}`);
9
+ this.path = path;
10
+ }
11
+ }
12
+ export function readConfig(path) {
13
+ if (!existsSync(path))
14
+ return {};
15
+ const raw = readFileSync(path, "utf8");
16
+ if (raw.trim() === "")
17
+ return {};
18
+ try {
19
+ return JSON.parse(raw);
20
+ }
21
+ catch (cause) {
22
+ throw new MalformedConfigError(path, cause);
23
+ }
24
+ }
25
+ export function mergeServer(config, key, name, server) {
26
+ const servers = { ...(config[key] ?? {}) };
27
+ servers[name] = server;
28
+ return { ...config, [key]: servers };
29
+ }
30
+ export function removeServer(config, key, name) {
31
+ const existing = config[key];
32
+ if (!existing)
33
+ return { ...config };
34
+ const servers = { ...existing };
35
+ delete servers[name];
36
+ const next = { ...config, [key]: servers };
37
+ if (Object.keys(servers).length === 0)
38
+ delete next[key];
39
+ return next;
40
+ }
41
+ export function writeConfig(path, config) {
42
+ mkdirSync(dirname(path), { recursive: true });
43
+ writeFileSync(path, `${JSON.stringify(config, undefined, 2)}\n`, "utf8");
44
+ }
45
+ //# sourceMappingURL=mcp-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../src/mcp-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC3B,IAAI,GAAG,sBAAsB,CAAC;IACvC,IAAI,CAAS;IAEtB,YAAY,IAAY,EAAE,KAAY;QACpC,KAAK,CACH,GAAG,IAAI,gEAAgE;YACrE,sDAAsD,KAAK,CAAC,OAAO,EAAE,CACxE,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACvC,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,oBAAoB,CAAC,IAAI,EAAE,KAAc,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,MAAoB,EACpB,GAAW,EACX,IAAY,EACZ,MAAmB;IAEnB,MAAM,OAAO,GAAG,EAAE,GAAG,CAAE,MAAM,CAAC,GAAG,CAA6C,IAAI,EAAE,CAAC,EAAE,CAAC;IACxF,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;IACvB,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAoB,EAAE,GAAW,EAAE,IAAY;IAC1E,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAA4C,CAAC;IACxE,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;IAChC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,MAAM,IAAI,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC;IAC3C,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,MAAoB;IAC5D,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface ProxyStreams {
2
+ readonly input: NodeJS.ReadableStream;
3
+ readonly output: NodeJS.WritableStream;
4
+ readonly log: NodeJS.WritableStream;
5
+ }
6
+ export interface ProxyConfig {
7
+ readonly url: string;
8
+ readonly apiKey: string;
9
+ }
10
+ export declare function runProxy({ url, apiKey }: ProxyConfig, { input, output, log }: ProxyStreams): Promise<void>;
11
+ export declare function configFromEnvironment(env: NodeJS.ProcessEnv): Promise<ProxyConfig>;
12
+ //# sourceMappingURL=proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,CAAC;CACrC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAUD,wBAAsB,QAAQ,CAC5B,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,WAAW,EAC5B,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,YAAY,GACnC,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAWxF"}