@bradygaster/squad-cli 0.6.2 → 0.8.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 +77 -77
- package/dist/cli/commands/copilot.d.ts +13 -0
- package/dist/cli/commands/copilot.d.ts.map +1 -0
- package/dist/cli/commands/copilot.js +86 -0
- package/dist/cli/commands/copilot.js.map +1 -0
- package/dist/cli/commands/export.d.ts +9 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +89 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/import.d.ts +9 -0
- package/dist/cli/commands/import.d.ts.map +1 -0
- package/dist/cli/commands/import.js +116 -0
- package/dist/cli/commands/import.js.map +1 -0
- package/dist/cli/commands/plugin.d.ts +14 -0
- package/dist/cli/commands/plugin.d.ts.map +1 -0
- package/dist/cli/commands/plugin.js +134 -0
- package/dist/cli/commands/plugin.js.map +1 -0
- package/dist/cli/commands/watch.d.ts +8 -0
- package/dist/cli/commands/watch.d.ts.map +1 -0
- package/dist/cli/commands/watch.js +178 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/copilot-install.d.ts +73 -0
- package/dist/cli/copilot-install.d.ts.map +1 -0
- package/dist/cli/copilot-install.js +117 -0
- package/dist/cli/copilot-install.js.map +1 -0
- package/dist/cli/core/detect-squad-dir.d.ts +13 -0
- package/dist/cli/core/detect-squad-dir.d.ts.map +1 -0
- package/dist/cli/core/detect-squad-dir.js +21 -0
- package/dist/cli/core/detect-squad-dir.js.map +1 -0
- package/dist/cli/core/email-scrub.d.ts +10 -0
- package/dist/cli/core/email-scrub.d.ts.map +1 -0
- package/dist/cli/core/email-scrub.js +103 -0
- package/dist/cli/core/email-scrub.js.map +1 -0
- package/dist/cli/core/errors.d.ts +17 -0
- package/dist/cli/core/errors.d.ts.map +1 -0
- package/dist/cli/core/errors.js +22 -0
- package/dist/cli/core/errors.js.map +1 -0
- package/dist/cli/core/gh-cli.d.ts +41 -0
- package/dist/cli/core/gh-cli.d.ts.map +1 -0
- package/dist/cli/core/gh-cli.js +67 -0
- package/dist/cli/core/gh-cli.js.map +1 -0
- package/dist/cli/core/history-split.d.ts +9 -0
- package/dist/cli/core/history-split.d.ts.map +1 -0
- package/dist/cli/core/history-split.js +65 -0
- package/dist/cli/core/history-split.js.map +1 -0
- package/dist/cli/core/init.d.ts +9 -0
- package/dist/cli/core/init.d.ts.map +1 -0
- package/dist/cli/core/init.js +296 -0
- package/dist/cli/core/init.js.map +1 -0
- package/dist/cli/core/migrate-directory.d.ts +11 -0
- package/dist/cli/core/migrate-directory.d.ts.map +1 -0
- package/dist/cli/core/migrate-directory.js +71 -0
- package/dist/cli/core/migrate-directory.js.map +1 -0
- package/dist/cli/core/migrations.d.ts +11 -0
- package/dist/cli/core/migrations.d.ts.map +1 -0
- package/dist/cli/core/migrations.js +78 -0
- package/dist/cli/core/migrations.js.map +1 -0
- package/dist/cli/core/output.d.ts +34 -0
- package/dist/cli/core/output.d.ts.map +1 -0
- package/dist/cli/core/output.js +47 -0
- package/dist/cli/core/output.js.map +1 -0
- package/dist/cli/core/project-type.d.ts +9 -0
- package/dist/cli/core/project-type.d.ts.map +1 -0
- package/dist/cli/core/project-type.js +29 -0
- package/dist/cli/core/project-type.js.map +1 -0
- package/dist/cli/core/team-md.d.ts +28 -0
- package/dist/cli/core/team-md.d.ts.map +1 -0
- package/dist/cli/core/team-md.js +91 -0
- package/dist/cli/core/team-md.js.map +1 -0
- package/dist/cli/core/templates.d.ts +30 -0
- package/dist/cli/core/templates.d.ts.map +1 -0
- package/dist/cli/core/templates.js +247 -0
- package/dist/cli/core/templates.js.map +1 -0
- package/dist/cli/core/upgrade.d.ts +20 -0
- package/dist/cli/core/upgrade.d.ts.map +1 -0
- package/dist/cli/core/upgrade.js +399 -0
- package/dist/cli/core/upgrade.js.map +1 -0
- package/dist/cli/core/version.d.ts +18 -0
- package/dist/cli/core/version.d.ts.map +1 -0
- package/dist/cli/core/version.js +61 -0
- package/dist/cli/core/version.js.map +1 -0
- package/dist/cli/core/workflows.d.ts +10 -0
- package/dist/cli/core/workflows.d.ts.map +1 -0
- package/dist/cli/core/workflows.js +155 -0
- package/dist/cli/core/workflows.js.map +1 -0
- package/dist/cli/index.d.ts +26 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +26 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/shell/autocomplete.d.ts +12 -0
- package/dist/cli/shell/autocomplete.d.ts.map +1 -0
- package/dist/cli/shell/autocomplete.js +39 -0
- package/dist/cli/shell/autocomplete.js.map +1 -0
- package/dist/cli/shell/commands.d.ts +19 -0
- package/dist/cli/shell/commands.d.ts.map +1 -0
- package/dist/cli/shell/commands.js +87 -0
- package/dist/cli/shell/commands.js.map +1 -0
- package/dist/cli/shell/components/AgentPanel.d.ts +8 -0
- package/dist/cli/shell/components/AgentPanel.d.ts.map +1 -0
- package/dist/cli/shell/components/AgentPanel.js +17 -0
- package/dist/cli/shell/components/AgentPanel.js.map +1 -0
- package/dist/cli/shell/components/InputPrompt.d.ts +9 -0
- package/dist/cli/shell/components/InputPrompt.d.ts.map +1 -0
- package/dist/cli/shell/components/InputPrompt.js +50 -0
- package/dist/cli/shell/components/InputPrompt.js.map +1 -0
- package/dist/cli/shell/components/MessageStream.d.ts +13 -0
- package/dist/cli/shell/components/MessageStream.d.ts.map +1 -0
- package/dist/cli/shell/components/MessageStream.js +7 -0
- package/dist/cli/shell/components/MessageStream.js.map +1 -0
- package/dist/cli/shell/components/index.d.ts +4 -0
- package/dist/cli/shell/components/index.d.ts.map +1 -0
- package/dist/cli/shell/components/index.js +4 -0
- package/dist/cli/shell/components/index.js.map +1 -0
- package/dist/cli/shell/coordinator.d.ts +32 -0
- package/dist/cli/shell/coordinator.d.ts.map +1 -0
- package/dist/cli/shell/coordinator.js +113 -0
- package/dist/cli/shell/coordinator.js.map +1 -0
- package/dist/cli/shell/index.d.ts +28 -0
- package/dist/cli/shell/index.d.ts.map +1 -0
- package/dist/cli/shell/index.js +66 -0
- package/dist/cli/shell/index.js.map +1 -0
- package/dist/cli/shell/lifecycle.d.ts +52 -0
- package/dist/cli/shell/lifecycle.d.ts.map +1 -0
- package/dist/cli/shell/lifecycle.js +168 -0
- package/dist/cli/shell/lifecycle.js.map +1 -0
- package/dist/cli/shell/memory.d.ts +36 -0
- package/dist/cli/shell/memory.d.ts.map +1 -0
- package/dist/cli/shell/memory.js +53 -0
- package/dist/cli/shell/memory.js.map +1 -0
- package/dist/cli/shell/render.d.ts +22 -0
- package/dist/cli/shell/render.d.ts.map +1 -0
- package/dist/cli/shell/render.js +44 -0
- package/dist/cli/shell/render.js.map +1 -0
- package/dist/cli/shell/router.d.ts +17 -0
- package/dist/cli/shell/router.d.ts.map +1 -0
- package/dist/cli/shell/router.js +55 -0
- package/dist/cli/shell/router.js.map +1 -0
- package/dist/cli/shell/sessions.d.ts +15 -0
- package/dist/cli/shell/sessions.d.ts.map +1 -0
- package/dist/cli/shell/sessions.js +37 -0
- package/dist/cli/shell/sessions.js.map +1 -0
- package/dist/cli/shell/spawn.d.ts +47 -0
- package/dist/cli/shell/spawn.d.ts.map +1 -0
- package/dist/cli/shell/spawn.js +77 -0
- package/dist/cli/shell/spawn.js.map +1 -0
- package/dist/cli/shell/stream-bridge.d.ts +60 -0
- package/dist/cli/shell/stream-bridge.d.ts.map +1 -0
- package/dist/cli/shell/stream-bridge.js +98 -0
- package/dist/cli/shell/stream-bridge.js.map +1 -0
- package/dist/cli/shell/terminal.d.ts +30 -0
- package/dist/cli/shell/terminal.d.ts.map +1 -0
- package/dist/cli/shell/terminal.js +34 -0
- package/dist/cli/shell/terminal.js.map +1 -0
- package/dist/cli/shell/types.d.ts +21 -0
- package/dist/cli/shell/types.d.ts.map +1 -0
- package/dist/cli/shell/types.js +5 -0
- package/dist/cli/shell/types.js.map +1 -0
- package/dist/cli/upgrade.d.ts +141 -0
- package/dist/cli/upgrade.d.ts.map +1 -0
- package/dist/cli/upgrade.js +226 -0
- package/dist/cli/upgrade.js.map +1 -0
- package/dist/cli-entry.d.ts +10 -0
- package/dist/cli-entry.d.ts.map +1 -0
- package/dist/cli-entry.js +213 -0
- package/dist/cli-entry.js.map +1 -0
- package/package.json +44 -34
- package/templates/casting-history.json +4 -0
- package/templates/casting-policy.json +35 -0
- package/templates/casting-registry.json +3 -0
- package/templates/ceremonies.md +41 -0
- package/templates/charter.md +53 -0
- package/templates/constraint-tracking.md +38 -0
- package/templates/copilot-instructions.md +46 -0
- package/templates/history.md +10 -0
- package/templates/identity/now.md +9 -0
- package/templates/identity/wisdom.md +15 -0
- package/templates/mcp-config.md +90 -0
- package/templates/multi-agent-format.md +28 -0
- package/templates/orchestration-log.md +27 -0
- package/templates/plugin-marketplace.md +49 -0
- package/templates/raw-agent-output.md +37 -0
- package/templates/roster.md +60 -0
- package/templates/routing.md +54 -0
- package/templates/run-output.md +50 -0
- package/templates/scribe-charter.md +119 -0
- package/templates/skill.md +24 -0
- package/templates/skills/squad-conventions/SKILL.md +69 -0
- package/templates/squad.agent.md +1146 -0
- package/templates/workflows/squad-ci.yml +24 -0
- package/templates/workflows/squad-docs.yml +50 -0
- package/templates/workflows/squad-heartbeat.yml +315 -0
- package/templates/workflows/squad-insider-release.yml +61 -0
- package/templates/workflows/squad-issue-assign.yml +161 -0
- package/templates/workflows/squad-label-enforce.yml +181 -0
- package/templates/workflows/squad-main-guard.yml +129 -0
- package/templates/workflows/squad-preview.yml +55 -0
- package/templates/workflows/squad-promote.yml +121 -0
- package/templates/workflows/squad-release.yml +77 -0
- package/templates/workflows/squad-triage.yml +260 -0
- package/templates/workflows/sync-squad-labels.yml +169 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { Box, Text, useInput } from 'ink';
|
|
4
|
+
export const InputPrompt = ({ onSubmit, prompt = '> ', disabled = false }) => {
|
|
5
|
+
const [value, setValue] = useState('');
|
|
6
|
+
const [history, setHistory] = useState([]);
|
|
7
|
+
const [historyIndex, setHistoryIndex] = useState(-1);
|
|
8
|
+
useInput((input, key) => {
|
|
9
|
+
if (disabled)
|
|
10
|
+
return;
|
|
11
|
+
if (key.return) {
|
|
12
|
+
if (value.trim()) {
|
|
13
|
+
onSubmit(value.trim());
|
|
14
|
+
setHistory(prev => [...prev, value.trim()]);
|
|
15
|
+
setHistoryIndex(-1);
|
|
16
|
+
}
|
|
17
|
+
setValue('');
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (key.backspace || key.delete) {
|
|
21
|
+
setValue(prev => prev.slice(0, -1));
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (key.upArrow && history.length > 0) {
|
|
25
|
+
const newIndex = historyIndex === -1 ? history.length - 1 : Math.max(0, historyIndex - 1);
|
|
26
|
+
setHistoryIndex(newIndex);
|
|
27
|
+
setValue(history[newIndex]);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (key.downArrow) {
|
|
31
|
+
if (historyIndex >= 0) {
|
|
32
|
+
const newIndex = historyIndex + 1;
|
|
33
|
+
if (newIndex >= history.length) {
|
|
34
|
+
setHistoryIndex(-1);
|
|
35
|
+
setValue('');
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
setHistoryIndex(newIndex);
|
|
39
|
+
setValue(history[newIndex]);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (input && !key.ctrl && !key.meta) {
|
|
45
|
+
setValue(prev => prev + input);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: "cyan", children: prompt }), _jsx(Text, { children: value }), !disabled && _jsx(Text, { color: "gray", children: "\u258C" })] }));
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=InputPrompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InputPrompt.js","sourceRoot":"","sources":["../../../../src/cli/shell/components/InputPrompt.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ShellMessage } from '../types.js';
|
|
3
|
+
interface MessageStreamProps {
|
|
4
|
+
messages: ShellMessage[];
|
|
5
|
+
streamingContent?: {
|
|
6
|
+
agentName: string;
|
|
7
|
+
content: string;
|
|
8
|
+
} | null;
|
|
9
|
+
maxVisible?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare const MessageStream: React.FC<MessageStreamProps>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=MessageStream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageStream.d.ts","sourceRoot":"","sources":["../../../../src/cli/shell/components/MessageStream.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,gBAAgB,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAyBtD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
export const MessageStream = ({ messages, streamingContent, maxVisible = 50 }) => {
|
|
4
|
+
const visible = messages.slice(-maxVisible);
|
|
5
|
+
return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [visible.map((msg, i) => (_jsxs(Box, { gap: 1, children: [_jsxs(Text, { color: msg.role === 'user' ? 'blue' : msg.role === 'system' ? 'yellow' : 'green', children: [msg.agentName ?? msg.role, ":"] }), _jsx(Text, { wrap: "wrap", children: msg.content })] }, i))), streamingContent && (_jsxs(Box, { gap: 1, children: [_jsxs(Text, { color: "green", children: [streamingContent.agentName, ":"] }), _jsx(Text, { wrap: "wrap", children: streamingContent.content }), _jsx(Text, { color: "gray", children: "\u258C" })] }))] }));
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=MessageStream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageStream.js","sourceRoot":"","sources":["../../../../src/cli/shell/components/MessageStream.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAShC,MAAM,CAAC,MAAM,aAAa,GAAiC,CAAC,EAC1D,QAAQ,EACR,gBAAgB,EAChB,UAAU,GAAG,EAAE,EAChB,EAAE,EAAE;IACH,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;IAC5C,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,aACpC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CACvB,MAAC,GAAG,IAAS,GAAG,EAAE,CAAC,aACjB,MAAC,IAAI,IAAC,KAAK,EAAE,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,aACnF,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,SACrB,EACP,KAAC,IAAI,IAAC,IAAI,EAAC,MAAM,YAAE,GAAG,CAAC,OAAO,GAAQ,KAJ9B,CAAC,CAKL,CACP,CAAC,EACD,gBAAgB,IAAI,CACnB,MAAC,GAAG,IAAC,GAAG,EAAE,CAAC,aACT,MAAC,IAAI,IAAC,KAAK,EAAC,OAAO,aAAE,gBAAgB,CAAC,SAAS,SAAS,EACxD,KAAC,IAAI,IAAC,IAAI,EAAC,MAAM,YAAE,gBAAgB,CAAC,OAAO,GAAQ,EACnD,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,uBAAS,IACvB,CACP,IACG,CACP,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/shell/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/shell/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ShellMessage } from './types.js';
|
|
2
|
+
export interface CoordinatorConfig {
|
|
3
|
+
teamRoot: string;
|
|
4
|
+
/** Path to routing.md */
|
|
5
|
+
routingPath?: string;
|
|
6
|
+
/** Path to team.md */
|
|
7
|
+
teamPath?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Build the coordinator system prompt from team.md + routing.md.
|
|
11
|
+
* This prompt tells the LLM how to route user requests to agents.
|
|
12
|
+
*/
|
|
13
|
+
export declare function buildCoordinatorPrompt(config: CoordinatorConfig): string;
|
|
14
|
+
/**
|
|
15
|
+
* Parse coordinator response to extract routing decisions.
|
|
16
|
+
*/
|
|
17
|
+
export interface RoutingDecision {
|
|
18
|
+
type: 'direct' | 'route' | 'multi';
|
|
19
|
+
directAnswer?: string;
|
|
20
|
+
routes?: Array<{
|
|
21
|
+
agent: string;
|
|
22
|
+
task: string;
|
|
23
|
+
context?: string;
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
export declare function parseCoordinatorResponse(response: string): RoutingDecision;
|
|
27
|
+
/**
|
|
28
|
+
* Format conversation history for the coordinator context window.
|
|
29
|
+
* Keeps recent messages, summarizes older ones.
|
|
30
|
+
*/
|
|
31
|
+
export declare function formatConversationContext(messages: ShellMessage[], maxMessages?: number): string;
|
|
32
|
+
//# sourceMappingURL=coordinator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../../src/cli/shell/coordinator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sBAAsB;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAkDxE;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnE;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,CA8C1E;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,YAAY,EAAE,EACxB,WAAW,GAAE,MAAW,GACvB,MAAM,CAQR"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Build the coordinator system prompt from team.md + routing.md.
|
|
5
|
+
* This prompt tells the LLM how to route user requests to agents.
|
|
6
|
+
*/
|
|
7
|
+
export function buildCoordinatorPrompt(config) {
|
|
8
|
+
const squadRoot = config.teamRoot;
|
|
9
|
+
// Load team.md for roster
|
|
10
|
+
const teamPath = config.teamPath ?? join(squadRoot, '.squad', 'team.md');
|
|
11
|
+
let teamContent = '';
|
|
12
|
+
try {
|
|
13
|
+
teamContent = readFileSync(teamPath, 'utf-8');
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
teamContent = '(No team.md found)';
|
|
17
|
+
}
|
|
18
|
+
// Load routing.md for routing rules
|
|
19
|
+
const routingPath = config.routingPath ?? join(squadRoot, '.squad', 'routing.md');
|
|
20
|
+
let routingContent = '';
|
|
21
|
+
try {
|
|
22
|
+
routingContent = readFileSync(routingPath, 'utf-8');
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
routingContent = '(No routing.md found)';
|
|
26
|
+
}
|
|
27
|
+
return `You are the Squad Coordinator — you route work to the right agent.
|
|
28
|
+
|
|
29
|
+
## Team Roster
|
|
30
|
+
${teamContent}
|
|
31
|
+
|
|
32
|
+
## Routing Rules
|
|
33
|
+
${routingContent}
|
|
34
|
+
|
|
35
|
+
## Your Job
|
|
36
|
+
1. Read the user's message
|
|
37
|
+
2. Decide which agent(s) should handle it based on routing rules
|
|
38
|
+
3. If naming a specific agent ("Fenster, fix the bug"), route directly
|
|
39
|
+
4. If ambiguous, pick the best match and explain your choice
|
|
40
|
+
5. For status/factual questions, answer directly without spawning
|
|
41
|
+
|
|
42
|
+
## Response Format
|
|
43
|
+
When routing to an agent, respond with:
|
|
44
|
+
ROUTE: {agent_name}
|
|
45
|
+
TASK: {what the agent should do}
|
|
46
|
+
CONTEXT: {any relevant context}
|
|
47
|
+
|
|
48
|
+
When answering directly:
|
|
49
|
+
DIRECT: {your answer}
|
|
50
|
+
|
|
51
|
+
When routing to multiple agents:
|
|
52
|
+
MULTI:
|
|
53
|
+
- {agent1}: {task1}
|
|
54
|
+
- {agent2}: {task2}
|
|
55
|
+
`;
|
|
56
|
+
}
|
|
57
|
+
export function parseCoordinatorResponse(response) {
|
|
58
|
+
const trimmed = response.trim();
|
|
59
|
+
// Direct answer
|
|
60
|
+
if (trimmed.startsWith('DIRECT:')) {
|
|
61
|
+
return {
|
|
62
|
+
type: 'direct',
|
|
63
|
+
directAnswer: trimmed.slice('DIRECT:'.length).trim(),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// Multi-agent routing
|
|
67
|
+
if (trimmed.startsWith('MULTI:')) {
|
|
68
|
+
const lines = trimmed.split('\n').slice(1);
|
|
69
|
+
const routes = lines
|
|
70
|
+
.filter(l => l.trim().startsWith('-'))
|
|
71
|
+
.map(l => {
|
|
72
|
+
const match = l.match(/^-\s*(\w+):\s*(.+)$/);
|
|
73
|
+
if (match) {
|
|
74
|
+
return { agent: match[1], task: match[2] };
|
|
75
|
+
}
|
|
76
|
+
return null;
|
|
77
|
+
})
|
|
78
|
+
.filter((r) => r !== null);
|
|
79
|
+
return { type: 'multi', routes };
|
|
80
|
+
}
|
|
81
|
+
// Single agent routing
|
|
82
|
+
if (trimmed.startsWith('ROUTE:')) {
|
|
83
|
+
const agentMatch = trimmed.match(/ROUTE:\s*(\w+)/);
|
|
84
|
+
const taskMatch = trimmed.match(/TASK:\s*(.+)/);
|
|
85
|
+
const contextMatch = trimmed.match(/CONTEXT:\s*(.+)/);
|
|
86
|
+
if (agentMatch) {
|
|
87
|
+
return {
|
|
88
|
+
type: 'route',
|
|
89
|
+
routes: [{
|
|
90
|
+
agent: agentMatch[1],
|
|
91
|
+
task: taskMatch?.[1] ?? '',
|
|
92
|
+
context: contextMatch?.[1],
|
|
93
|
+
}],
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Fallback — treat as direct answer
|
|
98
|
+
return { type: 'direct', directAnswer: trimmed };
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Format conversation history for the coordinator context window.
|
|
102
|
+
* Keeps recent messages, summarizes older ones.
|
|
103
|
+
*/
|
|
104
|
+
export function formatConversationContext(messages, maxMessages = 20) {
|
|
105
|
+
const recent = messages.slice(-maxMessages);
|
|
106
|
+
return recent
|
|
107
|
+
.map(m => {
|
|
108
|
+
const prefix = m.agentName ? `[${m.agentName}]` : `[${m.role}]`;
|
|
109
|
+
return `${prefix}: ${m.content}`;
|
|
110
|
+
})
|
|
111
|
+
.join('\n');
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=coordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../../src/cli/shell/coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Squad Interactive Shell — entry point
|
|
3
|
+
*
|
|
4
|
+
* Provides header chrome, readline input loop, and clean exit handling.
|
|
5
|
+
* Ink-based UI will be wired in a follow-up (#242+).
|
|
6
|
+
*/
|
|
7
|
+
export { SessionRegistry } from './sessions.js';
|
|
8
|
+
export { StreamBridge } from './stream-bridge.js';
|
|
9
|
+
export type { StreamBridgeOptions } from './stream-bridge.js';
|
|
10
|
+
export { ShellRenderer } from './render.js';
|
|
11
|
+
export { ShellLifecycle } from './lifecycle.js';
|
|
12
|
+
export type { LifecycleOptions, DiscoveredAgent } from './lifecycle.js';
|
|
13
|
+
export { spawnAgent, loadAgentCharter, buildAgentPrompt } from './spawn.js';
|
|
14
|
+
export type { SpawnOptions, SpawnResult, ToolDefinition } from './spawn.js';
|
|
15
|
+
export { buildCoordinatorPrompt, parseCoordinatorResponse, formatConversationContext } from './coordinator.js';
|
|
16
|
+
export type { CoordinatorConfig, RoutingDecision } from './coordinator.js';
|
|
17
|
+
export { parseInput } from './router.js';
|
|
18
|
+
export type { MessageType, ParsedInput } from './router.js';
|
|
19
|
+
export { executeCommand } from './commands.js';
|
|
20
|
+
export type { CommandContext, CommandResult } from './commands.js';
|
|
21
|
+
export { MemoryManager, DEFAULT_LIMITS } from './memory.js';
|
|
22
|
+
export type { MemoryLimits } from './memory.js';
|
|
23
|
+
export { detectTerminal, safeChar, boxChars } from './terminal.js';
|
|
24
|
+
export type { TerminalCapabilities } from './terminal.js';
|
|
25
|
+
export { createCompleter } from './autocomplete.js';
|
|
26
|
+
export type { CompleterFunction, CompleterResult } from './autocomplete.js';
|
|
27
|
+
export declare function runShell(): Promise<void>;
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/shell/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC5E,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC/G,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC5D,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACnE,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAmB5E,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAkC9C"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Squad Interactive Shell — entry point
|
|
3
|
+
*
|
|
4
|
+
* Provides header chrome, readline input loop, and clean exit handling.
|
|
5
|
+
* Ink-based UI will be wired in a follow-up (#242+).
|
|
6
|
+
*/
|
|
7
|
+
import { createRequire } from 'node:module';
|
|
8
|
+
import * as readline from 'node:readline/promises';
|
|
9
|
+
import { createCompleter } from './autocomplete.js';
|
|
10
|
+
export { SessionRegistry } from './sessions.js';
|
|
11
|
+
export { StreamBridge } from './stream-bridge.js';
|
|
12
|
+
export { ShellRenderer } from './render.js';
|
|
13
|
+
export { ShellLifecycle } from './lifecycle.js';
|
|
14
|
+
export { spawnAgent, loadAgentCharter, buildAgentPrompt } from './spawn.js';
|
|
15
|
+
export { buildCoordinatorPrompt, parseCoordinatorResponse, formatConversationContext } from './coordinator.js';
|
|
16
|
+
export { parseInput } from './router.js';
|
|
17
|
+
export { executeCommand } from './commands.js';
|
|
18
|
+
export { MemoryManager, DEFAULT_LIMITS } from './memory.js';
|
|
19
|
+
export { detectTerminal, safeChar, boxChars } from './terminal.js';
|
|
20
|
+
export { createCompleter } from './autocomplete.js';
|
|
21
|
+
const require = createRequire(import.meta.url);
|
|
22
|
+
const pkg = require('../../../package.json');
|
|
23
|
+
function printHeader() {
|
|
24
|
+
const version = `Squad v${pkg.version}`;
|
|
25
|
+
const help = 'Type /help for commands';
|
|
26
|
+
const width = Math.max(version.length, help.length) + 4;
|
|
27
|
+
const pad = (text) => `│ ${text.padEnd(width - 4)}│`;
|
|
28
|
+
console.log(`╭${'─'.repeat(width - 1)}╮`);
|
|
29
|
+
console.log(pad(version));
|
|
30
|
+
console.log(pad(help));
|
|
31
|
+
console.log(`╰${'─'.repeat(width - 1)}╯`);
|
|
32
|
+
}
|
|
33
|
+
const EXIT_COMMANDS = new Set(['exit', '/quit']);
|
|
34
|
+
export async function runShell() {
|
|
35
|
+
printHeader();
|
|
36
|
+
// Agent names will be populated from team discovery; empty for now
|
|
37
|
+
const agentNames = [];
|
|
38
|
+
const completer = createCompleter(agentNames);
|
|
39
|
+
const rl = readline.createInterface({
|
|
40
|
+
input: process.stdin,
|
|
41
|
+
output: process.stdout,
|
|
42
|
+
completer,
|
|
43
|
+
});
|
|
44
|
+
// Graceful Ctrl+C handling
|
|
45
|
+
process.on('SIGINT', () => {
|
|
46
|
+
console.log('\n👋 Squad out.');
|
|
47
|
+
rl.close();
|
|
48
|
+
});
|
|
49
|
+
try {
|
|
50
|
+
for await (const line of rl) {
|
|
51
|
+
const trimmed = line.trim();
|
|
52
|
+
if (EXIT_COMMANDS.has(trimmed)) {
|
|
53
|
+
console.log('👋 Squad out.');
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
// Placeholder — command handling comes with future issues
|
|
57
|
+
if (trimmed.length > 0) {
|
|
58
|
+
console.log(`[echo] ${trimmed}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
rl.close();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/shell/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell session lifecycle management.
|
|
3
|
+
*
|
|
4
|
+
* Manages initialization (team discovery, path resolution),
|
|
5
|
+
* message history tracking, state transitions, and graceful shutdown.
|
|
6
|
+
*
|
|
7
|
+
* @module cli/shell/lifecycle
|
|
8
|
+
*/
|
|
9
|
+
import { SessionRegistry } from './sessions.js';
|
|
10
|
+
import { ShellRenderer } from './render.js';
|
|
11
|
+
import type { ShellState, ShellMessage } from './types.js';
|
|
12
|
+
export interface LifecycleOptions {
|
|
13
|
+
teamRoot: string;
|
|
14
|
+
renderer: ShellRenderer;
|
|
15
|
+
registry: SessionRegistry;
|
|
16
|
+
}
|
|
17
|
+
export interface DiscoveredAgent {
|
|
18
|
+
name: string;
|
|
19
|
+
role: string;
|
|
20
|
+
charter: string | undefined;
|
|
21
|
+
status: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Manages the shell session lifecycle:
|
|
25
|
+
* - Initialization (load team, resolve squad path, populate registry)
|
|
26
|
+
* - Message handling (route user input, track responses)
|
|
27
|
+
* - Cleanup (graceful shutdown, session cleanup)
|
|
28
|
+
*/
|
|
29
|
+
export declare class ShellLifecycle {
|
|
30
|
+
private state;
|
|
31
|
+
private options;
|
|
32
|
+
private messageHistory;
|
|
33
|
+
private discoveredAgents;
|
|
34
|
+
constructor(options: LifecycleOptions);
|
|
35
|
+
/** Initialize the shell — verify .squad/, load team.md, discover agents. */
|
|
36
|
+
initialize(): Promise<void>;
|
|
37
|
+
/** Get current shell state. */
|
|
38
|
+
getState(): ShellState;
|
|
39
|
+
/** Get agents discovered during initialization. */
|
|
40
|
+
getDiscoveredAgents(): readonly DiscoveredAgent[];
|
|
41
|
+
/** Add a user message to history. */
|
|
42
|
+
addUserMessage(content: string): ShellMessage;
|
|
43
|
+
/** Add an agent response to history. */
|
|
44
|
+
addAgentMessage(agentName: string, content: string): ShellMessage;
|
|
45
|
+
/** Add a system message. */
|
|
46
|
+
addSystemMessage(content: string): ShellMessage;
|
|
47
|
+
/** Get message history (optionally filtered by agent). */
|
|
48
|
+
getHistory(agentName?: string): ShellMessage[];
|
|
49
|
+
/** Clean shutdown — close all sessions, clear state. */
|
|
50
|
+
shutdown(): Promise<void>;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/cli/shell/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,gBAAgB,CAAyB;gBAErC,OAAO,EAAE,gBAAgB;IASrC,4EAA4E;IACtE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgCjC,+BAA+B;IAC/B,QAAQ,IAAI,UAAU;IAItB,mDAAmD;IACnD,mBAAmB,IAAI,SAAS,eAAe,EAAE;IAIjD,qCAAqC;IACrC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY;IAW7C,wCAAwC;IACxC,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY;IAYjE,4BAA4B;IAC5B,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY;IAW/C,0DAA0D;IAC1D,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE;IAO9C,wDAAwD;IAClD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAQhC"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell session lifecycle management.
|
|
3
|
+
*
|
|
4
|
+
* Manages initialization (team discovery, path resolution),
|
|
5
|
+
* message history tracking, state transitions, and graceful shutdown.
|
|
6
|
+
*
|
|
7
|
+
* @module cli/shell/lifecycle
|
|
8
|
+
*/
|
|
9
|
+
import fs from 'node:fs';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
/**
|
|
12
|
+
* Manages the shell session lifecycle:
|
|
13
|
+
* - Initialization (load team, resolve squad path, populate registry)
|
|
14
|
+
* - Message handling (route user input, track responses)
|
|
15
|
+
* - Cleanup (graceful shutdown, session cleanup)
|
|
16
|
+
*/
|
|
17
|
+
export class ShellLifecycle {
|
|
18
|
+
state;
|
|
19
|
+
options;
|
|
20
|
+
messageHistory = [];
|
|
21
|
+
discoveredAgents = [];
|
|
22
|
+
constructor(options) {
|
|
23
|
+
this.options = options;
|
|
24
|
+
this.state = {
|
|
25
|
+
status: 'initializing',
|
|
26
|
+
activeAgents: new Map(),
|
|
27
|
+
messageHistory: [],
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/** Initialize the shell — verify .squad/, load team.md, discover agents. */
|
|
31
|
+
async initialize() {
|
|
32
|
+
this.state.status = 'initializing';
|
|
33
|
+
const squadDir = path.resolve(this.options.teamRoot, '.squad');
|
|
34
|
+
if (!fs.existsSync(squadDir) || !fs.statSync(squadDir).isDirectory()) {
|
|
35
|
+
this.state.status = 'error';
|
|
36
|
+
throw new Error(`No .squad/ directory found at "${squadDir}". Run "squad init" to create a team.`);
|
|
37
|
+
}
|
|
38
|
+
const teamPath = path.join(squadDir, 'team.md');
|
|
39
|
+
if (!fs.existsSync(teamPath)) {
|
|
40
|
+
this.state.status = 'error';
|
|
41
|
+
throw new Error(`No team.md found at "${teamPath}". The .squad/ directory exists but has no team manifest.`);
|
|
42
|
+
}
|
|
43
|
+
const teamContent = fs.readFileSync(teamPath, 'utf-8');
|
|
44
|
+
this.discoveredAgents = parseTeamManifest(teamContent);
|
|
45
|
+
// Register discovered agents in the session registry
|
|
46
|
+
for (const agent of this.discoveredAgents) {
|
|
47
|
+
if (agent.status === 'Active') {
|
|
48
|
+
this.options.registry.register(agent.name, agent.role);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
this.state.status = 'ready';
|
|
52
|
+
}
|
|
53
|
+
/** Get current shell state. */
|
|
54
|
+
getState() {
|
|
55
|
+
return { ...this.state };
|
|
56
|
+
}
|
|
57
|
+
/** Get agents discovered during initialization. */
|
|
58
|
+
getDiscoveredAgents() {
|
|
59
|
+
return this.discoveredAgents;
|
|
60
|
+
}
|
|
61
|
+
/** Add a user message to history. */
|
|
62
|
+
addUserMessage(content) {
|
|
63
|
+
const msg = {
|
|
64
|
+
role: 'user',
|
|
65
|
+
content,
|
|
66
|
+
timestamp: new Date(),
|
|
67
|
+
};
|
|
68
|
+
this.messageHistory.push(msg);
|
|
69
|
+
this.state.messageHistory = [...this.messageHistory];
|
|
70
|
+
return msg;
|
|
71
|
+
}
|
|
72
|
+
/** Add an agent response to history. */
|
|
73
|
+
addAgentMessage(agentName, content) {
|
|
74
|
+
const msg = {
|
|
75
|
+
role: 'agent',
|
|
76
|
+
agentName,
|
|
77
|
+
content,
|
|
78
|
+
timestamp: new Date(),
|
|
79
|
+
};
|
|
80
|
+
this.messageHistory.push(msg);
|
|
81
|
+
this.state.messageHistory = [...this.messageHistory];
|
|
82
|
+
return msg;
|
|
83
|
+
}
|
|
84
|
+
/** Add a system message. */
|
|
85
|
+
addSystemMessage(content) {
|
|
86
|
+
const msg = {
|
|
87
|
+
role: 'system',
|
|
88
|
+
content,
|
|
89
|
+
timestamp: new Date(),
|
|
90
|
+
};
|
|
91
|
+
this.messageHistory.push(msg);
|
|
92
|
+
this.state.messageHistory = [...this.messageHistory];
|
|
93
|
+
return msg;
|
|
94
|
+
}
|
|
95
|
+
/** Get message history (optionally filtered by agent). */
|
|
96
|
+
getHistory(agentName) {
|
|
97
|
+
if (agentName) {
|
|
98
|
+
return this.messageHistory.filter(m => m.agentName === agentName);
|
|
99
|
+
}
|
|
100
|
+
return [...this.messageHistory];
|
|
101
|
+
}
|
|
102
|
+
/** Clean shutdown — close all sessions, clear state. */
|
|
103
|
+
async shutdown() {
|
|
104
|
+
this.state.status = 'initializing'; // transitioning
|
|
105
|
+
this.options.registry.clear();
|
|
106
|
+
this.messageHistory = [];
|
|
107
|
+
this.state.messageHistory = [];
|
|
108
|
+
this.state.activeAgents.clear();
|
|
109
|
+
this.discoveredAgents = [];
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Parse the Members table from team.md and extract agent metadata.
|
|
114
|
+
*
|
|
115
|
+
* Expected markdown table format:
|
|
116
|
+
* ```
|
|
117
|
+
* | Name | Role | Charter | Status |
|
|
118
|
+
* |------|------|---------|--------|
|
|
119
|
+
* | Keaton | Lead | `.squad/agents/keaton/charter.md` | ✅ Active |
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
function parseTeamManifest(content) {
|
|
123
|
+
const agents = [];
|
|
124
|
+
const lines = content.split('\n');
|
|
125
|
+
let inMembersTable = false;
|
|
126
|
+
let headerParsed = false;
|
|
127
|
+
for (const line of lines) {
|
|
128
|
+
const trimmed = line.trim();
|
|
129
|
+
// Detect the "Members" section header
|
|
130
|
+
if (/^#+\s*Members/i.test(trimmed)) {
|
|
131
|
+
inMembersTable = true;
|
|
132
|
+
headerParsed = false;
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
// Stop at the next section header
|
|
136
|
+
if (inMembersTable && /^#+\s/.test(trimmed) && !/^#+\s*Members/i.test(trimmed)) {
|
|
137
|
+
inMembersTable = false;
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (!inMembersTable)
|
|
141
|
+
continue;
|
|
142
|
+
// Skip non-table lines
|
|
143
|
+
if (!trimmed.startsWith('|'))
|
|
144
|
+
continue;
|
|
145
|
+
// Skip the header row (contains "Name") and separator row (contains "---")
|
|
146
|
+
if (trimmed.includes('---') || /\|\s*Name\s*\|/i.test(trimmed)) {
|
|
147
|
+
headerParsed = true;
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
if (!headerParsed)
|
|
151
|
+
continue;
|
|
152
|
+
const cells = trimmed
|
|
153
|
+
.split('|')
|
|
154
|
+
.map(c => c.trim())
|
|
155
|
+
.filter(c => c.length > 0);
|
|
156
|
+
if (cells.length < 4)
|
|
157
|
+
continue;
|
|
158
|
+
const name = cells[0];
|
|
159
|
+
const role = cells[1];
|
|
160
|
+
const charter = cells[2]?.startsWith('`') ? cells[2].replace(/`/g, '') : undefined;
|
|
161
|
+
// Extract status text from emoji-prefixed status (e.g. "✅ Active" → "Active")
|
|
162
|
+
const rawStatus = cells[3];
|
|
163
|
+
const status = rawStatus.replace(/^[^\w]*/, '').trim();
|
|
164
|
+
agents.push({ name, role, charter, status });
|
|
165
|
+
}
|
|
166
|
+
return agents;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/cli/shell/lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory management for shell sessions.
|
|
3
|
+
* Enforces buffer limits and handles cleanup.
|
|
4
|
+
*/
|
|
5
|
+
export interface MemoryLimits {
|
|
6
|
+
/** Max messages to keep in history (default: 1000) */
|
|
7
|
+
maxMessages: number;
|
|
8
|
+
/** Max buffer size per stream in bytes (default: 1MB) */
|
|
9
|
+
maxStreamBuffer: number;
|
|
10
|
+
/** Max concurrent sessions (default: 10) */
|
|
11
|
+
maxSessions: number;
|
|
12
|
+
/** Session idle timeout in ms (default: 5 minutes) */
|
|
13
|
+
sessionIdleTimeout: number;
|
|
14
|
+
}
|
|
15
|
+
export declare const DEFAULT_LIMITS: MemoryLimits;
|
|
16
|
+
export declare class MemoryManager {
|
|
17
|
+
private limits;
|
|
18
|
+
private bufferSizes;
|
|
19
|
+
constructor(limits?: Partial<MemoryLimits>);
|
|
20
|
+
/** Check if a new session can be created */
|
|
21
|
+
canCreateSession(currentCount: number): boolean;
|
|
22
|
+
/** Track buffer growth, return true if within limits */
|
|
23
|
+
trackBuffer(sessionId: string, additionalBytes: number): boolean;
|
|
24
|
+
/** Trim message history to limit */
|
|
25
|
+
trimMessages<T>(messages: T[]): T[];
|
|
26
|
+
/** Clear buffer tracking for a session */
|
|
27
|
+
clearBuffer(sessionId: string): void;
|
|
28
|
+
/** Get current memory stats */
|
|
29
|
+
getStats(): {
|
|
30
|
+
sessions: number;
|
|
31
|
+
totalBufferBytes: number;
|
|
32
|
+
};
|
|
33
|
+
/** Get configured limits */
|
|
34
|
+
getLimits(): Readonly<MemoryLimits>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/cli/shell/memory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,eAAe,EAAE,MAAM,CAAC;IACxB,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,eAAO,MAAM,cAAc,EAAE,YAK5B,CAAC;AAEF,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,WAAW,CAA6B;gBAEpC,MAAM,GAAE,OAAO,CAAC,YAAY,CAAM;IAI9C,4CAA4C;IAC5C,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAI/C,wDAAwD;IACxD,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO;IAUhE,oCAAoC;IACpC,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAKnC,0CAA0C;IAC1C,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIpC,+BAA+B;IAC/B,QAAQ,IAAI;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE;IAM1D,4BAA4B;IAC5B,SAAS,IAAI,QAAQ,CAAC,YAAY,CAAC;CAGpC"}
|