very-happy-cli 0.2.133 → 0.2.134
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/{AcpBackend-BQm7dNza.mjs → AcpBackend-B8KEjDwF.mjs} +3 -3
- package/dist/{AcpBackend-DgG8o4jd.cjs → AcpBackend-CeNp7tgD.cjs} +3 -3
- package/dist/{AcpSessionManager-DDFEmhQp.cjs → AcpSessionManager-Bu1d05bx.cjs} +1 -1
- package/dist/{AcpSessionManager-C7unPEZO.mjs → AcpSessionManager-KlDZbEmZ.mjs} +1 -1
- package/dist/{agentGuidance-BaplwDcV.mjs → agentGuidance-CPG5Cr5T.mjs} +1 -1
- package/dist/{agentGuidance-BItqIZTf.cjs → agentGuidance-Cg8Lha39.cjs} +1 -1
- package/dist/codex/happyMcpStdioBridge.cjs +2 -2
- package/dist/codex/happyMcpStdioBridge.mjs +2 -2
- package/dist/{config-uLywzv5t.cjs → config-C3e90AIH.cjs} +4 -4
- package/dist/{config-BZ8xEnOv.mjs → config-C4gWfnJX.mjs} +4 -4
- package/dist/{index-6Xm0CgN_.cjs → index-B1plzL9M.cjs} +37 -25
- package/dist/{index-ClCeQ1FW.mjs → index-B6UvB88K.mjs} +16 -10
- package/dist/{index-EsR8ayIg.mjs → index-BqUOj1zK.mjs} +33 -21
- package/dist/{index-D8i2EViA.mjs → index-CEDPokKf.mjs} +4 -4
- package/dist/{index-CdH3ecC5.cjs → index-CX-zp3FH.cjs} +4 -4
- package/dist/{index-Daga0ztv.cjs → index-jqG8CV0c.cjs} +15 -9
- package/dist/index.cjs +4 -4
- package/dist/index.mjs +4 -4
- package/dist/{installTerminalHooks-NH4kiB2E.mjs → installTerminalHooks-BT4Dq28Y.mjs} +4 -4
- package/dist/{installTerminalHooks-CKG0MYVK.cjs → installTerminalHooks-DPmEaHg2.cjs} +4 -4
- package/dist/lib.cjs +2 -2
- package/dist/lib.d.cts +6 -60
- package/dist/lib.d.mts +6 -60
- package/dist/lib.mjs +2 -2
- package/dist/{limits-Du7S6jqA.mjs → limits-BGeIBBE3.mjs} +7 -7
- package/dist/{limits-XRNzIlVm.cjs → limits-D6kiAfXJ.cjs} +7 -7
- package/dist/{mcp-D8zhjyZa.mjs → mcp-BGu_dUaJ.mjs} +4 -4
- package/dist/{mcp-CAMCuudA.cjs → mcp-DGZmUpuZ.cjs} +4 -4
- package/dist/{runGemini-BIVHp0ST.cjs → runGemini-BPPnulIk.cjs} +6 -6
- package/dist/{runGemini-Db4rX54F.mjs → runGemini-DGTNwiLo.mjs} +6 -6
- package/dist/{runOpenClaw-a0f2pZZp.cjs → runOpenClaw-BB3Ivt1S.cjs} +5 -5
- package/dist/{runOpenClaw-D2MceXPO.mjs → runOpenClaw-CxgTFOSM.mjs} +5 -5
- package/dist/{send-DKbumEcg.cjs → send-Bo6iKuXr.cjs} +4 -4
- package/dist/{send-1Wjb0lIh.mjs → send-DHShoBeq.mjs} +4 -4
- package/dist/{sessions-DXCCRDb5.mjs → sessions-CJuwvEr0.mjs} +4 -4
- package/dist/{sessions-SIFOOlGp.cjs → sessions-DyC5Attg.cjs} +4 -4
- package/dist/{spawn-Bj3W6HR4.mjs → spawn-QtKlr8Ig.mjs} +4 -4
- package/dist/{spawn-C-XpSPLX.cjs → spawn-gha6nGx-.cjs} +4 -4
- package/dist/{teams-CqhFQLVC.mjs → teams-BF-GxUZc.mjs} +4 -4
- package/dist/{teams-ChFzXAqr.cjs → teams-BbzWNV9e.cjs} +4 -4
- package/dist/{todo-o0clp-_I.cjs → todo-BaNaNZ8c.cjs} +3 -3
- package/dist/{todo-B0gbQHH8.mjs → todo-CkJ5UjWs.mjs} +3 -3
- package/dist/{types-6DrEgHVx.mjs → types-Cq-tvv9t.mjs} +84 -27
- package/dist/{types-CcjVmS2i.cjs → types-Dabm17Ln.cjs} +85 -28
- package/package.json +7 -7
|
@@ -30,7 +30,7 @@ function _interopNamespaceDefault(e) {
|
|
|
30
30
|
var z__namespace = /*#__PURE__*/_interopNamespaceDefault(z);
|
|
31
31
|
|
|
32
32
|
var name = "very-happy-cli";
|
|
33
|
-
var version = "0.2.
|
|
33
|
+
var version = "0.2.134";
|
|
34
34
|
var description = "Remote multi-agent workspace CLI with deep Claude integration, native terminal streaming, and self-hosting.";
|
|
35
35
|
var author = "Kirill Dubovitskiy";
|
|
36
36
|
var contributors = [
|
|
@@ -143,12 +143,12 @@ var dependencies = {
|
|
|
143
143
|
zod: "^4.0.0"
|
|
144
144
|
};
|
|
145
145
|
var optionalDependencies = {
|
|
146
|
-
"very-happy-tools-arm64-darwin": "0.2.
|
|
147
|
-
"very-happy-tools-x64-darwin": "0.2.
|
|
148
|
-
"very-happy-tools-arm64-linux": "0.2.
|
|
149
|
-
"very-happy-tools-x64-linux": "0.2.
|
|
150
|
-
"very-happy-tools-arm64-win32": "0.2.
|
|
151
|
-
"very-happy-tools-x64-win32": "0.2.
|
|
146
|
+
"very-happy-tools-arm64-darwin": "0.2.134",
|
|
147
|
+
"very-happy-tools-x64-darwin": "0.2.134",
|
|
148
|
+
"very-happy-tools-arm64-linux": "0.2.134",
|
|
149
|
+
"very-happy-tools-x64-linux": "0.2.134",
|
|
150
|
+
"very-happy-tools-arm64-win32": "0.2.134",
|
|
151
|
+
"very-happy-tools-x64-win32": "0.2.134"
|
|
152
152
|
};
|
|
153
153
|
var devDependencies = {
|
|
154
154
|
"@slopus/happy-wire": "workspace:*",
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { r as registerTeamsTools } from './agentGuidance-
|
|
1
|
+
import { r as registerTeamsTools } from './agentGuidance-CPG5Cr5T.mjs';
|
|
2
2
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
3
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
4
|
import { z } from 'zod';
|
|
5
|
-
import { p as pushClipboardViaDaemon, k as setTerminalTitleViaDaemon, m as registerAssistantSessionTools } from './index-
|
|
6
|
-
import { l as logger, C as CLIPBOARD_TOOL_NAME, a as CLIPBOARD_TOOL_TITLE, b as CLIPBOARD_TOOL_DESCRIPTION, e as CLIPBOARD_MAX_BYTES } from './limits-
|
|
5
|
+
import { p as pushClipboardViaDaemon, k as setTerminalTitleViaDaemon, m as registerAssistantSessionTools } from './index-BqUOj1zK.mjs';
|
|
6
|
+
import { l as logger, C as CLIPBOARD_TOOL_NAME, a as CLIPBOARD_TOOL_TITLE, b as CLIPBOARD_TOOL_DESCRIPTION, e as CLIPBOARD_MAX_BYTES } from './limits-BGeIBBE3.mjs';
|
|
7
7
|
import 'node:fs/promises';
|
|
8
8
|
import 'node:os';
|
|
9
9
|
import 'node:crypto';
|
|
@@ -11,7 +11,7 @@ import 'axios';
|
|
|
11
11
|
import 'tweetnacl';
|
|
12
12
|
import 'socket.io-client';
|
|
13
13
|
import 'node:child_process';
|
|
14
|
-
import './types-
|
|
14
|
+
import './types-Cq-tvv9t.mjs';
|
|
15
15
|
import 'node:fs';
|
|
16
16
|
import 'node:path';
|
|
17
17
|
import 'chalk';
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var agentGuidance = require('./agentGuidance-
|
|
3
|
+
var agentGuidance = require('./agentGuidance-Cg8Lha39.cjs');
|
|
4
4
|
var mcp_js = require('@modelcontextprotocol/sdk/server/mcp.js');
|
|
5
5
|
var stdio_js = require('@modelcontextprotocol/sdk/server/stdio.js');
|
|
6
6
|
var z = require('zod');
|
|
7
|
-
var index = require('./index-
|
|
8
|
-
var persistence = require('./limits-
|
|
7
|
+
var index = require('./index-B1plzL9M.cjs');
|
|
8
|
+
var persistence = require('./limits-D6kiAfXJ.cjs');
|
|
9
9
|
require('node:fs/promises');
|
|
10
10
|
require('node:os');
|
|
11
11
|
require('node:crypto');
|
|
@@ -13,7 +13,7 @@ require('axios');
|
|
|
13
13
|
require('tweetnacl');
|
|
14
14
|
require('socket.io-client');
|
|
15
15
|
require('node:child_process');
|
|
16
|
-
require('./types-
|
|
16
|
+
require('./types-Dabm17Ln.cjs');
|
|
17
17
|
require('node:fs');
|
|
18
18
|
require('node:path');
|
|
19
19
|
require('chalk');
|
|
@@ -4,11 +4,11 @@ var ink = require('ink');
|
|
|
4
4
|
var React = require('react');
|
|
5
5
|
var node_crypto = require('node:crypto');
|
|
6
6
|
var path = require('node:path');
|
|
7
|
-
var api = require('./types-
|
|
8
|
-
var persistence = require('./limits-
|
|
9
|
-
var index = require('./index-
|
|
10
|
-
var AcpBackend = require('./AcpBackend-
|
|
11
|
-
var config = require('./config-
|
|
7
|
+
var api = require('./types-Dabm17Ln.cjs');
|
|
8
|
+
var persistence = require('./limits-D6kiAfXJ.cjs');
|
|
9
|
+
var index = require('./index-B1plzL9M.cjs');
|
|
10
|
+
var AcpBackend = require('./AcpBackend-CeNp7tgD.cjs');
|
|
11
|
+
var config = require('./config-C3e90AIH.cjs');
|
|
12
12
|
require('axios');
|
|
13
13
|
require('node:events');
|
|
14
14
|
require('socket.io-client');
|
|
@@ -34,7 +34,7 @@ require('@anthropic-ai/sandbox-runtime');
|
|
|
34
34
|
require('expo-server-sdk');
|
|
35
35
|
require('chalk');
|
|
36
36
|
require('node:util');
|
|
37
|
-
require('./agentGuidance-
|
|
37
|
+
require('./agentGuidance-Cg8Lha39.cjs');
|
|
38
38
|
require('@anthropic-ai/claude-agent-sdk');
|
|
39
39
|
require('ps-list');
|
|
40
40
|
require('tmp');
|
|
@@ -2,11 +2,11 @@ import { useStdout, useInput, Box, Text, render } from 'ink';
|
|
|
2
2
|
import React, { useState, useRef, useEffect, useCallback } from 'react';
|
|
3
3
|
import { randomUUID } from 'node:crypto';
|
|
4
4
|
import { join } from 'node:path';
|
|
5
|
-
import { f as connectionState, A as ApiClient, e as errorLogMetadata, p as projectPath, d as contentLogMetadata } from './types-
|
|
6
|
-
import { l as logger, g as readSettings, i as encodeBase64 } from './limits-
|
|
7
|
-
import { Q as GEMINI_API_KEY_ENV, R as GOOGLE_API_KEY_ENV, G as GEMINI_MODEL_ENV, K as BasePermissionHandler, U as BaseReasoningProcessor, n as initialMachineMetadata, o as createSessionMetadata, u as setupOfflineReconnection, v as notifyDaemonSessionStarted, x as MessageQueue2, B as hashObject, V as MessageBuffer, W as CHANGE_TITLE_INSTRUCTION, y as registerKillSessionHandler, C as startHappyServer } from './index-
|
|
8
|
-
import { A as AcpBackend } from './AcpBackend-
|
|
9
|
-
import { readGeminiLocalConfig, determineGeminiModel, getGeminiModelSource, getInitialGeminiModel, saveGeminiModelToConfig } from './config-
|
|
5
|
+
import { f as connectionState, A as ApiClient, e as errorLogMetadata, p as projectPath, d as contentLogMetadata } from './types-Cq-tvv9t.mjs';
|
|
6
|
+
import { l as logger, g as readSettings, i as encodeBase64 } from './limits-BGeIBBE3.mjs';
|
|
7
|
+
import { Q as GEMINI_API_KEY_ENV, R as GOOGLE_API_KEY_ENV, G as GEMINI_MODEL_ENV, K as BasePermissionHandler, U as BaseReasoningProcessor, n as initialMachineMetadata, o as createSessionMetadata, u as setupOfflineReconnection, v as notifyDaemonSessionStarted, x as MessageQueue2, B as hashObject, V as MessageBuffer, W as CHANGE_TITLE_INSTRUCTION, y as registerKillSessionHandler, C as startHappyServer } from './index-BqUOj1zK.mjs';
|
|
8
|
+
import { A as AcpBackend } from './AcpBackend-B8KEjDwF.mjs';
|
|
9
|
+
import { readGeminiLocalConfig, determineGeminiModel, getGeminiModelSource, getInitialGeminiModel, saveGeminiModelToConfig } from './config-C4gWfnJX.mjs';
|
|
10
10
|
import 'axios';
|
|
11
11
|
import 'node:events';
|
|
12
12
|
import 'socket.io-client';
|
|
@@ -32,7 +32,7 @@ import '@anthropic-ai/sandbox-runtime';
|
|
|
32
32
|
import 'expo-server-sdk';
|
|
33
33
|
import 'chalk';
|
|
34
34
|
import 'node:util';
|
|
35
|
-
import './agentGuidance-
|
|
35
|
+
import './agentGuidance-CPG5Cr5T.mjs';
|
|
36
36
|
import '@anthropic-ai/claude-agent-sdk';
|
|
37
37
|
import 'ps-list';
|
|
38
38
|
import 'tmp';
|
|
@@ -5,10 +5,10 @@ var node_child_process = require('node:child_process');
|
|
|
5
5
|
var os = require('node:os');
|
|
6
6
|
var node_fs = require('node:fs');
|
|
7
7
|
var path = require('node:path');
|
|
8
|
-
var api = require('./types-
|
|
9
|
-
var AcpSessionManager = require('./AcpSessionManager-
|
|
10
|
-
var persistence = require('./limits-
|
|
11
|
-
var index = require('./index-
|
|
8
|
+
var api = require('./types-Dabm17Ln.cjs');
|
|
9
|
+
var AcpSessionManager = require('./AcpSessionManager-Bu1d05bx.cjs');
|
|
10
|
+
var persistence = require('./limits-D6kiAfXJ.cjs');
|
|
11
|
+
var index = require('./index-B1plzL9M.cjs');
|
|
12
12
|
var WebSocket = require('ws');
|
|
13
13
|
var ed = require('@noble/ed25519');
|
|
14
14
|
var sha2_js = require('@noble/hashes/sha2.js');
|
|
@@ -34,7 +34,7 @@ require('@anthropic-ai/sandbox-runtime');
|
|
|
34
34
|
require('expo-server-sdk');
|
|
35
35
|
require('chalk');
|
|
36
36
|
require('node:util');
|
|
37
|
-
require('./agentGuidance-
|
|
37
|
+
require('./agentGuidance-Cg8Lha39.cjs');
|
|
38
38
|
require('ink');
|
|
39
39
|
require('react');
|
|
40
40
|
require('@anthropic-ai/claude-agent-sdk');
|
|
@@ -3,10 +3,10 @@ import { execFileSync } from 'node:child_process';
|
|
|
3
3
|
import os from 'node:os';
|
|
4
4
|
import { existsSync, readFileSync } from 'node:fs';
|
|
5
5
|
import { join } from 'node:path';
|
|
6
|
-
import { e as errorLogMetadata, d as contentLogMetadata, f as connectionState, A as ApiClient } from './types-
|
|
7
|
-
import { A as AcpSessionManager } from './AcpSessionManager-
|
|
8
|
-
import { f as ensurePrivateDirectorySync, h as hardenPrivateFileSync, w as writePrivateFileSync, g as readSettings, i as encodeBase64, l as logger, c as configuration } from './limits-
|
|
9
|
-
import { n as initialMachineMetadata, o as createSessionMetadata, u as setupOfflineReconnection, v as notifyDaemonSessionStarted, x as MessageQueue2, y as registerKillSessionHandler } from './index-
|
|
6
|
+
import { e as errorLogMetadata, d as contentLogMetadata, f as connectionState, A as ApiClient } from './types-Cq-tvv9t.mjs';
|
|
7
|
+
import { A as AcpSessionManager } from './AcpSessionManager-KlDZbEmZ.mjs';
|
|
8
|
+
import { f as ensurePrivateDirectorySync, h as hardenPrivateFileSync, w as writePrivateFileSync, g as readSettings, i as encodeBase64, l as logger, c as configuration } from './limits-BGeIBBE3.mjs';
|
|
9
|
+
import { n as initialMachineMetadata, o as createSessionMetadata, u as setupOfflineReconnection, v as notifyDaemonSessionStarted, x as MessageQueue2, y as registerKillSessionHandler } from './index-BqUOj1zK.mjs';
|
|
10
10
|
import WebSocket from 'ws';
|
|
11
11
|
import * as ed from '@noble/ed25519';
|
|
12
12
|
import { sha512 } from '@noble/hashes/sha2.js';
|
|
@@ -32,7 +32,7 @@ import '@anthropic-ai/sandbox-runtime';
|
|
|
32
32
|
import 'expo-server-sdk';
|
|
33
33
|
import 'chalk';
|
|
34
34
|
import 'node:util';
|
|
35
|
-
import './agentGuidance-
|
|
35
|
+
import './agentGuidance-CPG5Cr5T.mjs';
|
|
36
36
|
import 'ink';
|
|
37
37
|
import 'react';
|
|
38
38
|
import '@anthropic-ai/claude-agent-sdk';
|
|
@@ -3,15 +3,15 @@
|
|
|
3
3
|
var chalk = require('chalk');
|
|
4
4
|
var node_fs = require('node:fs');
|
|
5
5
|
var path = require('node:path');
|
|
6
|
-
var persistence = require('./limits-
|
|
7
|
-
var index = require('./index-
|
|
6
|
+
var persistence = require('./limits-D6kiAfXJ.cjs');
|
|
7
|
+
var index = require('./index-B1plzL9M.cjs');
|
|
8
8
|
require('node:fs/promises');
|
|
9
9
|
require('node:os');
|
|
10
10
|
require('zod');
|
|
11
11
|
require('node:crypto');
|
|
12
12
|
require('tweetnacl');
|
|
13
13
|
require('node:util');
|
|
14
|
-
require('./types-
|
|
14
|
+
require('./types-Dabm17Ln.cjs');
|
|
15
15
|
require('axios');
|
|
16
16
|
require('node:events');
|
|
17
17
|
require('socket.io-client');
|
|
@@ -30,7 +30,7 @@ require('fs');
|
|
|
30
30
|
require('node:readline');
|
|
31
31
|
require('@anthropic-ai/sandbox-runtime');
|
|
32
32
|
require('expo-server-sdk');
|
|
33
|
-
require('./agentGuidance-
|
|
33
|
+
require('./agentGuidance-Cg8Lha39.cjs');
|
|
34
34
|
require('ink');
|
|
35
35
|
require('react');
|
|
36
36
|
require('@anthropic-ai/claude-agent-sdk');
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { readFileSync } from 'node:fs';
|
|
3
3
|
import { resolve } from 'node:path';
|
|
4
|
-
import { r as readPersistedSessions, c as configuration } from './limits-
|
|
5
|
-
import { d as sendUserMessage, a as sessionWebUrl } from './index-
|
|
4
|
+
import { r as readPersistedSessions, c as configuration } from './limits-BGeIBBE3.mjs';
|
|
5
|
+
import { d as sendUserMessage, a as sessionWebUrl } from './index-BqUOj1zK.mjs';
|
|
6
6
|
import 'node:fs/promises';
|
|
7
7
|
import 'node:os';
|
|
8
8
|
import 'zod';
|
|
9
9
|
import 'node:crypto';
|
|
10
10
|
import 'tweetnacl';
|
|
11
11
|
import 'node:util';
|
|
12
|
-
import './types-
|
|
12
|
+
import './types-Cq-tvv9t.mjs';
|
|
13
13
|
import 'axios';
|
|
14
14
|
import 'node:events';
|
|
15
15
|
import 'socket.io-client';
|
|
@@ -28,7 +28,7 @@ import 'fs';
|
|
|
28
28
|
import 'node:readline';
|
|
29
29
|
import '@anthropic-ai/sandbox-runtime';
|
|
30
30
|
import 'expo-server-sdk';
|
|
31
|
-
import './agentGuidance-
|
|
31
|
+
import './agentGuidance-CPG5Cr5T.mjs';
|
|
32
32
|
import 'ink';
|
|
33
33
|
import 'react';
|
|
34
34
|
import '@anthropic-ai/claude-agent-sdk';
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
|
-
import { D as DEFAULT_RECENT_LIMIT, M as MAX_READ_LIMIT, l as listAccountSessions, e as listSessions, r as readSessionTranscript, f as stopSession, g as resolvePermissionRequest, h as archiveSession } from './index-
|
|
3
|
-
import { i as isValidSessionId } from './types-
|
|
2
|
+
import { D as DEFAULT_RECENT_LIMIT, M as MAX_READ_LIMIT, l as listAccountSessions, e as listSessions, r as readSessionTranscript, f as stopSession, g as resolvePermissionRequest, h as archiveSession } from './index-BqUOj1zK.mjs';
|
|
3
|
+
import { i as isValidSessionId } from './types-Cq-tvv9t.mjs';
|
|
4
4
|
import 'node:os';
|
|
5
5
|
import 'node:crypto';
|
|
6
|
-
import './limits-
|
|
6
|
+
import './limits-BGeIBBE3.mjs';
|
|
7
7
|
import 'node:fs/promises';
|
|
8
8
|
import 'node:fs';
|
|
9
9
|
import 'node:path';
|
|
@@ -12,7 +12,7 @@ import 'tweetnacl';
|
|
|
12
12
|
import 'node:util';
|
|
13
13
|
import 'cross-spawn';
|
|
14
14
|
import 'node:readline';
|
|
15
|
-
import './agentGuidance-
|
|
15
|
+
import './agentGuidance-CPG5Cr5T.mjs';
|
|
16
16
|
import 'fs/promises';
|
|
17
17
|
import 'ink';
|
|
18
18
|
import 'react';
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var chalk = require('chalk');
|
|
4
|
-
var index = require('./index-
|
|
5
|
-
var api = require('./types-
|
|
4
|
+
var index = require('./index-B1plzL9M.cjs');
|
|
5
|
+
var api = require('./types-Dabm17Ln.cjs');
|
|
6
6
|
require('node:os');
|
|
7
7
|
require('node:crypto');
|
|
8
|
-
require('./limits-
|
|
8
|
+
require('./limits-D6kiAfXJ.cjs');
|
|
9
9
|
require('node:fs/promises');
|
|
10
10
|
require('node:fs');
|
|
11
11
|
require('node:path');
|
|
@@ -14,7 +14,7 @@ require('tweetnacl');
|
|
|
14
14
|
require('node:util');
|
|
15
15
|
require('cross-spawn');
|
|
16
16
|
require('node:readline');
|
|
17
|
-
require('./agentGuidance-
|
|
17
|
+
require('./agentGuidance-Cg8Lha39.cjs');
|
|
18
18
|
require('fs/promises');
|
|
19
19
|
require('ink');
|
|
20
20
|
require('react');
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { readFileSync, statSync } from 'node:fs';
|
|
3
3
|
import { resolve } from 'node:path';
|
|
4
|
-
import { c as checkIfDaemonRunningAndCleanupStaleState, s as spawnDaemonSession, a as sessionWebUrl, i as isValidSpawnOrigin, b as sanitizeSpawnPermissionMode, A as ALLOWED_SPAWN_PERMISSION_MODES, S as SPAWN_AGENTS, w as waitForSessionKey, d as sendUserMessage } from './index-
|
|
5
|
-
import { l as logger } from './limits-
|
|
4
|
+
import { c as checkIfDaemonRunningAndCleanupStaleState, s as spawnDaemonSession, a as sessionWebUrl, i as isValidSpawnOrigin, b as sanitizeSpawnPermissionMode, A as ALLOWED_SPAWN_PERMISSION_MODES, S as SPAWN_AGENTS, w as waitForSessionKey, d as sendUserMessage } from './index-BqUOj1zK.mjs';
|
|
5
|
+
import { l as logger } from './limits-BGeIBBE3.mjs';
|
|
6
6
|
import 'node:os';
|
|
7
7
|
import 'node:crypto';
|
|
8
|
-
import './types-
|
|
8
|
+
import './types-Cq-tvv9t.mjs';
|
|
9
9
|
import 'axios';
|
|
10
10
|
import 'node:events';
|
|
11
11
|
import 'socket.io-client';
|
|
@@ -27,7 +27,7 @@ import 'tweetnacl';
|
|
|
27
27
|
import 'node:readline';
|
|
28
28
|
import '@anthropic-ai/sandbox-runtime';
|
|
29
29
|
import 'expo-server-sdk';
|
|
30
|
-
import './agentGuidance-
|
|
30
|
+
import './agentGuidance-CPG5Cr5T.mjs';
|
|
31
31
|
import 'ink';
|
|
32
32
|
import 'react';
|
|
33
33
|
import '@anthropic-ai/claude-agent-sdk';
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
var chalk = require('chalk');
|
|
4
4
|
var node_fs = require('node:fs');
|
|
5
5
|
var path = require('node:path');
|
|
6
|
-
var index = require('./index-
|
|
7
|
-
var persistence = require('./limits-
|
|
6
|
+
var index = require('./index-B1plzL9M.cjs');
|
|
7
|
+
var persistence = require('./limits-D6kiAfXJ.cjs');
|
|
8
8
|
require('node:os');
|
|
9
9
|
require('node:crypto');
|
|
10
|
-
require('./types-
|
|
10
|
+
require('./types-Dabm17Ln.cjs');
|
|
11
11
|
require('axios');
|
|
12
12
|
require('node:events');
|
|
13
13
|
require('socket.io-client');
|
|
@@ -29,7 +29,7 @@ require('tweetnacl');
|
|
|
29
29
|
require('node:readline');
|
|
30
30
|
require('@anthropic-ai/sandbox-runtime');
|
|
31
31
|
require('expo-server-sdk');
|
|
32
|
-
require('./agentGuidance-
|
|
32
|
+
require('./agentGuidance-Cg8Lha39.cjs');
|
|
33
33
|
require('ink');
|
|
34
34
|
require('react');
|
|
35
35
|
require('@anthropic-ai/claude-agent-sdk');
|
|
@@ -2,15 +2,15 @@ import { homedir } from 'node:os';
|
|
|
2
2
|
import { unlink, rmdir, mkdir, lstat, readFile, writeFile, rename } from 'node:fs/promises';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
import { createHash, randomUUID } from 'node:crypto';
|
|
5
|
-
import { d as teamRequest, e as createTeamsClient } from './agentGuidance-
|
|
6
|
-
import { d as readCredentialsForConfiguredRelay } from './limits-
|
|
5
|
+
import { d as teamRequest, e as createTeamsClient } from './agentGuidance-CPG5Cr5T.mjs';
|
|
6
|
+
import { d as readCredentialsForConfiguredRelay } from './limits-BGeIBBE3.mjs';
|
|
7
7
|
import { join, resolve, dirname } from 'node:path';
|
|
8
|
-
import { T as TEAM_SKILL } from './index-
|
|
8
|
+
import { T as TEAM_SKILL } from './index-BqUOj1zK.mjs';
|
|
9
9
|
import 'node:fs';
|
|
10
10
|
import 'tweetnacl';
|
|
11
11
|
import 'chalk';
|
|
12
12
|
import 'node:util';
|
|
13
|
-
import './types-
|
|
13
|
+
import './types-Cq-tvv9t.mjs';
|
|
14
14
|
import 'axios';
|
|
15
15
|
import 'node:events';
|
|
16
16
|
import 'socket.io-client';
|
|
@@ -4,15 +4,15 @@ var os = require('node:os');
|
|
|
4
4
|
var promises = require('node:fs/promises');
|
|
5
5
|
var z = require('zod');
|
|
6
6
|
var node_crypto = require('node:crypto');
|
|
7
|
-
var agentGuidance = require('./agentGuidance-
|
|
8
|
-
var persistence = require('./limits-
|
|
7
|
+
var agentGuidance = require('./agentGuidance-Cg8Lha39.cjs');
|
|
8
|
+
var persistence = require('./limits-D6kiAfXJ.cjs');
|
|
9
9
|
var path = require('node:path');
|
|
10
|
-
var index = require('./index-
|
|
10
|
+
var index = require('./index-B1plzL9M.cjs');
|
|
11
11
|
require('node:fs');
|
|
12
12
|
require('tweetnacl');
|
|
13
13
|
require('chalk');
|
|
14
14
|
require('node:util');
|
|
15
|
-
require('./types-
|
|
15
|
+
require('./types-Dabm17Ln.cjs');
|
|
16
16
|
require('axios');
|
|
17
17
|
require('node:events');
|
|
18
18
|
require('socket.io-client');
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var persistence = require('./limits-
|
|
4
|
-
var api = require('./types-
|
|
5
|
-
var agentGuidance = require('./agentGuidance-
|
|
3
|
+
var persistence = require('./limits-D6kiAfXJ.cjs');
|
|
4
|
+
var api = require('./types-Dabm17Ln.cjs');
|
|
5
|
+
var agentGuidance = require('./agentGuidance-Cg8Lha39.cjs');
|
|
6
6
|
require('node:fs/promises');
|
|
7
7
|
require('node:fs');
|
|
8
8
|
require('node:os');
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { d as readCredentialsForConfiguredRelay, c as configuration } from './limits-
|
|
2
|
-
import { b as createBuiltinTodoClient, B as BUILTIN_TODO_SKILL } from './types-
|
|
3
|
-
import { c as readTeamScope, t as teamScopePath } from './agentGuidance-
|
|
1
|
+
import { d as readCredentialsForConfiguredRelay, c as configuration } from './limits-BGeIBBE3.mjs';
|
|
2
|
+
import { b as createBuiltinTodoClient, B as BUILTIN_TODO_SKILL } from './types-Cq-tvv9t.mjs';
|
|
3
|
+
import { c as readTeamScope, t as teamScopePath } from './agentGuidance-CPG5Cr5T.mjs';
|
|
4
4
|
import 'node:fs/promises';
|
|
5
5
|
import 'node:fs';
|
|
6
6
|
import 'node:os';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
|
-
import { l as logger, i as encodeBase64, j as encrypt, k as decrypt, m as decodeBase64, c as configuration, o as decryptBlob, q as prepareClipboardText, g as readSettings, r as readPersistedSessions, s as credentialRelayProblem, p as packageJson, t as readTrackedClaudeSessionIds, u as libsodiumEncryptForPublicKey, v as libsodiumPublicKeyFromSecretKey, x as getRandomBytes, y as redactLogValue } from './limits-
|
|
2
|
+
import { l as logger, i as encodeBase64, j as encrypt, k as decrypt, m as decodeBase64, c as configuration, o as decryptBlob, q as prepareClipboardText, g as readSettings, r as readPersistedSessions, s as credentialRelayProblem, p as packageJson, t as readTrackedClaudeSessionIds, u as libsodiumEncryptForPublicKey, v as libsodiumPublicKeyFromSecretKey, x as getRandomBytes, y as redactLogValue } from './limits-BGeIBBE3.mjs';
|
|
3
3
|
import { EventEmitter } from 'node:events';
|
|
4
4
|
import { io } from 'socket.io-client';
|
|
5
5
|
import * as z from 'zod';
|
|
@@ -857,6 +857,8 @@ const WebTerminalListItemSchema = z$1.object({
|
|
|
857
857
|
createdAt: z$1.number().optional(),
|
|
858
858
|
activityAt: z$1.number().optional(),
|
|
859
859
|
agentState: z$1.enum(["working", "needs_input", "idle", "shell"]).optional(),
|
|
860
|
+
agentKind: z$1.string().optional(),
|
|
861
|
+
agentObservedAt: z$1.number().optional(),
|
|
860
862
|
/** B-105: mirror session of the claude running inside the terminal. */
|
|
861
863
|
mirrorSessionId: z$1.string().optional(),
|
|
862
864
|
/** B-150: auto-restored after a restart (ms epoch) — the directory and the
|
|
@@ -4337,6 +4339,58 @@ function registerTodoHandlers(manager) {
|
|
|
4337
4339
|
});
|
|
4338
4340
|
}
|
|
4339
4341
|
|
|
4342
|
+
function codingAgentFromProcessTree(panePid, snapshot) {
|
|
4343
|
+
const rows = snapshot.split("\n").flatMap((line) => {
|
|
4344
|
+
const m = line.trim().match(/^(\d+)\s+(\d+)\s+(.+)$/);
|
|
4345
|
+
return m ? [{ pid: Number(m[1]), parent: Number(m[2]), command: m[3] }] : [];
|
|
4346
|
+
});
|
|
4347
|
+
const visit = (pid, seen = /* @__PURE__ */ new Set()) => {
|
|
4348
|
+
if (seen.has(pid)) return void 0;
|
|
4349
|
+
seen.add(pid);
|
|
4350
|
+
const row = rows.find((r) => r.pid === pid);
|
|
4351
|
+
if (!row) return void 0;
|
|
4352
|
+
for (const child of rows.filter((r) => r.parent === pid)) {
|
|
4353
|
+
const kind = visit(child.pid, seen);
|
|
4354
|
+
if (kind) return kind;
|
|
4355
|
+
}
|
|
4356
|
+
const words = row.command.split(/\s+/);
|
|
4357
|
+
const executable = words[0].split("/").pop();
|
|
4358
|
+
const candidate = executable === "node" ? words[1]?.split("/").pop() : executable;
|
|
4359
|
+
if (candidate === "pi" || candidate === "pi-coding-agent") return "pi";
|
|
4360
|
+
if (candidate === "codex") return "codex";
|
|
4361
|
+
if (candidate === "claude" || /^\d+\.\d+\.\d+$/.test(candidate ?? "")) return "claude";
|
|
4362
|
+
return void 0;
|
|
4363
|
+
};
|
|
4364
|
+
return visit(panePid);
|
|
4365
|
+
}
|
|
4366
|
+
|
|
4367
|
+
const shells = /* @__PURE__ */ new Set(["zsh", "bash", "fish", "sh", "dash", "ksh", "tcsh", "csh"]);
|
|
4368
|
+
function classifyAgentPane(command, tail) {
|
|
4369
|
+
const cmd = command.trim().replace(/^-/, "").split(/[\\/]/).pop().toLowerCase();
|
|
4370
|
+
const lines = tail.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "").replace(/\r/g, "").trimEnd().split("\n");
|
|
4371
|
+
const screen = lines.join("\n");
|
|
4372
|
+
const footer = lines.slice(-20).join("\n");
|
|
4373
|
+
if (shells.has(cmd)) return { agentState: "shell" };
|
|
4374
|
+
if (!["node", "claude", "codex", "pi"].includes(cmd) && !/^\d+\.\d+\.\d+$/.test(cmd)) return {};
|
|
4375
|
+
const agentKind = cmd === "pi" ? "pi" : cmd === "codex" ? "codex" : cmd === "claude" || /^\d+\.\d+\.\d+$/.test(cmd) ? "claude" : /OpenAI Codex/.test(screen) ? "codex" : /(?:^|\n)\s*pi v\d|Pi can explain its own features/.test(screen) ? "pi" : /Claude Code|tell Claude what to do|bypass permissions on|⏵⏵|[·✻✽✶✳] [^\n]+… \(esc to interrupt\)/.test(footer) ? "claude" : void 0;
|
|
4376
|
+
if (!agentKind) return {};
|
|
4377
|
+
const result = (agentState) => ({ agentKind, agentState });
|
|
4378
|
+
if (agentKind === "pi") {
|
|
4379
|
+
if (/^\s*→ \S/m.test(screen) && /(?:↑↓ navigate.*(?:enter|return) select.*esc cancel|Enter to select.*Esc to cancel)/i.test(footer)) return result("needs_input");
|
|
4380
|
+
if (/^\s*[⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏◐◓◑◒]\s+(?:Working|Thinking|Retrying|Compacting context|Auto-compacting|Summarizing branch).*$/m.test(footer)) return result("working");
|
|
4381
|
+
if (/^\s*[⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏◐◓◑◒]\s/m.test(footer)) return result();
|
|
4382
|
+
const editorRules = footer.match(/^\s*─{8,}\s*$/gm) ?? [];
|
|
4383
|
+
if (editorRules.length >= 2 && /(?:\d+(?:\.\d+)?|\?)%\/\d+(?:\.\d+)?[km]?.* • (?:thinking off|minimal|low|medium|high|xhigh)/i.test(footer)) return result("idle");
|
|
4384
|
+
return result();
|
|
4385
|
+
}
|
|
4386
|
+
const choice = /^[\s│]*[❯›>]\s*\d+\.\s/m.test(footer);
|
|
4387
|
+
if (choice && /Do you want|Would you like|approve|Yes,|Yes\b|Enter to select.*navigate.*Esc to cancel/i.test(footer)) return result("needs_input");
|
|
4388
|
+
if (/esc to interrupt/i.test(footer)) return result("working");
|
|
4389
|
+
if (agentKind === "codex" && /^\s*gpt-[\w.-]+ (?:minimal|low|medium|high|xhigh|fast)[^\n]* · (?:~|\/|[A-Z]:[\\/])/m.test(footer) && /^› /m.test(footer)) return result("idle");
|
|
4390
|
+
if (/\? for shortcuts|bypass permissions on|⏵⏵|\d+% context left/.test(footer)) return result("idle");
|
|
4391
|
+
return result();
|
|
4392
|
+
}
|
|
4393
|
+
|
|
4340
4394
|
function sanitizeGeometry(cols, rows) {
|
|
4341
4395
|
const ok = (v) => typeof v === "number" && Number.isInteger(v) && v >= 2 && v <= 1e4;
|
|
4342
4396
|
return ok(cols) && ok(rows) ? { cols, rows } : void 0;
|
|
@@ -9546,10 +9600,12 @@ class TerminalNotifyTracker {
|
|
|
9546
9600
|
* Feed one observation for a terminal. Returns the notification event this
|
|
9547
9601
|
* observation triggers, or null. Call once per terminal per tick.
|
|
9548
9602
|
*/
|
|
9549
|
-
observe(terminalId, state, now) {
|
|
9603
|
+
observe(terminalId, state, now, agentKind) {
|
|
9550
9604
|
let t = this.tracks.get(terminalId);
|
|
9551
|
-
if (!t) {
|
|
9605
|
+
if (!t || t.agentKind !== agentKind || now - t.lastObservedAt > 45e3) {
|
|
9552
9606
|
t = {
|
|
9607
|
+
agentKind,
|
|
9608
|
+
lastObservedAt: now,
|
|
9553
9609
|
armed: state === "working",
|
|
9554
9610
|
confirmed: state,
|
|
9555
9611
|
candidate: state,
|
|
@@ -9560,6 +9616,7 @@ class TerminalNotifyTracker {
|
|
|
9560
9616
|
this.tracks.set(terminalId, t);
|
|
9561
9617
|
return null;
|
|
9562
9618
|
}
|
|
9619
|
+
t.lastObservedAt = now;
|
|
9563
9620
|
if (state === "working") t.armed = true;
|
|
9564
9621
|
if (state === t.confirmed) {
|
|
9565
9622
|
t.candidate = state;
|
|
@@ -9892,6 +9949,8 @@ function terminalListSignature(items) {
|
|
|
9892
9949
|
t.createdAt ?? 0,
|
|
9893
9950
|
Math.floor((t.activityAt ?? 0) / ACTIVITY_SIGNATURE_BUCKET_MS),
|
|
9894
9951
|
t.agentState ?? "",
|
|
9952
|
+
t.agentKind ?? "",
|
|
9953
|
+
Math.floor((t.agentObservedAt ?? 0) / 1e4),
|
|
9895
9954
|
// B-105: a mirror binding appearing/disappearing MUST push the
|
|
9896
9955
|
// list, or the web never learns the toggle became available.
|
|
9897
9956
|
t.mirrorSessionId ?? "",
|
|
@@ -9940,7 +9999,7 @@ const LIST_SESSIONS_FORMAT = [
|
|
|
9940
9999
|
// command only separates shell/idle). MUST stay before pane_title: that
|
|
9941
10000
|
// field is deliberately last so a pathological 0x1f inside a title can only
|
|
9942
10001
|
// garble the title, never shift the fields.
|
|
9943
|
-
"#{pane_current_command}",
|
|
10002
|
+
"#{pane_current_command} #{pane_pid}",
|
|
9944
10003
|
"#{pane_title}"
|
|
9945
10004
|
].join(LIST_FIELD_SEP);
|
|
9946
10005
|
function parseSessionListLine(line) {
|
|
@@ -9958,7 +10017,8 @@ function parseSessionListLine(line) {
|
|
|
9958
10017
|
vhTitle: vhTitle.trim() || void 0,
|
|
9959
10018
|
manual: manual.trim().length > 0,
|
|
9960
10019
|
tags: parseTerminalTags(vhTags),
|
|
9961
|
-
paneCurrentCommand: paneCommand.trim() || void 0,
|
|
10020
|
+
paneCurrentCommand: paneCommand.trim().replace(/ \d+$/, "") || void 0,
|
|
10021
|
+
.../ (\d+)$/.test(paneCommand) ? { panePid: Number(paneCommand.match(/ (\d+)$/)[1]) } : {},
|
|
9962
10022
|
// Verbatim (no trim): tmux allows edge spaces in a session name and the
|
|
9963
10023
|
// restore lookup / attach echo compare it exactly.
|
|
9964
10024
|
attachTmux: isSafeTmuxSessionName(vhAttach) ? vhAttach : void 0,
|
|
@@ -10000,22 +10060,6 @@ function parseTerminalTags(raw) {
|
|
|
10000
10060
|
return [];
|
|
10001
10061
|
}
|
|
10002
10062
|
}
|
|
10003
|
-
function classifyPane(currentCommand, tail) {
|
|
10004
|
-
const cmd = (currentCommand || "").trim().replace(/^-/, "").toLowerCase();
|
|
10005
|
-
const isShell = SHELL_COMMANDS.has(cmd);
|
|
10006
|
-
const lines = tail.replace(/\r/g, "").split("\n").map((l) => l.trimEnd());
|
|
10007
|
-
while (lines.length > 0 && lines[lines.length - 1] === "") lines.pop();
|
|
10008
|
-
const text = lines.join("\n");
|
|
10009
|
-
const last15 = lines.slice(-15).join("\n");
|
|
10010
|
-
const hasDialog = last15.includes("Do you want") || last15.includes("Would you like to proceed") || /^[\s│]*[❯>]\s*1\.\s/m.test(last15) || /\(y\/n\)/i.test(last15);
|
|
10011
|
-
if (hasDialog) return "needs_input";
|
|
10012
|
-
if (text.includes("esc to interrupt")) return "working";
|
|
10013
|
-
const looksLikeClaude = looksLikeClaudeCommand(cmd);
|
|
10014
|
-
const hasIdleFooter = text.includes("? for shortcuts") || text.includes("bypass permissions on") || text.includes("\u23F5\u23F5");
|
|
10015
|
-
if (looksLikeClaude || hasIdleFooter) return "idle";
|
|
10016
|
-
if (isShell) return "shell";
|
|
10017
|
-
return void 0;
|
|
10018
|
-
}
|
|
10019
10063
|
function looksLikeClaudeCommand(currentCommand) {
|
|
10020
10064
|
const cmd = (currentCommand || "").trim().replace(/^-/, "").toLowerCase();
|
|
10021
10065
|
return cmd === "claude" || cmd === "node" || /^\d+\.\d+(\.\d+)?$/.test(cmd);
|
|
@@ -11026,7 +11070,7 @@ class WebTerminalManager {
|
|
|
11026
11070
|
const now = Date.now();
|
|
11027
11071
|
this.notifyTracker.prune(list.map((t) => t.id));
|
|
11028
11072
|
for (const item of list) {
|
|
11029
|
-
const event = this.notifyTracker.observe(item.id, item.agentState, now);
|
|
11073
|
+
const event = this.notifyTracker.observe(item.id, item.agentState, now, item.agentKind);
|
|
11030
11074
|
if (!event) continue;
|
|
11031
11075
|
try {
|
|
11032
11076
|
this.onNotify({ terminalId: item.id, title: item.title || "Terminal", event });
|
|
@@ -11758,6 +11802,7 @@ class WebTerminalManager {
|
|
|
11758
11802
|
if (r.status !== 0 || !r.stdout) return [];
|
|
11759
11803
|
const hostname = os$1.hostname();
|
|
11760
11804
|
const out = [];
|
|
11805
|
+
let processSnapshot;
|
|
11761
11806
|
for (const line of r.stdout.split("\n")) {
|
|
11762
11807
|
const s = parseSessionListLine(line);
|
|
11763
11808
|
if (!s || !s.name.startsWith("vh-")) continue;
|
|
@@ -11775,7 +11820,15 @@ class WebTerminalManager {
|
|
|
11775
11820
|
} catch {
|
|
11776
11821
|
}
|
|
11777
11822
|
}
|
|
11778
|
-
|
|
11823
|
+
let identity = s.paneCurrentCommand;
|
|
11824
|
+
if (identity === "node" && s.panePid) {
|
|
11825
|
+
if (processSnapshot === void 0) {
|
|
11826
|
+
const ps = spawnSync("ps", ["-axo", "pid=,ppid=,args="], { encoding: "utf8", timeout: TMUX_PROBE_TIMEOUT_MS });
|
|
11827
|
+
processSnapshot = ps.status === 0 ? ps.stdout : "";
|
|
11828
|
+
}
|
|
11829
|
+
identity = codingAgentFromProcessTree(s.panePid, processSnapshot) ?? identity;
|
|
11830
|
+
}
|
|
11831
|
+
const probe = this.probeAgentState(s.name, identity);
|
|
11779
11832
|
out.push({
|
|
11780
11833
|
id,
|
|
11781
11834
|
title,
|
|
@@ -11787,6 +11840,8 @@ class WebTerminalManager {
|
|
|
11787
11840
|
// simply omit it and web clients fall back to createdAt.
|
|
11788
11841
|
activityAt: s.activity,
|
|
11789
11842
|
agentState: probe.agentState,
|
|
11843
|
+
agentKind: probe.agentKind,
|
|
11844
|
+
agentObservedAt: probe.agentObservedAt,
|
|
11790
11845
|
// Daemon-internal (not pushed to web / not in the signature):
|
|
11791
11846
|
// the mirror reconciler's stricter "claude is really here" gate.
|
|
11792
11847
|
claudeConfident: probe.claudeConfident,
|
|
@@ -11813,16 +11868,17 @@ class WebTerminalManager {
|
|
|
11813
11868
|
if (live) {
|
|
11814
11869
|
try {
|
|
11815
11870
|
const { command, tail } = live.agentProbeInput();
|
|
11816
|
-
|
|
11871
|
+
const observation = classifyAgentPane(command === "node" ? polledCommand || command : command || polledCommand || "", tail);
|
|
11872
|
+
return { ...observation, agentObservedAt: Date.now(), claudeConfident: observation.agentKind === "claude" && isClaudeConfident(tail) };
|
|
11817
11873
|
} catch {
|
|
11818
11874
|
}
|
|
11819
11875
|
}
|
|
11820
|
-
return this.probeAgentStateViaTmux(sessionName);
|
|
11876
|
+
return this.probeAgentStateViaTmux(sessionName, polledCommand);
|
|
11821
11877
|
}
|
|
11822
11878
|
/** Fallback probe for sessions with no live headless: 2 short tmux calls
|
|
11823
11879
|
* (foreground command + pane tail) fed into classifyPane. Any failure or
|
|
11824
11880
|
* timeout → undefined (the field is omitted), never an error. */
|
|
11825
|
-
probeAgentStateViaTmux(sessionName) {
|
|
11881
|
+
probeAgentStateViaTmux(sessionName, polledCommand) {
|
|
11826
11882
|
try {
|
|
11827
11883
|
const cmd = spawnSync(
|
|
11828
11884
|
"tmux",
|
|
@@ -11836,7 +11892,8 @@ class WebTerminalManager {
|
|
|
11836
11892
|
{ encoding: "utf8", timeout: TMUX_PROBE_TIMEOUT_MS, env: ptyEnv() }
|
|
11837
11893
|
);
|
|
11838
11894
|
if (cap.status !== 0 || typeof cap.stdout !== "string") return { agentState: void 0, claudeConfident: false };
|
|
11839
|
-
|
|
11895
|
+
const observation = classifyAgentPane(cmd.stdout.trim() === "node" ? polledCommand || "node" : cmd.stdout.trim(), cap.stdout);
|
|
11896
|
+
return { ...observation, agentObservedAt: Date.now(), claudeConfident: observation.agentKind === "claude" && isClaudeConfident(cap.stdout) };
|
|
11840
11897
|
} catch {
|
|
11841
11898
|
return { agentState: void 0, claudeConfident: false };
|
|
11842
11899
|
}
|