@jitera/connect 1.5.0 → 2.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 (64) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.codex-plugin/plugin.json +1 -1
  3. package/README.md +51 -13
  4. package/content/instructions.md +7 -4
  5. package/content/session-start-unbound.md +12 -0
  6. package/content/session-start.md +14 -5
  7. package/dist/bin/cli.js +101 -93
  8. package/dist/bin/cli.js.map +1 -1
  9. package/dist/bin/connect.js +3 -0
  10. package/dist/bin/connect.js.map +1 -1
  11. package/dist/bin/init.js +122 -119
  12. package/dist/bin/init.js.map +1 -1
  13. package/dist/bin/login.js +221 -211
  14. package/dist/bin/login.js.map +1 -1
  15. package/dist/bin/proxy.js +2 -1
  16. package/dist/bin/proxy.js.map +1 -1
  17. package/dist/bin/set-agent.d.ts +3 -0
  18. package/dist/bin/set-agent.d.ts.map +1 -0
  19. package/dist/bin/set-agent.js +165 -0
  20. package/dist/bin/set-agent.js.map +1 -0
  21. package/dist/bin/statusline.js +6 -1
  22. package/dist/bin/statusline.js.map +1 -1
  23. package/dist/cli-session.d.ts +12 -0
  24. package/dist/cli-session.d.ts.map +1 -1
  25. package/dist/cli-session.js +25 -0
  26. package/dist/cli-session.js.map +1 -1
  27. package/dist/exit.d.ts +8 -0
  28. package/dist/exit.d.ts.map +1 -0
  29. package/dist/exit.js +32 -0
  30. package/dist/exit.js.map +1 -0
  31. package/dist/graphql.d.ts +6 -0
  32. package/dist/graphql.d.ts.map +1 -1
  33. package/dist/graphql.js +24 -0
  34. package/dist/graphql.js.map +1 -1
  35. package/dist/hook-io.d.ts +2 -0
  36. package/dist/hook-io.d.ts.map +1 -1
  37. package/dist/hook-io.js +3 -0
  38. package/dist/hook-io.js.map +1 -1
  39. package/dist/hooks/session-start.js +19 -5
  40. package/dist/hooks/session-start.js.map +1 -1
  41. package/dist/hooks/stop.js +7 -1
  42. package/dist/hooks/stop.js.map +1 -1
  43. package/dist/hooks/user-prompt-submit.js +78 -20
  44. package/dist/hooks/user-prompt-submit.js.map +1 -1
  45. package/dist/project-marker.d.ts +1 -0
  46. package/dist/project-marker.d.ts.map +1 -1
  47. package/dist/project-marker.js +40 -2
  48. package/dist/project-marker.js.map +1 -1
  49. package/dist/proxy.d.ts +5 -1
  50. package/dist/proxy.d.ts.map +1 -1
  51. package/dist/proxy.js +42 -2
  52. package/dist/proxy.js.map +1 -1
  53. package/dist/select.d.ts +17 -0
  54. package/dist/select.d.ts.map +1 -1
  55. package/dist/select.js +164 -3
  56. package/dist/select.js.map +1 -1
  57. package/dist/statusline.d.ts +2 -1
  58. package/dist/statusline.d.ts.map +1 -1
  59. package/dist/statusline.js +6 -1
  60. package/dist/statusline.js.map +1 -1
  61. package/package.json +1 -1
  62. package/skills/jitera-context/SKILL.md +22 -0
  63. package/skills/jitera-memory/SKILL.md +20 -2
  64. package/templates/AGENTS.md.tmpl +10 -4
@@ -1,18 +1,36 @@
1
1
  #!/usr/bin/env node
2
2
  import { callTool, McpCallError } from "../mcp-client.js";
3
3
  import { discoverDeployment } from "../discovery.js";
4
- import { emitContext, readHookInput } from "../hook-io.js";
4
+ import { emitContext, promptText, readHookInput } from "../hook-io.js";
5
5
  import { readProjectMarker } from "../project-marker.js";
6
6
  import { claimOnce } from "../session-marker.js";
7
7
  import { writeSessionStatus } from "../session-status.js";
8
8
  const MAX_CONTEXT_CHARS = 6000;
