claude-code-watchos 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -0
- package/dist/src/cli/serve.d.ts +6 -0
- package/dist/src/cli/serve.d.ts.map +1 -0
- package/dist/src/cli/serve.js +9 -0
- package/dist/src/cli/serve.js.map +1 -0
- package/dist/src/cli/setup.d.ts +5 -0
- package/dist/src/cli/setup.d.ts.map +1 -0
- package/dist/src/cli/setup.js +215 -0
- package/dist/src/cli/setup.js.map +1 -0
- package/dist/src/cli/status.d.ts +5 -0
- package/dist/src/cli/status.d.ts.map +1 -0
- package/dist/src/cli/status.js +73 -0
- package/dist/src/cli/status.js.map +1 -0
- package/dist/src/cli/unpair.d.ts +5 -0
- package/dist/src/cli/unpair.d.ts.map +1 -0
- package/dist/src/cli/unpair.js +65 -0
- package/dist/src/cli/unpair.js.map +1 -0
- package/dist/src/cloud/client.d.ts +58 -0
- package/dist/src/cloud/client.d.ts.map +1 -0
- package/dist/src/cloud/client.js +166 -0
- package/dist/src/cloud/client.js.map +1 -0
- package/dist/src/cloud/pairing.d.ts +51 -0
- package/dist/src/cloud/pairing.d.ts.map +1 -0
- package/dist/src/cloud/pairing.js +131 -0
- package/dist/src/cloud/pairing.js.map +1 -0
- package/dist/src/config/mcp-config.d.ts +26 -0
- package/dist/src/config/mcp-config.d.ts.map +1 -0
- package/dist/src/config/mcp-config.js +76 -0
- package/dist/src/config/mcp-config.js.map +1 -0
- package/dist/src/config/pairing-store.d.ts +38 -0
- package/dist/src/config/pairing-store.d.ts.map +1 -0
- package/dist/src/config/pairing-store.js +91 -0
- package/dist/src/config/pairing-store.js.map +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +68 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/server/index.d.ts +12 -0
- package/dist/src/server/index.d.ts.map +1 -0
- package/dist/src/server/index.js +74 -0
- package/dist/src/server/index.js.map +1 -0
- package/dist/src/server/state.d.ts +64 -0
- package/dist/src/server/state.d.ts.map +1 -0
- package/dist/src/server/state.js +194 -0
- package/dist/src/server/state.js.map +1 -0
- package/dist/src/server/tools.d.ts +258 -0
- package/dist/src/server/tools.d.ts.map +1 -0
- package/dist/src/server/tools.js +177 -0
- package/dist/src/server/tools.js.map +1 -0
- package/dist/src/types/index.d.ts +212 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +90 -0
- package/dist/src/types/index.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { runSetup } from "./cli/setup.js";
|
|
3
|
+
import { runStatus } from "./cli/status.js";
|
|
4
|
+
import { runUnpair } from "./cli/unpair.js";
|
|
5
|
+
import { runServe } from "./cli/serve.js";
|
|
6
|
+
const HELP = `
|
|
7
|
+
Claude Watch - Control Claude Code from your Apple Watch
|
|
8
|
+
|
|
9
|
+
Usage:
|
|
10
|
+
npx claude-watch [command]
|
|
11
|
+
|
|
12
|
+
Commands:
|
|
13
|
+
(default) Interactive setup wizard
|
|
14
|
+
status Check connection status
|
|
15
|
+
serve Start MCP server (called by Claude Code)
|
|
16
|
+
unpair Remove configuration
|
|
17
|
+
help Show this help message
|
|
18
|
+
|
|
19
|
+
Examples:
|
|
20
|
+
npx claude-watch # Run setup wizard
|
|
21
|
+
npx claude-watch status # Check status
|
|
22
|
+
npx claude-watch unpair # Remove configuration
|
|
23
|
+
`;
|
|
24
|
+
async function main() {
|
|
25
|
+
const args = process.argv.slice(2);
|
|
26
|
+
const command = args[0] || "";
|
|
27
|
+
switch (command) {
|
|
28
|
+
case "":
|
|
29
|
+
case "setup":
|
|
30
|
+
await runSetup();
|
|
31
|
+
break;
|
|
32
|
+
case "status":
|
|
33
|
+
await runStatus();
|
|
34
|
+
break;
|
|
35
|
+
case "serve":
|
|
36
|
+
await runServe();
|
|
37
|
+
break;
|
|
38
|
+
case "unpair":
|
|
39
|
+
await runUnpair();
|
|
40
|
+
break;
|
|
41
|
+
case "help":
|
|
42
|
+
case "--help":
|
|
43
|
+
case "-h":
|
|
44
|
+
console.log(HELP);
|
|
45
|
+
break;
|
|
46
|
+
case "version":
|
|
47
|
+
case "--version":
|
|
48
|
+
case "-v":
|
|
49
|
+
console.log("claude-watch v0.1.0");
|
|
50
|
+
break;
|
|
51
|
+
default:
|
|
52
|
+
console.error(`Unknown command: ${command}`);
|
|
53
|
+
console.log(HELP);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
main().catch((error) => {
|
|
58
|
+
console.error("Error:", error);
|
|
59
|
+
process.exit(1);
|
|
60
|
+
});
|
|
61
|
+
// Export for programmatic use
|
|
62
|
+
export { runSetup } from "./cli/setup.js";
|
|
63
|
+
export { runStatus } from "./cli/status.js";
|
|
64
|
+
export { runUnpair } from "./cli/unpair.js";
|
|
65
|
+
export { runServe } from "./cli/serve.js";
|
|
66
|
+
export { runMCPServer, createMCPServer } from "./server/index.js";
|
|
67
|
+
export * from "./types/index.js";
|
|
68
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;CAiBZ,CAAC;AAEF,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAE9B,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,EAAE,CAAC;QACR,KAAK,OAAO;YACV,MAAM,QAAQ,EAAE,CAAC;YACjB,MAAM;QAER,KAAK,QAAQ;YACX,MAAM,SAAS,EAAE,CAAC;YAClB,MAAM;QAER,KAAK,OAAO;YACV,MAAM,QAAQ,EAAE,CAAC;YACjB,MAAM;QAER,KAAK,QAAQ;YACX,MAAM,SAAS,EAAE,CAAC;YAClB,MAAM;QAER,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACP,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,MAAM;QAER,KAAK,SAAS,CAAC;QACf,KAAK,WAAW,CAAC;QACjB,KAAK,IAAI;YACP,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACnC,MAAM;QAER;YACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,8BAA8B;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAClE,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Create and configure the MCP server
|
|
4
|
+
*/
|
|
5
|
+
export declare function createMCPServer(): Server;
|
|
6
|
+
/**
|
|
7
|
+
* Run the MCP server over stdio
|
|
8
|
+
*/
|
|
9
|
+
export declare function runMCPServer(): Promise<void>;
|
|
10
|
+
export { getStateManager, resetStateManager } from "./state.js";
|
|
11
|
+
export { tools, getToolsList, callTool } from "./tools.js";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AASnE;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAkDxC;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAmBlD;AAED,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
4
|
+
import { getToolsList, callTool } from "./tools.js";
|
|
5
|
+
import { getStateManager, resetStateManager } from "./state.js";
|
|
6
|
+
/**
|
|
7
|
+
* Create and configure the MCP server
|
|
8
|
+
*/
|
|
9
|
+
export function createMCPServer() {
|
|
10
|
+
const server = new Server({
|
|
11
|
+
name: "claude-watch",
|
|
12
|
+
version: "1.0.0",
|
|
13
|
+
}, {
|
|
14
|
+
capabilities: {
|
|
15
|
+
tools: {},
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
// Handle tools/list
|
|
19
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
20
|
+
return {
|
|
21
|
+
tools: getToolsList(),
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
// Handle tools/call
|
|
25
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
26
|
+
const { name, arguments: args } = request.params;
|
|
27
|
+
try {
|
|
28
|
+
const result = await callTool(name, args || {});
|
|
29
|
+
return {
|
|
30
|
+
content: [
|
|
31
|
+
{
|
|
32
|
+
type: "text",
|
|
33
|
+
text: JSON.stringify(result),
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
40
|
+
return {
|
|
41
|
+
content: [
|
|
42
|
+
{
|
|
43
|
+
type: "text",
|
|
44
|
+
text: JSON.stringify({ error: errorMessage }),
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
isError: true,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
return server;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Run the MCP server over stdio
|
|
55
|
+
*/
|
|
56
|
+
export async function runMCPServer() {
|
|
57
|
+
const server = createMCPServer();
|
|
58
|
+
const transport = new StdioServerTransport();
|
|
59
|
+
// Initialize state manager (starts cloud polling if configured)
|
|
60
|
+
getStateManager();
|
|
61
|
+
// Handle shutdown
|
|
62
|
+
process.on("SIGINT", () => {
|
|
63
|
+
resetStateManager();
|
|
64
|
+
process.exit(0);
|
|
65
|
+
});
|
|
66
|
+
process.on("SIGTERM", () => {
|
|
67
|
+
resetStateManager();
|
|
68
|
+
process.exit(0);
|
|
69
|
+
});
|
|
70
|
+
await server.connect(transport);
|
|
71
|
+
}
|
|
72
|
+
export { getStateManager, resetStateManager } from "./state.js";
|
|
73
|
+
export { tools, getToolsList, callTool } from "./tools.js";
|
|
74
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEhE;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;QACE,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;SACV;KACF,CACF,CAAC;IAEF,oBAAoB;IACpB,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QAC1D,OAAO;YACL,KAAK,EAAE,YAAY,EAAE;SACtB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,oBAAoB;IACpB,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAEjD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;YAChD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;qBAC7B;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YAC3D,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;qBAC9C;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,gEAAgE;IAChE,eAAe,EAAE,CAAC;IAElB,kBAAkB;IAClB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,iBAAiB,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,iBAAiB,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { type SessionState, type ActionStatus, type ActionType } from "../types/index.js";
|
|
2
|
+
import { CloudClient } from "../cloud/client.js";
|
|
3
|
+
/**
|
|
4
|
+
* Manages session state and action approval flows
|
|
5
|
+
*/
|
|
6
|
+
export declare class SessionStateManager {
|
|
7
|
+
private state;
|
|
8
|
+
private cloudClient;
|
|
9
|
+
private actionResolvers;
|
|
10
|
+
constructor(cloudClient?: CloudClient);
|
|
11
|
+
/**
|
|
12
|
+
* Get current state
|
|
13
|
+
*/
|
|
14
|
+
getState(): SessionState;
|
|
15
|
+
/**
|
|
16
|
+
* Handle incoming message from watch
|
|
17
|
+
*/
|
|
18
|
+
private handleWatchMessage;
|
|
19
|
+
/**
|
|
20
|
+
* Handle action response from watch
|
|
21
|
+
*/
|
|
22
|
+
private handleActionResponse;
|
|
23
|
+
/**
|
|
24
|
+
* Request approval from watch
|
|
25
|
+
*/
|
|
26
|
+
requestApproval(params: {
|
|
27
|
+
type: ActionType;
|
|
28
|
+
title: string;
|
|
29
|
+
description: string;
|
|
30
|
+
file_path?: string;
|
|
31
|
+
command?: string;
|
|
32
|
+
timeout?: number;
|
|
33
|
+
}): Promise<{
|
|
34
|
+
approved: boolean;
|
|
35
|
+
status: ActionStatus;
|
|
36
|
+
}>;
|
|
37
|
+
/**
|
|
38
|
+
* Send notification to watch
|
|
39
|
+
*/
|
|
40
|
+
notify(title: string, message: string): Promise<boolean>;
|
|
41
|
+
/**
|
|
42
|
+
* Update progress
|
|
43
|
+
*/
|
|
44
|
+
updateProgress(progress: number, taskName?: string): Promise<boolean>;
|
|
45
|
+
/**
|
|
46
|
+
* Set current task
|
|
47
|
+
*/
|
|
48
|
+
setTask(name: string, description?: string): Promise<boolean>;
|
|
49
|
+
/**
|
|
50
|
+
* Complete current task
|
|
51
|
+
*/
|
|
52
|
+
completeTask(success?: boolean): Promise<boolean>;
|
|
53
|
+
/**
|
|
54
|
+
* Sync state to watch
|
|
55
|
+
*/
|
|
56
|
+
syncState(): Promise<boolean>;
|
|
57
|
+
/**
|
|
58
|
+
* Stop the state manager
|
|
59
|
+
*/
|
|
60
|
+
stop(): void;
|
|
61
|
+
}
|
|
62
|
+
export declare function getStateManager(): SessionStateManager;
|
|
63
|
+
export declare function resetStateManager(): void;
|
|
64
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/server/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,YAAY,EAMjB,KAAK,UAAU,EAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAkB,MAAM,oBAAoB,CAAC;AAEjE;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,eAAe,CAGT;gBAEF,WAAW,CAAC,EAAE,WAAW;IAUrC;;OAEG;IACH,QAAQ,IAAI,YAAY;IAIxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA8B1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAmB5B;;OAEG;IACG,eAAe,CAAC,MAAM,EAAE;QAC5B,IAAI,EAAE,UAAU,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,YAAY,CAAA;KAAE,CAAC;IAiDxD;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ9D;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAa3E;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,GAAE,MAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAcvE;;OAEG;IACG,YAAY,CAAC,OAAO,GAAE,OAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAW7D;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAInC;;OAEG;IACH,IAAI,IAAI,IAAI;CASb;AAKD,wBAAgB,eAAe,IAAI,mBAAmB,CAKrD;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { ActionStatus as ActionStatusEnum, SessionStatus, createDefaultSessionState, createPendingAction, } from "../types/index.js";
|
|
2
|
+
import { getCloudClient } from "../cloud/client.js";
|
|
3
|
+
/**
|
|
4
|
+
* Manages session state and action approval flows
|
|
5
|
+
*/
|
|
6
|
+
export class SessionStateManager {
|
|
7
|
+
state;
|
|
8
|
+
cloudClient;
|
|
9
|
+
actionResolvers = new Map();
|
|
10
|
+
constructor(cloudClient) {
|
|
11
|
+
this.state = createDefaultSessionState();
|
|
12
|
+
this.cloudClient = cloudClient || getCloudClient();
|
|
13
|
+
// Start listening for messages from watch
|
|
14
|
+
if (this.cloudClient.isConfigured()) {
|
|
15
|
+
this.cloudClient.startPolling(this.handleWatchMessage.bind(this));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get current state
|
|
20
|
+
*/
|
|
21
|
+
getState() {
|
|
22
|
+
return { ...this.state };
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Handle incoming message from watch
|
|
26
|
+
*/
|
|
27
|
+
handleWatchMessage(message) {
|
|
28
|
+
const msg = message;
|
|
29
|
+
const type = msg.type;
|
|
30
|
+
switch (type) {
|
|
31
|
+
case "action_response":
|
|
32
|
+
this.handleActionResponse(msg.action_id, msg.approved);
|
|
33
|
+
break;
|
|
34
|
+
case "toggle_yolo":
|
|
35
|
+
this.state.yolo_mode = msg.enabled;
|
|
36
|
+
// Auto-approve all pending if YOLO enabled
|
|
37
|
+
if (this.state.yolo_mode) {
|
|
38
|
+
for (const action of this.state.pending_actions) {
|
|
39
|
+
this.handleActionResponse(action.id, true);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
break;
|
|
43
|
+
case "approve_all":
|
|
44
|
+
for (const action of this.state.pending_actions) {
|
|
45
|
+
this.handleActionResponse(action.id, true);
|
|
46
|
+
}
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Handle action response from watch
|
|
52
|
+
*/
|
|
53
|
+
handleActionResponse(actionId, approved) {
|
|
54
|
+
const resolver = this.actionResolvers.get(actionId);
|
|
55
|
+
if (resolver) {
|
|
56
|
+
clearTimeout(resolver.timeout);
|
|
57
|
+
resolver.resolve(approved ? ActionStatusEnum.APPROVED : ActionStatusEnum.REJECTED);
|
|
58
|
+
this.actionResolvers.delete(actionId);
|
|
59
|
+
// Update action status
|
|
60
|
+
const action = this.state.pending_actions.find((a) => a.id === actionId);
|
|
61
|
+
if (action) {
|
|
62
|
+
action.status = approved
|
|
63
|
+
? ActionStatusEnum.APPROVED
|
|
64
|
+
: ActionStatusEnum.REJECTED;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Request approval from watch
|
|
70
|
+
*/
|
|
71
|
+
async requestApproval(params) {
|
|
72
|
+
// Check YOLO mode
|
|
73
|
+
if (this.state.yolo_mode) {
|
|
74
|
+
return { approved: true, status: ActionStatusEnum.APPROVED };
|
|
75
|
+
}
|
|
76
|
+
const action = createPendingAction({
|
|
77
|
+
type: params.type,
|
|
78
|
+
title: params.title,
|
|
79
|
+
description: params.description,
|
|
80
|
+
file_path: params.file_path,
|
|
81
|
+
command: params.command,
|
|
82
|
+
});
|
|
83
|
+
// Add to pending actions
|
|
84
|
+
this.state.pending_actions.push(action);
|
|
85
|
+
this.state.status = SessionStatus.WAITING;
|
|
86
|
+
// Broadcast to watch
|
|
87
|
+
await this.cloudClient.sendMessage({
|
|
88
|
+
type: "action_requested",
|
|
89
|
+
action,
|
|
90
|
+
});
|
|
91
|
+
// Wait for response
|
|
92
|
+
const timeoutMs = params.timeout || 300000; // 5 minutes default
|
|
93
|
+
const status = await new Promise((resolve) => {
|
|
94
|
+
const timeout = setTimeout(() => {
|
|
95
|
+
this.actionResolvers.delete(action.id);
|
|
96
|
+
resolve(ActionStatusEnum.TIMEOUT);
|
|
97
|
+
}, timeoutMs);
|
|
98
|
+
this.actionResolvers.set(action.id, { resolve, timeout });
|
|
99
|
+
});
|
|
100
|
+
// Cleanup
|
|
101
|
+
this.state.pending_actions = this.state.pending_actions.filter((a) => a.id !== action.id);
|
|
102
|
+
if (this.state.pending_actions.length === 0) {
|
|
103
|
+
this.state.status = SessionStatus.RUNNING;
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
approved: status === ActionStatusEnum.APPROVED,
|
|
107
|
+
status,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Send notification to watch
|
|
112
|
+
*/
|
|
113
|
+
async notify(title, message) {
|
|
114
|
+
return this.cloudClient.sendMessage({
|
|
115
|
+
type: "notification",
|
|
116
|
+
title,
|
|
117
|
+
message,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Update progress
|
|
122
|
+
*/
|
|
123
|
+
async updateProgress(progress, taskName) {
|
|
124
|
+
this.state.progress = Math.max(0, Math.min(1, progress));
|
|
125
|
+
if (taskName) {
|
|
126
|
+
this.state.task_name = taskName;
|
|
127
|
+
}
|
|
128
|
+
return this.cloudClient.sendMessage({
|
|
129
|
+
type: "progress_update",
|
|
130
|
+
progress: this.state.progress,
|
|
131
|
+
task_name: this.state.task_name,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Set current task
|
|
136
|
+
*/
|
|
137
|
+
async setTask(name, description = "") {
|
|
138
|
+
this.state.task_name = name;
|
|
139
|
+
this.state.task_description = description;
|
|
140
|
+
this.state.progress = 0;
|
|
141
|
+
this.state.status = SessionStatus.RUNNING;
|
|
142
|
+
this.state.started_at = new Date().toISOString();
|
|
143
|
+
return this.cloudClient.sendMessage({
|
|
144
|
+
type: "task_started",
|
|
145
|
+
task_name: name,
|
|
146
|
+
task_description: description,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Complete current task
|
|
151
|
+
*/
|
|
152
|
+
async completeTask(success = true) {
|
|
153
|
+
this.state.status = success ? SessionStatus.COMPLETED : SessionStatus.FAILED;
|
|
154
|
+
this.state.progress = success ? 1 : this.state.progress;
|
|
155
|
+
return this.cloudClient.sendMessage({
|
|
156
|
+
type: "task_completed",
|
|
157
|
+
success,
|
|
158
|
+
task_name: this.state.task_name,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Sync state to watch
|
|
163
|
+
*/
|
|
164
|
+
async syncState() {
|
|
165
|
+
return this.cloudClient.syncState(this.state);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Stop the state manager
|
|
169
|
+
*/
|
|
170
|
+
stop() {
|
|
171
|
+
this.cloudClient.stopPolling();
|
|
172
|
+
// Clear all pending resolvers
|
|
173
|
+
for (const [id, resolver] of this.actionResolvers) {
|
|
174
|
+
clearTimeout(resolver.timeout);
|
|
175
|
+
resolver.resolve(ActionStatusEnum.TIMEOUT);
|
|
176
|
+
}
|
|
177
|
+
this.actionResolvers.clear();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Singleton instance
|
|
181
|
+
let stateManager = null;
|
|
182
|
+
export function getStateManager() {
|
|
183
|
+
if (!stateManager) {
|
|
184
|
+
stateManager = new SessionStateManager();
|
|
185
|
+
}
|
|
186
|
+
return stateManager;
|
|
187
|
+
}
|
|
188
|
+
export function resetStateManager() {
|
|
189
|
+
if (stateManager) {
|
|
190
|
+
stateManager.stop();
|
|
191
|
+
stateManager = null;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/server/state.ts"],"names":[],"mappings":"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"}
|