@gajae-code/coding-agent 0.7.7 → 0.7.9

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 (96) hide show
  1. package/CHANGELOG.md +38 -1
  2. package/README.md +14 -0
  3. package/dist/types/cli/local-provider-smoke.d.ts +59 -0
  4. package/dist/types/cli/notify-cli.d.ts +1 -1
  5. package/dist/types/cli/update-cli.d.ts +24 -1
  6. package/dist/types/commands/local-provider.d.ts +34 -0
  7. package/dist/types/config/keybindings.d.ts +1 -1
  8. package/dist/types/config/model-profile-activation.d.ts +19 -2
  9. package/dist/types/config/model-profiles.d.ts +1 -0
  10. package/dist/types/config/model-registry.d.ts +9 -0
  11. package/dist/types/config/models-config-schema.d.ts +5 -0
  12. package/dist/types/config/settings-schema.d.ts +45 -0
  13. package/dist/types/config/settings.d.ts +7 -0
  14. package/dist/types/coordinator-mcp/server.d.ts +8 -0
  15. package/dist/types/gjc-runtime/launch-tmux.d.ts +14 -5
  16. package/dist/types/gjc-runtime/team-runtime.d.ts +1 -1
  17. package/dist/types/gjc-runtime/tmux-common.d.ts +12 -0
  18. package/dist/types/gjc-runtime/ultragoal-guard.d.ts +3 -1
  19. package/dist/types/modes/components/custom-model-preset-wizard.d.ts +1 -1
  20. package/dist/types/modes/components/hook-input.d.ts +1 -0
  21. package/dist/types/modes/components/model-selector.d.ts +11 -0
  22. package/dist/types/modes/components/settings-selector.d.ts +4 -1
  23. package/dist/types/modes/components/status-line/types.d.ts +5 -7
  24. package/dist/types/modes/components/status-line.d.ts +7 -3
  25. package/dist/types/modes/controllers/extension-ui-controller.d.ts +3 -1
  26. package/dist/types/modes/controllers/input-controller.d.ts +1 -0
  27. package/dist/types/modes/controllers/selector-controller.d.ts +2 -1
  28. package/dist/types/modes/interactive-mode.d.ts +3 -1
  29. package/dist/types/modes/prompt-action-autocomplete.d.ts +1 -0
  30. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +21 -1
  31. package/dist/types/modes/tmux-scroll.d.ts +18 -0
  32. package/dist/types/modes/types.d.ts +3 -1
  33. package/dist/types/modes/utils/terminal-bell.d.ts +3 -0
  34. package/dist/types/notifications/daemon-paths.d.ts +9 -0
  35. package/dist/types/notifications/telegram-daemon-cli.d.ts +21 -4
  36. package/dist/types/notifications/telegram-daemon.d.ts +1 -10
  37. package/dist/types/tools/ask.d.ts +24 -0
  38. package/dist/types/tools/ultragoal-ask-guard.d.ts +9 -2
  39. package/package.json +7 -7
  40. package/src/cli/local-provider-smoke.ts +632 -0
  41. package/src/cli/notify-cli.ts +5 -3
  42. package/src/cli/update-cli.ts +155 -13
  43. package/src/cli.ts +19 -0
  44. package/src/commands/launch.ts +46 -1
  45. package/src/commands/local-provider.ts +62 -0
  46. package/src/commands/notify.ts +1 -1
  47. package/src/config/keybindings.ts +1 -1
  48. package/src/config/model-profile-activation.ts +92 -11
  49. package/src/config/model-profiles.ts +15 -2
  50. package/src/config/model-registry.ts +136 -6
  51. package/src/config/models-config-schema.ts +9 -0
  52. package/src/config/settings-schema.ts +48 -0
  53. package/src/config/settings.ts +11 -0
  54. package/src/coordinator-mcp/server.ts +280 -36
  55. package/src/deep-interview/render-middleware.ts +1 -0
  56. package/src/defaults/gjc/skills/deep-interview/SKILL.md +14 -6
  57. package/src/defaults/gjc/skills/ralplan/SKILL.md +14 -7
  58. package/src/gjc-runtime/deep-interview-runtime.ts +1 -1
  59. package/src/gjc-runtime/launch-tmux.ts +321 -38
  60. package/src/gjc-runtime/launch-worktree.ts +16 -2
  61. package/src/gjc-runtime/team-runtime.ts +87 -7
  62. package/src/gjc-runtime/tmux-common.ts +16 -0
  63. package/src/gjc-runtime/tmux-sessions.ts +13 -9
  64. package/src/gjc-runtime/ultragoal-guard.ts +11 -5
  65. package/src/internal-urls/docs-index.generated.ts +10 -9
  66. package/src/modes/components/agent-dashboard.ts +2 -1
  67. package/src/modes/components/custom-model-preset-wizard.ts +31 -192
  68. package/src/modes/components/hook-editor.ts +7 -4
  69. package/src/modes/components/hook-input.ts +4 -0
  70. package/src/modes/components/model-selector.ts +260 -12
  71. package/src/modes/components/session-observer-overlay.ts +3 -3
  72. package/src/modes/components/settings-selector.ts +506 -5
  73. package/src/modes/components/status-line/segments.ts +16 -19
  74. package/src/modes/components/status-line/types.ts +6 -2
  75. package/src/modes/components/status-line.ts +70 -35
  76. package/src/modes/controllers/event-controller.ts +98 -4
  77. package/src/modes/controllers/extension-ui-controller.ts +5 -0
  78. package/src/modes/controllers/input-controller.ts +15 -0
  79. package/src/modes/controllers/selector-controller.ts +142 -11
  80. package/src/modes/interactive-mode.ts +7 -2
  81. package/src/modes/prompt-action-autocomplete.ts +8 -0
  82. package/src/modes/shared/agent-wire/deep-interview-gate.ts +11 -4
  83. package/src/modes/tmux-scroll.ts +92 -0
  84. package/src/modes/types.ts +6 -1
  85. package/src/modes/utils/terminal-bell.ts +48 -0
  86. package/src/notifications/daemon-paths.ts +22 -0
  87. package/src/notifications/telegram-daemon-cli.ts +125 -13
  88. package/src/notifications/telegram-daemon.ts +6 -21
  89. package/src/prompts/system/system-prompt.md +5 -0
  90. package/src/sdk.ts +10 -1
  91. package/src/session/agent-session.ts +84 -6
  92. package/src/slash-commands/builtin-registry.ts +106 -13
  93. package/src/tools/ask.ts +11 -1
  94. package/src/tools/eval.ts +2 -2
  95. package/src/tools/render-utils.ts +2 -0
  96. package/src/tools/ultragoal-ask-guard.ts +39 -5
