@agent-relay/state 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.
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Agent State Manager
3
+ * Persists agent context between spawns for non-hook CLIs (Codex, Gemini, etc.)
4
+ */
5
+ export interface AgentState {
6
+ name: string;
7
+ lastActive: string;
8
+ currentTask: string;
9
+ completedTasks: string[];
10
+ decisions: string[];
11
+ context: string;
12
+ files: string[];
13
+ }
14
+ export declare class AgentStateManager {
15
+ private dataDir;
16
+ constructor(dataDir?: string);
17
+ private getStatePath;
18
+ /**
19
+ * Load agent state from file
20
+ */
21
+ load(agentName: string): AgentState | null;
22
+ /**
23
+ * Save agent state to file
24
+ */
25
+ save(state: AgentState): void;
26
+ /**
27
+ * Update specific fields in state
28
+ */
29
+ update(agentName: string, updates: Partial<AgentState>): AgentState;
30
+ /**
31
+ * Format state as context for agent prompt
32
+ */
33
+ formatAsContext(agentName: string): string;
34
+ }
35
+ /**
36
+ * CLI helper to save state from agent output
37
+ * Agent outputs: [[STATE]]{"currentTask": "...", "context": "..."}[[/STATE]]
38
+ */
39
+ export declare function parseStateFromOutput(output: string): Partial<AgentState> | null;
40
+ //# sourceMappingURL=agent-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-state.d.ts","sourceRoot":"","sources":["../src/agent-state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,MAAgC;IAIrD,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACH,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAe1C;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAW7B;;OAEG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU;IAqBnE;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CA8C3C;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAY/E"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Agent State Manager
3
+ * Persists agent context between spawns for non-hook CLIs (Codex, Gemini, etc.)
4
+ */
5
+ import * as fs from 'node:fs';
6
+ import * as path from 'node:path';
7
+ export class AgentStateManager {
8
+ dataDir;
9
+ constructor(dataDir = '/tmp/agent-relay-team') {
10
+ this.dataDir = dataDir;
11
+ }
12
+ getStatePath(agentName) {
13
+ return path.join(this.dataDir, agentName, 'state.json');
14
+ }
15
+ /**
16
+ * Load agent state from file
17
+ */
18
+ load(agentName) {
19
+ const statePath = this.getStatePath(agentName);
20
+ if (!fs.existsSync(statePath)) {
21
+ return null;
22
+ }
23
+ try {
24
+ const content = fs.readFileSync(statePath, 'utf-8');
25
+ return JSON.parse(content);
26
+ }
27
+ catch {
28
+ return null;
29
+ }
30
+ }
31
+ /**
32
+ * Save agent state to file
33
+ */
34
+ save(state) {
35
+ const statePath = this.getStatePath(state.name);
36
+ const dir = path.dirname(statePath);
37
+ if (!fs.existsSync(dir)) {
38
+ fs.mkdirSync(dir, { recursive: true });
39
+ }
40
+ fs.writeFileSync(statePath, JSON.stringify(state, null, 2));
41
+ }
42
+ /**
43
+ * Update specific fields in state
44
+ */
45
+ update(agentName, updates) {
46
+ const existing = this.load(agentName) || {
47
+ name: agentName,
48
+ lastActive: new Date().toISOString(),
49
+ currentTask: '',
50
+ completedTasks: [],
51
+ decisions: [],
52
+ context: '',
53
+ files: [],
54
+ };
55
+ const updated = {
56
+ ...existing,
57
+ ...updates,
58
+ lastActive: new Date().toISOString(),
59
+ };
60
+ this.save(updated);
61
+ return updated;
62
+ }
63
+ /**
64
+ * Format state as context for agent prompt
65
+ */
66
+ formatAsContext(agentName) {
67
+ const state = this.load(agentName);
68
+ if (!state) {
69
+ return 'No previous session state found. Starting fresh.';
70
+ }
71
+ const lines = [
72
+ '=== PREVIOUS SESSION CONTEXT ===',
73
+ `Last active: ${state.lastActive}`,
74
+ '',
75
+ ];
76
+ if (state.currentTask) {
77
+ lines.push(`Current task: ${state.currentTask}`);
78
+ }
79
+ if (state.completedTasks.length > 0) {
80
+ lines.push('');
81
+ lines.push('Completed tasks:');
82
+ state.completedTasks.forEach(t => lines.push(` - ${t}`));
83
+ }
84
+ if (state.decisions.length > 0) {
85
+ lines.push('');
86
+ lines.push('Key decisions made:');
87
+ state.decisions.forEach(d => lines.push(` - ${d}`));
88
+ }
89
+ if (state.context) {
90
+ lines.push('');
91
+ lines.push('Context:');
92
+ lines.push(state.context);
93
+ }
94
+ if (state.files.length > 0) {
95
+ lines.push('');
96
+ lines.push('Files being worked on:');
97
+ state.files.forEach(f => lines.push(` - ${f}`));
98
+ }
99
+ lines.push('=== END CONTEXT ===');
100
+ lines.push('');
101
+ return lines.join('\n');
102
+ }
103
+ }
104
+ /**
105
+ * CLI helper to save state from agent output
106
+ * Agent outputs: [[STATE]]{"currentTask": "...", "context": "..."}[[/STATE]]
107
+ */
108
+ export function parseStateFromOutput(output) {
109
+ const match = output.match(/\[\[STATE\]\]([\s\S]*?)\[\[\/STATE\]\]/);
110
+ if (!match) {
111
+ return null;
112
+ }
113
+ try {
114
+ return JSON.parse(match[1]);
115
+ }
116
+ catch {
117
+ return null;
118
+ }
119
+ }
120
+ //# sourceMappingURL=agent-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-state.js","sourceRoot":"","sources":["../src/agent-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @relay/state
3
+ *
4
+ * Agent state persistence for non-hook CLIs (Codex, Gemini, etc.)
5
+ * Provides state management between agent spawns.
6
+ */
7
+ export { AgentStateManager, parseStateFromOutput, type AgentState, } from './agent-state.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,KAAK,UAAU,GAChB,MAAM,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @relay/state
3
+ *
4
+ * Agent state persistence for non-hook CLIs (Codex, Gemini, etc.)
5
+ * Provides state management between agent spawns.
6
+ */
7
+ export { AgentStateManager, parseStateFromOutput, } from './agent-state.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,iBAAiB,EACjB,oBAAoB,GAErB,MAAM,kBAAkB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@agent-relay/state",
3
+ "version": "0.1.0",
4
+ "description": "Agent state persistence for non-hook CLIs (Codex, Gemini, etc.)",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "README.md"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "clean": "rm -rf dist",
21
+ "test": "vitest run",
22
+ "test:watch": "vitest"
23
+ },
24
+ "devDependencies": {
25
+ "@types/node": "^22.19.3",
26
+ "typescript": "^5.9.3",
27
+ "vitest": "^3.2.4"
28
+ },
29
+ "publishConfig": {
30
+ "access": "public"
31
+ }
32
+ }