mapples 0.2.0-beta.1 → 0.2.0-beta.12
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 +133 -22
- package/dist/adopt/scan.d.ts +8 -2
- package/dist/adopt/scan.js +31 -13
- package/dist/adopt/scan.js.map +1 -1
- package/dist/api/agent.d.ts +85 -0
- package/dist/api/agent.js +92 -0
- package/dist/api/agent.js.map +1 -0
- package/dist/api/client.d.ts +12 -1
- package/dist/api/client.js +23 -2
- package/dist/api/client.js.map +1 -1
- package/dist/api/commit.d.ts +9 -0
- package/dist/api/commit.js +51 -2
- package/dist/api/commit.js.map +1 -1
- package/dist/api/errors.d.ts +1 -1
- package/dist/api/errors.js +15 -2
- package/dist/api/errors.js.map +1 -1
- package/dist/api/objects.d.ts +39 -6
- package/dist/api/objects.js +204 -11
- package/dist/api/objects.js.map +1 -1
- package/dist/api/poll.d.ts +5 -3
- package/dist/api/poll.js +17 -6
- package/dist/api/poll.js.map +1 -1
- package/dist/api/txPlan.d.ts +15 -0
- package/dist/api/txPlan.js +196 -0
- package/dist/api/txPlan.js.map +1 -0
- package/dist/assets/assets.d.ts +21 -0
- package/dist/assets/assets.js +62 -4
- package/dist/assets/assets.js.map +1 -1
- package/dist/codegen/emit.d.ts +4 -7
- package/dist/codegen/emit.js +10 -29
- package/dist/codegen/emit.js.map +1 -1
- package/dist/codegen/imports.d.ts +8 -15
- package/dist/codegen/imports.js +27 -72
- package/dist/codegen/imports.js.map +1 -1
- package/dist/codegen/instances.d.ts +5 -0
- package/dist/codegen/instances.js +30 -0
- package/dist/codegen/instances.js.map +1 -0
- package/dist/codegen/styles.d.ts +1 -0
- package/dist/codegen/styles.js +3 -0
- package/dist/codegen/styles.js.map +1 -0
- package/dist/commands/agent.d.ts +2 -0
- package/dist/commands/agent.js +87 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/create.js +1 -0
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/impl/adoptImpl.js +3 -0
- package/dist/commands/impl/adoptImpl.js.map +1 -1
- package/dist/commands/impl/agentImpl.d.ts +23 -0
- package/dist/commands/impl/agentImpl.js +426 -0
- package/dist/commands/impl/agentImpl.js.map +1 -0
- package/dist/commands/impl/createImpl.js +31 -4
- package/dist/commands/impl/createImpl.js.map +1 -1
- package/dist/commands/impl/initImpl.js +35 -5
- package/dist/commands/impl/initImpl.js.map +1 -1
- package/dist/commands/impl/syncImpl.js +30 -5
- package/dist/commands/impl/syncImpl.js.map +1 -1
- package/dist/commands/init.js +1 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/merge/applyOps.d.ts +5 -2
- package/dist/merge/applyOps.js +75 -32
- package/dist/merge/applyOps.js.map +1 -1
- package/dist/merge/childrenOrder.d.ts +13 -0
- package/dist/merge/childrenOrder.js +51 -0
- package/dist/merge/childrenOrder.js.map +1 -0
- package/dist/merge/diff.d.ts +20 -1
- package/dist/merge/diff.js +77 -17
- package/dist/merge/diff.js.map +1 -1
- package/dist/merge/threeWay.d.ts +2 -2
- package/dist/merge/threeWay.js +74 -10
- package/dist/merge/threeWay.js.map +1 -1
- package/dist/merge/toEdits.d.ts +1 -3
- package/dist/merge/toEdits.js +3 -91
- package/dist/merge/toEdits.js.map +1 -1
- package/dist/nav/navigatorTree.d.ts +78 -0
- package/dist/nav/navigatorTree.js +419 -0
- package/dist/nav/navigatorTree.js.map +1 -0
- package/dist/nav/placement.d.ts +53 -0
- package/dist/nav/placement.js +260 -0
- package/dist/nav/placement.js.map +1 -0
- package/dist/nav/routeTree.d.ts +8 -2
- package/dist/nav/routeTree.js +85 -152
- package/dist/nav/routeTree.js.map +1 -1
- package/dist/nav/screenOptions.d.ts +15 -0
- package/dist/nav/screenOptions.js +213 -0
- package/dist/nav/screenOptions.js.map +1 -0
- package/dist/project/agentState.d.ts +30 -0
- package/dist/project/agentState.js +42 -0
- package/dist/project/agentState.js.map +1 -0
- package/dist/project/baseStore.d.ts +19 -1
- package/dist/project/baseStore.js +28 -0
- package/dist/project/baseStore.js.map +1 -1
- package/dist/project/componentsMap.d.ts +7 -0
- package/dist/project/componentsMap.js +21 -0
- package/dist/project/componentsMap.js.map +1 -0
- package/dist/project/config.d.ts +12 -3
- package/dist/project/config.js +11 -2
- package/dist/project/config.js.map +1 -1
- package/dist/project/env.d.ts +10 -3
- package/dist/project/env.js +23 -5
- package/dist/project/env.js.map +1 -1
- package/dist/project/pagesMap.d.ts +2 -0
- package/dist/project/pagesMap.js.map +1 -1
- package/dist/project/secret.d.ts +6 -2
- package/dist/project/secret.js +11 -5
- package/dist/project/secret.js.map +1 -1
- package/dist/services/adoptService.d.ts +3 -0
- package/dist/services/adoptService.js +357 -38
- package/dist/services/adoptService.js.map +1 -1
- package/dist/services/agentInstall.d.ts +80 -0
- package/dist/services/agentInstall.js +309 -0
- package/dist/services/agentInstall.js.map +1 -0
- package/dist/services/agentLease.d.ts +2 -0
- package/dist/services/agentLease.js +32 -0
- package/dist/services/agentLease.js.map +1 -0
- package/dist/services/clientFactory.d.ts +2 -0
- package/dist/services/clientFactory.js +20 -3
- package/dist/services/clientFactory.js.map +1 -1
- package/dist/services/doctorService.js +77 -66
- package/dist/services/doctorService.js.map +1 -1
- package/dist/services/scaffold.d.ts +3 -0
- package/dist/services/scaffold.js +16 -0
- package/dist/services/scaffold.js.map +1 -1
- package/dist/services/syncEngine.d.ts +7 -0
- package/dist/services/syncEngine.js +766 -306
- package/dist/services/syncEngine.js.map +1 -1
- package/dist/style/theme.js +17 -1
- package/dist/style/theme.js.map +1 -1
- package/dist/types.d.ts +55 -2
- package/dist/types.js +25 -0
- package/dist/types.js.map +1 -1
- package/dist/ui/report.d.ts +15 -0
- package/dist/ui/report.js +30 -0
- package/dist/ui/report.js.map +1 -1
- package/package.json +4 -2
- package/templates/agent/agents-md/AGENTS.md +8 -0
- package/templates/agent/claude/CLAUDE.md +7 -0
- package/templates/agent/claude/mcp.json +11 -0
- package/templates/agent/claude/settings.json +26 -0
- package/templates/agent/codex/config.toml +6 -0
- package/templates/agent/codex/hooks.json +26 -0
- package/templates/agent/cursor/hooks.json +9 -0
- package/templates/agent/cursor/mcp.json +10 -0
- package/templates/agent/mapples.md +124 -0
- package/templates/agent/skills/mapples-conventions/SKILL.md +137 -0
- package/templates/agent/skills/mapples-design/SKILL.md +235 -0
- package/templates/agent/skills/mapples-design/reference/component-library.md +128 -0
- package/templates/agent/skills/mapples-design/reference/design-tokens.md +132 -0
- package/templates/agent/skills/mapples-design/reference/layout-contract.md +227 -0
- package/templates/agent/skills/mapples-design/reference/lint-checklist.md +51 -0
- package/templates/agent/skills/mapples-design/reference/plan.md +95 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/empty-states.md +14 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/forms-and-auth.md +22 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/home-dashboard.md +14 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/list-and-detail.md +18 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/microcopy.md +20 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/navigation-chrome.md +21 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/onboarding-flow.md +15 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/screen-flow-wiring.md +37 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/settings-profile.md +16 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/stats-and-progress.md +17 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/visual-hierarchy.md +18 -0
- package/templates/agent/skills/mapples-design/reference/style-guides.md +92 -0
- package/templates/agent/skills/mapples-sync/SKILL.md +93 -0
- package/templates/app/_layout.tsx +9 -1
- package/templates/app.json +0 -1
- package/templates/gitignore +2 -0
- package/templates/mapples/sid.d.ts +6 -0
- package/templates/metro.config.js +11 -0
- package/templates/package.json +13 -10
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { hoistStyles, STYLE_MODULE, type HoistedStyles } from '@mapples/codegen';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/codegen/styles.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,OAAO,EAAE,WAAW,EAAE,YAAY,EAAsB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { Option } from 'commander';
|
|
2
|
+
const denv = () => new Option('--denv <env>').hideHelp(); // internal: dev|staging|prod
|
|
3
|
+
export function registerAgent(program) {
|
|
4
|
+
const agent = program
|
|
5
|
+
.command('agent')
|
|
6
|
+
.description('Agent-session lease: tell Creator an AI agent is working on this project');
|
|
7
|
+
agent
|
|
8
|
+
.command('install')
|
|
9
|
+
.description('Write the agent skills bundle (skills, conventions, instructions pointer, MCP entry) into a linked app')
|
|
10
|
+
.option('--agent <name>', 'agent to set up: claude | cursor | codex (chatgpt)', 'claude')
|
|
11
|
+
.option('--force', 'regenerate files you edited (your version is kept as _depr_…old)')
|
|
12
|
+
.addOption(denv())
|
|
13
|
+
.option('--json', 'machine-readable output')
|
|
14
|
+
.action(async (opts) => {
|
|
15
|
+
const { runAgentInstall } = await import('./impl/agentImpl.js');
|
|
16
|
+
await runAgentInstall(opts);
|
|
17
|
+
});
|
|
18
|
+
agent
|
|
19
|
+
.command('start')
|
|
20
|
+
.description('Take the project lease (exit 4 when another agent session is live)')
|
|
21
|
+
.option('--agent <agent>', 'claude-code | cursor | codex — Creator names the session after it')
|
|
22
|
+
.option('--label <label>', 'session label shown in Creator (default: the agent name)')
|
|
23
|
+
.option('--steps <titles>', 'comma-separated step titles to pre-declare')
|
|
24
|
+
.option('--takeover', 'disconnect a live session and take the lease')
|
|
25
|
+
.option('--no-daemon', 'do not spawn the heartbeat daemon')
|
|
26
|
+
.addOption(denv())
|
|
27
|
+
.option('--json', 'machine-readable output')
|
|
28
|
+
.action(async (opts) => {
|
|
29
|
+
const { runAgentStart } = await import('./impl/agentImpl.js');
|
|
30
|
+
await runAgentStart(opts);
|
|
31
|
+
});
|
|
32
|
+
agent
|
|
33
|
+
.command('step')
|
|
34
|
+
.description('Report a step (exit 3 when the lease is gone)')
|
|
35
|
+
.requiredOption('--index <n>', 'step index (0-based)')
|
|
36
|
+
.option('--title <title>', 'step title (required for a new index)')
|
|
37
|
+
.requiredOption('--status <status>', 'running | done | failed | skipped | pending')
|
|
38
|
+
.option('--detail <text>', 'one line of detail')
|
|
39
|
+
.addOption(denv())
|
|
40
|
+
.option('--json', 'machine-readable output')
|
|
41
|
+
.action(async (opts) => {
|
|
42
|
+
const { runAgentStep } = await import('./impl/agentImpl.js');
|
|
43
|
+
await runAgentStep(opts);
|
|
44
|
+
});
|
|
45
|
+
agent
|
|
46
|
+
.command('heartbeat')
|
|
47
|
+
.description('Keep the lease alive once (exit 3 when the lease is gone)')
|
|
48
|
+
.addOption(new Option('--loop').hideHelp()) // the daemon
|
|
49
|
+
.addOption(new Option('--max-minutes <n>').hideHelp().default('180'))
|
|
50
|
+
.addOption(denv())
|
|
51
|
+
.option('--json', 'machine-readable output')
|
|
52
|
+
.action(async (opts) => {
|
|
53
|
+
const { runAgentHeartbeat } = await import('./impl/agentImpl.js');
|
|
54
|
+
await runAgentHeartbeat(opts);
|
|
55
|
+
});
|
|
56
|
+
agent
|
|
57
|
+
.command('stop')
|
|
58
|
+
.description('Release the lease and stop the heartbeat daemon')
|
|
59
|
+
.option('--status <status>', 'done | failed', 'done')
|
|
60
|
+
.option('--error <text>', 'why the run failed')
|
|
61
|
+
.addOption(denv())
|
|
62
|
+
.option('--json', 'machine-readable output')
|
|
63
|
+
.action(async (opts) => {
|
|
64
|
+
const { runAgentStop } = await import('./impl/agentImpl.js');
|
|
65
|
+
await runAgentStop(opts);
|
|
66
|
+
});
|
|
67
|
+
agent
|
|
68
|
+
.command('hook <event>')
|
|
69
|
+
.description('Agent hook entry point (prompt | stop): hold the lease while the agent works on a request')
|
|
70
|
+
.option('--agent <name>', 'the agent whose hook calls this: claude | cursor | codex', 'claude')
|
|
71
|
+
.addOption(new Option('--no-daemon').hideHelp())
|
|
72
|
+
.addOption(denv())
|
|
73
|
+
.action(async (event, opts) => {
|
|
74
|
+
const { runAgentHook } = await import('./impl/agentImpl.js');
|
|
75
|
+
await runAgentHook(event, opts);
|
|
76
|
+
});
|
|
77
|
+
agent
|
|
78
|
+
.command('status')
|
|
79
|
+
.description("Show the project's live agent session and this checkout's local state")
|
|
80
|
+
.addOption(denv())
|
|
81
|
+
.option('--json', 'machine-readable output')
|
|
82
|
+
.action(async (opts) => {
|
|
83
|
+
const { runAgentStatus } = await import('./impl/agentImpl.js');
|
|
84
|
+
await runAgentStatus(opts);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/create.js
CHANGED
|
@@ -5,6 +5,7 @@ export function registerCreate(program) {
|
|
|
5
5
|
.description('Scaffold a new Mapples-connected Expo app')
|
|
6
6
|
.option('--secret <secret>', 'project API secret (Creator: Project → Settings)')
|
|
7
7
|
.option('--api-url <url>', 'Mapples API base URL')
|
|
8
|
+
.option('--agent <name>', 'also set up an AI agent: claude (Claude Code) | cursor | codex (ChatGPT) — skills, instructions, MCP entry')
|
|
8
9
|
.addOption(new Option('--denv <env>').hideHelp()) // internal: dev|staging|prod
|
|
9
10
|
.option('--json', 'machine-readable output')
|
|
10
11
|
.action(async (app, opts) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,MAAM,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,2CAA2C,CAAC;SACxD,MAAM,CAAC,mBAAmB,EAAE,kDAAkD,CAAC;SAC/E,MAAM,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;SACjD,SAAS,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,6BAA6B;SAC9E,MAAM,CAAC,QAAQ,EAAE,yBAAyB,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,IAA6B,EAAE,EAAE;QAC3D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC3D,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,MAAM,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,2CAA2C,CAAC;SACxD,MAAM,CAAC,mBAAmB,EAAE,kDAAkD,CAAC;SAC/E,MAAM,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;SACjD,MAAM,CACL,gBAAgB,EAChB,4GAA4G,CAC7G;SACA,SAAS,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,6BAA6B;SAC9E,MAAM,CAAC,QAAQ,EAAE,yBAAyB,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,IAA6B,EAAE,EAAE;QAC3D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC3D,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { proposeAdoptions } from '../../services/adoptService.js';
|
|
3
|
+
import { touchAgentLease } from '../../services/agentLease.js';
|
|
3
4
|
import { clientForApp } from '../../services/clientFactory.js';
|
|
4
5
|
import { emptyReport, renderReport } from '../../ui/report.js';
|
|
5
6
|
export async function runAdopt(file, opts) {
|
|
6
7
|
const root = process.cwd();
|
|
7
8
|
const client = clientForApp(root, opts);
|
|
8
9
|
const report = emptyReport();
|
|
10
|
+
await touchAgentLease(root, report, opts);
|
|
9
11
|
await proposeAdoptions({ root, client, report, yes: true, file });
|
|
12
|
+
await touchAgentLease(root, report, opts);
|
|
10
13
|
if (opts.json === true) {
|
|
11
14
|
console.log(JSON.stringify(report, null, 2));
|
|
12
15
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adoptImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/adoptImpl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,IAA6B;IACxE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;IAC7B,MAAM,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"adoptImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/adoptImpl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,IAA6B;IACxE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;IAC7B,MAAM,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1C,MAAM,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAE1C,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type InstallOutcome } from '../../services/agentInstall.js';
|
|
2
|
+
export declare const EXIT_LEASE_GONE = 3;
|
|
3
|
+
export declare const EXIT_BUSY = 4;
|
|
4
|
+
export declare function runAgentInstall(opts: Record<string, unknown>): Promise<void>;
|
|
5
|
+
export declare function renderInstallOutcomes(outcomes: InstallOutcome[]): string[];
|
|
6
|
+
export declare function runAgentStart(opts: Record<string, unknown>): Promise<void>;
|
|
7
|
+
export declare function runAgentStep(opts: Record<string, unknown>): Promise<void>;
|
|
8
|
+
export declare function runAgentHeartbeat(opts: Record<string, unknown>): Promise<void>;
|
|
9
|
+
export declare function runAgentStop(opts: Record<string, unknown>): Promise<void>;
|
|
10
|
+
export declare const HOOK_EVENTS: readonly ["prompt", "stop"];
|
|
11
|
+
export type HookEvent = (typeof HOOK_EVENTS)[number];
|
|
12
|
+
/** What the agent is told when another session already holds the project. */
|
|
13
|
+
export declare const BUSY_HOOK_MESSAGE = "Another agent session holds this Mapples project (see `mapples agent status`). Do not sync or edit Mapples files until it is released \u2014 ask the user whether to take over with `mapples agent start --takeover`.";
|
|
14
|
+
/**
|
|
15
|
+
* `mapples agent hook prompt|stop --agent <name>` — wired into the agent's
|
|
16
|
+
* hook file by `agent install`. A prompt takes the lease for the request
|
|
17
|
+
* (Creator shows the agent working even when it changes nothing); the end of
|
|
18
|
+
* the request releases a lease the hook took, never one a skill pinned.
|
|
19
|
+
* Stdout follows each agent's hook protocol: Claude Code reads plain text as
|
|
20
|
+
* context, Cursor and Codex expect JSON.
|
|
21
|
+
*/
|
|
22
|
+
export declare function runAgentHook(event: unknown, opts: Record<string, unknown>): Promise<void>;
|
|
23
|
+
export declare function runAgentStatus(opts: Record<string, unknown>): Promise<void>;
|
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
// `mapples agent …` — the lease driver a Claude Code run calls between its
|
|
2
|
+
// phases. Exit codes: 0 ok · 1 error · 3 lease gone · 4 project busy.
|
|
3
|
+
import { spawn } from 'node:child_process';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { AgentSessionError, } from '../../api/agent.js';
|
|
6
|
+
import { isNetworkError } from '../../api/client.js';
|
|
7
|
+
import { agentStatePath, clearAgentState, readAgentState, writeAgentState, } from '../../project/agentState.js';
|
|
8
|
+
import { readConfig } from '../../project/config.js';
|
|
9
|
+
import { resolveApiUrl } from '../../project/env.js';
|
|
10
|
+
import { AGENT_PROFILES, agentNextSteps, installAgentIntegration, hooksSnippetHeading, mcpSnippetHeading, parseAgentName, parseSessionAgent, sessionAgentLabel, } from '../../services/agentInstall.js';
|
|
11
|
+
import { agentClientForApp } from '../../services/clientFactory.js';
|
|
12
|
+
export const EXIT_LEASE_GONE = 3;
|
|
13
|
+
export const EXIT_BUSY = 4;
|
|
14
|
+
const STEP_STATUSES = [
|
|
15
|
+
'pending',
|
|
16
|
+
'running',
|
|
17
|
+
'done',
|
|
18
|
+
'failed',
|
|
19
|
+
'skipped',
|
|
20
|
+
];
|
|
21
|
+
function emit(opts, json, lines) {
|
|
22
|
+
// Hooks run the lease quietly: their stdout belongs to the agent's hook protocol.
|
|
23
|
+
if (opts.quiet === true)
|
|
24
|
+
return;
|
|
25
|
+
if (opts.json === true) {
|
|
26
|
+
console.log(JSON.stringify(json, null, 2));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
for (const line of lines)
|
|
30
|
+
console.log(line);
|
|
31
|
+
}
|
|
32
|
+
function requireState(root) {
|
|
33
|
+
const state = readAgentState(root);
|
|
34
|
+
if (!state) {
|
|
35
|
+
throw new Error('no agent session in this checkout — run `mapples agent start` first');
|
|
36
|
+
}
|
|
37
|
+
return state;
|
|
38
|
+
}
|
|
39
|
+
function isAlive(pid) {
|
|
40
|
+
if (!pid)
|
|
41
|
+
return false;
|
|
42
|
+
try {
|
|
43
|
+
process.kill(pid, 0);
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
// ESRCH: the daemon is gone. EPERM: a process exists but is not ours — alive.
|
|
48
|
+
return err.code === 'EPERM';
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function killDaemon(pid) {
|
|
52
|
+
if (!pid)
|
|
53
|
+
return 'absent';
|
|
54
|
+
try {
|
|
55
|
+
process.kill(pid, 'SIGTERM');
|
|
56
|
+
return 'stopped';
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
if (err.code === 'ESRCH')
|
|
60
|
+
return 'absent';
|
|
61
|
+
throw err;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/** The detached keep-alive: `mapples agent heartbeat --loop` in this checkout. */
|
|
65
|
+
function spawnDaemon(root, opts) {
|
|
66
|
+
const entry = process.argv[1];
|
|
67
|
+
if (!entry)
|
|
68
|
+
throw new Error('cannot locate the CLI entry point to spawn the heartbeat daemon');
|
|
69
|
+
const args = [entry, 'agent', 'heartbeat', '--loop'];
|
|
70
|
+
if (typeof opts.denv === 'string')
|
|
71
|
+
args.push('--denv', opts.denv);
|
|
72
|
+
const child = spawn(process.execPath, args, { cwd: root, detached: true, stdio: 'ignore' });
|
|
73
|
+
child.unref();
|
|
74
|
+
if (child.pid === undefined)
|
|
75
|
+
throw new Error('the heartbeat daemon did not start (no pid)');
|
|
76
|
+
return child.pid;
|
|
77
|
+
}
|
|
78
|
+
function describe(session) {
|
|
79
|
+
const done = session.steps.filter((s) => s.status === 'done').length;
|
|
80
|
+
return [
|
|
81
|
+
` session ${session.uuid} (${session.status})`,
|
|
82
|
+
` label ${session.label ?? '—'}${session.apiKey?.name ? chalk.gray(` · key ${session.apiKey.name}`) : ''}`,
|
|
83
|
+
` since ${session.startedAt}`,
|
|
84
|
+
` heartbeat ${session.lastHeartbeatAt} (expires ${session.expiresAt})`,
|
|
85
|
+
` step ${session.currentStep ?? '—'} · ${done}/${session.steps.length} done`,
|
|
86
|
+
...(session.error ? [` error ${session.error}`] : []),
|
|
87
|
+
];
|
|
88
|
+
}
|
|
89
|
+
// ---- install ----
|
|
90
|
+
export async function runAgentInstall(opts) {
|
|
91
|
+
const root = process.cwd();
|
|
92
|
+
const agent = parseAgentName(opts.agent ?? 'claude');
|
|
93
|
+
const config = readConfig(root);
|
|
94
|
+
const apiUrl = resolveApiUrl({ denv: opts.denv, configuredUrl: config.apiUrl });
|
|
95
|
+
const result = installAgentIntegration(root, agent, {
|
|
96
|
+
apiUrl,
|
|
97
|
+
force: opts.force === true,
|
|
98
|
+
routesDir: config.routesDir,
|
|
99
|
+
pagesDir: config.pagesDir,
|
|
100
|
+
componentsDir: config.componentsDir,
|
|
101
|
+
});
|
|
102
|
+
emit(opts, result, [
|
|
103
|
+
chalk.bold('\nmapples agent install'),
|
|
104
|
+
...renderInstallOutcomes(result.outcomes),
|
|
105
|
+
...(result.mcpSnippet ? ['', mcpSnippetHeading(agent), result.mcpSnippet] : []),
|
|
106
|
+
...(result.hooksSnippet ? ['', hooksSnippetHeading(agent), result.hooksSnippet] : []),
|
|
107
|
+
'',
|
|
108
|
+
...agentNextSteps(agent, null),
|
|
109
|
+
]);
|
|
110
|
+
}
|
|
111
|
+
export function renderInstallOutcomes(outcomes) {
|
|
112
|
+
const icon = {
|
|
113
|
+
created: chalk.green('A'),
|
|
114
|
+
updated: chalk.cyan('M'),
|
|
115
|
+
unchanged: chalk.gray('·'),
|
|
116
|
+
skipped: chalk.yellow('S'),
|
|
117
|
+
appended: chalk.cyan('+'),
|
|
118
|
+
deprecated: chalk.red('D'),
|
|
119
|
+
};
|
|
120
|
+
return outcomes
|
|
121
|
+
.filter((o) => o.action !== 'unchanged')
|
|
122
|
+
.map((o) => ` ${icon[o.action]} ${o.file}${o.detail ? chalk.gray(` — ${o.detail}`) : ''}`);
|
|
123
|
+
}
|
|
124
|
+
// ---- start ----
|
|
125
|
+
export async function runAgentStart(opts) {
|
|
126
|
+
const root = process.cwd();
|
|
127
|
+
const config = readConfig(root);
|
|
128
|
+
const client = agentClientForApp(root, opts);
|
|
129
|
+
const sessionAgent = parseSessionAgent(opts.agent);
|
|
130
|
+
const label = typeof opts.label === 'string' && opts.label.length > 0
|
|
131
|
+
? opts.label
|
|
132
|
+
: sessionAgentLabel(sessionAgent);
|
|
133
|
+
const steps = typeof opts.steps === 'string'
|
|
134
|
+
? opts.steps
|
|
135
|
+
.split(',')
|
|
136
|
+
.map((title) => title.trim())
|
|
137
|
+
.filter((title) => title.length > 0)
|
|
138
|
+
.map((title) => ({ title }))
|
|
139
|
+
: undefined;
|
|
140
|
+
const wantDaemon = opts.daemon !== false;
|
|
141
|
+
const auto = opts.auto === true;
|
|
142
|
+
// Idempotent re-run: this checkout already holds the live session.
|
|
143
|
+
const existing = readAgentState(root);
|
|
144
|
+
if (existing) {
|
|
145
|
+
let live = await client.current();
|
|
146
|
+
if (live && live.uuid === existing.uuid && live.status === 'active') {
|
|
147
|
+
let pid = existing.heartbeatPid;
|
|
148
|
+
if (wantDaemon && !isAlive(pid))
|
|
149
|
+
pid = spawnDaemon(root, opts);
|
|
150
|
+
// An explicit start pins a hook's lease and declares its steps on it;
|
|
151
|
+
// a hook's start never unpins an explicit one.
|
|
152
|
+
const next = { ...existing, ...(pid !== undefined ? { heartbeatPid: pid } : {}) };
|
|
153
|
+
if (!auto) {
|
|
154
|
+
delete next.auto;
|
|
155
|
+
for (const [index, step] of (steps ?? []).entries()) {
|
|
156
|
+
if (index < live.steps.length)
|
|
157
|
+
continue;
|
|
158
|
+
live = await client.heartbeat(existing.uuid, {
|
|
159
|
+
step: { index, title: step.title, status: 'pending' },
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
writeAgentState(root, next);
|
|
164
|
+
emit(opts, { session: live, state: readAgentState(root), resumed: true }, [
|
|
165
|
+
chalk.bold('\nmapples agent start') + chalk.gray(' — already running'),
|
|
166
|
+
...describe(live),
|
|
167
|
+
]);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
clearAgentState(root);
|
|
171
|
+
}
|
|
172
|
+
let session;
|
|
173
|
+
try {
|
|
174
|
+
session = await client.start({
|
|
175
|
+
agent: sessionAgent,
|
|
176
|
+
label,
|
|
177
|
+
...(steps && steps.length > 0 ? { steps } : {}),
|
|
178
|
+
...(opts.takeover === true ? { force: true } : {}),
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
if (err instanceof AgentSessionError && err.code === 'SESSION_ACTIVE') {
|
|
183
|
+
const busy = err.session;
|
|
184
|
+
process.exitCode = EXIT_BUSY;
|
|
185
|
+
emit(opts, { busy: true, session: busy, exitCode: EXIT_BUSY }, [
|
|
186
|
+
chalk.yellow.bold('\nproject busy — another agent session holds it'),
|
|
187
|
+
...(busy ? describe(busy) : [` ${err.message}`]),
|
|
188
|
+
chalk.gray(' re-run with --takeover to disconnect it and take the lease'),
|
|
189
|
+
]);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
throw err;
|
|
193
|
+
}
|
|
194
|
+
const state = {
|
|
195
|
+
schema: 1,
|
|
196
|
+
uuid: session.uuid,
|
|
197
|
+
label,
|
|
198
|
+
startedAt: session.startedAt,
|
|
199
|
+
apiUrl: resolveApiUrl({ denv: opts.denv, configuredUrl: config.apiUrl }),
|
|
200
|
+
projectId: config.projectId,
|
|
201
|
+
heartbeatSeconds: session.heartbeatSeconds,
|
|
202
|
+
...(auto ? { auto: true } : {}),
|
|
203
|
+
};
|
|
204
|
+
writeAgentState(root, state);
|
|
205
|
+
if (wantDaemon) {
|
|
206
|
+
state.heartbeatPid = spawnDaemon(root, opts);
|
|
207
|
+
writeAgentState(root, state);
|
|
208
|
+
}
|
|
209
|
+
emit(opts, { session, state, resumed: false }, [
|
|
210
|
+
chalk.bold('\nmapples agent start'),
|
|
211
|
+
...describe(session),
|
|
212
|
+
chalk.gray(wantDaemon
|
|
213
|
+
? ` heartbeat daemon pid ${state.heartbeatPid} every ${session.heartbeatSeconds} s`
|
|
214
|
+
: ' no heartbeat daemon (--no-daemon) — keep the lease alive with `mapples agent heartbeat`'),
|
|
215
|
+
]);
|
|
216
|
+
}
|
|
217
|
+
// ---- step ----
|
|
218
|
+
export async function runAgentStep(opts) {
|
|
219
|
+
const root = process.cwd();
|
|
220
|
+
const state = requireState(root);
|
|
221
|
+
const index = Number(opts.index);
|
|
222
|
+
if (!Number.isInteger(index) || index < 0)
|
|
223
|
+
throw new Error(`--index must be a non-negative integer`);
|
|
224
|
+
const status = opts.status;
|
|
225
|
+
if (!STEP_STATUSES.includes(status)) {
|
|
226
|
+
throw new Error(`--status must be one of ${STEP_STATUSES.join(', ')}`);
|
|
227
|
+
}
|
|
228
|
+
const title = typeof opts.title === 'string' ? opts.title : undefined;
|
|
229
|
+
const detail = typeof opts.detail === 'string' ? opts.detail : undefined;
|
|
230
|
+
const client = agentClientForApp(root, opts);
|
|
231
|
+
let session;
|
|
232
|
+
try {
|
|
233
|
+
session = await client.heartbeat(state.uuid, {
|
|
234
|
+
step: { index, ...(title ? { title } : {}), status, ...(detail ? { detail } : {}) },
|
|
235
|
+
...(status === 'running' && title ? { currentStep: title } : {}),
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
if (leaseGone(err, root, state, opts))
|
|
240
|
+
return;
|
|
241
|
+
throw err;
|
|
242
|
+
}
|
|
243
|
+
const reported = session.steps.find((s) => s.index === index);
|
|
244
|
+
writeAgentState(root, {
|
|
245
|
+
...state,
|
|
246
|
+
lastStep: { index, title: reported?.title ?? title ?? `step ${index}`, status },
|
|
247
|
+
});
|
|
248
|
+
emit(opts, { session, step: reported ?? null }, [
|
|
249
|
+
`${chalk.bold('mapples agent step')} ${index} ${reported?.title ?? title ?? ''} → ${status}`,
|
|
250
|
+
]);
|
|
251
|
+
}
|
|
252
|
+
/** SESSION_GONE handling shared by step/heartbeat/stop: exit 3, clear local state, stop the daemon. */
|
|
253
|
+
function leaseGone(err, root, state, opts) {
|
|
254
|
+
if (!(err instanceof AgentSessionError) || err.code !== 'SESSION_GONE')
|
|
255
|
+
return false;
|
|
256
|
+
killDaemon(state.heartbeatPid);
|
|
257
|
+
clearAgentState(root);
|
|
258
|
+
process.exitCode = EXIT_LEASE_GONE;
|
|
259
|
+
emit(opts, { leaseGone: true, session: state.uuid, reason: err.message, exitCode: EXIT_LEASE_GONE }, [
|
|
260
|
+
chalk.red(`agent session ${state.uuid} is no longer active (${err.message}) — local state cleared`),
|
|
261
|
+
]);
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
// ---- heartbeat ----
|
|
265
|
+
export async function runAgentHeartbeat(opts) {
|
|
266
|
+
const root = process.cwd();
|
|
267
|
+
if (opts.loop === true) {
|
|
268
|
+
process.exitCode = await heartbeatLoop(root, opts);
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
const state = requireState(root);
|
|
272
|
+
const client = agentClientForApp(root, opts);
|
|
273
|
+
try {
|
|
274
|
+
const session = await client.heartbeat(state.uuid);
|
|
275
|
+
emit(opts, { session }, [
|
|
276
|
+
`${chalk.bold('mapples agent heartbeat')} ok (${session.lastHeartbeatAt})`,
|
|
277
|
+
]);
|
|
278
|
+
}
|
|
279
|
+
catch (err) {
|
|
280
|
+
if (leaseGone(err, root, state, opts))
|
|
281
|
+
return;
|
|
282
|
+
throw err;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
286
|
+
/**
|
|
287
|
+
* The daemon body. Stops (exit 0) when the state file is gone or names
|
|
288
|
+
* another session, after --max-minutes; exit 3 when the server says the
|
|
289
|
+
* lease is gone. Network errors are retried on the next tick.
|
|
290
|
+
*/
|
|
291
|
+
async function heartbeatLoop(root, opts) {
|
|
292
|
+
const initial = readAgentState(root);
|
|
293
|
+
if (!initial)
|
|
294
|
+
return 0;
|
|
295
|
+
const maxMinutes = Number(opts.maxMinutes ?? 180);
|
|
296
|
+
const deadline = Date.now() + maxMinutes * 60_000;
|
|
297
|
+
let client = agentClientForApp(root, opts);
|
|
298
|
+
let intervalMs = Math.max(1, initial.heartbeatSeconds) * 1000;
|
|
299
|
+
while (Date.now() < deadline) {
|
|
300
|
+
const state = readAgentState(root);
|
|
301
|
+
if (!state || state.uuid !== initial.uuid)
|
|
302
|
+
return 0;
|
|
303
|
+
try {
|
|
304
|
+
const session = await client.heartbeat(state.uuid);
|
|
305
|
+
intervalMs = Math.max(1, session.heartbeatSeconds) * 1000;
|
|
306
|
+
}
|
|
307
|
+
catch (err) {
|
|
308
|
+
if (err instanceof AgentSessionError && err.code === 'SESSION_GONE')
|
|
309
|
+
return EXIT_LEASE_GONE;
|
|
310
|
+
if (!(err instanceof AgentSessionError) && !isNetworkError(err))
|
|
311
|
+
throw err;
|
|
312
|
+
// Refused for another reason or unreachable: keep trying — the lease
|
|
313
|
+
// has 90 s and the next tick may land.
|
|
314
|
+
client = agentClientForApp(root, opts);
|
|
315
|
+
}
|
|
316
|
+
await sleep(intervalMs);
|
|
317
|
+
}
|
|
318
|
+
return 0;
|
|
319
|
+
}
|
|
320
|
+
// ---- stop ----
|
|
321
|
+
export async function runAgentStop(opts) {
|
|
322
|
+
const root = process.cwd();
|
|
323
|
+
const state = readAgentState(root);
|
|
324
|
+
if (!state) {
|
|
325
|
+
emit(opts, { released: false, reason: 'no local agent session' }, [
|
|
326
|
+
chalk.gray('no agent session in this checkout — nothing to stop'),
|
|
327
|
+
]);
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
if (opts.auto === true && state.auto !== true) {
|
|
331
|
+
// A request ended inside a pinned run (e.g. the design skill asking the
|
|
332
|
+
// user a question): the run releases its own lease.
|
|
333
|
+
emit(opts, { released: false, reason: 'pinned by an explicit agent start' }, [
|
|
334
|
+
chalk.gray('the lease is pinned by a running skill — left held'),
|
|
335
|
+
]);
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
const status = opts.status === 'failed' ? 'failed' : 'done';
|
|
339
|
+
if (opts.status !== undefined && opts.status !== 'done' && opts.status !== 'failed') {
|
|
340
|
+
throw new Error('--status must be done or failed');
|
|
341
|
+
}
|
|
342
|
+
const error = typeof opts.error === 'string' ? opts.error : undefined;
|
|
343
|
+
const client = agentClientForApp(root, opts);
|
|
344
|
+
let session = null;
|
|
345
|
+
let note = null;
|
|
346
|
+
try {
|
|
347
|
+
session = await client.release(state.uuid, { status, ...(error ? { error } : {}) });
|
|
348
|
+
}
|
|
349
|
+
catch (err) {
|
|
350
|
+
if (!(err instanceof AgentSessionError) || err.code !== 'SESSION_GONE')
|
|
351
|
+
throw err;
|
|
352
|
+
note = `session ${state.uuid} was already gone (${err.message})`;
|
|
353
|
+
}
|
|
354
|
+
const daemon = killDaemon(state.heartbeatPid);
|
|
355
|
+
clearAgentState(root);
|
|
356
|
+
emit(opts, { released: session !== null, session, daemon, note }, [
|
|
357
|
+
chalk.bold('\nmapples agent stop'),
|
|
358
|
+
...(session ? describe(session) : [` ${note}`]),
|
|
359
|
+
chalk.gray(` heartbeat daemon ${daemon}; ${agentStatePath(root).slice(root.length + 1)} removed`),
|
|
360
|
+
]);
|
|
361
|
+
}
|
|
362
|
+
// ---- hook ----
|
|
363
|
+
export const HOOK_EVENTS = ['prompt', 'stop'];
|
|
364
|
+
/** What the agent is told when another session already holds the project. */
|
|
365
|
+
export const BUSY_HOOK_MESSAGE = 'Another agent session holds this Mapples project (see `mapples agent status`). Do not sync or edit Mapples files until it is released — ask the user whether to take over with `mapples agent start --takeover`.';
|
|
366
|
+
/**
|
|
367
|
+
* `mapples agent hook prompt|stop --agent <name>` — wired into the agent's
|
|
368
|
+
* hook file by `agent install`. A prompt takes the lease for the request
|
|
369
|
+
* (Creator shows the agent working even when it changes nothing); the end of
|
|
370
|
+
* the request releases a lease the hook took, never one a skill pinned.
|
|
371
|
+
* Stdout follows each agent's hook protocol: Claude Code reads plain text as
|
|
372
|
+
* context, Cursor and Codex expect JSON.
|
|
373
|
+
*/
|
|
374
|
+
export async function runAgentHook(event, opts) {
|
|
375
|
+
if (!HOOK_EVENTS.includes(event)) {
|
|
376
|
+
throw new Error(`unknown hook event "${String(event)}" — expected ${HOOK_EVENTS.join(' or ')}`);
|
|
377
|
+
}
|
|
378
|
+
const agent = parseAgentName(opts.agent ?? 'claude');
|
|
379
|
+
const lease = {
|
|
380
|
+
...opts,
|
|
381
|
+
agent: AGENT_PROFILES[agent].sessionAgent,
|
|
382
|
+
auto: true,
|
|
383
|
+
quiet: true,
|
|
384
|
+
json: false,
|
|
385
|
+
};
|
|
386
|
+
let busy = false;
|
|
387
|
+
if (event === 'prompt') {
|
|
388
|
+
await runAgentStart(lease);
|
|
389
|
+
if (process.exitCode === EXIT_BUSY) {
|
|
390
|
+
// Surfaced to the agent, not a failed prompt: the user may still want an answer.
|
|
391
|
+
process.exitCode = 0;
|
|
392
|
+
busy = true;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
await runAgentStop(lease);
|
|
397
|
+
}
|
|
398
|
+
writeHookOutput(agent, event, busy ? BUSY_HOOK_MESSAGE : null);
|
|
399
|
+
}
|
|
400
|
+
function writeHookOutput(agent, event, message) {
|
|
401
|
+
if (agent === 'claude') {
|
|
402
|
+
if (message)
|
|
403
|
+
console.log(message);
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
if (message)
|
|
407
|
+
console.error(message);
|
|
408
|
+
console.log(JSON.stringify(agent === 'cursor' && event === 'prompt' ? { continue: true } : {}));
|
|
409
|
+
}
|
|
410
|
+
// ---- status ----
|
|
411
|
+
export async function runAgentStatus(opts) {
|
|
412
|
+
const root = process.cwd();
|
|
413
|
+
readConfig(root);
|
|
414
|
+
const state = readAgentState(root);
|
|
415
|
+
const session = await agentClientForApp(root, opts).current();
|
|
416
|
+
const daemonAlive = state ? isAlive(state.heartbeatPid) : false;
|
|
417
|
+
const holdsLease = state !== null && session !== null && session.uuid === state.uuid;
|
|
418
|
+
emit(opts, { session, state, holdsLease, daemonAlive }, [
|
|
419
|
+
chalk.bold('\nmapples agent status'),
|
|
420
|
+
...(session ? describe(session) : [' no agent session on this project']),
|
|
421
|
+
state
|
|
422
|
+
? chalk.gray(` local ${state.uuid}${holdsLease ? ' (this checkout holds the lease)' : ' (stale — run `mapples agent stop`)'}; daemon ${daemonAlive ? `alive (pid ${state.heartbeatPid})` : 'not running'}`)
|
|
423
|
+
: chalk.gray(' local no session state in this checkout'),
|
|
424
|
+
]);
|
|
425
|
+
}
|
|
426
|
+
//# sourceMappingURL=agentImpl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/agentImpl.ts"],"names":[],"mappings":"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"}
|