@@ -86,6 +86,22 @@ export function buildGjcTmuxExactOptionTarget(
86
86
  return `=${sessionName}:`;
87
87
  }
88
88
 
89
+ /**
90
+ * Build the exact-session target for tmux *session-scoped* commands such as
91
+ * `attach-session` and `kill-session`. Native tmux accepts `=NAME` for an
92
+ * exact session match, but Windows psmux 3.3.x rejects that target form for
93
+ * session commands even though the bare `NAME` resolves. Keep native tmux on
94
+ * exact targets and intentionally use the bare session name for psmux.
95
+ */
96
+ export function buildGjcTmuxExactSessionTarget(
97
+ sessionName: string,
98
+ opts: { env?: NodeJS.ProcessEnv; platform?: NodeJS.Platform; binary?: ResolvedTmuxBinary } = {},
99
+ ): string {
100
+ const binary = opts.binary ?? resolveGjcTmuxBinary({ env: opts.env, platform: opts.platform });
101
+ if (binary.isPsmux) return sessionName;
102
+ return `=${sessionName}`;
103
+ }
104
+
89
105
  export const GJC_TMUX_UNTAGGED_REASON = "gjc_tmux_session_untagged";
90
106
 
91
107
  export function buildGjcTmuxUntaggedSessionHint(tmuxCommand: string): string {
@@ -1,6 +1,7 @@
1
1
  import { resolveGjcTmuxBinary } from "./psmux-detect";
2
2
  import {
3
3
  buildGjcTmuxExactOptionTarget,
4
+ buildGjcTmuxExactSessionTarget,
4
5
  buildGjcTmuxProfileCommands,
5
6
  buildGjcTmuxSessionName,
6
7
  buildGjcTmuxUntaggedSessionError,
@@ -60,7 +61,7 @@ function runTmux(args: string[], env: NodeJS.ProcessEnv = process.env): string {
60
61
 
61
62
  function tryKillSession(sessionName: string, env: NodeJS.ProcessEnv): void {
62
63
  try {
63
- runTmux(["kill-session", "-t", `=${sessionName}`], env);
64
+ runTmux(["kill-session", "-t", buildGjcTmuxExactSessionTarget(sessionName, { env })], env);
64
65
  } catch {
65
66
  // Best-effort cleanup only; preserve the original create/tag failure.
66
67
  }
@@ -360,7 +361,7 @@ export function removeGjcTmuxSession(sessionName: string, env: NodeJS.ProcessEnv
360
361
  if (readProfileForExactTarget(session.name, env) !== GJC_TMUX_PROFILE_VALUE) {
361
362
  throw new Error(`gjc_tmux_session_not_managed:${sessionName}`);
362
363
  }
363
- runTmux(["kill-session", "-t", `=${session.name}`], env);
364
+ runTmux(["kill-session", "-t", buildGjcTmuxExactSessionTarget(session.name, { env })], env);
364
365
  return session;
365
366
  }
366
367
 
@@ -404,18 +405,21 @@ export function forceCloseGjcTmuxSession(
404
405
  }
405
406
  }
406
407
  // Intentionally NOT refusing live/attached panes — force-close is hard-kill.
407
- runTmux(["kill-session", "-t", `=${session.name}`], env);
408
+ runTmux(["kill-session", "-t", buildGjcTmuxExactSessionTarget(session.name, { env })], env);
408
409
  return session;
409
410
  }
410
411
 
411
412
  export function attachGjcTmuxSession(sessionName: string, env: NodeJS.ProcessEnv = process.env): never {
412
413
  const session = statusGjcTmuxSession(sessionName, env);
413
414
  const tmuxCommand = resolveGjcTmuxCommand(env);
414
- const result = Bun.spawnSync([tmuxCommand, "attach-session", "-t", `=${session.name}`], {
415
- stdin: "inherit",
416
- stdout: "inherit",
417
- stderr: "inherit",
418
- env,
419
- });
415
+ const result = Bun.spawnSync(
416
+ [tmuxCommand, "attach-session", "-t", buildGjcTmuxExactSessionTarget(session.name, { env })],
417
+ {
418
+ stdin: "inherit",
419
+ stdout: "inherit",
420
+ stderr: "inherit",
421
+ env,
422
+ },
423
+ );
420
424
  process.exit(result.exitCode ?? 1);
421
425
  }
@@ -69,9 +69,12 @@ function isKnownUltragoalObjective(currentObjective: string): boolean {
69
69
  );
70
70
  }
71
71
 
72
- async function ultragoalReadPaths(cwd: string): Promise<{ paths: UltragoalPaths; sessionId: string | null }> {
73
- const envSessionId = process.env.GJC_SESSION_ID?.trim();
74
- if (envSessionId) return { paths: getUltragoalPaths(cwd, envSessionId), sessionId: envSessionId };
72
+ async function ultragoalReadPaths(
73
+ cwd: string,
74
+ options: { sessionId?: string | null } = {},
75
+ ): Promise<{ paths: UltragoalPaths; sessionId: string | null }> {
76
+ const explicitSessionId = options.sessionId?.trim() || process.env.GJC_SESSION_ID?.trim();
77
+ if (explicitSessionId) return { paths: getUltragoalPaths(cwd, explicitSessionId), sessionId: explicitSessionId };
75
78
  try {
76
79
  const session = await resolveGjcSessionForRead(cwd, { envSessionId: process.env.GJC_SESSION_ID });
77
80
  return { paths: getUltragoalPaths(cwd, session.gjcSessionId), sessionId: session.gjcSessionId };
@@ -372,11 +375,14 @@ export async function readUltragoalVerificationState(input: {
372
375
  return receiptDiagnostic;
373
376
  }
374
377
 
375
- export async function isUltragoalAskBlocked(cwd: string): Promise<UltragoalAskBlockDiagnostic> {
378
+ export async function isUltragoalAskBlocked(
379
+ cwd: string,
380
+ options: { sessionId?: string | null } = {},
381
+ ): Promise<UltragoalAskBlockDiagnostic> {
376
382
  let paths: UltragoalPaths;
377
383
  let sessionId: string | null;
378
384
  try {
379
- ({ paths, sessionId } = await ultragoalReadPaths(cwd));
385
+ ({ paths, sessionId } = await ultragoalReadPaths(cwd, options));
380
386
  } catch (error) {
381
387
  return activeAskDiagnostic({
382
388
  reason: `Unable to resolve durable Ultragoal state: ${error instanceof Error ? error.message : String(error)}`,