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.
Files changed (54) hide show
  1. package/README.md +47 -0
  2. package/dist/src/cli/serve.d.ts +6 -0
  3. package/dist/src/cli/serve.d.ts.map +1 -0
  4. package/dist/src/cli/serve.js +9 -0
  5. package/dist/src/cli/serve.js.map +1 -0
  6. package/dist/src/cli/setup.d.ts +5 -0
  7. package/dist/src/cli/setup.d.ts.map +1 -0
  8. package/dist/src/cli/setup.js +215 -0
  9. package/dist/src/cli/setup.js.map +1 -0
  10. package/dist/src/cli/status.d.ts +5 -0
  11. package/dist/src/cli/status.d.ts.map +1 -0
  12. package/dist/src/cli/status.js +73 -0
  13. package/dist/src/cli/status.js.map +1 -0
  14. package/dist/src/cli/unpair.d.ts +5 -0
  15. package/dist/src/cli/unpair.d.ts.map +1 -0
  16. package/dist/src/cli/unpair.js +65 -0
  17. package/dist/src/cli/unpair.js.map +1 -0
  18. package/dist/src/cloud/client.d.ts +58 -0
  19. package/dist/src/cloud/client.d.ts.map +1 -0
  20. package/dist/src/cloud/client.js +166 -0
  21. package/dist/src/cloud/client.js.map +1 -0
  22. package/dist/src/cloud/pairing.d.ts +51 -0
  23. package/dist/src/cloud/pairing.d.ts.map +1 -0
  24. package/dist/src/cloud/pairing.js +131 -0
  25. package/dist/src/cloud/pairing.js.map +1 -0
  26. package/dist/src/config/mcp-config.d.ts +26 -0
  27. package/dist/src/config/mcp-config.d.ts.map +1 -0
  28. package/dist/src/config/mcp-config.js +76 -0
  29. package/dist/src/config/mcp-config.js.map +1 -0
  30. package/dist/src/config/pairing-store.d.ts +38 -0
  31. package/dist/src/config/pairing-store.d.ts.map +1 -0
  32. package/dist/src/config/pairing-store.js +91 -0
  33. package/dist/src/config/pairing-store.js.map +1 -0
  34. package/dist/src/index.d.ts +8 -0
  35. package/dist/src/index.d.ts.map +1 -0
  36. package/dist/src/index.js +68 -0
  37. package/dist/src/index.js.map +1 -0
  38. package/dist/src/server/index.d.ts +12 -0
  39. package/dist/src/server/index.d.ts.map +1 -0
  40. package/dist/src/server/index.js +74 -0
  41. package/dist/src/server/index.js.map +1 -0
  42. package/dist/src/server/state.d.ts +64 -0
  43. package/dist/src/server/state.d.ts.map +1 -0
  44. package/dist/src/server/state.js +194 -0
  45. package/dist/src/server/state.js.map +1 -0
  46. package/dist/src/server/tools.d.ts +258 -0
  47. package/dist/src/server/tools.d.ts.map +1 -0
  48. package/dist/src/server/tools.js +177 -0
  49. package/dist/src/server/tools.js.map +1 -0
  50. package/dist/src/types/index.d.ts +212 -0
  51. package/dist/src/types/index.d.ts.map +1 -0
  52. package/dist/src/types/index.js +90 -0
  53. package/dist/src/types/index.js.map +1 -0
  54. 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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"}