aimux-cli 0.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.
- package/README.md +743 -0
- package/bin/aimux +2 -0
- package/dist/agent-events.d.ts +20 -0
- package/dist/agent-events.js +2 -0
- package/dist/agent-events.js.map +1 -0
- package/dist/agent-message-parts.d.ts +17 -0
- package/dist/agent-message-parts.js +31 -0
- package/dist/agent-message-parts.js.map +1 -0
- package/dist/agent-output-parser.d.ts +16 -0
- package/dist/agent-output-parser.js +229 -0
- package/dist/agent-output-parser.js.map +1 -0
- package/dist/agent-tracker.d.ts +9 -0
- package/dist/agent-tracker.js +144 -0
- package/dist/agent-tracker.js.map +1 -0
- package/dist/agent-watcher.d.ts +15 -0
- package/dist/agent-watcher.js +2 -0
- package/dist/agent-watcher.js.map +1 -0
- package/dist/attachment-store.d.ts +35 -0
- package/dist/attachment-store.js +129 -0
- package/dist/attachment-store.js.map +1 -0
- package/dist/builtin-metadata-watchers.d.ts +2 -0
- package/dist/builtin-metadata-watchers.js +275 -0
- package/dist/builtin-metadata-watchers.js.map +1 -0
- package/dist/claude-hooks.d.ts +29 -0
- package/dist/claude-hooks.js +106 -0
- package/dist/claude-hooks.js.map +1 -0
- package/dist/config.d.ts +78 -0
- package/dist/config.js +172 -0
- package/dist/config.js.map +1 -0
- package/dist/context/compactor.d.ts +20 -0
- package/dist/context/compactor.js +212 -0
- package/dist/context/compactor.js.map +1 -0
- package/dist/context/context-bridge.d.ts +67 -0
- package/dist/context/context-bridge.js +471 -0
- package/dist/context/context-bridge.js.map +1 -0
- package/dist/context/context-file.d.ts +11 -0
- package/dist/context/context-file.js +93 -0
- package/dist/context/context-file.js.map +1 -0
- package/dist/context/history.d.ts +40 -0
- package/dist/context/history.js +108 -0
- package/dist/context/history.js.map +1 -0
- package/dist/daemon.d.ts +39 -0
- package/dist/daemon.js +344 -0
- package/dist/daemon.js.map +1 -0
- package/dist/dashboard-session-registry.d.ts +47 -0
- package/dist/dashboard-session-registry.js +161 -0
- package/dist/dashboard-session-registry.js.map +1 -0
- package/dist/dashboard-state.d.ts +18 -0
- package/dist/dashboard-state.js +26 -0
- package/dist/dashboard-state.js.map +1 -0
- package/dist/dashboard.d.ts +118 -0
- package/dist/dashboard.js +91 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/debug.d.ts +7 -0
- package/dist/debug.js +41 -0
- package/dist/debug.js.map +1 -0
- package/dist/fast-control.d.ts +45 -0
- package/dist/fast-control.js +174 -0
- package/dist/fast-control.js.map +1 -0
- package/dist/hotkeys.d.ts +44 -0
- package/dist/hotkeys.js +118 -0
- package/dist/hotkeys.js.map +1 -0
- package/dist/http-client.d.ts +10 -0
- package/dist/http-client.js +54 -0
- package/dist/http-client.js.map +1 -0
- package/dist/instance-directory.d.ts +32 -0
- package/dist/instance-directory.js +82 -0
- package/dist/instance-directory.js.map +1 -0
- package/dist/instance-registry.d.ts +38 -0
- package/dist/instance-registry.js +208 -0
- package/dist/instance-registry.js.map +1 -0
- package/dist/key-parser.d.ts +30 -0
- package/dist/key-parser.js +272 -0
- package/dist/key-parser.js.map +1 -0
- package/dist/last-used.d.ts +31 -0
- package/dist/last-used.js +93 -0
- package/dist/last-used.js.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +2483 -0
- package/dist/main.js.map +1 -0
- package/dist/metadata-server.d.ts +268 -0
- package/dist/metadata-server.js +1379 -0
- package/dist/metadata-server.js.map +1 -0
- package/dist/metadata-store.d.ts +80 -0
- package/dist/metadata-store.js +87 -0
- package/dist/metadata-store.js.map +1 -0
- package/dist/multiplexer.d.ts +471 -0
- package/dist/multiplexer.js +5714 -0
- package/dist/multiplexer.js.map +1 -0
- package/dist/notification-context.d.ts +18 -0
- package/dist/notification-context.js +68 -0
- package/dist/notification-context.js.map +1 -0
- package/dist/notifications.d.ts +38 -0
- package/dist/notifications.js +111 -0
- package/dist/notifications.js.map +1 -0
- package/dist/notify.d.ts +10 -0
- package/dist/notify.js +62 -0
- package/dist/notify.js.map +1 -0
- package/dist/orchestration-actions.d.ts +76 -0
- package/dist/orchestration-actions.js +310 -0
- package/dist/orchestration-actions.js.map +1 -0
- package/dist/orchestration-dispatcher.d.ts +22 -0
- package/dist/orchestration-dispatcher.js +49 -0
- package/dist/orchestration-dispatcher.js.map +1 -0
- package/dist/orchestration-routing.d.ts +20 -0
- package/dist/orchestration-routing.js +78 -0
- package/dist/orchestration-routing.js.map +1 -0
- package/dist/orchestration.d.ts +26 -0
- package/dist/orchestration.js +110 -0
- package/dist/orchestration.js.map +1 -0
- package/dist/osc-notifications.d.ts +15 -0
- package/dist/osc-notifications.js +180 -0
- package/dist/osc-notifications.js.map +1 -0
- package/dist/paths.d.ts +55 -0
- package/dist/paths.js +259 -0
- package/dist/paths.js.map +1 -0
- package/dist/plugin-runtime.d.ts +46 -0
- package/dist/plugin-runtime.js +180 -0
- package/dist/plugin-runtime.js.map +1 -0
- package/dist/project-events.d.ts +36 -0
- package/dist/project-events.js +63 -0
- package/dist/project-events.js.map +1 -0
- package/dist/project-scanner.d.ts +38 -0
- package/dist/project-scanner.js +243 -0
- package/dist/project-scanner.js.map +1 -0
- package/dist/project-service-manifest.d.ts +18 -0
- package/dist/project-service-manifest.js +56 -0
- package/dist/project-service-manifest.js.map +1 -0
- package/dist/recency.d.ts +2 -0
- package/dist/recency.js +34 -0
- package/dist/recency.js.map +1 -0
- package/dist/recorder.d.ts +14 -0
- package/dist/recorder.js +130 -0
- package/dist/recorder.js.map +1 -0
- package/dist/session-bootstrap.d.ts +45 -0
- package/dist/session-bootstrap.js +436 -0
- package/dist/session-bootstrap.js.map +1 -0
- package/dist/session-message-history.d.ts +27 -0
- package/dist/session-message-history.js +105 -0
- package/dist/session-message-history.js.map +1 -0
- package/dist/session-runtime.d.ts +44 -0
- package/dist/session-runtime.js +56 -0
- package/dist/session-runtime.js.map +1 -0
- package/dist/session-semantics.d.ts +35 -0
- package/dist/session-semantics.js +110 -0
- package/dist/session-semantics.js.map +1 -0
- package/dist/status-detector.d.ts +17 -0
- package/dist/status-detector.js +67 -0
- package/dist/status-detector.js.map +1 -0
- package/dist/statusline-model.d.ts +103 -0
- package/dist/statusline-model.js +177 -0
- package/dist/statusline-model.js.map +1 -0
- package/dist/task-dispatcher.d.ts +63 -0
- package/dist/task-dispatcher.js +210 -0
- package/dist/task-dispatcher.js.map +1 -0
- package/dist/task-workflow.d.ts +13 -0
- package/dist/task-workflow.js +153 -0
- package/dist/task-workflow.js.map +1 -0
- package/dist/tasks.d.ts +60 -0
- package/dist/tasks.js +120 -0
- package/dist/tasks.js.map +1 -0
- package/dist/team.d.ts +28 -0
- package/dist/team.js +91 -0
- package/dist/team.js.map +1 -0
- package/dist/terminal-host.d.ts +10 -0
- package/dist/terminal-host.js +52 -0
- package/dist/terminal-host.js.map +1 -0
- package/dist/threads.d.ts +61 -0
- package/dist/threads.js +200 -0
- package/dist/threads.js.map +1 -0
- package/dist/tmux-doctor.d.ts +47 -0
- package/dist/tmux-doctor.js +112 -0
- package/dist/tmux-doctor.js.map +1 -0
- package/dist/tmux-runtime-manager.d.ts +164 -0
- package/dist/tmux-runtime-manager.js +794 -0
- package/dist/tmux-runtime-manager.js.map +1 -0
- package/dist/tmux-session-transport.d.ts +31 -0
- package/dist/tmux-session-transport.js +115 -0
- package/dist/tmux-session-transport.js.map +1 -0
- package/dist/tmux-statusline.d.ts +17 -0
- package/dist/tmux-statusline.js +166 -0
- package/dist/tmux-statusline.js.map +1 -0
- package/dist/tool-output-watchers.d.ts +10 -0
- package/dist/tool-output-watchers.js +190 -0
- package/dist/tool-output-watchers.js.map +1 -0
- package/dist/tui/render/box.d.ts +1 -0
- package/dist/tui/render/box.js +20 -0
- package/dist/tui/render/box.js.map +1 -0
- package/dist/tui/render/text.d.ts +8 -0
- package/dist/tui/render/text.js +92 -0
- package/dist/tui/render/text.js.map +1 -0
- package/dist/tui/screens/dashboard-renderers.d.ts +23 -0
- package/dist/tui/screens/dashboard-renderers.js +411 -0
- package/dist/tui/screens/dashboard-renderers.js.map +1 -0
- package/dist/tui/screens/overlay-renderers.d.ts +10 -0
- package/dist/tui/screens/overlay-renderers.js +274 -0
- package/dist/tui/screens/overlay-renderers.js.map +1 -0
- package/dist/tui/screens/subscreen-renderers.d.ts +9 -0
- package/dist/tui/screens/subscreen-renderers.js +327 -0
- package/dist/tui/screens/subscreen-renderers.js.map +1 -0
- package/dist/workflow.d.ts +19 -0
- package/dist/workflow.js +111 -0
- package/dist/workflow.js.map +1 -0
- package/dist/worktree.d.ts +23 -0
- package/dist/worktree.js +101 -0
- package/dist/worktree.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { listThreads, markMessageDelivered, readMessages } from "./threads.js";
|
|
2
|
+
function shouldDispatch(kind) {
|
|
3
|
+
return kind === "request" || kind === "reply" || kind === "handoff" || kind === "decision" || kind === "status";
|
|
4
|
+
}
|
|
5
|
+
export class OrchestrationDispatcher {
|
|
6
|
+
getSession;
|
|
7
|
+
pendingEvents = [];
|
|
8
|
+
constructor(getSession) {
|
|
9
|
+
this.getSession = getSession;
|
|
10
|
+
}
|
|
11
|
+
tick(localSessionIds) {
|
|
12
|
+
for (const thread of listThreads()) {
|
|
13
|
+
const messages = readMessages(thread.id);
|
|
14
|
+
for (const message of messages) {
|
|
15
|
+
if (!message.to?.length || !shouldDispatch(message.kind))
|
|
16
|
+
continue;
|
|
17
|
+
for (const recipient of message.to) {
|
|
18
|
+
if ((message.deliveredTo ?? []).includes(recipient))
|
|
19
|
+
continue;
|
|
20
|
+
if (!localSessionIds.includes(recipient))
|
|
21
|
+
continue;
|
|
22
|
+
const session = this.getSession(recipient);
|
|
23
|
+
if (!session || session.exited)
|
|
24
|
+
continue;
|
|
25
|
+
if (session.status !== "idle" && session.status !== "waiting")
|
|
26
|
+
continue;
|
|
27
|
+
const prompt = `[AIMUX MESSAGE ${thread.id} from ${message.from}] ${message.body}\n\n` +
|
|
28
|
+
`Read .aimux/threads/${thread.id}.json and .aimux/threads/${thread.id}.jsonl for context. ` +
|
|
29
|
+
`This is a ${message.kind} message. Reply in-thread if needed.`;
|
|
30
|
+
session.write(prompt + "\r");
|
|
31
|
+
markMessageDelivered(thread.id, message.id, recipient);
|
|
32
|
+
this.pendingEvents.push({
|
|
33
|
+
type: "message_delivered",
|
|
34
|
+
threadId: thread.id,
|
|
35
|
+
messageId: message.id,
|
|
36
|
+
sessionId: recipient,
|
|
37
|
+
kind: message.kind,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
drainEvents() {
|
|
44
|
+
const events = this.pendingEvents;
|
|
45
|
+
this.pendingEvents = [];
|
|
46
|
+
return events;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=orchestration-dispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestration-dispatcher.js","sourceRoot":"","sources":["../src/orchestration-dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,YAAY,EAAoB,MAAM,cAAc,CAAC;AAiBjG,SAAS,cAAc,CAAC,IAAiB;IACvC,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,QAAQ,CAAC;AAClH,CAAC;AAED,MAAM,OAAO,uBAAuB;IAGL;IAFrB,aAAa,GAAiC,EAAE,CAAC;IAEzD,YAA6B,UAAuD;QAAvD,eAAU,GAAV,UAAU,CAA6C;IAAG,CAAC;IAExF,IAAI,CAAC,eAAyB;QAC5B,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC;oBAAE,SAAS;gBACnE,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;oBACnC,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;wBAAE,SAAS;oBAC9D,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC;wBAAE,SAAS;oBACnD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;oBAC3C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM;wBAAE,SAAS;oBACzC,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;wBAAE,SAAS;oBACxE,MAAM,MAAM,GACV,kBAAkB,MAAM,CAAC,EAAE,SAAS,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,MAAM;wBACvE,uBAAuB,MAAM,CAAC,EAAE,4BAA4B,MAAM,CAAC,EAAE,sBAAsB;wBAC3F,aAAa,OAAO,CAAC,IAAI,sCAAsC,CAAC;oBAClE,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;oBAC7B,oBAAoB,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;oBACvD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;wBACtB,IAAI,EAAE,mBAAmB;wBACzB,QAAQ,EAAE,MAAM,CAAC,EAAE;wBACnB,SAAS,EAAE,OAAO,CAAC,EAAE;wBACrB,SAAS,EAAE,SAAS;wBACpB,IAAI,EAAE,OAAO,CAAC,IAAI;qBACnB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,WAAW;QACT,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;QAClC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { SessionAvailability } from "./session-semantics.js";
|
|
2
|
+
export interface RoutingCandidate {
|
|
3
|
+
id: string;
|
|
4
|
+
tool?: string;
|
|
5
|
+
role?: string;
|
|
6
|
+
worktreePath?: string;
|
|
7
|
+
status?: string;
|
|
8
|
+
availability?: SessionAvailability;
|
|
9
|
+
workflowPressure?: number;
|
|
10
|
+
exited?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface RouteTargetInput {
|
|
13
|
+
candidates: RoutingCandidate[];
|
|
14
|
+
to?: string | string[];
|
|
15
|
+
assignee?: string;
|
|
16
|
+
tool?: string;
|
|
17
|
+
worktreePath?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function resolveOrchestrationTarget(input: RouteTargetInput): RoutingCandidate | undefined;
|
|
20
|
+
export declare function resolveOrchestrationRecipients(input: RouteTargetInput): string[];
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
function samePath(a, b) {
|
|
2
|
+
return (a ?? "") === (b ?? "");
|
|
3
|
+
}
|
|
4
|
+
function explicitRecipients(input) {
|
|
5
|
+
const explicit = Array.isArray(input.to) ? input.to : input.to ? [input.to] : [];
|
|
6
|
+
return [...new Set(explicit.map((value) => value.trim()).filter(Boolean))];
|
|
7
|
+
}
|
|
8
|
+
function scoreCandidate(candidate, input) {
|
|
9
|
+
let score = 0;
|
|
10
|
+
if (input.worktreePath && samePath(candidate.worktreePath, input.worktreePath))
|
|
11
|
+
score += 10;
|
|
12
|
+
if (input.assignee && candidate.role === input.assignee)
|
|
13
|
+
score += 8;
|
|
14
|
+
if (input.tool && candidate.tool === input.tool)
|
|
15
|
+
score += 6;
|
|
16
|
+
if (candidate.availability === "available")
|
|
17
|
+
score += 5;
|
|
18
|
+
else if (candidate.availability === "busy")
|
|
19
|
+
score += 3;
|
|
20
|
+
else if (candidate.availability === "needs_input")
|
|
21
|
+
score += 1;
|
|
22
|
+
if (candidate.status === "idle")
|
|
23
|
+
score += 3;
|
|
24
|
+
else if (candidate.status === "waiting")
|
|
25
|
+
score += 2;
|
|
26
|
+
else if (candidate.status === "running")
|
|
27
|
+
score += 1;
|
|
28
|
+
score -= Math.min(candidate.workflowPressure ?? 0, 20);
|
|
29
|
+
return score;
|
|
30
|
+
}
|
|
31
|
+
export function resolveOrchestrationTarget(input) {
|
|
32
|
+
const explicit = explicitRecipients(input);
|
|
33
|
+
if (explicit.length > 0) {
|
|
34
|
+
return explicit
|
|
35
|
+
.map((id) => input.candidates.find((candidate) => candidate.id === id && !candidate.exited))
|
|
36
|
+
.find(Boolean);
|
|
37
|
+
}
|
|
38
|
+
const filtered = input.candidates.filter((candidate) => {
|
|
39
|
+
if (candidate.exited)
|
|
40
|
+
return false;
|
|
41
|
+
if (candidate.availability === "blocked" || candidate.availability === "offline")
|
|
42
|
+
return false;
|
|
43
|
+
if (input.assignee && candidate.role !== input.assignee)
|
|
44
|
+
return false;
|
|
45
|
+
if (input.tool && candidate.tool !== input.tool)
|
|
46
|
+
return false;
|
|
47
|
+
if (input.worktreePath && !samePath(candidate.worktreePath, input.worktreePath))
|
|
48
|
+
return false;
|
|
49
|
+
return true;
|
|
50
|
+
});
|
|
51
|
+
if (filtered.length === 0)
|
|
52
|
+
return undefined;
|
|
53
|
+
return [...filtered].sort((a, b) => scoreCandidate(b, input) - scoreCandidate(a, input) || a.id.localeCompare(b.id))[0];
|
|
54
|
+
}
|
|
55
|
+
export function resolveOrchestrationRecipients(input) {
|
|
56
|
+
const explicit = explicitRecipients(input);
|
|
57
|
+
if (explicit.length > 0) {
|
|
58
|
+
const live = new Set(input.candidates.filter((candidate) => !candidate.exited).map((candidate) => candidate.id));
|
|
59
|
+
return explicit.filter((id) => live.has(id));
|
|
60
|
+
}
|
|
61
|
+
const filtered = input.candidates.filter((candidate) => {
|
|
62
|
+
if (candidate.exited)
|
|
63
|
+
return false;
|
|
64
|
+
if (candidate.availability === "blocked" || candidate.availability === "offline")
|
|
65
|
+
return false;
|
|
66
|
+
if (input.assignee && candidate.role !== input.assignee)
|
|
67
|
+
return false;
|
|
68
|
+
if (input.tool && candidate.tool !== input.tool)
|
|
69
|
+
return false;
|
|
70
|
+
if (input.worktreePath && !samePath(candidate.worktreePath, input.worktreePath))
|
|
71
|
+
return false;
|
|
72
|
+
return true;
|
|
73
|
+
});
|
|
74
|
+
return [...filtered]
|
|
75
|
+
.sort((a, b) => scoreCandidate(b, input) - scoreCandidate(a, input) || a.id.localeCompare(b.id))
|
|
76
|
+
.map((candidate) => candidate.id);
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=orchestration-routing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestration-routing.js","sourceRoot":"","sources":["../src/orchestration-routing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type MessageKind, type OrchestrationMessage, type OrchestrationThread } from "./threads.js";
|
|
2
|
+
export interface SendThreadMessageInput {
|
|
3
|
+
threadId: string;
|
|
4
|
+
from: string;
|
|
5
|
+
to?: string[];
|
|
6
|
+
kind?: MessageKind;
|
|
7
|
+
body: string;
|
|
8
|
+
metadata?: Record<string, string | number | boolean | null>;
|
|
9
|
+
}
|
|
10
|
+
export interface SendDirectMessageInput {
|
|
11
|
+
from?: string;
|
|
12
|
+
to: string[];
|
|
13
|
+
body: string;
|
|
14
|
+
title?: string;
|
|
15
|
+
kind?: Extract<MessageKind, "request" | "note" | "handoff" | "reply" | "status" | "decision">;
|
|
16
|
+
worktreePath?: string;
|
|
17
|
+
tags?: string[];
|
|
18
|
+
}
|
|
19
|
+
export interface SendMessageResult {
|
|
20
|
+
thread: OrchestrationThread;
|
|
21
|
+
message: OrchestrationMessage;
|
|
22
|
+
threadCreated: boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare function sendThreadMessage(input: SendThreadMessageInput): SendMessageResult;
|
|
25
|
+
export declare function findDirectConversationThread(participants: string[]): OrchestrationThread | undefined;
|
|
26
|
+
export declare function sendDirectMessage(input: SendDirectMessageInput): SendMessageResult;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { appendMessage, createThread, listThreads, readThread, updateThread, } from "./threads.js";
|
|
2
|
+
function unique(values) {
|
|
3
|
+
return [...new Set(values.map((value) => value.trim()).filter(Boolean))];
|
|
4
|
+
}
|
|
5
|
+
function sameParticipants(a, b) {
|
|
6
|
+
const aSorted = [...unique(a)].sort();
|
|
7
|
+
const bSorted = [...unique(b)].sort();
|
|
8
|
+
if (aSorted.length !== bSorted.length)
|
|
9
|
+
return false;
|
|
10
|
+
return aSorted.every((value, idx) => value === bSorted[idx]);
|
|
11
|
+
}
|
|
12
|
+
function defaultConversationTitle(from, to) {
|
|
13
|
+
return `Conversation: ${from} → ${to.join(", ")}`;
|
|
14
|
+
}
|
|
15
|
+
function resolveRecipients(thread, from, to) {
|
|
16
|
+
const explicit = unique(to ?? []);
|
|
17
|
+
if (explicit.length > 0)
|
|
18
|
+
return explicit;
|
|
19
|
+
return unique(thread.participants.filter((participant) => participant !== from && participant !== "user"));
|
|
20
|
+
}
|
|
21
|
+
function updateThreadForMessage(current, from, recipients, kind) {
|
|
22
|
+
const participants = unique([...current.participants, from, ...recipients]);
|
|
23
|
+
if (kind === "request" || kind === "handoff") {
|
|
24
|
+
return {
|
|
25
|
+
...current,
|
|
26
|
+
participants,
|
|
27
|
+
status: recipients.length > 0 ? "waiting" : "open",
|
|
28
|
+
owner: from,
|
|
29
|
+
waitingOn: recipients,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
if (kind === "reply" || kind === "decision" || kind === "status") {
|
|
33
|
+
return {
|
|
34
|
+
...current,
|
|
35
|
+
participants,
|
|
36
|
+
status: recipients.length > 0 ? "waiting" : "open",
|
|
37
|
+
owner: from,
|
|
38
|
+
waitingOn: recipients,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
...current,
|
|
43
|
+
participants,
|
|
44
|
+
owner: current.owner ?? from,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export function sendThreadMessage(input) {
|
|
48
|
+
const thread = readThread(input.threadId);
|
|
49
|
+
if (!thread) {
|
|
50
|
+
throw new Error(`thread not found: ${input.threadId}`);
|
|
51
|
+
}
|
|
52
|
+
const recipients = resolveRecipients(thread, input.from, input.to);
|
|
53
|
+
const kind = input.kind ?? "note";
|
|
54
|
+
const message = appendMessage(thread.id, {
|
|
55
|
+
from: input.from,
|
|
56
|
+
to: recipients,
|
|
57
|
+
kind,
|
|
58
|
+
body: input.body,
|
|
59
|
+
metadata: input.metadata,
|
|
60
|
+
});
|
|
61
|
+
const updated = updateThread(thread.id, (current) => updateThreadForMessage(current, input.from, recipients, kind)) ??
|
|
62
|
+
readThread(thread.id);
|
|
63
|
+
if (!updated) {
|
|
64
|
+
throw new Error(`thread disappeared after update: ${thread.id}`);
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
thread: updated,
|
|
68
|
+
message,
|
|
69
|
+
threadCreated: false,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
export function findDirectConversationThread(participants) {
|
|
73
|
+
return listThreads().find((thread) => thread.kind === "conversation" &&
|
|
74
|
+
!thread.taskId &&
|
|
75
|
+
thread.status !== "abandoned" &&
|
|
76
|
+
sameParticipants(thread.participants, participants));
|
|
77
|
+
}
|
|
78
|
+
export function sendDirectMessage(input) {
|
|
79
|
+
const from = input.from?.trim() || "user";
|
|
80
|
+
const recipients = unique(input.to);
|
|
81
|
+
if (recipients.length === 0) {
|
|
82
|
+
throw new Error("direct message requires at least one recipient");
|
|
83
|
+
}
|
|
84
|
+
const participants = unique([from, ...recipients]);
|
|
85
|
+
const existing = findDirectConversationThread(participants);
|
|
86
|
+
const thread = existing ??
|
|
87
|
+
createThread({
|
|
88
|
+
title: input.title?.trim() || defaultConversationTitle(from, recipients),
|
|
89
|
+
kind: "conversation",
|
|
90
|
+
createdBy: from,
|
|
91
|
+
participants,
|
|
92
|
+
worktreePath: input.worktreePath,
|
|
93
|
+
tags: input.tags,
|
|
94
|
+
owner: from,
|
|
95
|
+
waitingOn: recipients,
|
|
96
|
+
status: recipients.length > 0 ? "waiting" : "open",
|
|
97
|
+
});
|
|
98
|
+
const result = sendThreadMessage({
|
|
99
|
+
threadId: thread.id,
|
|
100
|
+
from,
|
|
101
|
+
to: recipients,
|
|
102
|
+
kind: input.kind ?? "request",
|
|
103
|
+
body: input.body,
|
|
104
|
+
});
|
|
105
|
+
return {
|
|
106
|
+
...result,
|
|
107
|
+
threadCreated: !existing,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=orchestration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestration.js","sourceRoot":"","sources":["../src/orchestration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface OscNotification {
|
|
2
|
+
source: "osc9" | "osc99" | "osc777";
|
|
3
|
+
title: string;
|
|
4
|
+
body: string;
|
|
5
|
+
}
|
|
6
|
+
interface ParseResult {
|
|
7
|
+
cleaned: string;
|
|
8
|
+
notifications: OscNotification[];
|
|
9
|
+
}
|
|
10
|
+
export declare class OscNotificationParser {
|
|
11
|
+
private buffer;
|
|
12
|
+
private kittyPending;
|
|
13
|
+
parseChunk(chunk: string): ParseResult;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
const ESC = "\u001b";
|
|
2
|
+
const BEL = "\u0007";
|
|
3
|
+
const DEFAULT_KITTY_ID = "__default__";
|
|
4
|
+
function decodeBase64Utf8(input) {
|
|
5
|
+
if (!input)
|
|
6
|
+
return "";
|
|
7
|
+
if (typeof globalThis.atob === "function") {
|
|
8
|
+
const binary = globalThis.atob(input);
|
|
9
|
+
const bytes = Uint8Array.from(binary, (char) => char.charCodeAt(0));
|
|
10
|
+
if (typeof TextDecoder !== "undefined") {
|
|
11
|
+
return new TextDecoder().decode(bytes);
|
|
12
|
+
}
|
|
13
|
+
return binary;
|
|
14
|
+
}
|
|
15
|
+
if (typeof Buffer !== "undefined") {
|
|
16
|
+
return Buffer.from(input, "base64").toString("utf8");
|
|
17
|
+
}
|
|
18
|
+
return input;
|
|
19
|
+
}
|
|
20
|
+
function looksLikeConEmuOsc9(payload) {
|
|
21
|
+
return /^(?:1|2|3|4|5|6|7|8|9|10|11|12)(?:;|$)/.test(payload);
|
|
22
|
+
}
|
|
23
|
+
function parseOsc9(payload) {
|
|
24
|
+
if (!payload || looksLikeConEmuOsc9(payload))
|
|
25
|
+
return null;
|
|
26
|
+
return {
|
|
27
|
+
source: "osc9",
|
|
28
|
+
title: "",
|
|
29
|
+
body: payload,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function parseOsc777(payload) {
|
|
33
|
+
if (!payload.startsWith("notify;"))
|
|
34
|
+
return null;
|
|
35
|
+
const firstSep = payload.indexOf(";");
|
|
36
|
+
const secondSep = payload.indexOf(";", firstSep + 1);
|
|
37
|
+
if (secondSep === -1)
|
|
38
|
+
return null;
|
|
39
|
+
return {
|
|
40
|
+
source: "osc777",
|
|
41
|
+
title: payload.slice(firstSep + 1, secondSep),
|
|
42
|
+
body: payload.slice(secondSep + 1),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function parseBool(value, defaultValue) {
|
|
46
|
+
if (!value)
|
|
47
|
+
return defaultValue;
|
|
48
|
+
if (value[0] === "0")
|
|
49
|
+
return false;
|
|
50
|
+
if (value[0] === "1")
|
|
51
|
+
return true;
|
|
52
|
+
return defaultValue;
|
|
53
|
+
}
|
|
54
|
+
function isValidKittyId(value) {
|
|
55
|
+
return /^[A-Za-z0-9._:+-]+$/.test(value);
|
|
56
|
+
}
|
|
57
|
+
function parseOsc99(payload, kittyPending) {
|
|
58
|
+
const metaEnd = payload.indexOf(";");
|
|
59
|
+
if (metaEnd === -1)
|
|
60
|
+
return null;
|
|
61
|
+
const meta = payload.slice(0, metaEnd);
|
|
62
|
+
let rawPayload = payload.slice(metaEnd + 1);
|
|
63
|
+
let payloadKind = "title";
|
|
64
|
+
let done = true;
|
|
65
|
+
let base64 = false;
|
|
66
|
+
let id = DEFAULT_KITTY_ID;
|
|
67
|
+
if (meta) {
|
|
68
|
+
for (const part of meta.split(":")) {
|
|
69
|
+
if (!part)
|
|
70
|
+
continue;
|
|
71
|
+
const eq = part.indexOf("=");
|
|
72
|
+
if (eq <= 0)
|
|
73
|
+
continue;
|
|
74
|
+
const key = part.slice(0, eq);
|
|
75
|
+
const value = part.slice(eq + 1);
|
|
76
|
+
if (key === "p") {
|
|
77
|
+
if (value === "title" || value === "body")
|
|
78
|
+
payloadKind = value;
|
|
79
|
+
else
|
|
80
|
+
payloadKind = "ignore";
|
|
81
|
+
}
|
|
82
|
+
else if (key === "d") {
|
|
83
|
+
done = parseBool(value, true);
|
|
84
|
+
}
|
|
85
|
+
else if (key === "e") {
|
|
86
|
+
base64 = parseBool(value, false);
|
|
87
|
+
}
|
|
88
|
+
else if (key === "i" && isValidKittyId(value)) {
|
|
89
|
+
id = value;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (payloadKind === "ignore")
|
|
94
|
+
return null;
|
|
95
|
+
if (base64) {
|
|
96
|
+
try {
|
|
97
|
+
rawPayload = decodeBase64Utf8(rawPayload);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const pending = kittyPending.get(id) ?? { title: "", body: "" };
|
|
104
|
+
if (payloadKind === "title")
|
|
105
|
+
pending.title += rawPayload;
|
|
106
|
+
else
|
|
107
|
+
pending.body += rawPayload;
|
|
108
|
+
if (!done) {
|
|
109
|
+
kittyPending.set(id, pending);
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
kittyPending.delete(id);
|
|
113
|
+
const title = pending.title || (pending.body ? pending.body : "");
|
|
114
|
+
const body = pending.title ? pending.body : "";
|
|
115
|
+
if (!title && !body)
|
|
116
|
+
return null;
|
|
117
|
+
return {
|
|
118
|
+
source: "osc99",
|
|
119
|
+
title,
|
|
120
|
+
body,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function parseOscPayload(payload, kittyPending) {
|
|
124
|
+
const firstSep = payload.indexOf(";");
|
|
125
|
+
const command = firstSep === -1 ? payload : payload.slice(0, firstSep);
|
|
126
|
+
const rest = firstSep === -1 ? "" : payload.slice(firstSep + 1);
|
|
127
|
+
if (command === "9")
|
|
128
|
+
return parseOsc9(rest);
|
|
129
|
+
if (command === "99")
|
|
130
|
+
return parseOsc99(rest, kittyPending);
|
|
131
|
+
if (command === "777")
|
|
132
|
+
return parseOsc777(rest);
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
export class OscNotificationParser {
|
|
136
|
+
buffer = "";
|
|
137
|
+
kittyPending = new Map();
|
|
138
|
+
parseChunk(chunk) {
|
|
139
|
+
const input = this.buffer + (chunk || "");
|
|
140
|
+
const notifications = [];
|
|
141
|
+
let cleaned = "";
|
|
142
|
+
let index = 0;
|
|
143
|
+
while (index < input.length) {
|
|
144
|
+
const escIndex = input.indexOf(`${ESC}]`, index);
|
|
145
|
+
if (escIndex === -1) {
|
|
146
|
+
cleaned += input.slice(index);
|
|
147
|
+
index = input.length;
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
cleaned += input.slice(index, escIndex);
|
|
151
|
+
let end = -1;
|
|
152
|
+
let terminatorLength = 0;
|
|
153
|
+
for (let cursor = escIndex + 2; cursor < input.length; cursor += 1) {
|
|
154
|
+
const ch = input[cursor];
|
|
155
|
+
if (ch === BEL) {
|
|
156
|
+
end = cursor;
|
|
157
|
+
terminatorLength = 1;
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
if (ch === ESC && input[cursor + 1] === "\\") {
|
|
161
|
+
end = cursor;
|
|
162
|
+
terminatorLength = 2;
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (end === -1) {
|
|
167
|
+
this.buffer = input.slice(escIndex);
|
|
168
|
+
return { cleaned, notifications };
|
|
169
|
+
}
|
|
170
|
+
const payload = input.slice(escIndex + 2, end);
|
|
171
|
+
const notification = parseOscPayload(payload, this.kittyPending);
|
|
172
|
+
if (notification)
|
|
173
|
+
notifications.push(notification);
|
|
174
|
+
index = end + terminatorLength;
|
|
175
|
+
}
|
|
176
|
+
this.buffer = "";
|
|
177
|
+
return { cleaned, notifications };
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=osc-notifications.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"osc-notifications.js","sourceRoot":"","sources":["../src/osc-notifications.ts"],"names":[],"mappings":"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"}
|
package/dist/paths.d.ts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Central path resolution for aimux.
|
|
3
|
+
*
|
|
4
|
+
* Two locations:
|
|
5
|
+
* - In-repo: {repoRoot}/.aimux/ → agent-facing shared artifacts
|
|
6
|
+
* (config, team, plans, context, history, tasks, status, threads, sessions.json)
|
|
7
|
+
* - Global: ~/.aimux/projects/<project-id>/ → runtime-private state
|
|
8
|
+
* (recordings, metadata, instance ownership, statusline internals, offline state)
|
|
9
|
+
*
|
|
10
|
+
* Must call `await initPaths(cwd)` once at startup before using sync path functions.
|
|
11
|
+
*/
|
|
12
|
+
export interface ProjectEntry {
|
|
13
|
+
id: string;
|
|
14
|
+
name: string;
|
|
15
|
+
repoRoot: string;
|
|
16
|
+
lastSeen: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function initPaths(cwd?: string): Promise<void>;
|
|
19
|
+
export declare function getRepoRoot(): string;
|
|
20
|
+
export declare function getProjectId(): string;
|
|
21
|
+
export declare function getProjectIdFor(cwd: string): string;
|
|
22
|
+
export declare function getProjectStateDirFor(cwd: string): string;
|
|
23
|
+
export declare function getProjectStateDirById(projectId: string): string;
|
|
24
|
+
export declare function getGlobalAimuxDir(): string;
|
|
25
|
+
export declare function getDaemonDir(): string;
|
|
26
|
+
export declare function getDaemonInfoPath(): string;
|
|
27
|
+
export declare function getDaemonStatePath(): string;
|
|
28
|
+
export declare function getProjectStateDir(): string;
|
|
29
|
+
export declare function getStatePath(): string;
|
|
30
|
+
export declare function getGraveyardPath(): string;
|
|
31
|
+
export declare function getContextDir(): string;
|
|
32
|
+
export declare function getContextPathForDate(date: Date): string;
|
|
33
|
+
export declare function getHistoryDir(): string;
|
|
34
|
+
export declare function getRecordingsDir(): string;
|
|
35
|
+
export declare function getTasksDir(): string;
|
|
36
|
+
export declare function getStatusDir(): string;
|
|
37
|
+
export declare function getInstancesPath(): string;
|
|
38
|
+
export declare function getMetadataPath(): string;
|
|
39
|
+
export declare function getNotificationsPath(): string;
|
|
40
|
+
export declare function getNotificationContextPath(): string;
|
|
41
|
+
export declare function getMetadataEndpointPath(): string;
|
|
42
|
+
export declare function getLocalAimuxDir(): string;
|
|
43
|
+
export declare function getConfigPath(): string;
|
|
44
|
+
export declare function getProjectTeamPath(): string;
|
|
45
|
+
export declare function getPlansDir(): string;
|
|
46
|
+
export declare function getThreadsDir(): string;
|
|
47
|
+
export declare function getAttachmentsDir(): string;
|
|
48
|
+
export declare function getSessionMessagesDir(): string;
|
|
49
|
+
/** Escape hatch for cross-worktree operations. Prefer the no-arg variants above. */
|
|
50
|
+
export declare function getAimuxDirFor(cwd: string): string;
|
|
51
|
+
export declare function getGlobalConfigPath(): string;
|
|
52
|
+
export declare function getGlobalTeamPath(): string;
|
|
53
|
+
export declare function getProjectsRegistryPath(): string;
|
|
54
|
+
export declare function listProjects(): ProjectEntry[];
|
|
55
|
+
export declare function removeProject(id: string): void;
|