@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.
- package/dist/agent-state.d.ts +40 -0
- package/dist/agent-state.d.ts.map +1 -0
- package/dist/agent-state.js +120 -0
- package/dist/agent-state.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/package.json +32 -0
|
@@ -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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"}
|
package/dist/index.d.ts
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, 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 @@
|
|
|
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
|
+
}
|