@gajae-code/coding-agent 0.12.10 → 0.12.12
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 +47 -2
- package/dist/types/cli/notify-cli.d.ts +42 -1
- package/dist/types/cli/update-cli.d.ts +9 -3
- package/dist/types/commands/notify.d.ts +6 -0
- package/dist/types/config/file-lock.d.ts +3 -0
- package/dist/types/coordinator/contract.d.ts +1 -1
- package/dist/types/coordinator-mcp/question-state.d.ts +3 -1
- package/dist/types/extensibility/extensions/index.d.ts +1 -0
- package/dist/types/extensibility/extensions/ouroboros-ooo-bridge.d.ts +13 -0
- package/dist/types/extensibility/extensions/prefix-command-bridge.d.ts +0 -1
- package/dist/types/extensibility/extensions/types.d.ts +2 -0
- package/dist/types/main.d.ts +6 -2
- package/dist/types/modes/components/session-selector.d.ts +1 -1
- package/dist/types/modes/utils/host-status.d.ts +23 -0
- package/dist/types/runtime-mcp/types.d.ts +2 -0
- package/dist/types/sdk/broker/lifecycle.d.ts +12 -0
- package/dist/types/sdk/bus/chat-daemon-cli.d.ts +3 -0
- package/dist/types/sdk/bus/chat-daemon-command-channel.d.ts +244 -0
- package/dist/types/sdk/bus/chat-daemon-control.d.ts +13 -1
- package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +7 -0
- package/dist/types/sdk/bus/control-plane-frames.d.ts +43 -0
- package/dist/types/sdk/bus/conversation-store.d.ts +18 -0
- package/dist/types/sdk/bus/existing-thread-readiness.d.ts +71 -0
- package/dist/types/sdk/bus/notification-service.d.ts +10 -0
- package/dist/types/sdk/bus/slack-daemon.d.ts +27 -0
- package/dist/types/sdk/bus/slack-live-provider.d.ts +11 -0
- package/dist/types/sdk/bus/slack-provider.d.ts +14 -0
- package/dist/types/sdk/bus/slack-thread-binding.d.ts +140 -0
- package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +2 -0
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +25 -7
- package/dist/types/sdk/bus/telegram-daemon.d.ts +104 -16
- package/dist/types/sdk/bus/telegram-reference.d.ts +10 -1
- package/dist/types/sdk/bus/topic-registry.d.ts +130 -85
- package/dist/types/sdk/host/host.d.ts +52 -0
- package/dist/types/sdk/lifecycle-session.d.ts +6 -0
- package/dist/types/sdk/session-activation.d.ts +41 -0
- package/dist/types/sdk/session.d.ts +18 -0
- package/dist/types/sdk/startup-capability.d.ts +8 -1
- package/dist/types/session/agent-session.d.ts +7 -0
- package/dist/types/session/artifacts.d.ts +2 -2
- package/dist/types/session/internal/managed-session-storage.d.ts +12 -2
- package/dist/types/session/session-manager.d.ts +40 -5
- package/dist/types/session/session-storage.d.ts +1 -0
- package/dist/types/tools/computer.d.ts +35 -2
- package/dist/types/tools/index.d.ts +8 -0
- package/dist/types/tools/todo-write.d.ts +2 -0
- package/dist/types/utils/npm-registry.d.ts +71 -0
- package/examples/extensions/README.md +38 -4
- package/examples/extensions/ooo-bridge.ts +15 -0
- package/package.json +8 -8
- package/scripts/generate-sdk-operation-inventory.ts +4 -0
- package/src/async/job-manager.ts +9 -2
- package/src/cli/notify-cli.ts +226 -2
- package/src/cli/update-cli.ts +90 -23
- package/src/commands/notify.ts +27 -3
- package/src/commands/sdk.ts +1 -0
- package/src/config/file-lock-gc.ts +18 -0
- package/src/config/file-lock.ts +61 -16
- package/src/config/model-profiles.ts +31 -15
- package/src/coordinator/contract.ts +1 -0
- package/src/coordinator-mcp/question-state.ts +2 -0
- package/src/coordinator-mcp/server.ts +358 -7
- package/src/defaults/gjc/skills/ultragoal/SKILL.md +2 -0
- package/src/extensibility/extensions/index.ts +1 -0
- package/src/extensibility/extensions/ouroboros-ooo-bridge.ts +235 -0
- package/src/extensibility/extensions/prefix-command-bridge.ts +4 -9
- package/src/extensibility/extensions/runner.ts +15 -2
- package/src/extensibility/extensions/types.ts +2 -0
- package/src/gjc-runtime/launch-tmux.ts +53 -1
- package/src/internal-urls/docs-index.generated.ts +13 -12
- package/src/main.ts +203 -67
- package/src/modes/DESIGN.md +8 -5
- package/src/modes/components/footer.ts +10 -18
- package/src/modes/components/session-selector.ts +26 -3
- package/src/modes/components/status-line/gh.ts +23 -2
- package/src/modes/controllers/event-controller.ts +3 -0
- package/src/modes/controllers/extension-ui-controller.ts +2 -0
- package/src/modes/controllers/input-controller.ts +11 -0
- package/src/modes/controllers/selector-controller.ts +8 -2
- package/src/modes/interactive-mode.ts +7 -1
- package/src/modes/utils/host-status.ts +38 -0
- package/src/prompts/tools/computer.md +6 -1
- package/src/runtime-mcp/types.ts +2 -0
- package/src/sdk/broker/lifecycle.ts +60 -3
- package/src/sdk/bus/chat-daemon-cli.ts +42 -0
- package/src/sdk/bus/chat-daemon-command-channel.ts +921 -0
- package/src/sdk/bus/chat-daemon-control.ts +18 -3
- package/src/sdk/bus/chat-daemon-runtime.ts +257 -21
- package/src/sdk/bus/control-plane-frames.ts +51 -0
- package/src/sdk/bus/conversation-store.ts +29 -1
- package/src/sdk/bus/existing-thread-readiness.ts +155 -0
- package/src/sdk/bus/index.ts +70 -0
- package/src/sdk/bus/notification-service.ts +28 -1
- package/src/sdk/bus/rich-render.ts +3 -2
- package/src/sdk/bus/slack-daemon.ts +99 -4
- package/src/sdk/bus/slack-live-provider.ts +32 -2
- package/src/sdk/bus/slack-provider.ts +11 -0
- package/src/sdk/bus/slack-thread-binding.ts +641 -0
- package/src/sdk/bus/telegram-daemon-cli.ts +11 -0
- package/src/sdk/bus/telegram-daemon-contract.ts +25 -7
- package/src/sdk/bus/telegram-daemon.ts +1961 -497
- package/src/sdk/bus/telegram-reference.ts +42 -6
- package/src/sdk/bus/topic-registry.ts +674 -181
- package/src/sdk/host/host.ts +180 -1
- package/src/sdk/lifecycle-session.ts +8 -2
- package/src/sdk/protocol/operation-inventory.generated.json +22 -0
- package/src/sdk/session-activation.ts +127 -0
- package/src/sdk/session.ts +139 -28
- package/src/sdk/startup-capability.ts +10 -1
- package/src/session/agent-session.ts +331 -30
- package/src/session/artifacts.ts +56 -13
- package/src/session/internal/managed-session-storage.ts +440 -243
- package/src/session/session-manager.ts +288 -44
- package/src/session/session-storage.ts +3 -0
- package/src/setup/provider-presets.json +1 -1
- package/src/task/index.ts +92 -44
- package/src/tools/computer.ts +322 -45
- package/src/tools/index.ts +8 -0
- package/src/tools/todo-write.ts +29 -11
- package/src/utils/npm-registry.ts +660 -0
package/src/task/index.ts
CHANGED
|
@@ -485,10 +485,12 @@ interface SessionLifetimeArtifactsState {
|
|
|
485
485
|
originalGetArtifactsDir?: ToolSession["getArtifactsDir"];
|
|
486
486
|
originalGetAuthorizedArtifactsDirs?: ToolSession["getAuthorizedArtifactsDirs"];
|
|
487
487
|
originalGetArtifactManager?: ToolSession["getArtifactManager"];
|
|
488
|
+
originalIsArtifactManagerAuthorized?: ToolSession["isArtifactManagerAuthorized"];
|
|
488
489
|
originalAgentOutputManager?: AgentOutputManager;
|
|
489
490
|
installedGetArtifactsDir?: ToolSession["getArtifactsDir"];
|
|
490
491
|
installedGetAuthorizedArtifactsDirs?: ToolSession["getAuthorizedArtifactsDirs"];
|
|
491
492
|
installedGetArtifactManager?: ToolSession["getArtifactManager"];
|
|
493
|
+
installedIsArtifactManagerAuthorized?: ToolSession["isArtifactManagerAuthorized"];
|
|
492
494
|
installedAgentOutputManager?: AgentOutputManager;
|
|
493
495
|
}
|
|
494
496
|
|
|
@@ -568,6 +570,17 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
|
|
|
568
570
|
return this.session.settings.get("task.simple");
|
|
569
571
|
}
|
|
570
572
|
|
|
573
|
+
/**
|
|
574
|
+
* The artifact store shared by this whole agent tree, when the session proves
|
|
575
|
+
* the exact manager relationship. Path containment is not authority: an
|
|
576
|
+
* unrelated manager can choose a lexically nested root or session filename.
|
|
577
|
+
*/
|
|
578
|
+
#sharedArtifactStore(): { dir: string; manager: ArtifactManager } | null {
|
|
579
|
+
const manager = this.session.getArtifactManager?.() ?? null;
|
|
580
|
+
if (!manager || this.session.isArtifactManagerAuthorized?.(manager) !== true) return null;
|
|
581
|
+
return { dir: path.resolve(manager.dir), manager };
|
|
582
|
+
}
|
|
583
|
+
|
|
571
584
|
/**
|
|
572
585
|
* Ensure a session-lifetime artifact directory when the parent has no session file.
|
|
573
586
|
* Returns null only when durable allocation fails (mkdir error) — callers must not
|
|
@@ -576,15 +589,24 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
|
|
|
576
589
|
async #ensureSessionLifetimeArtifacts(): Promise<{ dir: string; manager: ArtifactManager } | null> {
|
|
577
590
|
const state = sessionLifetimeArtifactsState(this.session);
|
|
578
591
|
if (state.authorized && state.dir && state.manager) return { dir: state.dir, manager: state.manager };
|
|
592
|
+
if (this.session.ensureArtifactManager) {
|
|
593
|
+
const manager = await this.session.ensureArtifactManager();
|
|
594
|
+
if (manager && this.session.isArtifactManagerAuthorized?.(manager) === true) {
|
|
595
|
+
const dir = path.resolve(manager.dir);
|
|
596
|
+
state.dir = dir;
|
|
597
|
+
state.manager = manager;
|
|
598
|
+
if (!(await this.#authorizeSessionLifetimeArtifacts(state, dir, manager, false, false))) return null;
|
|
599
|
+
return { dir, manager };
|
|
600
|
+
}
|
|
601
|
+
}
|
|
579
602
|
|
|
580
603
|
const sessionArtifactsDir = this.session.getArtifactsDir?.() ?? null;
|
|
581
604
|
if (sessionArtifactsDir) {
|
|
582
|
-
const
|
|
583
|
-
if (existingManager && path.resolve(existingManager.dir) !== path.resolve(sessionArtifactsDir)) return null;
|
|
584
|
-
const manager = existingManager ?? new ArtifactManager(sessionArtifactsDir);
|
|
605
|
+
const manager = new ArtifactManager(sessionArtifactsDir);
|
|
585
606
|
state.dir = sessionArtifactsDir;
|
|
586
607
|
state.manager = manager;
|
|
587
|
-
if (!(await this.#authorizeSessionLifetimeArtifacts(state, sessionArtifactsDir, manager, false)))
|
|
608
|
+
if (!(await this.#authorizeSessionLifetimeArtifacts(state, sessionArtifactsDir, manager, false, true)))
|
|
609
|
+
return null;
|
|
588
610
|
return { dir: sessionArtifactsDir, manager };
|
|
589
611
|
}
|
|
590
612
|
if (!this.session.registerSessionCleanup) return null;
|
|
@@ -609,7 +631,7 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
|
|
|
609
631
|
}
|
|
610
632
|
state.dir = dir;
|
|
611
633
|
state.manager = new ArtifactManager(dir);
|
|
612
|
-
if (!(await this.#authorizeSessionLifetimeArtifacts(state, dir, state.manager, true))) return null;
|
|
634
|
+
if (!(await this.#authorizeSessionLifetimeArtifacts(state, dir, state.manager, true, true))) return null;
|
|
613
635
|
return dir;
|
|
614
636
|
}
|
|
615
637
|
|
|
@@ -623,11 +645,13 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
|
|
|
623
645
|
dir: string,
|
|
624
646
|
manager: ArtifactManager,
|
|
625
647
|
owned: boolean,
|
|
648
|
+
adoptIntoSessionOwner: boolean,
|
|
626
649
|
): Promise<boolean> {
|
|
627
650
|
if (state.authorized) return true;
|
|
628
651
|
state.originalGetArtifactsDir = this.session.getArtifactsDir;
|
|
629
652
|
state.originalGetAuthorizedArtifactsDirs = this.session.getAuthorizedArtifactsDirs;
|
|
630
653
|
state.originalGetArtifactManager = this.session.getArtifactManager;
|
|
654
|
+
state.originalIsArtifactManagerAuthorized = this.session.isArtifactManagerAuthorized;
|
|
631
655
|
state.originalAgentOutputManager = this.session.agentOutputManager;
|
|
632
656
|
|
|
633
657
|
state.installedGetArtifactsDir = () => state.originalGetArtifactsDir?.() ?? dir;
|
|
@@ -643,6 +667,8 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
|
|
|
643
667
|
return dirs;
|
|
644
668
|
};
|
|
645
669
|
state.installedGetArtifactManager = () => manager;
|
|
670
|
+
state.installedIsArtifactManagerAuthorized = candidate =>
|
|
671
|
+
candidate === manager || state.originalIsArtifactManagerAuthorized?.(candidate) === true;
|
|
646
672
|
if (owned || !this.session.agentOutputManager) {
|
|
647
673
|
state.installedAgentOutputManager = new AgentOutputManager(() => this.session.getArtifactsDir?.() ?? null, {
|
|
648
674
|
parentPrefix: owned ? state.outputPrefix : undefined,
|
|
@@ -653,56 +679,74 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
|
|
|
653
679
|
let cleanupRan = false;
|
|
654
680
|
const cleanup = async () => {
|
|
655
681
|
cleanupRan = true;
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
}
|
|
682
|
+
this.session.releaseArtifactManager?.(manager);
|
|
683
|
+
if (this.session.getArtifactsDir === state.installedGetArtifactsDir)
|
|
684
|
+
this.session.getArtifactsDir = state.originalGetArtifactsDir;
|
|
685
|
+
if (this.session.getAuthorizedArtifactsDirs === state.installedGetAuthorizedArtifactsDirs)
|
|
686
|
+
this.session.getAuthorizedArtifactsDirs = state.originalGetAuthorizedArtifactsDirs;
|
|
687
|
+
if (this.session.getArtifactManager === state.installedGetArtifactManager)
|
|
688
|
+
this.session.getArtifactManager = state.originalGetArtifactManager;
|
|
689
|
+
if (this.session.isArtifactManagerAuthorized === state.installedIsArtifactManagerAuthorized)
|
|
690
|
+
this.session.isArtifactManagerAuthorized = state.originalIsArtifactManagerAuthorized;
|
|
691
|
+
if (this.session.agentOutputManager === state.installedAgentOutputManager)
|
|
692
|
+
this.session.agentOutputManager = state.originalAgentOutputManager;
|
|
693
|
+
sessionLifetimeArtifacts.delete(this.session);
|
|
694
|
+
if (owned) await fs.rm(dir, { recursive: true, force: true });
|
|
669
695
|
};
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
696
|
+
const registerCleanup = this.session.registerSessionCleanup;
|
|
697
|
+
if (!registerCleanup) {
|
|
698
|
+
state.dir = undefined;
|
|
699
|
+
state.manager = undefined;
|
|
700
|
+
state.ensurePromise = undefined;
|
|
701
|
+
sessionLifetimeArtifacts.delete(this.session);
|
|
702
|
+
if (owned) await fs.rm(dir, { recursive: true, force: true }).catch(() => {});
|
|
703
|
+
return false;
|
|
704
|
+
}
|
|
705
|
+
try {
|
|
706
|
+
registerCleanup(cleanup);
|
|
707
|
+
} catch {
|
|
708
|
+
state.dir = undefined;
|
|
709
|
+
state.manager = undefined;
|
|
710
|
+
state.ensurePromise = undefined;
|
|
711
|
+
sessionLifetimeArtifacts.delete(this.session);
|
|
712
|
+
if (owned) await fs.rm(dir, { recursive: true, force: true }).catch(() => {});
|
|
713
|
+
return false;
|
|
714
|
+
}
|
|
715
|
+
if (cleanupRan) return false;
|
|
716
|
+
state.cleanupRegistered = true;
|
|
717
|
+
if (adoptIntoSessionOwner && this.session.adoptArtifactManager) {
|
|
680
718
|
try {
|
|
681
|
-
|
|
719
|
+
this.session.adoptArtifactManager(manager);
|
|
682
720
|
} catch {
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
721
|
+
await cleanup();
|
|
722
|
+
return false;
|
|
723
|
+
}
|
|
724
|
+
if (
|
|
725
|
+
this.session.getArtifactManager?.() !== manager ||
|
|
726
|
+
this.session.isArtifactManagerAuthorized?.(manager) !== true
|
|
727
|
+
) {
|
|
728
|
+
await cleanup();
|
|
688
729
|
return false;
|
|
689
730
|
}
|
|
690
|
-
if (cleanupRan) return false;
|
|
691
|
-
state.cleanupRegistered = true;
|
|
692
731
|
}
|
|
693
732
|
|
|
694
733
|
state.authorized = true;
|
|
695
734
|
this.session.getArtifactsDir = state.installedGetArtifactsDir;
|
|
696
735
|
this.session.getAuthorizedArtifactsDirs = state.installedGetAuthorizedArtifactsDirs;
|
|
697
736
|
this.session.getArtifactManager = state.installedGetArtifactManager;
|
|
737
|
+
this.session.isArtifactManagerAuthorized = state.installedIsArtifactManagerAuthorized;
|
|
698
738
|
if (state.installedAgentOutputManager) this.session.agentOutputManager = state.installedAgentOutputManager;
|
|
699
739
|
return true;
|
|
700
740
|
}
|
|
701
741
|
|
|
702
742
|
/**
|
|
703
743
|
* Resolve the effective artifacts directory for this task batch.
|
|
704
|
-
*
|
|
705
|
-
*
|
|
744
|
+
*
|
|
745
|
+
* The session's ArtifactManager is authoritative when present: a subagent
|
|
746
|
+
* adopts its parent's manager, so honouring it keeps the whole agent tree on
|
|
747
|
+
* one artifact directory and one ID space instead of giving each nesting
|
|
748
|
+
* level a private store. Sessions without a manager fall back to the session
|
|
749
|
+
* artifacts path, then to the session-lifetime durable temp root.
|
|
706
750
|
*/
|
|
707
751
|
async #resolveEffectiveArtifactsDir(): Promise<{
|
|
708
752
|
sessionArtifactsDir: string | null;
|
|
@@ -710,19 +754,23 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
|
|
|
710
754
|
effectiveArtifactsDir: string | undefined;
|
|
711
755
|
parentArtifactManager: ArtifactManager | undefined;
|
|
712
756
|
}> {
|
|
757
|
+
const shared = this.#sharedArtifactStore();
|
|
758
|
+
if (shared) {
|
|
759
|
+
return {
|
|
760
|
+
sessionArtifactsDir: shared.dir,
|
|
761
|
+
durableArtifactsDir: null,
|
|
762
|
+
effectiveArtifactsDir: shared.dir,
|
|
763
|
+
parentArtifactManager: shared.manager,
|
|
764
|
+
};
|
|
765
|
+
}
|
|
713
766
|
const sessionFile = this.session.getSessionFile();
|
|
714
767
|
const sessionArtifactsDir = sessionFile ? sessionFile.slice(0, -6) : null;
|
|
715
768
|
if (sessionArtifactsDir) {
|
|
716
|
-
const candidateManager = this.session.getArtifactManager?.() ?? undefined;
|
|
717
|
-
const parentArtifactManager =
|
|
718
|
-
candidateManager && path.resolve(candidateManager.dir) === path.resolve(sessionArtifactsDir)
|
|
719
|
-
? candidateManager
|
|
720
|
-
: undefined;
|
|
721
769
|
return {
|
|
722
770
|
sessionArtifactsDir,
|
|
723
771
|
durableArtifactsDir: null,
|
|
724
772
|
effectiveArtifactsDir: sessionArtifactsDir,
|
|
725
|
-
parentArtifactManager,
|
|
773
|
+
parentArtifactManager: undefined,
|
|
726
774
|
};
|
|
727
775
|
}
|
|
728
776
|
const durable = await this.#ensureSessionLifetimeArtifacts();
|