9
+ // The composite tool searches memory, documents and source concurrently, so it
10
+ // is slower than a bare recall. This hook blocks the user's prompt, so the
11
+ // ceiling stays close to the old one rather than tracking the server's own
12
+ // per-section timeout.
13
+ const GATHER_TIMEOUT_MS = 10000;
9
14
  const RECALL_TIMEOUT_MS = 8000;
15
+ // Keywords are extracted from the task, so a pasted stack trace or diff adds
16
+ // upload on a path that blocks the prompt without adding signal.
17
+ const MAX_TASK_CHARS = 2000;
10
18
  const input = readHookInput();
11
- if (!claimOnce(input.session_id, "recall"))
12
- process.exit(0);
13
19
  const apiKey = process.env["CLAUDE_PLUGIN_OPTION_JITERA_API_KEY"] ?? "";
14
20
  if (!apiKey)
15
21
  process.exit(0);
22
+ // Without .jitera.json this repository is not bound to a project, so there is
23
+ // no project whose context could be gathered. Bail before discovery rather
24
+ // than spend a network round trip guessing at a project nobody chose; session
25
+ // start is where the user is told how to bind it.
26
+ const marker = readProjectMarker(input.cwd ?? process.cwd());
27
+ if (!marker)
28
+ process.exit(0);
29
+ // Claimed only once there is something to claim it for: burning the session's
30
+ // single gather on an unbound repo would mean running init mid-session never
31
+ // took effect.
32
+ if (!claimOnce(input.session_id, "recall"))
33
+ process.exit(0);
16
34
  let url;
17
35
  const override = process.env["JITERA_MCP_URL"];
18
36
  if (override) {
@@ -31,24 +49,63 @@ else {
31
49
  process.exit(0);
32
50
  }
33
51
  }
