helloagents 3.0.35 → 3.0.38
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/.claude-plugin/marketplace.json +1 -4
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/README.md +21 -13
- package/README_CN.md +21 -13
- package/bootstrap-lite.md +3 -4
- package/bootstrap.md +3 -4
- package/gemini-extension.json +1 -1
- package/install.ps1 +9 -2
- package/install.sh +11 -2
- package/package.json +1 -1
- package/scripts/cli-doctor-codex.mjs +4 -1
- package/scripts/cli-doctor.mjs +3 -3
- package/scripts/cli-hosts.mjs +1 -1
- package/scripts/cli-lifecycle-hosts.mjs +48 -20
- package/scripts/cli-messages.mjs +2 -2
- package/scripts/cli-runtime-root.mjs +9 -1
- package/scripts/notify-sound.mjs +2 -1
- package/scripts/notify.mjs +4 -0
- package/scripts/project-session-cleanup.mjs +60 -16
- package/scripts/project-storage.mjs +2 -8
- package/scripts/runtime-artifacts.mjs +2 -2
- package/scripts/runtime-scope.mjs +115 -20
- package/scripts/runtime-ttl.mjs +7 -4
- package/scripts/session-capsule.mjs +117 -13
- package/scripts/session-token.mjs +62 -9
- package/scripts/state-document.mjs +6 -7
- package/scripts/turn-state.mjs +2 -3
- package/scripts/workflow-core.mjs +1 -4
- package/scripts/workflow-plan-files.mjs +1 -1
- /package/hooks/{hooks.json → hooks-gemini.json} +0 -0
|
@@ -17,6 +17,19 @@ const PAYLOAD_SESSION_KEYS = [
|
|
|
17
17
|
'tab',
|
|
18
18
|
]
|
|
19
19
|
|
|
20
|
+
const PROJECT_PAYLOAD_SESSION_KEYS = [
|
|
21
|
+
'sessionId',
|
|
22
|
+
'session_id',
|
|
23
|
+
'session',
|
|
24
|
+
'conversationId',
|
|
25
|
+
'conversation_id',
|
|
26
|
+
'conversation',
|
|
27
|
+
'threadId',
|
|
28
|
+
'thread_id',
|
|
29
|
+
'thread-id',
|
|
30
|
+
'thread',
|
|
31
|
+
]
|
|
32
|
+
|
|
20
33
|
const ENV_SESSION_KEYS = [
|
|
21
34
|
'HELLOAGENTS_NOTIFY_SESSION_ID',
|
|
22
35
|
'WT_SESSION',
|
|
@@ -28,6 +41,21 @@ const ENV_SESSION_KEYS = [
|
|
|
28
41
|
'TAB_ID',
|
|
29
42
|
]
|
|
30
43
|
|
|
44
|
+
const PROJECT_ENV_SESSION_KEYS = [
|
|
45
|
+
'HELLOAGENTS_NOTIFY_SESSION_ID',
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
const PROJECT_ALIAS_ENV_SESSION_KEYS = [
|
|
49
|
+
'HELLOAGENTS_NOTIFY_SESSION_ID',
|
|
50
|
+
'WT_SESSION',
|
|
51
|
+
'TERM_SESSION_ID',
|
|
52
|
+
'KITTY_WINDOW_ID',
|
|
53
|
+
'ALACRITTY_WINDOW_ID',
|
|
54
|
+
'WINDOWID',
|
|
55
|
+
'WEZTERM_PANE',
|
|
56
|
+
'TAB_ID',
|
|
57
|
+
]
|
|
58
|
+
|
|
31
59
|
function readStringCandidate(input, key) {
|
|
32
60
|
if (!input || typeof input !== 'object') return ''
|
|
33
61
|
const value = input[key]
|
|
@@ -50,23 +78,48 @@ export function sanitizeSessionToken(value = '') {
|
|
|
50
78
|
return cleaned.slice(0, 8)
|
|
51
79
|
}
|
|
52
80
|
|
|
81
|
+
function resolveTokenFromKeys(input, keys = []) {
|
|
82
|
+
for (const key of keys) {
|
|
83
|
+
const value = sanitizeSessionToken(readStringCandidate(input, key))
|
|
84
|
+
if (value) return value
|
|
85
|
+
}
|
|
86
|
+
return ''
|
|
87
|
+
}
|
|
88
|
+
|
|
53
89
|
export function resolveSessionToken({
|
|
54
90
|
payload = {},
|
|
55
91
|
env = process.env,
|
|
56
92
|
ppid = process.ppid,
|
|
57
93
|
allowPpidFallback = true,
|
|
58
94
|
} = {}) {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
if (value) return value
|
|
62
|
-
}
|
|
95
|
+
const payloadToken = resolveTokenFromKeys(payload, PAYLOAD_SESSION_KEYS)
|
|
96
|
+
if (payloadToken) return payloadToken
|
|
63
97
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
if (value) return value
|
|
67
|
-
}
|
|
98
|
+
const envToken = resolveTokenFromKeys(env, ENV_SESSION_KEYS)
|
|
99
|
+
if (envToken) return envToken
|
|
68
100
|
|
|
69
101
|
return allowPpidFallback && ppid ? String(ppid) : ''
|
|
70
102
|
}
|
|
71
103
|
|
|
72
|
-
export {
|
|
104
|
+
export function resolveProjectSessionToken({
|
|
105
|
+
payload = {},
|
|
106
|
+
env = process.env,
|
|
107
|
+
} = {}) {
|
|
108
|
+
const payloadToken = resolveTokenFromKeys(payload, PROJECT_PAYLOAD_SESSION_KEYS)
|
|
109
|
+
if (payloadToken) return payloadToken
|
|
110
|
+
return resolveTokenFromKeys(env, PROJECT_ENV_SESSION_KEYS)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export function resolveProjectSessionAliasToken({
|
|
114
|
+
env = process.env,
|
|
115
|
+
} = {}) {
|
|
116
|
+
return resolveTokenFromKeys(env, PROJECT_ALIAS_ENV_SESSION_KEYS)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export {
|
|
120
|
+
ENV_SESSION_KEYS,
|
|
121
|
+
PAYLOAD_SESSION_KEYS,
|
|
122
|
+
PROJECT_ALIAS_ENV_SESSION_KEYS,
|
|
123
|
+
PROJECT_ENV_SESSION_KEYS,
|
|
124
|
+
PROJECT_PAYLOAD_SESSION_KEYS,
|
|
125
|
+
}
|
|
@@ -3,6 +3,7 @@ import { dirname } from 'node:path'
|
|
|
3
3
|
|
|
4
4
|
const STATE_META_BEGIN = '<!-- HELLOAGENTS_STATE_META'
|
|
5
5
|
const STATE_META_END = 'HELLOAGENTS_STATE_META -->'
|
|
6
|
+
export const AUTO_CREATED_STATE_MARKER = '由运行时自动创建;后续按实际任务重写'
|
|
6
7
|
|
|
7
8
|
function normalizeText(content = '') {
|
|
8
9
|
return String(content || '').replace(/^\uFEFF/, '')
|
|
@@ -62,13 +63,11 @@ export function readStateDocument(filePath) {
|
|
|
62
63
|
|
|
63
64
|
export function composeStateDocument({ metadata = {}, body = '' } = {}) {
|
|
64
65
|
const normalizedBody = normalizeText(body).replace(/^\n+/, '')
|
|
65
|
-
return
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
normalizedBody,
|
|
71
|
-
].join('\n').replace(/\n+$/, '\n')
|
|
66
|
+
return normalizedBody ? `${normalizedBody.replace(/\n+$/, '')}\n` : ''
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function looksLikeAutoCreatedState(body = '') {
|
|
70
|
+
return normalizeText(body).includes(AUTO_CREATED_STATE_MARKER)
|
|
72
71
|
}
|
|
73
72
|
|
|
74
73
|
export function writeStateDocument(filePath, { metadata = {}, body = '' } = {}) {
|
package/scripts/turn-state.mjs
CHANGED
|
@@ -5,7 +5,6 @@ import { fileURLToPath } from 'node:url'
|
|
|
5
5
|
import {
|
|
6
6
|
appendSessionEvent,
|
|
7
7
|
clearCapsuleSection,
|
|
8
|
-
getSessionCapsulePath,
|
|
9
8
|
getRuntimeScope,
|
|
10
9
|
readCapsuleSection,
|
|
11
10
|
writeCapsuleSection,
|
|
@@ -108,7 +107,7 @@ export function readTurnState(cwd = process.cwd(), { now = Date.now(), ...option
|
|
|
108
107
|
return {
|
|
109
108
|
cwd: normalizePath(entry.cwd),
|
|
110
109
|
key: entry.key || '',
|
|
111
|
-
path:
|
|
110
|
+
path: getRuntimeScope(cwd, options).statePath,
|
|
112
111
|
updatedAt: entry.updatedAt,
|
|
113
112
|
...normalized,
|
|
114
113
|
}
|
|
@@ -288,7 +287,7 @@ function main() {
|
|
|
288
287
|
const payload = writeTurnState(cwd, input)
|
|
289
288
|
process.stdout.write(JSON.stringify({
|
|
290
289
|
suppressOutput: true,
|
|
291
|
-
path:
|
|
290
|
+
path: getRuntimeScope(cwd, input).statePath,
|
|
292
291
|
payload,
|
|
293
292
|
}))
|
|
294
293
|
return
|
|
@@ -15,10 +15,7 @@ export function getTargetPlans(snapshot) {
|
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
function describeStateLabel(state) {
|
|
18
|
-
|
|
19
|
-
return '当前工作区默认位置的状态文件'
|
|
20
|
-
}
|
|
21
|
-
return '当前会话的状态文件'
|
|
18
|
+
return '当前工作区状态文件'
|
|
22
19
|
}
|
|
23
20
|
|
|
24
21
|
export function classifyPlan(plan) {
|
|
@@ -188,7 +188,7 @@ export function readStateSnapshot(cwd, options = {}) {
|
|
|
188
188
|
stateSessionToken: stateScope.stateSessionToken,
|
|
189
189
|
stateSessionMode: stateScope.stateSessionMode,
|
|
190
190
|
stateWorkspace: stateScope.stateWorkspace,
|
|
191
|
-
sessionScoped:
|
|
191
|
+
sessionScoped: true,
|
|
192
192
|
exists,
|
|
193
193
|
content,
|
|
194
194
|
sections,
|
|
File without changes
|