@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.
- package/CHANGELOG.md +38 -1
- package/README.md +14 -0
- package/dist/types/cli/local-provider-smoke.d.ts +59 -0
- package/dist/types/cli/notify-cli.d.ts +1 -1
- package/dist/types/cli/update-cli.d.ts +24 -1
- package/dist/types/commands/local-provider.d.ts +34 -0
- package/dist/types/config/keybindings.d.ts +1 -1
- package/dist/types/config/model-profile-activation.d.ts +19 -2
- package/dist/types/config/model-profiles.d.ts +1 -0
- package/dist/types/config/model-registry.d.ts +9 -0
- package/dist/types/config/models-config-schema.d.ts +5 -0
- package/dist/types/config/settings-schema.d.ts +45 -0
- package/dist/types/config/settings.d.ts +7 -0
- package/dist/types/coordinator-mcp/server.d.ts +8 -0
- package/dist/types/gjc-runtime/launch-tmux.d.ts +14 -5
- package/dist/types/gjc-runtime/team-runtime.d.ts +1 -1
- package/dist/types/gjc-runtime/tmux-common.d.ts +12 -0
- package/dist/types/gjc-runtime/ultragoal-guard.d.ts +3 -1
- package/dist/types/modes/components/custom-model-preset-wizard.d.ts +1 -1
- package/dist/types/modes/components/hook-input.d.ts +1 -0
- package/dist/types/modes/components/model-selector.d.ts +11 -0
- package/dist/types/modes/components/settings-selector.d.ts +4 -1
- package/dist/types/modes/components/status-line/types.d.ts +5 -7
- package/dist/types/modes/components/status-line.d.ts +7 -3
- package/dist/types/modes/controllers/extension-ui-controller.d.ts +3 -1
- package/dist/types/modes/controllers/input-controller.d.ts +1 -0
- package/dist/types/modes/controllers/selector-controller.d.ts +2 -1
- package/dist/types/modes/interactive-mode.d.ts +3 -1
- package/dist/types/modes/prompt-action-autocomplete.d.ts +1 -0
- package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +21 -1
- package/dist/types/modes/tmux-scroll.d.ts +18 -0
- package/dist/types/modes/types.d.ts +3 -1
- package/dist/types/modes/utils/terminal-bell.d.ts +3 -0
- package/dist/types/notifications/daemon-paths.d.ts +9 -0
- package/dist/types/notifications/telegram-daemon-cli.d.ts +21 -4
- package/dist/types/notifications/telegram-daemon.d.ts +1 -10
- package/dist/types/tools/ask.d.ts +24 -0
- package/dist/types/tools/ultragoal-ask-guard.d.ts +9 -2
- package/package.json +7 -7
- package/src/cli/local-provider-smoke.ts +632 -0
- package/src/cli/notify-cli.ts +5 -3
- package/src/cli/update-cli.ts +155 -13
- package/src/cli.ts +19 -0
- package/src/commands/launch.ts +46 -1
- package/src/commands/local-provider.ts +62 -0
- package/src/commands/notify.ts +1 -1
- package/src/config/keybindings.ts +1 -1
- package/src/config/model-profile-activation.ts +92 -11
- package/src/config/model-profiles.ts +15 -2
- package/src/config/model-registry.ts +136 -6
- package/src/config/models-config-schema.ts +9 -0
- package/src/config/settings-schema.ts +48 -0
- package/src/config/settings.ts +11 -0
- package/src/coordinator-mcp/server.ts +280 -36
- package/src/deep-interview/render-middleware.ts +1 -0
- package/src/defaults/gjc/skills/deep-interview/SKILL.md +14 -6
- package/src/defaults/gjc/skills/ralplan/SKILL.md +14 -7
- package/src/gjc-runtime/deep-interview-runtime.ts +1 -1
- package/src/gjc-runtime/launch-tmux.ts +321 -38
- package/src/gjc-runtime/launch-worktree.ts +16 -2
- package/src/gjc-runtime/team-runtime.ts +87 -7
- package/src/gjc-runtime/tmux-common.ts +16 -0
- package/src/gjc-runtime/tmux-sessions.ts +13 -9
- package/src/gjc-runtime/ultragoal-guard.ts +11 -5
- package/src/internal-urls/docs-index.generated.ts +10 -9
- package/src/modes/components/agent-dashboard.ts +2 -1
- package/src/modes/components/custom-model-preset-wizard.ts +31 -192
- package/src/modes/components/hook-editor.ts +7 -4
- package/src/modes/components/hook-input.ts +4 -0
- package/src/modes/components/model-selector.ts +260 -12
- package/src/modes/components/session-observer-overlay.ts +3 -3
- package/src/modes/components/settings-selector.ts +506 -5
- package/src/modes/components/status-line/segments.ts +16 -19
- package/src/modes/components/status-line/types.ts +6 -2
- package/src/modes/components/status-line.ts +70 -35
- package/src/modes/controllers/event-controller.ts +98 -4
- package/src/modes/controllers/extension-ui-controller.ts +5 -0
- package/src/modes/controllers/input-controller.ts +15 -0
- package/src/modes/controllers/selector-controller.ts +142 -11
- package/src/modes/interactive-mode.ts +7 -2
- package/src/modes/prompt-action-autocomplete.ts +8 -0
- package/src/modes/shared/agent-wire/deep-interview-gate.ts +11 -4
- package/src/modes/tmux-scroll.ts +92 -0
- package/src/modes/types.ts +6 -1
- package/src/modes/utils/terminal-bell.ts +48 -0
- package/src/notifications/daemon-paths.ts +22 -0
- package/src/notifications/telegram-daemon-cli.ts +125 -13
- package/src/notifications/telegram-daemon.ts +6 -21
- package/src/prompts/system/system-prompt.md +5 -0
- package/src/sdk.ts +10 -1
- package/src/session/agent-session.ts +84 -6
- package/src/slash-commands/builtin-registry.ts +106 -13
- package/src/tools/ask.ts +11 -1
- package/src/tools/eval.ts +2 -2
- package/src/tools/render-utils.ts +2 -0
- 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",
|
|
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",
|
|
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",
|
|
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(
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
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(
|
|
73
|
-
|
|
74
|
-
|
|
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(
|
|
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)}`,
|