34
- let memory;
35
- const startedAt = Date.now();
36
- try {
37
- memory = await callTool({
38
- url,
39
- apiKey,
40
- projectUuid: readProjectMarker(input.cwd ?? process.cwd())?.project,
41
- name: "recall_jitera_memory",
42
- args: {},
43
- timeoutMs: RECALL_TIMEOUT_MS,
44
- });
52
+ const transport = { url, apiKey, projectUuid: marker.project };
53
+ // `set-agent` records which agents this repository reads. Absent means every
54
+ // agent, which is what the tools do when the argument is omitted.
55
+ const agents = marker.agents && marker.agents.length > 0 ? [...marker.agents] : undefined;
56
+ const task = promptText(input).slice(0, MAX_TASK_CHARS);
57
+ // The blind recall serves two purposes: it is what deployments predating the
58
+ // composite tool answer, and it is the right call when there is no prompt text
59
+ // to gather for. It stays query-less on purpose — a server without the widening
60
+ // ladder can return less for a query than for no query.
61
+ const recall = () => callTool({
62
+ ...transport,
63
+ name: "recall_jitera_memory",
64
+ args: agents ? { agents } : {},
65
+ timeoutMs: RECALL_TIMEOUT_MS,
66
+ });
67
+ // The fallback exists for deployments that predate the composite tool, so it
68
+ // is worth a second round trip only when the tool is genuinely absent. Falling
69
+ // back on a timeout would stack RECALL_TIMEOUT_MS on top of GATHER_TIMEOUT_MS
70
+ // while the user's prompt is blocked.
71
+ function toolIsMissing(error) {
72
+ if (!(error instanceof McpCallError))
73
+ return false;
74
+ const detail = error.detail;
75
+ if (detail?.code === -32601 || detail?.code === -32602)
76
+ return true;
77
+ return /unknown tool|tool not found|method not found/i.test(error.message);
45
78
  }
46
- catch (error) {
79
+ function giveUp(error) {
47
80
  const message = error instanceof McpCallError ? error.message : String(error);
48
81
  writeSessionStatus(input.session_id, { recallError: message });
49
- process.stderr.write(`jitera-connect: could not load project memory: ${message}\n`);
82
+ process.stderr.write(`jitera-connect: could not load project context: ${message}\n`);
50
83
  process.exit(0);
51
84
  }
85
+ let memory;
86
+ const startedAt = Date.now();
87
+ try {
88
+ // Gathering for an empty task makes the server ask for one, and that answer
89
+ // would be injected as though it were project context.
90
+ memory = task
91
+ ? await callTool({
92
+ ...transport,
93
+ name: "gather_jitera_context",
94
+ args: { task, budget: MAX_CONTEXT_CHARS, ...(agents ? { agents } : {}) },
95
+ timeoutMs: GATHER_TIMEOUT_MS,
96
+ })
97
+ : await recall();
98
+ }
99
+ catch (gatherError) {
100
+ if (!task || !toolIsMissing(gatherError))
101
+ giveUp(gatherError);
102
+ try {
103
+ memory = await recall();
104
+ }
105
+ catch (error) {
106
+ giveUp(error);
107
+ }
108
+ }
52
109
  writeSessionStatus(input.session_id, {
53
110
  recallMs: Date.now() - startedAt,
54
111
  recallChars: memory.length,
@@ -57,9 +114,10 @@ writeSessionStatus(input.session_id, {
57
114
  if (!memory)
58
115
  process.exit(0);
59
116
  const body = memory.length > MAX_CONTEXT_CHARS
60
- ? `${memory.slice(0, MAX_CONTEXT_CHARS)}\n\n[truncated, call recall_jitera_memory for the rest]`
117
+ ? `${memory.slice(0, MAX_CONTEXT_CHARS)}\n\n[truncated, call gather_jitera_context for the rest]`
61
118
  : memory;
62
- emitContext("UserPromptSubmit", `Stored project memory for this workspace, loaded at session start:\n\n${body}\n\n` +
63
- `Treat this as current. Call recall_jitera_memory again if you need a narrower or fuller view, ` +
64
- `and persist new decisions with remember_jitera_memory.`);
119
+ emitContext("UserPromptSubmit", `Project context for this workspace, gathered at session start:\n\n${body}\n\n` +
120
+ `Treat this as current. It was gathered for the first prompt of this session, so call ` +
121
+ `gather_jitera_context yourself when the task moves on to a different area, and persist ` +
122
+ `new decisions with remember_jitera_memory.`);
65
123
  //# sourceMappingURL=user-prompt-submit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"user-prompt-submit.js","sourceRoot":"","sources":["../../src/hooks/user-prompt-submit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"user-prompt-submit.js","sourceRoot":"","sources":["../../src/hooks/user-prompt-submit.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ export declare const MARKER_FILENAME = ".jitera.json";
2
2
  export interface ProjectMarker {
3
3
  readonly environment?: string | undefined;
4
4
  readonly project?: string | undefined;
5
+ readonly agents?: readonly string[] | undefined;
5
6
  }
6
7
  export interface FoundProjectMarker extends ProjectMarker {
7
8
  readonly path: string;
@@ -1 +1 @@
1
- {"version":3,"file":"project-marker.d.ts","sourceRoot":"","sources":["../src/project-marker.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,eAAe,iBAAiB,CAAC;AAM9C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAED,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAyBlF;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,EACrB,MAAM,UAAQ,GACb,iBAAiB,CAuBnB"}
1
+ {"version":3,"file":"project-marker.d.ts","sourceRoot":"","sources":["../src/project-marker.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,eAAe,iBAAiB,CAAC;AAU9C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAGtC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CACjD;AAED,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAoDlF;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,EACrB,MAAM,UAAQ,GACb,iBAAiB,CAiCnB"}
@@ -4,6 +4,9 @@ export const MARKER_FILENAME = ".jitera.json";
4
4
  // Environments are studio, studio-stage, studio-NN. Anything else in the file
5
5
  // is not echoed back into session context.
6
6
  const SAFE_ENVIRONMENT = /^[A-Za-z0-9-]{1,64}$/;
7
+ // A committed marker is editable by hand, and every selected id becomes a
8
+ // clause in the server's filter, so the list is bounded rather than trusted.
9
+ const MAX_AGENTS = 100;
7
10
  export function readProjectMarker(startDir) {
8
11
  let dir = startDir;
9
12
  for (;;) {
@@ -16,16 +19,40 @@ export function readProjectMarker(startDir) {
16
19
  catch {
17
20
  return undefined;
18
21
  }
19
- const environment = parsed["environment"];
20
- const project = parsed["project"];
22
+ // `null` parses cleanly and then throws on property access, and a array
23
+ // or a bare scalar is not a marker either. Malformed reads as unbound,
24
+ // the same as unparseable, because hooks must never break a session.
25
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
26
+ return undefined;
27
+ }
28
+ const fields = parsed;
29
+ const environment = fields["environment"];
30
+ const project = fields["project"];
31
+ const agents = fields["agents"];
32
+ // Trimmed and de-duplicated: an id with stray whitespace matches no
33
+ // partition on the server and would silently narrow recall to nothing.
34
+ const agentIds = Array.isArray(agents)
35
+ ? [
36
+ ...new Set(agents
37
+ .filter((id) => typeof id === "string")
38
+ .map((id) => id.trim())
39
+ .filter((id) => id !== "")),
40
+ ].slice(0, MAX_AGENTS)
41
+ : undefined;
21
42
  return {
22
43
  path,
23
44
  ...(typeof environment === "string" && SAFE_ENVIRONMENT.test(environment)
24
45
  ? { environment }
25
46
  : {}),
26
47
  ...(typeof project === "string" ? { project } : {}),
48
+ ...(agentIds && agentIds.length > 0 ? { agents: agentIds } : {}),
27
49
  };
28
50
  }
51
+ // Never look past the repository root. `init` writes the marker there, so
52
+ // a stray .jitera.json in a parent directory (or $HOME) would otherwise
53
+ // bind every repository beneath it to a project nobody chose for them.
54
+ if (existsSync(join(dir, ".git")))
55
+ return undefined;
29
56
  const parent = dirname(dir);
30
57
  if (parent === dir)
31
58
  return undefined;
@@ -50,6 +77,17 @@ export function writeProjectMarker(root, marker, dryRun = false) {
50
77
  ...(marker.environment ? { environment: marker.environment } : {}),
51
78
  ...(marker.project ? { project: marker.project } : {}),
52
79
  };
80
+ // An empty list is a real choice - "read every agent" - and has to erase a
81
+ // previous selection rather than be mistaken for "leave it alone".
82
+ if (marker.agents) {
83
+ const ids = [
84
+ ...new Set(marker.agents.map((id) => id.trim()).filter((id) => id !== "")),
85
+ ].slice(0, MAX_AGENTS);
86
+ if (ids.length > 0)
87
+ next["agents"] = ids;
88
+ else
89
+ delete next["agents"];
90
+ }
53
91
  const serialized = `${JSON.stringify(next, undefined, 2)}\n`;
54
92
  const changed = before !== serialized;
55
93
  if (changed && !dryRun)
@@ -1 +1 @@
1
- {"version":3,"file":"project-marker.js","sourceRoot":"","sources":["../src/project-marker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,CAAC,MAAM,eAAe,GAAG,cAAc,CAAC;AAE9C,8EAA8E;AAC9E,2CAA2C;AAC3C,MAAM,gBAAgB,GAAG,sBAAsB,CAAC;AAWhD,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,SAAS,CAAC;QACR,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QACxC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,IAAI,MAA+B,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAA4B,CAAC;YAC7E,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,MAAM,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;YAClC,OAAO;gBACL,IAAI;gBACJ,GAAG,CAAC,OAAO,WAAW,KAAK,QAAQ,IAAI,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC;oBACvE,CAAC,CAAC,EAAE,WAAW,EAAE;oBACjB,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpD,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,SAAS,CAAC;QACrC,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAOD,MAAM,UAAU,kBAAkB,CAChC,IAAY,EACZ,MAAqB,EACrB,MAAM,GAAG,KAAK;IAEd,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAEzC,IAAI,QAAQ,GAA4B,EAAE,CAAC;IAC3C,IAAI,MAA0B,CAAC;IAC/B,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAA4B,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,GAAG,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG;QACX,GAAG,QAAQ;QACX,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvD,CAAC;IACF,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC;IAC7D,MAAM,OAAO,GAAG,MAAM,KAAK,UAAU,CAAC;IACtC,IAAI,OAAO,IAAI,CAAC,MAAM;QAAE,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAChE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"project-marker.js","sourceRoot":"","sources":["../src/project-marker.ts"],"names":[],"mappings":"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"}
package/dist/proxy.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { type JsonRpcRequest } from "./mcp-client.ts";
1
2
  export interface ProxyStreams {
2
3
  readonly input: NodeJS.ReadableStream;
3
4
  readonly output: NodeJS.WritableStream;
@@ -8,9 +9,12 @@ export interface ProxyConfig {
8
9
  readonly apiKey: string;
9
10
  readonly instructions?: string | undefined;
10
11
  readonly projectUuid?: string | undefined;
12
+ readonly agents?: readonly string[] | undefined;
11
13
  }
12
14
  export declare function resolveProjectUuid(env: NodeJS.ProcessEnv, cwd?: string): string | undefined;
13
- export declare function runProxy({ url, apiKey, instructions, projectUuid }: ProxyConfig, { input, output, log }: ProxyStreams): Promise<void>;
15
+ export declare function resolveAgents(cwd: string, env?: NodeJS.ProcessEnv): readonly string[] | undefined;
16
+ export declare function withAgentSelection(request: JsonRpcRequest, agents: readonly string[] | undefined): JsonRpcRequest;
17
+ export declare function runProxy({ url, apiKey, instructions, projectUuid, agents }: ProxyConfig, { input, output, log }: ProxyStreams): Promise<void>;
14
18
  export interface ProxyEnvironment extends ProxyConfig {
15
19
  readonly brand: string;
16
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AASA,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;IACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C;AAID,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,GAAG,GAAE,MAAsB,GAC1B,MAAM,GAAG,SAAS,CAIpB;AAiBD,wBAAsB,QAAQ,CAC5B,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,WAAW,EACvD,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,YAAY,GACnC,OAAO,CAAC,IAAI,CAAC,CAmCf;AAED,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAW7F"}
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAIA,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAK7E,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;IACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CACjD;AAID,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,GAAG,GAAE,MAAsB,GAC1B,MAAM,GAAG,SAAS,CAIpB;AAED,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,SAAS,MAAM,EAAE,GAAG,SAAS,CAS/B;AAOD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GACpC,cAAc,CAsBhB;AAiBD,wBAAsB,QAAQ,CAC5B,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,WAAW,EAC/D,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,YAAY,GACnC,OAAO,CAAC,IAAI,CAAC,CAwCf;AAED,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAW7F"}
package/dist/proxy.js CHANGED
@@ -12,6 +12,41 @@ export function resolveProjectUuid(env, cwd = process.cwd()) {
12
12
  return override;
13
13
  return readProjectMarker(cwd)?.project;
14
14
  }
15
+ export function resolveAgents(cwd, env = process.env) {
16
+ // JITERA_PROJECT overrides which project the proxy talks to, and agent ids
17
+ // belong to the project they were chosen in. Sending this repository's ids
18
+ // alongside someone else's project matches nothing and quietly empties the
19
+ // recall, so the override drops the selection with it.
20
+ if (env["JITERA_PROJECT"])
21
+ return undefined;
22
+ const agents = readProjectMarker(cwd)?.agents;
23
+ return agents && agents.length > 0 ? agents : undefined;
24
+ }
25
+ // Tools whose reach `set-agent` narrows. Clients other than Claude Code reach
26
+ // the server through this proxy, so the repository's choice is applied here
27
+ // rather than relying on every client to know about it.
28
+ const AGENT_SCOPED_TOOLS = new Set(["recall_jitera_memory", "gather_jitera_context"]);
29
+ export function withAgentSelection(request, agents) {
30
+ if (!agents || agents.length === 0 || request.method !== "tools/call")
31
+ return request;
32
+ const params = request.params;
33
+ if (!params?.name || !AGENT_SCOPED_TOOLS.has(params.name))
34
+ return request;
35
+ // A caller that named agents itself has been more specific than the
36
+ // repository default, so leave it alone.
37
+ const args = params.arguments;
38
+ if (args !== undefined && (typeof args !== "object" || Array.isArray(args))) {
39
+ // Not a valid MCP argument object; forwarding it unchanged lets the server
40
+ // reject it rather than this throwing on a property test.
41
+ return request;
42
+ }
43
+ if (args && "agents" in args)
44
+ return request;
45
+ return {
46
+ ...request,
47
+ params: { ...params, arguments: { ...(args ?? {}), agents: [...agents] } },
48
+ };
49
+ }
15
50
  function isNotification(request) {
16
51
  return request.id === undefined || request.id === null;
17
52
  }
@@ -24,7 +59,7 @@ function injectInstructions(response, instructions) {
24
59
  result["instructions"] = instructions;
25
60
  }
26
61
  }
27
- export async function runProxy({ url, apiKey, instructions, projectUuid }, { input, output, log }) {
62
+ export async function runProxy({ url, apiKey, instructions, projectUuid, agents }, { input, output, log }) {
28
63
  const lines = createInterface({ input, crlfDelay: Infinity });
29
64
  for await (const line of lines) {
30
65
  const trimmed = line.trim();
@@ -40,7 +75,12 @@ export async function runProxy({ url, apiKey, instructions, projectUuid }, { inp
40
75
  }
41
76
  let response;
42
77
  try {
43
- response = await postRpc(request, { url, apiKey, projectUuid, timeoutMs: REQUEST_TIMEOUT_MS });
78
+ response = await postRpc(withAgentSelection(request, agents), {
79
+ url,
80
+ apiKey,
81
+ projectUuid,
82
+ timeoutMs: REQUEST_TIMEOUT_MS,
83
+ });
44
84
  }
45
85
  catch (error) {
46
86
  const message = error instanceof McpCallError ? error.message : String(error);
package/dist/proxy.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
package/dist/select.d.ts CHANGED
@@ -8,6 +8,10 @@ export declare class InvalidChoiceError extends Error {
8
8
  readonly answer: string;
9
9
  constructor(answer: string);
10
10
  }
11
+ export declare class NoInputError extends Error {
12
+ readonly name = "NoInputError";
13
+ constructor();
14
+ }
11
15
  export declare function chooseFrom<T>({ items, prompt, label, theme, }: {
12
16
  readonly items: readonly T[];
13
17
  readonly prompt: string;
@@ -33,4 +37,17 @@ export interface SelectOptions<T> {
33
37
  readonly output: SelectOutput;
34
38
  }
35
39
  export declare function interactiveSelect<T>({ items, prompt, label, theme, input, output }: SelectOptions<T>): Promise<T>;
40
+ export interface MultiSelectOptions<T> extends SelectOptions<T> {
41
+ readonly selected?: (item: T) => boolean;
42
+ readonly viewport?: number;
43
+ readonly columns?: number;
44
+ }
45
+ export declare function multiSelect<T>({ items, prompt, label, theme, input, output, selected, viewport, columns, }: MultiSelectOptions<T>): Promise<T[]>;
46
+ export declare function chooseManyFrom<T>({ items, prompt, label, theme, selected, }: {
47
+ readonly items: readonly T[];
48
+ readonly prompt: string;
49
+ readonly label: (item: T) => string;
50
+ readonly theme: Theme;
51
+ readonly selected?: (item: T) => boolean;
52
+ }): Promise<T[]>;
36
53
  //# sourceMappingURL=select.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../src/select.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,SAAkB,IAAI,0BAA0B;IAEhD,cAEC;CACF;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,SAAkB,IAAI,wBAAwB;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,YAAY,MAAM,EAAE,MAAM,EAGzB;CACF;AAGD,wBAAsB,UAAU,CAAC,CAAC,EAAE,EAClC,KAAK,EACL,MAAM,EACN,KAAK,EACL,KAAK,GACN,EAAE;IACD,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACvB,GAAG,OAAO,CAAC,CAAC,CAAC,CAsBb;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACpC,MAAM,CAAC,IAAI,OAAO,CAAC;IACnB,KAAK,CAAC,IAAI,OAAO,CAAC;IAClB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC;IACvE,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC;CACzE;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;CAC/B;AAqBD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA2DjH"}
1
+ {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../src/select.ts"],"names":[],"mappings":"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"}
package/dist/select.js CHANGED
@@ -13,6 +13,26 @@ export class InvalidChoiceError extends Error {
13
13
  this.answer = answer;
14
14
  }
15
15
  }
16
+ export class NoInputError extends Error {
17
+ name = "NoInputError";
18
+ constructor() {
19
+ super("no answer was given and there is no terminal to ask on");
20
+ }
21
+ }
22
+ // `rl.question` never settles when stdin is already at EOF, which left a
23
+ // scripted run hanging until the process exited with nothing saved.
24
+ async function ask(prompt) {
25
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
26
+ try {
27
+ return await new Promise((resolve, reject) => {
28
+ rl.once("close", () => reject(new NoInputError()));
29
+ void rl.question(prompt).then(resolve, reject);
30
+ }).then((answer) => answer.trim());
31
+ }
32
+ finally {
33
+ rl.close();
34
+ }
35
+ }
16
36
  // Arrow-key selection on a terminal, a numbered prompt everywhere else.
17
37
  export async function chooseFrom({ items, prompt, label, theme, }) {
18
38
  if (process.stdin.isTTY && process.stdout.isTTY) {
@@ -29,9 +49,7 @@ export async function chooseFrom({ items, prompt, label, theme, }) {
29
49
  items.forEach((item, index) => {
30
50
  process.stdout.write(` ${theme.accent(String(index + 1).padStart(2))} ${label(item)}\n`);
31
51
  });
32
- const rl = createInterface({ input: process.stdin, output: process.stdout });
33
- const answer = (await rl.question(`\n ${theme.dim(`Number [1-${items.length}]`)} `)).trim();
34
- rl.close();
52
+ const answer = await ask(`\n ${theme.dim(`Number [1-${items.length}]`)} `);
35
53
  const picked = items[Number(answer) - 1];
36
54
  if (!picked)
37
55
  throw new InvalidChoiceError(answer);
@@ -108,4 +126,147 @@ export function interactiveSelect({ items, prompt, label, theme, input, output }
108
126
  input.on("data", onData);
109
127
  });
110
128
  }
129
+ function parseMultiKey(sequence) {
130
+ if (sequence === "\u0003" || sequence === "\u001b")
131
+ return { kind: "cancel" };
132
+ if (sequence === "\r" || sequence === "\n" || sequence === "\r\n")
133
+ return { kind: "confirm" };
134
+ if (sequence === " ")
135
+ return { kind: "toggle" };
136
+ if (sequence === "a" || sequence === "A")
137
+ return { kind: "all" };
138
+ if (sequence === "n" || sequence === "N")
139
+ return { kind: "none_of_them" };
140
+ if (sequence === "\u001b[A" || sequence === "\u001bOA" || sequence === "k") {
141
+ return { kind: "move", delta: -1 };
142
+ }
143
+ if (sequence === "\u001b[B" || sequence === "\u001bOB" || sequence === "j") {
144
+ return { kind: "move", delta: 1 };
145
+ }
146
+ return { kind: "none" };
147
+ }
148
+ // Rows are redrawn by moving the cursor up a fixed number of lines, so every
149
+ // row has to occupy exactly one line. Agent descriptions are free text from the
150
+ // studio, so they are flattened and cut to the terminal width.
151
+ function oneLine(text, width) {
152
+ const flat = text.replace(/\s+/g, " ").trim();
153
+ return flat.length <= width ? flat : `${flat.slice(0, Math.max(1, width - 1))}…`;
154
+ }
155
+ // Checkbox selection: space toggles, enter confirms. Returns the ticked items,
156
+ // which may legitimately be none — "none" means "do not narrow", and the
157
+ // caller decides what that implies.
158
+ export function multiSelect({ items, prompt, label, theme, input, output, selected, viewport, columns, }) {
159
+ if (items.length === 0) {
160
+ return Promise.reject(new Error("there is nothing to select from"));
161
+ }
162
+ const width = Math.max(20, (columns ?? process.stdout.columns ?? 80) - 8);
163
+ // Leave room for the blank line, the prompt, the blank line and the footer.
164
+ const rows = Math.max(1, Math.min(items.length, viewport ?? Math.max(1, (process.stdout.rows ?? 24) - 5)));
165
+ const windowed = rows < items.length;
166
+ const painted = windowed ? rows + 1 : rows;
167
+ return new Promise((resolve, reject) => {
168
+ let highlighted = 0;
169
+ let top = 0;
170
+ const ticked = items.map((item) => (selected ? selected(item) : false));
171
+ const row = (index) => {
172
+ const box = ticked[index] ? theme.ok("[x]") : theme.dim("[ ]");
173
+ const text = oneLine(label(items[index]), width);
174
+ return index === highlighted
175
+ ? ` ${theme.accent("❯")} ${box} ${theme.bold(text)}`
176
+ : ` ${box} ${text}`;
177
+ };
178
+ const scroll = () => {
179
+ if (highlighted < top)
180
+ top = highlighted;
181
+ else if (highlighted >= top + rows)
182
+ top = highlighted - rows + 1;
183
+ top = Math.max(0, Math.min(top, items.length - rows));
184
+ };
185
+ const paintItems = () => {
186
+ scroll();
187
+ for (let offset = 0; offset < rows; offset += 1) {
188
+ output.write(`\r\u001b[2K${row(top + offset)}\n`);
189
+ }
190
+ if (windowed) {
191
+ output.write(`\r\u001b[2K ${theme.dim(`${highlighted + 1}/${items.length}`)}\n`);
192
+ }
193
+ };
194
+ const repaint = () => {
195
+ output.write(`\u001b[${painted}A`);
196
+ paintItems();
197
+ };
198
+ const finish = () => {
199
+ input.off("data", onData);
200
+ input.setRawMode?.(false);
201
+ input.pause?.();
202
+ output.write(`\u001b[${painted + 3}A\r\u001b[J`);
203
+ output.write("\u001b[?25h");
204
+ };
205
+ const onData = (chunk) => {
206
+ const action = parseMultiKey(chunk.toString());
207
+ if (action.kind === "move") {
208
+ highlighted = (highlighted + action.delta + items.length) % items.length;
209
+ repaint();
210
+ }
211
+ else if (action.kind === "toggle") {
212
+ ticked[highlighted] = !ticked[highlighted];
213
+ repaint();
214
+ }
215
+ else if (action.kind === "all") {
216
+ ticked.fill(true);
217
+ repaint();
218
+ }
219
+ else if (action.kind === "none_of_them") {
220
+ ticked.fill(false);
221
+ repaint();
222
+ }
223
+ else if (action.kind === "confirm") {
224
+ finish();
225
+ resolve(items.filter((_item, index) => ticked[index]));
226
+ }
227
+ else if (action.kind === "cancel") {
228
+ finish();
229
+ reject(new SelectCancelledError());
230
+ }
231
+ };
232
+ output.write("\u001b[?25l");
233
+ output.write(`\n ${theme.bold(prompt)} ${theme.dim("↑/↓ move · space select · a all · n none · enter save")}\n\n`);
234
+ paintItems();
235
+ input.setRawMode?.(true);
236
+ input.resume?.();
237
+ input.on("data", onData);
238
+ });
239
+ }
240
+ // Terminal picker when there is one, a numbered list everywhere else.
241
+ export async function chooseManyFrom({ items, prompt, label, theme, selected, }) {
242
+ if (process.stdin.isTTY && process.stdout.isTTY) {
243
+ return multiSelect({
244
+ items,
245
+ prompt,
246
+ label,
247
+ theme,
248
+ input: process.stdin,
249
+ output: process.stdout,
250
+ ...(selected ? { selected } : {}),
251
+ });
252
+ }
253
+ process.stdout.write(`\n ${theme.bold(prompt)}\n\n`);
254
+ items.forEach((item, index) => {
255
+ const mark = selected?.(item) ? theme.ok("x") : " ";
256
+ process.stdout.write(` ${theme.accent(String(index + 1).padStart(2))} [${mark}] ${label(item)}\n`);
257
+ });
258
+ const answer = await ask(`\n ${theme.dim(`Numbers, comma separated, or blank for all [1-${items.length}]`)} `);
259
+ if (!answer)
260
+ return [];
261
+ const picked = [];
262
+ for (const part of answer.split(",")) {
263
+ const index = Number(part.trim()) - 1;
264
+ const item = items[index];
265
+ if (!item)
266
+ throw new InvalidChoiceError(part.trim());
267
+ if (!picked.includes(item))
268
+ picked.push(item);
269
+ }
270
+ return picked;
271
+ }
111
272
  //# sourceMappingURL=select.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"select.js","sourceRoot":"","sources":["../src/select.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"select.js","sourceRoot":"","sources":["../src/select.ts"],"names":[],"mappings":"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"}