@ai-devkit/agent-manager 0.30.0 → 0.32.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/__tests__/readiness/AgentReadiness.test.js +301 -0
- package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -0
- package/dist/database/connection.d.ts.map +1 -1
- package/dist/database/connection.js +5 -1
- package/dist/database/connection.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/readiness/AgentReadiness.d.ts +67 -0
- package/dist/readiness/AgentReadiness.d.ts.map +1 -0
- package/dist/readiness/AgentReadiness.js +614 -0
- package/dist/readiness/AgentReadiness.js.map +1 -0
- package/package.json +1 -1
- package/src/__tests__/readiness/AgentReadiness.test.ts +194 -0
- package/src/database/connection.ts +3 -1
- package/src/index.ts +18 -0
- package/src/readiness/AgentReadiness.ts +655 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
3
|
+
import { AGENTS, getAgentReadinessReport, getAgentReadinessReports } from '../../index.js';
|
|
4
|
+
const builtInSkillNames = [
|
|
5
|
+
'agent-management',
|
|
6
|
+
'memory',
|
|
7
|
+
'verify'
|
|
8
|
+
];
|
|
9
|
+
const skillRoots = {
|
|
10
|
+
claude: '.claude/skills',
|
|
11
|
+
codex: '.codex/skills',
|
|
12
|
+
copilot: '.copilot/skills',
|
|
13
|
+
grok_cli: '.grok/skills',
|
|
14
|
+
opencode: '.config/opencode/skill',
|
|
15
|
+
pi: '.pi/agent/skills'
|
|
16
|
+
};
|
|
17
|
+
function fixture(overrides = {}) {
|
|
18
|
+
const homeDir = '/home/test';
|
|
19
|
+
const assetRoot = '/assets';
|
|
20
|
+
const files = {
|
|
21
|
+
[path.join(homeDir, '.codex', 'hooks', 'codex-session-mapping.cjs')]: 'codex-hook',
|
|
22
|
+
[path.join(assetRoot, 'codex', 'codex-session-mapping.cjs')]: 'codex-hook',
|
|
23
|
+
[path.join(homeDir, '.codex', 'hooks.json')]: JSON.stringify({
|
|
24
|
+
hooks: {
|
|
25
|
+
SessionStart: [
|
|
26
|
+
{
|
|
27
|
+
hooks: [
|
|
28
|
+
{
|
|
29
|
+
type: 'command',
|
|
30
|
+
command: 'node ~/.codex/hooks/codex-session-mapping.cjs'
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
}
|
|
36
|
+
}),
|
|
37
|
+
[path.join(homeDir, '.codex', 'ai-devkit', 'sessions.json')]: JSON.stringify({
|
|
38
|
+
'123': '/sessions/codex.jsonl'
|
|
39
|
+
}),
|
|
40
|
+
'/sessions/codex.jsonl': '',
|
|
41
|
+
[path.join(homeDir, '.claude', 'hooks', 'claude-prompt-hook.js')]: 'claude-hook',
|
|
42
|
+
[path.join(assetRoot, 'claude', 'claude-prompt-hook.js')]: 'claude-hook',
|
|
43
|
+
[path.join(homeDir, '.claude', 'settings.json')]: JSON.stringify({
|
|
44
|
+
hooks: {
|
|
45
|
+
PreToolUse: [
|
|
46
|
+
{
|
|
47
|
+
hooks: [
|
|
48
|
+
{
|
|
49
|
+
type: 'command',
|
|
50
|
+
command: 'node ~/.claude/hooks/claude-prompt-hook.js'
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
}),
|
|
57
|
+
[path.join(homeDir, '.pi', 'agent', 'sessions.json')]: JSON.stringify({
|
|
58
|
+
'456': '/sessions/missing-pi.jsonl'
|
|
59
|
+
}),
|
|
60
|
+
[path.join(homeDir, '.pi', 'agent', 'auth.json')]: JSON.stringify({
|
|
61
|
+
anthropic: {
|
|
62
|
+
access: 'access-secret',
|
|
63
|
+
refresh: 'refresh-secret'
|
|
64
|
+
},
|
|
65
|
+
litellm: {
|
|
66
|
+
key: 'litellm-secret',
|
|
67
|
+
env: {
|
|
68
|
+
LITELLM_BASE_URL: 'https://litellm.example.test'
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
})
|
|
72
|
+
};
|
|
73
|
+
for (const directory of [
|
|
74
|
+
'.claude',
|
|
75
|
+
'.codex',
|
|
76
|
+
'.copilot',
|
|
77
|
+
'.grok',
|
|
78
|
+
'.config/opencode',
|
|
79
|
+
'.pi'
|
|
80
|
+
]){
|
|
81
|
+
files[path.join(homeDir, directory)] = '<dir>';
|
|
82
|
+
}
|
|
83
|
+
for (const root of Object.values(skillRoots)){
|
|
84
|
+
for (const skill of builtInSkillNames){
|
|
85
|
+
files[path.join(homeDir, root, skill, 'SKILL.md')] = '# skill';
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const executablePaths = Object.values(AGENTS).map((agent)=>path.join('/bin', agent.command));
|
|
89
|
+
const options = {
|
|
90
|
+
homeDir,
|
|
91
|
+
path: '/bin',
|
|
92
|
+
assetRoot,
|
|
93
|
+
builtInSkillNames,
|
|
94
|
+
skillRoots,
|
|
95
|
+
readFile: async (target)=>{
|
|
96
|
+
if (!(target in files)) throw new Error('missing');
|
|
97
|
+
return files[target];
|
|
98
|
+
},
|
|
99
|
+
access: async (target)=>{
|
|
100
|
+
if (executablePaths.includes(target) || target in files) return;
|
|
101
|
+
throw new Error('missing');
|
|
102
|
+
},
|
|
103
|
+
runCommand: vi.fn(async (command)=>{
|
|
104
|
+
if (command === 'pi') return {
|
|
105
|
+
stdout: 'npm:@ai-devkit/pi-session-tracker\n',
|
|
106
|
+
stderr: ''
|
|
107
|
+
};
|
|
108
|
+
if (command === 'claude') return {
|
|
109
|
+
stdout: JSON.stringify({
|
|
110
|
+
loggedIn: true
|
|
111
|
+
}),
|
|
112
|
+
stderr: ''
|
|
113
|
+
};
|
|
114
|
+
if (command === 'gh') return {
|
|
115
|
+
stdout: 'github.com\n Logged in to github.com account test-user\n',
|
|
116
|
+
stderr: ''
|
|
117
|
+
};
|
|
118
|
+
if (command === 'opencode') return {
|
|
119
|
+
stdout: '● litellm api\n● OpenAI oauth\n',
|
|
120
|
+
stderr: ''
|
|
121
|
+
};
|
|
122
|
+
throw new Error(`unexpected command ${command}`);
|
|
123
|
+
}),
|
|
124
|
+
codexAuth: async ()=>true,
|
|
125
|
+
...overrides
|
|
126
|
+
};
|
|
127
|
+
return {
|
|
128
|
+
options,
|
|
129
|
+
files
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
describe('agent readiness', ()=>{
|
|
133
|
+
it('reports every readiness-supported adapter with generic checks and only real integrations', async ()=>{
|
|
134
|
+
const { options } = fixture();
|
|
135
|
+
const reports = await getAgentReadinessReports(options);
|
|
136
|
+
expect(Object.keys(reports)).toEqual([
|
|
137
|
+
'claude',
|
|
138
|
+
'codex',
|
|
139
|
+
'copilot',
|
|
140
|
+
'grok_cli',
|
|
141
|
+
'opencode',
|
|
142
|
+
'pi'
|
|
143
|
+
]);
|
|
144
|
+
expect(reports).not.toHaveProperty('gemini_cli');
|
|
145
|
+
for (const [agent, report] of Object.entries(reports)){
|
|
146
|
+
expect(report.type).toBe(agent);
|
|
147
|
+
expect(report.executable.status).toBe('pass');
|
|
148
|
+
expect(report.globalConfig.status).toBe('pass');
|
|
149
|
+
expect(report.builtInSkills).toMatchObject({
|
|
150
|
+
status: 'info',
|
|
151
|
+
present: 3,
|
|
152
|
+
required: 3
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
expect(reports.codex.integration).toMatchObject({
|
|
156
|
+
label: 'ai-devkit hook',
|
|
157
|
+
installed: true,
|
|
158
|
+
status: 'pass'
|
|
159
|
+
});
|
|
160
|
+
expect(reports.claude.integration).toMatchObject({
|
|
161
|
+
label: 'ai-devkit hook',
|
|
162
|
+
installed: true,
|
|
163
|
+
status: 'pass'
|
|
164
|
+
});
|
|
165
|
+
expect(reports.pi.integration).toMatchObject({
|
|
166
|
+
label: 'ai-devkit plugin',
|
|
167
|
+
installed: true,
|
|
168
|
+
status: 'pass'
|
|
169
|
+
});
|
|
170
|
+
expect(reports.copilot.integration).toBeUndefined();
|
|
171
|
+
expect(reports.grok_cli.integration).toBeUndefined();
|
|
172
|
+
expect(reports.opencode.integration).toBeUndefined();
|
|
173
|
+
});
|
|
174
|
+
it('parses Pi provider names without returning credential values', async ()=>{
|
|
175
|
+
const { options } = fixture();
|
|
176
|
+
const report = await getAgentReadinessReport('pi', options);
|
|
177
|
+
const serialized = JSON.stringify(report);
|
|
178
|
+
expect(report.auth).toMatchObject({
|
|
179
|
+
state: 'authenticated',
|
|
180
|
+
provider: null,
|
|
181
|
+
availableProviders: [
|
|
182
|
+
'anthropic',
|
|
183
|
+
'litellm'
|
|
184
|
+
],
|
|
185
|
+
status: 'pass'
|
|
186
|
+
});
|
|
187
|
+
expect(serialized).not.toContain('access-secret');
|
|
188
|
+
expect(serialized).not.toContain('refresh-secret');
|
|
189
|
+
expect(serialized).not.toContain('litellm-secret');
|
|
190
|
+
expect(serialized).not.toContain('litellm.example.test');
|
|
191
|
+
});
|
|
192
|
+
it('accepts Pi session tracker display names from pi list output', async ()=>{
|
|
193
|
+
const { options } = fixture({
|
|
194
|
+
runCommand: vi.fn(async (command)=>{
|
|
195
|
+
if (command === 'pi') return {
|
|
196
|
+
stdout: 'session tracker\n',
|
|
197
|
+
stderr: ''
|
|
198
|
+
};
|
|
199
|
+
if (command === 'claude') return {
|
|
200
|
+
stdout: JSON.stringify({
|
|
201
|
+
loggedIn: true
|
|
202
|
+
}),
|
|
203
|
+
stderr: ''
|
|
204
|
+
};
|
|
205
|
+
throw new Error(`unexpected command ${command}`);
|
|
206
|
+
})
|
|
207
|
+
});
|
|
208
|
+
const report = await getAgentReadinessReport('pi', options);
|
|
209
|
+
expect(report.integration).toMatchObject({
|
|
210
|
+
label: 'ai-devkit plugin',
|
|
211
|
+
installed: true,
|
|
212
|
+
status: 'pass'
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
it('reports missing built-in skills as informational readiness', async ()=>{
|
|
216
|
+
const { options, files } = fixture();
|
|
217
|
+
delete files[path.join(options.homeDir, skillRoots.codex, 'verify', 'SKILL.md')];
|
|
218
|
+
const report = await getAgentReadinessReport('codex', options);
|
|
219
|
+
expect(report.builtInSkills).toMatchObject({
|
|
220
|
+
status: 'info',
|
|
221
|
+
present: 2,
|
|
222
|
+
required: 3,
|
|
223
|
+
missing: [
|
|
224
|
+
'verify'
|
|
225
|
+
]
|
|
226
|
+
});
|
|
227
|
+
expect(report.status).toBe('pass');
|
|
228
|
+
});
|
|
229
|
+
it('checks OpenCode auth from auth list output', async ()=>{
|
|
230
|
+
const { options } = fixture({
|
|
231
|
+
runCommand: vi.fn(async (command)=>{
|
|
232
|
+
if (command === 'opencode') {
|
|
233
|
+
return {
|
|
234
|
+
stdout: '\x1B[32m●\x1B[0m litellm api\n● OpenAI oauth\n● GitLab Duo GITLAB_TOKEN\n',
|
|
235
|
+
stderr: ''
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
if (command === 'pi') return {
|
|
239
|
+
stdout: 'npm:@ai-devkit/pi-session-tracker\n',
|
|
240
|
+
stderr: ''
|
|
241
|
+
};
|
|
242
|
+
if (command === 'claude') return {
|
|
243
|
+
stdout: JSON.stringify({
|
|
244
|
+
loggedIn: true
|
|
245
|
+
}),
|
|
246
|
+
stderr: ''
|
|
247
|
+
};
|
|
248
|
+
throw new Error(`unexpected command ${command}`);
|
|
249
|
+
})
|
|
250
|
+
});
|
|
251
|
+
const report = await getAgentReadinessReport('opencode', options);
|
|
252
|
+
expect(report.auth).toMatchObject({
|
|
253
|
+
state: 'authenticated',
|
|
254
|
+
source: 'opencode auth list',
|
|
255
|
+
provider: null,
|
|
256
|
+
availableProviders: [
|
|
257
|
+
'GitLab Duo',
|
|
258
|
+
'OpenAI',
|
|
259
|
+
'litellm'
|
|
260
|
+
],
|
|
261
|
+
status: 'pass'
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
it('checks Copilot auth through GitHub CLI authentication', async ()=>{
|
|
265
|
+
const { options } = fixture({
|
|
266
|
+
runCommand: vi.fn(async (command)=>{
|
|
267
|
+
if (command === 'gh') return {
|
|
268
|
+
stdout: 'github.com\n Logged in to github.com account test-user\n',
|
|
269
|
+
stderr: ''
|
|
270
|
+
};
|
|
271
|
+
if (command === 'pi') return {
|
|
272
|
+
stdout: 'npm:@ai-devkit/pi-session-tracker\n',
|
|
273
|
+
stderr: ''
|
|
274
|
+
};
|
|
275
|
+
if (command === 'claude') return {
|
|
276
|
+
stdout: JSON.stringify({
|
|
277
|
+
loggedIn: true
|
|
278
|
+
}),
|
|
279
|
+
stderr: ''
|
|
280
|
+
};
|
|
281
|
+
if (command === 'opencode') return {
|
|
282
|
+
stdout: '● litellm api\n',
|
|
283
|
+
stderr: ''
|
|
284
|
+
};
|
|
285
|
+
throw new Error(`unexpected command ${command}`);
|
|
286
|
+
})
|
|
287
|
+
});
|
|
288
|
+
const report = await getAgentReadinessReport('copilot', options);
|
|
289
|
+
expect(report.auth).toMatchObject({
|
|
290
|
+
state: 'authenticated',
|
|
291
|
+
source: 'gh auth status --hostname github.com',
|
|
292
|
+
provider: 'github',
|
|
293
|
+
availableProviders: [
|
|
294
|
+
'GitHub'
|
|
295
|
+
],
|
|
296
|
+
status: 'pass'
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
//# sourceMappingURL=AgentReadiness.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/__tests__/readiness/AgentReadiness.test.ts"],"sourcesContent":["import path from 'node:path';\nimport { describe, expect, it, vi } from 'vitest';\nimport {\n AGENTS,\n getAgentReadinessReport,\n getAgentReadinessReports,\n type AgentReadinessOptions,\n type ReadinessAgentType,\n} from '../../index.js';\n\ntype Files = Record<string, string>;\n\nconst builtInSkillNames = ['agent-management', 'memory', 'verify'];\nconst skillRoots: Record<ReadinessAgentType, string> = {\n claude: '.claude/skills',\n codex: '.codex/skills',\n copilot: '.copilot/skills',\n grok_cli: '.grok/skills',\n opencode: '.config/opencode/skill',\n pi: '.pi/agent/skills',\n};\n\nfunction fixture(overrides: Partial<AgentReadinessOptions> = {}) {\n const homeDir = '/home/test';\n const assetRoot = '/assets';\n const files: Files = {\n [path.join(homeDir, '.codex', 'hooks', 'codex-session-mapping.cjs')]: 'codex-hook',\n [path.join(assetRoot, 'codex', 'codex-session-mapping.cjs')]: 'codex-hook',\n [path.join(homeDir, '.codex', 'hooks.json')]: JSON.stringify({ hooks: { SessionStart: [{ hooks: [\n { type: 'command', command: 'node ~/.codex/hooks/codex-session-mapping.cjs' },\n ] }] } }),\n [path.join(homeDir, '.codex', 'ai-devkit', 'sessions.json')]: JSON.stringify({ '123': '/sessions/codex.jsonl' }),\n '/sessions/codex.jsonl': '',\n [path.join(homeDir, '.claude', 'hooks', 'claude-prompt-hook.js')]: 'claude-hook',\n [path.join(assetRoot, 'claude', 'claude-prompt-hook.js')]: 'claude-hook',\n [path.join(homeDir, '.claude', 'settings.json')]: JSON.stringify({ hooks: { PreToolUse: [{ hooks: [\n { type: 'command', command: 'node ~/.claude/hooks/claude-prompt-hook.js' },\n ] }] } }),\n [path.join(homeDir, '.pi', 'agent', 'sessions.json')]: JSON.stringify({ '456': '/sessions/missing-pi.jsonl' }),\n [path.join(homeDir, '.pi', 'agent', 'auth.json')]: JSON.stringify({\n anthropic: { access: 'access-secret', refresh: 'refresh-secret' },\n litellm: { key: 'litellm-secret', env: { LITELLM_BASE_URL: 'https://litellm.example.test' } },\n }),\n };\n for (const directory of ['.claude', '.codex', '.copilot', '.grok', '.config/opencode', '.pi']) {\n files[path.join(homeDir, directory)] = '<dir>';\n }\n for (const root of Object.values(skillRoots)) {\n for (const skill of builtInSkillNames) {\n files[path.join(homeDir, root, skill, 'SKILL.md')] = '# skill';\n }\n }\n const executablePaths = Object.values(AGENTS).map(agent => path.join('/bin', agent.command));\n const options: AgentReadinessOptions = {\n homeDir,\n path: '/bin',\n assetRoot,\n builtInSkillNames,\n skillRoots,\n readFile: async target => {\n if (!(target in files)) throw new Error('missing');\n return files[target];\n },\n access: async target => {\n if (executablePaths.includes(target) || target in files) return;\n throw new Error('missing');\n },\n runCommand: vi.fn(async command => {\n if (command === 'pi') return { stdout: 'npm:@ai-devkit/pi-session-tracker\\n', stderr: '' };\n if (command === 'claude') return { stdout: JSON.stringify({ loggedIn: true }), stderr: '' };\n if (command === 'gh') return { stdout: 'github.com\\n Logged in to github.com account test-user\\n', stderr: '' };\n if (command === 'opencode') return { stdout: '● litellm api\\n● OpenAI oauth\\n', stderr: '' };\n throw new Error(`unexpected command ${command}`);\n }),\n codexAuth: async () => true,\n ...overrides,\n };\n return { options, files };\n}\n\ndescribe('agent readiness', () => {\n it('reports every readiness-supported adapter with generic checks and only real integrations', async () => {\n const { options } = fixture();\n\n const reports = await getAgentReadinessReports(options);\n\n expect(Object.keys(reports)).toEqual(['claude', 'codex', 'copilot', 'grok_cli', 'opencode', 'pi']);\n expect(reports).not.toHaveProperty('gemini_cli');\n for (const [agent, report] of Object.entries(reports) as Array<[ReadinessAgentType, typeof reports[ReadinessAgentType]]>) {\n expect(report.type).toBe(agent);\n expect(report.executable.status).toBe('pass');\n expect(report.globalConfig.status).toBe('pass');\n expect(report.builtInSkills).toMatchObject({ status: 'info', present: 3, required: 3 });\n }\n expect(reports.codex.integration).toMatchObject({ label: 'ai-devkit hook', installed: true, status: 'pass' });\n expect(reports.claude.integration).toMatchObject({ label: 'ai-devkit hook', installed: true, status: 'pass' });\n expect(reports.pi.integration).toMatchObject({ label: 'ai-devkit plugin', installed: true, status: 'pass' });\n expect(reports.copilot.integration).toBeUndefined();\n expect(reports.grok_cli.integration).toBeUndefined();\n expect(reports.opencode.integration).toBeUndefined();\n });\n\n it('parses Pi provider names without returning credential values', async () => {\n const { options } = fixture();\n\n const report = await getAgentReadinessReport('pi', options);\n const serialized = JSON.stringify(report);\n\n expect(report.auth).toMatchObject({\n state: 'authenticated',\n provider: null,\n availableProviders: ['anthropic', 'litellm'],\n status: 'pass',\n });\n expect(serialized).not.toContain('access-secret');\n expect(serialized).not.toContain('refresh-secret');\n expect(serialized).not.toContain('litellm-secret');\n expect(serialized).not.toContain('litellm.example.test');\n });\n\n it('accepts Pi session tracker display names from pi list output', async () => {\n const { options } = fixture({\n runCommand: vi.fn(async command => {\n if (command === 'pi') return { stdout: 'session tracker\\n', stderr: '' };\n if (command === 'claude') return { stdout: JSON.stringify({ loggedIn: true }), stderr: '' };\n throw new Error(`unexpected command ${command}`);\n }),\n });\n\n const report = await getAgentReadinessReport('pi', options);\n\n expect(report.integration).toMatchObject({ label: 'ai-devkit plugin', installed: true, status: 'pass' });\n });\n\n it('reports missing built-in skills as informational readiness', async () => {\n const { options, files } = fixture();\n delete files[path.join(options.homeDir!, skillRoots.codex, 'verify', 'SKILL.md')];\n\n const report = await getAgentReadinessReport('codex', options);\n\n expect(report.builtInSkills).toMatchObject({\n status: 'info',\n present: 2,\n required: 3,\n missing: ['verify'],\n });\n expect(report.status).toBe('pass');\n });\n\n it('checks OpenCode auth from auth list output', async () => {\n const { options } = fixture({\n runCommand: vi.fn(async command => {\n if (command === 'opencode') {\n return { stdout: '\\x1B[32m●\\x1B[0m litellm api\\n● OpenAI oauth\\n● GitLab Duo GITLAB_TOKEN\\n', stderr: '' };\n }\n if (command === 'pi') return { stdout: 'npm:@ai-devkit/pi-session-tracker\\n', stderr: '' };\n if (command === 'claude') return { stdout: JSON.stringify({ loggedIn: true }), stderr: '' };\n throw new Error(`unexpected command ${command}`);\n }),\n });\n\n const report = await getAgentReadinessReport('opencode', options);\n\n expect(report.auth).toMatchObject({\n state: 'authenticated',\n source: 'opencode auth list',\n provider: null,\n availableProviders: ['GitLab Duo', 'OpenAI', 'litellm'],\n status: 'pass',\n });\n });\n\n it('checks Copilot auth through GitHub CLI authentication', async () => {\n const { options } = fixture({\n runCommand: vi.fn(async command => {\n if (command === 'gh') return { stdout: 'github.com\\n Logged in to github.com account test-user\\n', stderr: '' };\n if (command === 'pi') return { stdout: 'npm:@ai-devkit/pi-session-tracker\\n', stderr: '' };\n if (command === 'claude') return { stdout: JSON.stringify({ loggedIn: true }), stderr: '' };\n if (command === 'opencode') return { stdout: '● litellm api\\n', stderr: '' };\n throw new Error(`unexpected command ${command}`);\n }),\n });\n\n const report = await getAgentReadinessReport('copilot', options);\n\n expect(report.auth).toMatchObject({\n state: 'authenticated',\n source: 'gh auth status --hostname github.com',\n provider: 'github',\n availableProviders: ['GitHub'],\n status: 'pass',\n });\n });\n});\n"],"names":["path","describe","expect","it","vi","AGENTS","getAgentReadinessReport","getAgentReadinessReports","builtInSkillNames","skillRoots","claude","codex","copilot","grok_cli","opencode","pi","fixture","overrides","homeDir","assetRoot","files","join","JSON","stringify","hooks","SessionStart","type","command","PreToolUse","anthropic","access","refresh","litellm","key","env","LITELLM_BASE_URL","directory","root","Object","values","skill","executablePaths","map","agent","options","readFile","target","Error","includes","runCommand","fn","stdout","stderr","loggedIn","codexAuth","reports","keys","toEqual","not","toHaveProperty","report","entries","toBe","executable","status","globalConfig","builtInSkills","toMatchObject","present","required","integration","label","installed","toBeUndefined","serialized","auth","state","provider","availableProviders","toContain","missing","source"],"mappings":"AAAA,OAAOA,UAAU,YAAY;AAC7B,SAASC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,EAAEC,EAAE,QAAQ,SAAS;AAClD,SACIC,MAAM,EACNC,uBAAuB,EACvBC,wBAAwB,QAGrB,iBAAiB;AAIxB,MAAMC,oBAAoB;IAAC;IAAoB;IAAU;CAAS;AAClE,MAAMC,aAAiD;IACnDC,QAAQ;IACRC,OAAO;IACPC,SAAS;IACTC,UAAU;IACVC,UAAU;IACVC,IAAI;AACR;AAEA,SAASC,QAAQC,YAA4C,CAAC,CAAC;IAC3D,MAAMC,UAAU;IAChB,MAAMC,YAAY;IAClB,MAAMC,QAAe;QACjB,CAACpB,KAAKqB,IAAI,CAACH,SAAS,UAAU,SAAS,6BAA6B,EAAE;QACtE,CAAClB,KAAKqB,IAAI,CAACF,WAAW,SAAS,6BAA6B,EAAE;QAC9D,CAACnB,KAAKqB,IAAI,CAACH,SAAS,UAAU,cAAc,EAAEI,KAAKC,SAAS,CAAC;YAAEC,OAAO;gBAAEC,cAAc;oBAAC;wBAAED,OAAO;4BAC5F;gCAAEE,MAAM;gCAAWC,SAAS;4BAAgD;yBAC/E;oBAAC;iBAAE;YAAC;QAAE;QACP,CAAC3B,KAAKqB,IAAI,CAACH,SAAS,UAAU,aAAa,iBAAiB,EAAEI,KAAKC,SAAS,CAAC;YAAE,OAAO;QAAwB;QAC9G,yBAAyB;QACzB,CAACvB,KAAKqB,IAAI,CAACH,SAAS,WAAW,SAAS,yBAAyB,EAAE;QACnE,CAAClB,KAAKqB,IAAI,CAACF,WAAW,UAAU,yBAAyB,EAAE;QAC3D,CAACnB,KAAKqB,IAAI,CAACH,SAAS,WAAW,iBAAiB,EAAEI,KAAKC,SAAS,CAAC;YAAEC,OAAO;gBAAEI,YAAY;oBAAC;wBAAEJ,OAAO;4BAC9F;gCAAEE,MAAM;gCAAWC,SAAS;4BAA6C;yBAC5E;oBAAC;iBAAE;YAAC;QAAE;QACP,CAAC3B,KAAKqB,IAAI,CAACH,SAAS,OAAO,SAAS,iBAAiB,EAAEI,KAAKC,SAAS,CAAC;YAAE,OAAO;QAA6B;QAC5G,CAACvB,KAAKqB,IAAI,CAACH,SAAS,OAAO,SAAS,aAAa,EAAEI,KAAKC,SAAS,CAAC;YAC9DM,WAAW;gBAAEC,QAAQ;gBAAiBC,SAAS;YAAiB;YAChEC,SAAS;gBAAEC,KAAK;gBAAkBC,KAAK;oBAAEC,kBAAkB;gBAA+B;YAAE;QAChG;IACJ;IACA,KAAK,MAAMC,aAAa;QAAC;QAAW;QAAU;QAAY;QAAS;QAAoB;KAAM,CAAE;QAC3FhB,KAAK,CAACpB,KAAKqB,IAAI,CAACH,SAASkB,WAAW,GAAG;IAC3C;IACA,KAAK,MAAMC,QAAQC,OAAOC,MAAM,CAAC9B,YAAa;QAC1C,KAAK,MAAM+B,SAAShC,kBAAmB;YACnCY,KAAK,CAACpB,KAAKqB,IAAI,CAACH,SAASmB,MAAMG,OAAO,YAAY,GAAG;QACzD;IACJ;IACA,MAAMC,kBAAkBH,OAAOC,MAAM,CAAClC,QAAQqC,GAAG,CAACC,CAAAA,QAAS3C,KAAKqB,IAAI,CAAC,QAAQsB,MAAMhB,OAAO;IAC1F,MAAMiB,UAAiC;QACnC1B;QACAlB,MAAM;QACNmB;QACAX;QACAC;QACAoC,UAAU,OAAMC;YACZ,IAAI,CAAEA,CAAAA,UAAU1B,KAAI,GAAI,MAAM,IAAI2B,MAAM;YACxC,OAAO3B,KAAK,CAAC0B,OAAO;QACxB;QACAhB,QAAQ,OAAMgB;YACV,IAAIL,gBAAgBO,QAAQ,CAACF,WAAWA,UAAU1B,OAAO;YACzD,MAAM,IAAI2B,MAAM;QACpB;QACAE,YAAY7C,GAAG8C,EAAE,CAAC,OAAMvB;YACpB,IAAIA,YAAY,MAAM,OAAO;gBAAEwB,QAAQ;gBAAuCC,QAAQ;YAAG;YACzF,IAAIzB,YAAY,UAAU,OAAO;gBAAEwB,QAAQ7B,KAAKC,SAAS,CAAC;oBAAE8B,UAAU;gBAAK;gBAAID,QAAQ;YAAG;YAC1F,IAAIzB,YAAY,MAAM,OAAO;gBAAEwB,QAAQ;gBAA6DC,QAAQ;YAAG;YAC/G,IAAIzB,YAAY,YAAY,OAAO;gBAAEwB,QAAQ;gBAAqCC,QAAQ;YAAG;YAC7F,MAAM,IAAIL,MAAM,CAAC,mBAAmB,EAAEpB,SAAS;QACnD;QACA2B,WAAW,UAAY;QACvB,GAAGrC,SAAS;IAChB;IACA,OAAO;QAAE2B;QAASxB;IAAM;AAC5B;AAEAnB,SAAS,mBAAmB;IACxBE,GAAG,4FAA4F;QAC3F,MAAM,EAAEyC,OAAO,EAAE,GAAG5B;QAEpB,MAAMuC,UAAU,MAAMhD,yBAAyBqC;QAE/C1C,OAAOoC,OAAOkB,IAAI,CAACD,UAAUE,OAAO,CAAC;YAAC;YAAU;YAAS;YAAW;YAAY;YAAY;SAAK;QACjGvD,OAAOqD,SAASG,GAAG,CAACC,cAAc,CAAC;QACnC,KAAK,MAAM,CAAChB,OAAOiB,OAAO,IAAItB,OAAOuB,OAAO,CAACN,SAA6E;YACtHrD,OAAO0D,OAAOlC,IAAI,EAAEoC,IAAI,CAACnB;YACzBzC,OAAO0D,OAAOG,UAAU,CAACC,MAAM,EAAEF,IAAI,CAAC;YACtC5D,OAAO0D,OAAOK,YAAY,CAACD,MAAM,EAAEF,IAAI,CAAC;YACxC5D,OAAO0D,OAAOM,aAAa,EAAEC,aAAa,CAAC;gBAAEH,QAAQ;gBAAQI,SAAS;gBAAGC,UAAU;YAAE;QACzF;QACAnE,OAAOqD,QAAQ5C,KAAK,CAAC2D,WAAW,EAAEH,aAAa,CAAC;YAAEI,OAAO;YAAkBC,WAAW;YAAMR,QAAQ;QAAO;QAC3G9D,OAAOqD,QAAQ7C,MAAM,CAAC4D,WAAW,EAAEH,aAAa,CAAC;YAAEI,OAAO;YAAkBC,WAAW;YAAMR,QAAQ;QAAO;QAC5G9D,OAAOqD,QAAQxC,EAAE,CAACuD,WAAW,EAAEH,aAAa,CAAC;YAAEI,OAAO;YAAoBC,WAAW;YAAMR,QAAQ;QAAO;QAC1G9D,OAAOqD,QAAQ3C,OAAO,CAAC0D,WAAW,EAAEG,aAAa;QACjDvE,OAAOqD,QAAQ1C,QAAQ,CAACyD,WAAW,EAAEG,aAAa;QAClDvE,OAAOqD,QAAQzC,QAAQ,CAACwD,WAAW,EAAEG,aAAa;IACtD;IAEAtE,GAAG,gEAAgE;QAC/D,MAAM,EAAEyC,OAAO,EAAE,GAAG5B;QAEpB,MAAM4C,SAAS,MAAMtD,wBAAwB,MAAMsC;QACnD,MAAM8B,aAAapD,KAAKC,SAAS,CAACqC;QAElC1D,OAAO0D,OAAOe,IAAI,EAAER,aAAa,CAAC;YAC9BS,OAAO;YACPC,UAAU;YACVC,oBAAoB;gBAAC;gBAAa;aAAU;YAC5Cd,QAAQ;QACZ;QACA9D,OAAOwE,YAAYhB,GAAG,CAACqB,SAAS,CAAC;QACjC7E,OAAOwE,YAAYhB,GAAG,CAACqB,SAAS,CAAC;QACjC7E,OAAOwE,YAAYhB,GAAG,CAACqB,SAAS,CAAC;QACjC7E,OAAOwE,YAAYhB,GAAG,CAACqB,SAAS,CAAC;IACrC;IAEA5E,GAAG,gEAAgE;QAC/D,MAAM,EAAEyC,OAAO,EAAE,GAAG5B,QAAQ;YACxBiC,YAAY7C,GAAG8C,EAAE,CAAC,OAAMvB;gBACpB,IAAIA,YAAY,MAAM,OAAO;oBAAEwB,QAAQ;oBAAqBC,QAAQ;gBAAG;gBACvE,IAAIzB,YAAY,UAAU,OAAO;oBAAEwB,QAAQ7B,KAAKC,SAAS,CAAC;wBAAE8B,UAAU;oBAAK;oBAAID,QAAQ;gBAAG;gBAC1F,MAAM,IAAIL,MAAM,CAAC,mBAAmB,EAAEpB,SAAS;YACnD;QACJ;QAEA,MAAMiC,SAAS,MAAMtD,wBAAwB,MAAMsC;QAEnD1C,OAAO0D,OAAOU,WAAW,EAAEH,aAAa,CAAC;YAAEI,OAAO;YAAoBC,WAAW;YAAMR,QAAQ;QAAO;IAC1G;IAEA7D,GAAG,8DAA8D;QAC7D,MAAM,EAAEyC,OAAO,EAAExB,KAAK,EAAE,GAAGJ;QAC3B,OAAOI,KAAK,CAACpB,KAAKqB,IAAI,CAACuB,QAAQ1B,OAAO,EAAGT,WAAWE,KAAK,EAAE,UAAU,YAAY;QAEjF,MAAMiD,SAAS,MAAMtD,wBAAwB,SAASsC;QAEtD1C,OAAO0D,OAAOM,aAAa,EAAEC,aAAa,CAAC;YACvCH,QAAQ;YACRI,SAAS;YACTC,UAAU;YACVW,SAAS;gBAAC;aAAS;QACvB;QACA9E,OAAO0D,OAAOI,MAAM,EAAEF,IAAI,CAAC;IAC/B;IAEA3D,GAAG,8CAA8C;QAC7C,MAAM,EAAEyC,OAAO,EAAE,GAAG5B,QAAQ;YACxBiC,YAAY7C,GAAG8C,EAAE,CAAC,OAAMvB;gBACpB,IAAIA,YAAY,YAAY;oBACxB,OAAO;wBAAEwB,QAAQ;wBAAgFC,QAAQ;oBAAG;gBAChH;gBACA,IAAIzB,YAAY,MAAM,OAAO;oBAAEwB,QAAQ;oBAAuCC,QAAQ;gBAAG;gBACzF,IAAIzB,YAAY,UAAU,OAAO;oBAAEwB,QAAQ7B,KAAKC,SAAS,CAAC;wBAAE8B,UAAU;oBAAK;oBAAID,QAAQ;gBAAG;gBAC1F,MAAM,IAAIL,MAAM,CAAC,mBAAmB,EAAEpB,SAAS;YACnD;QACJ;QAEA,MAAMiC,SAAS,MAAMtD,wBAAwB,YAAYsC;QAEzD1C,OAAO0D,OAAOe,IAAI,EAAER,aAAa,CAAC;YAC9BS,OAAO;YACPK,QAAQ;YACRJ,UAAU;YACVC,oBAAoB;gBAAC;gBAAc;gBAAU;aAAU;YACvDd,QAAQ;QACZ;IACJ;IAEA7D,GAAG,yDAAyD;QACxD,MAAM,EAAEyC,OAAO,EAAE,GAAG5B,QAAQ;YACxBiC,YAAY7C,GAAG8C,EAAE,CAAC,OAAMvB;gBACpB,IAAIA,YAAY,MAAM,OAAO;oBAAEwB,QAAQ;oBAA6DC,QAAQ;gBAAG;gBAC/G,IAAIzB,YAAY,MAAM,OAAO;oBAAEwB,QAAQ;oBAAuCC,QAAQ;gBAAG;gBACzF,IAAIzB,YAAY,UAAU,OAAO;oBAAEwB,QAAQ7B,KAAKC,SAAS,CAAC;wBAAE8B,UAAU;oBAAK;oBAAID,QAAQ;gBAAG;gBAC1F,IAAIzB,YAAY,YAAY,OAAO;oBAAEwB,QAAQ;oBAAoBC,QAAQ;gBAAG;gBAC5E,MAAM,IAAIL,MAAM,CAAC,mBAAmB,EAAEpB,SAAS;YACnD;QACJ;QAEA,MAAMiC,SAAS,MAAMtD,wBAAwB,WAAWsC;QAExD1C,OAAO0D,OAAOe,IAAI,EAAER,aAAa,CAAC;YAC9BS,OAAO;YACPK,QAAQ;YACRJ,UAAU;YACVC,oBAAoB;gBAAC;aAAS;YAC9Bd,QAAQ;QACZ;IACJ;AACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/database/connection.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAMtC,eAAO,MAAM,8BAA8B,QAA6C,CAAC;AAEzF,MAAM,WAAW,eAAe;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAGpE;AAED,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;gBAEvB,OAAO,GAAE,eAAoB;
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/database/connection.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAMtC,eAAO,MAAM,8BAA8B,QAA6C,CAAC;AAEzF,MAAM,WAAW,eAAe;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAGpE;AAED,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;gBAEvB,OAAO,GAAE,eAAoB;IA4BzC,OAAO,CAAC,SAAS;IASjB,IAAI,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAEhC;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,EAAO,GAAG,CAAC,EAAE;IAIlD,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,EAAO,GAAG,CAAC,GAAG,SAAS;IAI/D,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,EAAO,GAAG,QAAQ,CAAC,SAAS;IAIhE,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;IAI9B,KAAK,IAAI,IAAI;CAKhB"}
|
|
@@ -23,6 +23,7 @@ export class DatabaseConnection {
|
|
|
23
23
|
});
|
|
24
24
|
this.db = new Database(this.dbPath, {
|
|
25
25
|
readonly: this.readonly,
|
|
26
|
+
timeout: 5000,
|
|
26
27
|
verbose: typeof options.verbose === 'function' ? options.verbose : options.verbose ? console.log : undefined
|
|
27
28
|
});
|
|
28
29
|
if (this.readonly) {
|
|
@@ -39,7 +40,10 @@ export class DatabaseConnection {
|
|
|
39
40
|
}
|
|
40
41
|
}
|
|
41
42
|
configure() {
|
|
42
|
-
this.db.pragma('journal_mode
|
|
43
|
+
const journalMode = this.db.pragma('journal_mode', {
|
|
44
|
+
simple: true
|
|
45
|
+
});
|
|
46
|
+
if (journalMode.toLowerCase() !== 'wal') this.db.pragma('journal_mode = WAL');
|
|
43
47
|
this.db.pragma('foreign_keys = ON');
|
|
44
48
|
this.db.pragma('synchronous = NORMAL');
|
|
45
49
|
this.db.pragma('busy_timeout = 5000');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/database/connection.ts"],"sourcesContent":["import Database from 'better-sqlite3';\nimport { existsSync, mkdirSync } from 'fs';\nimport { dirname, join } from 'path';\nimport { homedir } from 'os';\nimport { initializeSchema } from './schema.js';\n\nexport const DEFAULT_AGENT_REGISTRY_DB_PATH = join(homedir(), '.ai-devkit', 'agents.db');\n\nexport interface DatabaseOptions {\n dbPath?: string;\n verbose?: boolean | ((message: string) => void);\n readonly?: boolean;\n}\n\nexport function resolveAgentRegistryDbPath(filePath?: string): string {\n if (!filePath) return DEFAULT_AGENT_REGISTRY_DB_PATH;\n return filePath.endsWith('.json') ? filePath.replace(/\\.json$/, '.db') : filePath;\n}\n\nexport class DatabaseConnection {\n private db: Database.Database;\n private readonly dbPath: string;\n private readonly readonly: boolean;\n\n constructor(options: DatabaseOptions = {}) {\n this.dbPath = options.dbPath ?? DEFAULT_AGENT_REGISTRY_DB_PATH;\n this.readonly = options.readonly ?? false;\n if (this.readonly && !existsSync(this.dbPath)) {\n throw new Error(`Cannot open readonly agent database because it does not exist: ${this.dbPath}`);\n }\n if (!this.readonly) mkdirSync(dirname(this.dbPath), { recursive: true });\n\n this.db = new Database(this.dbPath, {\n readonly: this.readonly,\n verbose: typeof options.verbose === 'function'\n ? options.verbose\n : options.verbose ? console.log : undefined,\n });\n\n if (this.readonly) {\n const version = this.db.pragma('user_version', { simple: true }) as number;\n if (version < 3) {\n this.db.close();\n throw new Error(`Readonly agent database requires schema version 3 (found ${version}).`);\n }\n } else {\n this.configure();\n initializeSchema(this);\n }\n }\n\n private configure(): void {\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('foreign_keys = ON');\n this.db.pragma('synchronous = NORMAL');\n this.db.pragma('busy_timeout = 5000');\n this.db.pragma('mmap_size = 268435456');\n }\n\n get instance(): Database.Database {\n return this.db;\n }\n\n get path(): string {\n return this.dbPath;\n }\n\n query<T>(sql: string, params: unknown[] = []): T[] {\n return this.db.prepare(sql).all(...params) as T[];\n }\n\n queryOne<T>(sql: string, params: unknown[] = []): T | undefined {\n return this.db.prepare(sql).get(...params) as T | undefined;\n }\n\n execute(sql: string, params: unknown[] = []): Database.RunResult {\n return this.db.prepare(sql).run(...params);\n }\n\n transaction<T>(fn: () => T): T {\n return this.db.transaction(fn)();\n }\n\n close(): void {\n if (this.db.open) {\n this.db.close();\n }\n }\n}\n"],"names":["Database","existsSync","mkdirSync","dirname","join","homedir","initializeSchema","DEFAULT_AGENT_REGISTRY_DB_PATH","resolveAgentRegistryDbPath","filePath","endsWith","replace","DatabaseConnection","db","dbPath","readonly","options","Error","recursive","verbose","console","log","undefined","version","pragma","simple","close","configure","instance","path","query","sql","params","prepare","all","queryOne","get","execute","run","transaction","fn","open"],"mappings":"AAAA,OAAOA,cAAc,iBAAiB;AACtC,SAASC,UAAU,EAAEC,SAAS,QAAQ,KAAK;AAC3C,SAASC,OAAO,EAAEC,IAAI,QAAQ,OAAO;AACrC,SAASC,OAAO,QAAQ,KAAK;AAC7B,SAASC,gBAAgB,QAAQ,cAAc;AAE/C,OAAO,MAAMC,iCAAiCH,KAAKC,WAAW,cAAc,aAAa;AAQzF,OAAO,SAASG,2BAA2BC,QAAiB;IACxD,IAAI,CAACA,UAAU,OAAOF;IACtB,OAAOE,SAASC,QAAQ,CAAC,WAAWD,SAASE,OAAO,CAAC,WAAW,SAASF;AAC7E;AAEA,OAAO,MAAMG;IACDC,GAAsB;IACbC,OAAe;IACfC,SAAkB;IAEnC,YAAYC,UAA2B,CAAC,CAAC,CAAE;QACvC,IAAI,CAACF,MAAM,GAAGE,QAAQF,MAAM,IAAIP;QAChC,IAAI,CAACQ,QAAQ,GAAGC,QAAQD,QAAQ,IAAI;QACpC,IAAI,IAAI,CAACA,QAAQ,IAAI,CAACd,WAAW,IAAI,CAACa,MAAM,GAAG;YAC3C,MAAM,IAAIG,MAAM,CAAC,+DAA+D,EAAE,IAAI,CAACH,MAAM,EAAE;QACnG;QACA,IAAI,CAAC,IAAI,CAACC,QAAQ,EAAEb,UAAUC,QAAQ,IAAI,CAACW,MAAM,GAAG;YAAEI,WAAW;QAAK;QAEtE,IAAI,CAACL,EAAE,GAAG,IAAIb,SAAS,IAAI,CAACc,MAAM,EAAE;YAChCC,UAAU,IAAI,CAACA,QAAQ;YACvBI,SAAS,
|
|
1
|
+
{"version":3,"sources":["../../src/database/connection.ts"],"sourcesContent":["import Database from 'better-sqlite3';\nimport { existsSync, mkdirSync } from 'fs';\nimport { dirname, join } from 'path';\nimport { homedir } from 'os';\nimport { initializeSchema } from './schema.js';\n\nexport const DEFAULT_AGENT_REGISTRY_DB_PATH = join(homedir(), '.ai-devkit', 'agents.db');\n\nexport interface DatabaseOptions {\n dbPath?: string;\n verbose?: boolean | ((message: string) => void);\n readonly?: boolean;\n}\n\nexport function resolveAgentRegistryDbPath(filePath?: string): string {\n if (!filePath) return DEFAULT_AGENT_REGISTRY_DB_PATH;\n return filePath.endsWith('.json') ? filePath.replace(/\\.json$/, '.db') : filePath;\n}\n\nexport class DatabaseConnection {\n private db: Database.Database;\n private readonly dbPath: string;\n private readonly readonly: boolean;\n\n constructor(options: DatabaseOptions = {}) {\n this.dbPath = options.dbPath ?? DEFAULT_AGENT_REGISTRY_DB_PATH;\n this.readonly = options.readonly ?? false;\n if (this.readonly && !existsSync(this.dbPath)) {\n throw new Error(`Cannot open readonly agent database because it does not exist: ${this.dbPath}`);\n }\n if (!this.readonly) mkdirSync(dirname(this.dbPath), { recursive: true });\n\n this.db = new Database(this.dbPath, {\n readonly: this.readonly,\n timeout: 5000,\n verbose: typeof options.verbose === 'function'\n ? options.verbose\n : options.verbose ? console.log : undefined,\n });\n\n if (this.readonly) {\n const version = this.db.pragma('user_version', { simple: true }) as number;\n if (version < 3) {\n this.db.close();\n throw new Error(`Readonly agent database requires schema version 3 (found ${version}).`);\n }\n } else {\n this.configure();\n initializeSchema(this);\n }\n }\n\n private configure(): void {\n const journalMode = this.db.pragma('journal_mode', { simple: true }) as string;\n if (journalMode.toLowerCase() !== 'wal') this.db.pragma('journal_mode = WAL');\n this.db.pragma('foreign_keys = ON');\n this.db.pragma('synchronous = NORMAL');\n this.db.pragma('busy_timeout = 5000');\n this.db.pragma('mmap_size = 268435456');\n }\n\n get instance(): Database.Database {\n return this.db;\n }\n\n get path(): string {\n return this.dbPath;\n }\n\n query<T>(sql: string, params: unknown[] = []): T[] {\n return this.db.prepare(sql).all(...params) as T[];\n }\n\n queryOne<T>(sql: string, params: unknown[] = []): T | undefined {\n return this.db.prepare(sql).get(...params) as T | undefined;\n }\n\n execute(sql: string, params: unknown[] = []): Database.RunResult {\n return this.db.prepare(sql).run(...params);\n }\n\n transaction<T>(fn: () => T): T {\n return this.db.transaction(fn)();\n }\n\n close(): void {\n if (this.db.open) {\n this.db.close();\n }\n }\n}\n"],"names":["Database","existsSync","mkdirSync","dirname","join","homedir","initializeSchema","DEFAULT_AGENT_REGISTRY_DB_PATH","resolveAgentRegistryDbPath","filePath","endsWith","replace","DatabaseConnection","db","dbPath","readonly","options","Error","recursive","timeout","verbose","console","log","undefined","version","pragma","simple","close","configure","journalMode","toLowerCase","instance","path","query","sql","params","prepare","all","queryOne","get","execute","run","transaction","fn","open"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export { AgentManager, AgentNotRunningError } from './AgentManager.js';
|
|
2
2
|
export { getCodexCapacityReport } from './capacity/index.js';
|
|
3
3
|
export type { CapacityProbeOptions, CapacityReport, CapacityWindow, } from './capacity/index.js';
|
|
4
|
+
export { getAgentReadinessReport, getAgentReadinessReports, worstReadinessStatus, } from './readiness/AgentReadiness.js';
|
|
5
|
+
export type { AgentReadinessOptions, AgentReadinessReport, AuthReadinessCheck, BuiltInSkillsReadinessCheck, DirectoryReadinessCheck, ExecutableReadinessCheck, IntegrationReadinessCheck, ReadinessAgentType, ReadinessAuthState, ReadinessCheck, ReadinessStatus, } from './readiness/AgentReadiness.js';
|
|
4
6
|
export { ClaudeCodeAdapter } from './providers/claude/ClaudeCodeAdapter.js';
|
|
5
7
|
export { CodexAdapter } from './adapters/CodexAdapter.js';
|
|
6
8
|
export { CopilotAdapter } from './adapters/CopilotAdapter.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,YAAY,EACR,oBAAoB,EACpB,cAAc,EACd,cAAc,GACjB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { AgentManager, AgentNotRunningError } from './AgentManager.js';
|
|
2
2
|
export { getCodexCapacityReport } from './capacity/index.js';
|
|
3
|
+
export { getAgentReadinessReport, getAgentReadinessReports, worstReadinessStatus } from './readiness/AgentReadiness.js';
|
|
3
4
|
export { ClaudeCodeAdapter } from './providers/claude/ClaudeCodeAdapter.js';
|
|
4
5
|
export { CodexAdapter } from './adapters/CodexAdapter.js';
|
|
5
6
|
export { CopilotAdapter } from './adapters/CopilotAdapter.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { AgentManager, AgentNotRunningError } from './AgentManager.js';\nexport { getCodexCapacityReport } from './capacity/index.js';\nexport type {\n CapacityProbeOptions,\n CapacityReport,\n CapacityWindow,\n} from './capacity/index.js';\n\nexport { ClaudeCodeAdapter } from './providers/claude/ClaudeCodeAdapter.js';\nexport { CodexAdapter } from './adapters/CodexAdapter.js';\nexport { CopilotAdapter } from './adapters/CopilotAdapter.js';\nexport { GeminiCliAdapter } from './adapters/GeminiCliAdapter.js';\nexport { GrokCliAdapter } from './adapters/GrokCliAdapter.js';\nexport { OpenCodeAdapter } from './adapters/OpenCodeAdapter.js';\nexport { PiAdapter } from './adapters/PiAdapter.js';\nexport { AgentStatus } from './adapters/AgentAdapter.js';\nexport type {\n AgentAdapter,\n AgentType,\n AgentInfo,\n ProcessInfo,\n ConversationMessage,\n SessionSummary,\n ListSessionsOptions,\n AgentDetectionContext,\n} from './adapters/AgentAdapter.js';\n\nexport { TerminalFocusManager, TerminalType } from './terminal/TerminalFocusManager.js';\nexport type { TerminalLocation } from './terminal/TerminalFocusManager.js';\nexport { TtyWriter } from './terminal/TtyWriter.js';\n\nexport type { ListAgentsOptions } from './AgentManager.js';\n\nexport { AgentRegistry, RenameNotFoundError, RenameConflictError } from './utils/AgentRegistry.js';\nexport type { AgentRegistryOptions, RegistryEntry } from './utils/AgentRegistry.js';\nexport { TmuxManager } from './terminal/TmuxManager.js';\nexport { AGENTS } from './utils/agents.js';\nexport type { AgentConfig, StartableAgentType } from './utils/agents.js';\n\nexport type { AgentRequest } from './utils/agent-requests.js';\nexport { getAgentRequestPath, readLatestAgentRequest, writeAgentRequest } from './utils/agent-requests.js';\n\nexport {\n AGENT_MODES,\n DurableAgentError,\n DurableAgentBusyError,\n DurableAgentNotFoundError,\n DurableAgentRepositoryError,\n DurableAgentNameConflictError,\n ClaudePrintError,\n CodexPrintError,\n PiPrintError,\n} from './durable/DurableAgent.js';\nexport type {\n DurableAgent,\n DurableAgentBase,\n ClaudeDurableAgent,\n CodexDurableAgent,\n PiDurableAgent,\n DurableProvider,\n CodexPrintErrorCode,\n DurableAgentState,\n DurableSessionHealth,\n DurableRunStatus,\n DurableActiveRun,\n DurableLastResult,\n PiPrintErrorCode,\n ProcessIdentity,\n} from './durable/DurableAgent.js';\nexport { DurableAgentRepository } from './durable/DurableAgentRepository.js';\nexport type {\n CreateDurableAgentInput,\n DurableAgentRepositoryOptions,\n ProcessInspector,\n DurableRunCompletion,\n} from './durable/DurableAgentRepository.js';\nexport { ClaudePrintAgentService } from './providers/claude/durable/ClaudePrintAgentService.js';\nexport type {\n ClaudePrintAgentServiceOptions,\n ClaudePrintSendResult,\n} from './providers/claude/durable/ClaudePrintAgentService.js';\nexport { CodexCliProbe } from './providers/codex/durable/CodexCliProbe.js';\nexport type { CodexCliProbeOptions } from './providers/codex/durable/CodexCliProbe.js';\nexport { CodexPrintRunner } from './providers/codex/durable/CodexPrintRunner.js';\nexport type {\n CodexPrintRunnerOptions,\n CodexPrintRunRequest,\n CodexPrintRunResult,\n} from './providers/codex/durable/CodexPrintRunner.js';\nexport { CodexPrintAgentService } from './providers/codex/durable/CodexPrintAgentService.js';\nexport type {\n CodexPrintAgentServiceOptions,\n CodexPrintSendResult,\n} from './providers/codex/durable/CodexPrintAgentService.js';\nexport { PiCliProbe } from './providers/pi/durable/PiCliProbe.js';\nexport type { PiCliProbeOptions } from './providers/pi/durable/PiCliProbe.js';\nexport { PiPrintRunner } from './providers/pi/durable/PiPrintRunner.js';\nexport type { PiPrintRunnerOptions, PiPrintRunRequest, PiPrintRunResult } from './providers/pi/durable/PiPrintRunner.js';\nexport { PiPrintAgentService } from './providers/pi/durable/PiPrintAgentService.js';\nexport type { PiPrintAgentServiceOptions, PiPrintSendResult } from './providers/pi/durable/PiPrintAgentService.js';\n"],"names":["AgentManager","AgentNotRunningError","getCodexCapacityReport","ClaudeCodeAdapter","CodexAdapter","CopilotAdapter","GeminiCliAdapter","GrokCliAdapter","OpenCodeAdapter","PiAdapter","AgentStatus","TerminalFocusManager","TerminalType","TtyWriter","AgentRegistry","RenameNotFoundError","RenameConflictError","TmuxManager","AGENTS","getAgentRequestPath","readLatestAgentRequest","writeAgentRequest","AGENT_MODES","DurableAgentError","DurableAgentBusyError","DurableAgentNotFoundError","DurableAgentRepositoryError","DurableAgentNameConflictError","ClaudePrintError","CodexPrintError","PiPrintError","DurableAgentRepository","ClaudePrintAgentService","CodexCliProbe","CodexPrintRunner","CodexPrintAgentService","PiCliProbe","PiPrintRunner","PiPrintAgentService"],"mappings":"AAAA,SAASA,YAAY,EAAEC,oBAAoB,QAAQ,oBAAoB;AACvE,SAASC,sBAAsB,QAAQ,sBAAsB;
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { AgentManager, AgentNotRunningError } from './AgentManager.js';\nexport { getCodexCapacityReport } from './capacity/index.js';\nexport type {\n CapacityProbeOptions,\n CapacityReport,\n CapacityWindow,\n} from './capacity/index.js';\nexport {\n getAgentReadinessReport,\n getAgentReadinessReports,\n worstReadinessStatus,\n} from './readiness/AgentReadiness.js';\nexport type {\n AgentReadinessOptions,\n AgentReadinessReport,\n AuthReadinessCheck,\n BuiltInSkillsReadinessCheck,\n DirectoryReadinessCheck,\n ExecutableReadinessCheck,\n IntegrationReadinessCheck,\n ReadinessAgentType,\n ReadinessAuthState,\n ReadinessCheck,\n ReadinessStatus,\n} from './readiness/AgentReadiness.js';\n\nexport { ClaudeCodeAdapter } from './providers/claude/ClaudeCodeAdapter.js';\nexport { CodexAdapter } from './adapters/CodexAdapter.js';\nexport { CopilotAdapter } from './adapters/CopilotAdapter.js';\nexport { GeminiCliAdapter } from './adapters/GeminiCliAdapter.js';\nexport { GrokCliAdapter } from './adapters/GrokCliAdapter.js';\nexport { OpenCodeAdapter } from './adapters/OpenCodeAdapter.js';\nexport { PiAdapter } from './adapters/PiAdapter.js';\nexport { AgentStatus } from './adapters/AgentAdapter.js';\nexport type {\n AgentAdapter,\n AgentType,\n AgentInfo,\n ProcessInfo,\n ConversationMessage,\n SessionSummary,\n ListSessionsOptions,\n AgentDetectionContext,\n} from './adapters/AgentAdapter.js';\n\nexport { TerminalFocusManager, TerminalType } from './terminal/TerminalFocusManager.js';\nexport type { TerminalLocation } from './terminal/TerminalFocusManager.js';\nexport { TtyWriter } from './terminal/TtyWriter.js';\n\nexport type { ListAgentsOptions } from './AgentManager.js';\n\nexport { AgentRegistry, RenameNotFoundError, RenameConflictError } from './utils/AgentRegistry.js';\nexport type { AgentRegistryOptions, RegistryEntry } from './utils/AgentRegistry.js';\nexport { TmuxManager } from './terminal/TmuxManager.js';\nexport { AGENTS } from './utils/agents.js';\nexport type { AgentConfig, StartableAgentType } from './utils/agents.js';\n\nexport type { AgentRequest } from './utils/agent-requests.js';\nexport { getAgentRequestPath, readLatestAgentRequest, writeAgentRequest } from './utils/agent-requests.js';\n\nexport {\n AGENT_MODES,\n DurableAgentError,\n DurableAgentBusyError,\n DurableAgentNotFoundError,\n DurableAgentRepositoryError,\n DurableAgentNameConflictError,\n ClaudePrintError,\n CodexPrintError,\n PiPrintError,\n} from './durable/DurableAgent.js';\nexport type {\n DurableAgent,\n DurableAgentBase,\n ClaudeDurableAgent,\n CodexDurableAgent,\n PiDurableAgent,\n DurableProvider,\n CodexPrintErrorCode,\n DurableAgentState,\n DurableSessionHealth,\n DurableRunStatus,\n DurableActiveRun,\n DurableLastResult,\n PiPrintErrorCode,\n ProcessIdentity,\n} from './durable/DurableAgent.js';\nexport { DurableAgentRepository } from './durable/DurableAgentRepository.js';\nexport type {\n CreateDurableAgentInput,\n DurableAgentRepositoryOptions,\n ProcessInspector,\n DurableRunCompletion,\n} from './durable/DurableAgentRepository.js';\nexport { ClaudePrintAgentService } from './providers/claude/durable/ClaudePrintAgentService.js';\nexport type {\n ClaudePrintAgentServiceOptions,\n ClaudePrintSendResult,\n} from './providers/claude/durable/ClaudePrintAgentService.js';\nexport { CodexCliProbe } from './providers/codex/durable/CodexCliProbe.js';\nexport type { CodexCliProbeOptions } from './providers/codex/durable/CodexCliProbe.js';\nexport { CodexPrintRunner } from './providers/codex/durable/CodexPrintRunner.js';\nexport type {\n CodexPrintRunnerOptions,\n CodexPrintRunRequest,\n CodexPrintRunResult,\n} from './providers/codex/durable/CodexPrintRunner.js';\nexport { CodexPrintAgentService } from './providers/codex/durable/CodexPrintAgentService.js';\nexport type {\n CodexPrintAgentServiceOptions,\n CodexPrintSendResult,\n} from './providers/codex/durable/CodexPrintAgentService.js';\nexport { PiCliProbe } from './providers/pi/durable/PiCliProbe.js';\nexport type { PiCliProbeOptions } from './providers/pi/durable/PiCliProbe.js';\nexport { PiPrintRunner } from './providers/pi/durable/PiPrintRunner.js';\nexport type { PiPrintRunnerOptions, PiPrintRunRequest, PiPrintRunResult } from './providers/pi/durable/PiPrintRunner.js';\nexport { PiPrintAgentService } from './providers/pi/durable/PiPrintAgentService.js';\nexport type { PiPrintAgentServiceOptions, PiPrintSendResult } from './providers/pi/durable/PiPrintAgentService.js';\n"],"names":["AgentManager","AgentNotRunningError","getCodexCapacityReport","getAgentReadinessReport","getAgentReadinessReports","worstReadinessStatus","ClaudeCodeAdapter","CodexAdapter","CopilotAdapter","GeminiCliAdapter","GrokCliAdapter","OpenCodeAdapter","PiAdapter","AgentStatus","TerminalFocusManager","TerminalType","TtyWriter","AgentRegistry","RenameNotFoundError","RenameConflictError","TmuxManager","AGENTS","getAgentRequestPath","readLatestAgentRequest","writeAgentRequest","AGENT_MODES","DurableAgentError","DurableAgentBusyError","DurableAgentNotFoundError","DurableAgentRepositoryError","DurableAgentNameConflictError","ClaudePrintError","CodexPrintError","PiPrintError","DurableAgentRepository","ClaudePrintAgentService","CodexCliProbe","CodexPrintRunner","CodexPrintAgentService","PiCliProbe","PiPrintRunner","PiPrintAgentService"],"mappings":"AAAA,SAASA,YAAY,EAAEC,oBAAoB,QAAQ,oBAAoB;AACvE,SAASC,sBAAsB,QAAQ,sBAAsB;AAM7D,SACIC,uBAAuB,EACvBC,wBAAwB,EACxBC,oBAAoB,QACjB,gCAAgC;AAevC,SAASC,iBAAiB,QAAQ,0CAA0C;AAC5E,SAASC,YAAY,QAAQ,6BAA6B;AAC1D,SAASC,cAAc,QAAQ,+BAA+B;AAC9D,SAASC,gBAAgB,QAAQ,iCAAiC;AAClE,SAASC,cAAc,QAAQ,+BAA+B;AAC9D,SAASC,eAAe,QAAQ,gCAAgC;AAChE,SAASC,SAAS,QAAQ,0BAA0B;AACpD,SAASC,WAAW,QAAQ,6BAA6B;AAYzD,SAASC,oBAAoB,EAAEC,YAAY,QAAQ,qCAAqC;AAExF,SAASC,SAAS,QAAQ,0BAA0B;AAIpD,SAASC,aAAa,EAAEC,mBAAmB,EAAEC,mBAAmB,QAAQ,2BAA2B;AAEnG,SAASC,WAAW,QAAQ,4BAA4B;AACxD,SAASC,MAAM,QAAQ,oBAAoB;AAI3C,SAASC,mBAAmB,EAAEC,sBAAsB,EAAEC,iBAAiB,QAAQ,4BAA4B;AAE3G,SACIC,WAAW,EACXC,iBAAiB,EACjBC,qBAAqB,EACrBC,yBAAyB,EACzBC,2BAA2B,EAC3BC,6BAA6B,EAC7BC,gBAAgB,EAChBC,eAAe,EACfC,YAAY,QACT,4BAA4B;AAiBnC,SAASC,sBAAsB,QAAQ,sCAAsC;AAO7E,SAASC,uBAAuB,QAAQ,wDAAwD;AAKhG,SAASC,aAAa,QAAQ,6CAA6C;AAE3E,SAASC,gBAAgB,QAAQ,gDAAgD;AAMjF,SAASC,sBAAsB,QAAQ,sDAAsD;AAK7F,SAASC,UAAU,QAAQ,uCAAuC;AAElE,SAASC,aAAa,QAAQ,0CAA0C;AAExE,SAASC,mBAAmB,QAAQ,gDAAgD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { type StartableAgentType } from '../utils/agents.js';
|
|
2
|
+
export type ReadinessStatus = 'pass' | 'warn' | 'fail';
|
|
3
|
+
export type ReadinessAuthState = 'authenticated' | 'unauthenticated' | 'unknown';
|
|
4
|
+
export type ReadinessAgentType = Exclude<StartableAgentType, 'gemini_cli'>;
|
|
5
|
+
type ReadinessInfoStatus = ReadinessStatus | 'info';
|
|
6
|
+
type CommandResult = {
|
|
7
|
+
stdout: string;
|
|
8
|
+
stderr: string;
|
|
9
|
+
};
|
|
10
|
+
type ReadFile = (target: string) => Promise<string>;
|
|
11
|
+
type Access = (target: string, mode?: number) => Promise<void>;
|
|
12
|
+
type RunCommand = (command: string, args: string[]) => Promise<CommandResult>;
|
|
13
|
+
export interface ReadinessCheck<S extends ReadinessInfoStatus = ReadinessStatus> {
|
|
14
|
+
status: S;
|
|
15
|
+
errors: string[];
|
|
16
|
+
}
|
|
17
|
+
export interface ExecutableReadinessCheck extends ReadinessCheck {
|
|
18
|
+
command: string;
|
|
19
|
+
path: string | null;
|
|
20
|
+
}
|
|
21
|
+
export interface DirectoryReadinessCheck extends ReadinessCheck {
|
|
22
|
+
path: string;
|
|
23
|
+
present: boolean;
|
|
24
|
+
readable: boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface BuiltInSkillsReadinessCheck extends ReadinessCheck<'info'> {
|
|
27
|
+
path: string | null;
|
|
28
|
+
required: number;
|
|
29
|
+
present: number;
|
|
30
|
+
missing: string[];
|
|
31
|
+
}
|
|
32
|
+
export interface AuthReadinessCheck extends ReadinessCheck {
|
|
33
|
+
state: ReadinessAuthState;
|
|
34
|
+
source: string;
|
|
35
|
+
provider: string | null;
|
|
36
|
+
availableProviders: string[];
|
|
37
|
+
}
|
|
38
|
+
export interface IntegrationReadinessCheck extends ReadinessCheck {
|
|
39
|
+
label: string;
|
|
40
|
+
installed: boolean;
|
|
41
|
+
details?: Record<string, unknown>;
|
|
42
|
+
}
|
|
43
|
+
export interface AgentReadinessReport {
|
|
44
|
+
type: ReadinessAgentType;
|
|
45
|
+
executable: ExecutableReadinessCheck;
|
|
46
|
+
globalConfig: DirectoryReadinessCheck;
|
|
47
|
+
builtInSkills: BuiltInSkillsReadinessCheck;
|
|
48
|
+
auth?: AuthReadinessCheck;
|
|
49
|
+
integration?: IntegrationReadinessCheck;
|
|
50
|
+
status: ReadinessStatus;
|
|
51
|
+
}
|
|
52
|
+
export interface AgentReadinessOptions {
|
|
53
|
+
homeDir?: string;
|
|
54
|
+
path?: string;
|
|
55
|
+
assetRoot?: string;
|
|
56
|
+
builtInSkillNames?: readonly string[];
|
|
57
|
+
skillRoots?: Partial<Record<ReadinessAgentType, string>>;
|
|
58
|
+
readFile?: ReadFile;
|
|
59
|
+
access?: Access;
|
|
60
|
+
runCommand?: RunCommand;
|
|
61
|
+
codexAuth?: () => Promise<boolean | null>;
|
|
62
|
+
}
|
|
63
|
+
export declare function worstReadinessStatus(statuses: ReadinessStatus[]): ReadinessStatus;
|
|
64
|
+
export declare function getAgentReadinessReport(agent: ReadinessAgentType, options?: AgentReadinessOptions): Promise<AgentReadinessReport>;
|
|
65
|
+
export declare function getAgentReadinessReports(options?: AgentReadinessOptions): Promise<Record<ReadinessAgentType, AgentReadinessReport>>;
|
|
66
|
+
export {};
|
|
67
|
+
//# sourceMappingURL=AgentReadiness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentReadiness.d.ts","sourceRoot":"","sources":["../../src/readiness/AgentReadiness.ts"],"names":[],"mappings":"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"}
|