clawconnect-agent 0.1.6 → 0.1.7

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 (125) hide show
  1. package/README.md +83 -7
  2. package/README.zh-CN.md +93 -17
  3. package/dist/commands/install.js +10 -4
  4. package/dist/commands/install.js.map +1 -1
  5. package/dist/commands/local-handlers.js +0 -28
  6. package/dist/commands/local-handlers.js.map +1 -1
  7. package/dist/commands/pair.d.ts +2 -0
  8. package/dist/commands/pair.js +17 -6
  9. package/dist/commands/pair.js.map +1 -1
  10. package/dist/commands/run.js +13 -16
  11. package/dist/commands/run.js.map +1 -1
  12. package/dist/commands/send-file.d.ts +2 -0
  13. package/dist/commands/send-file.js +6 -0
  14. package/dist/commands/send-file.js.map +1 -1
  15. package/dist/commands/status.d.ts +13 -1
  16. package/dist/commands/status.js +58 -15
  17. package/dist/commands/status.js.map +1 -1
  18. package/dist/config/config.d.ts +6 -11
  19. package/dist/config/config.js +19 -48
  20. package/dist/config/config.js.map +1 -1
  21. package/dist/config/env.d.ts +1 -1
  22. package/dist/config/env.js +4 -5
  23. package/dist/config/env.js.map +1 -1
  24. package/dist/config/profile.d.ts +11 -0
  25. package/dist/config/profile.js +80 -0
  26. package/dist/config/profile.js.map +1 -0
  27. package/dist/gateway-profiles.d.ts +8 -0
  28. package/dist/gateway-profiles.js +24 -0
  29. package/dist/gateway-profiles.js.map +1 -0
  30. package/dist/hermes/hermes-relay-manager.d.ts +49 -0
  31. package/dist/hermes/hermes-relay-manager.js +636 -0
  32. package/dist/hermes/hermes-relay-manager.js.map +1 -0
  33. package/dist/hermes/hermes-runtime.d.ts +8 -0
  34. package/dist/hermes/hermes-runtime.js +8 -0
  35. package/dist/hermes/hermes-runtime.js.map +1 -0
  36. package/dist/hermes/hermes-session-store.d.ts +15 -0
  37. package/dist/hermes/hermes-session-store.js +152 -0
  38. package/dist/hermes/hermes-session-store.js.map +1 -0
  39. package/dist/hermes/hermes-voice-input.d.ts +13 -0
  40. package/dist/hermes/hermes-voice-input.js +27 -0
  41. package/dist/hermes/hermes-voice-input.js.map +1 -0
  42. package/dist/hermes/models/hermes-runtime-artifacts.d.ts +3 -0
  43. package/dist/hermes/models/hermes-runtime-artifacts.js +65 -0
  44. package/dist/hermes/models/hermes-runtime-artifacts.js.map +1 -0
  45. package/dist/hermes/models/hermes-runtime-backups.d.ts +5 -0
  46. package/dist/hermes/models/hermes-runtime-backups.js +128 -0
  47. package/dist/hermes/models/hermes-runtime-backups.js.map +1 -0
  48. package/dist/hermes/models/hermes-runtime-chat.d.ts +40 -0
  49. package/dist/hermes/models/hermes-runtime-chat.js +623 -0
  50. package/dist/hermes/models/hermes-runtime-chat.js.map +1 -0
  51. package/dist/hermes/models/hermes-runtime-command-router.d.ts +2 -0
  52. package/dist/hermes/models/hermes-runtime-command-router.js +93 -0
  53. package/dist/hermes/models/hermes-runtime-command-router.js.map +1 -0
  54. package/dist/hermes/models/hermes-runtime-command-utils.d.ts +3 -0
  55. package/dist/hermes/models/hermes-runtime-command-utils.js +19 -0
  56. package/dist/hermes/models/hermes-runtime-command-utils.js.map +1 -0
  57. package/dist/hermes/models/hermes-runtime-cron.d.ts +11 -0
  58. package/dist/hermes/models/hermes-runtime-cron.js +301 -0
  59. package/dist/hermes/models/hermes-runtime-cron.js.map +1 -0
  60. package/dist/hermes/models/hermes-runtime-lifecycle.d.ts +9 -0
  61. package/dist/hermes/models/hermes-runtime-lifecycle.js +111 -0
  62. package/dist/hermes/models/hermes-runtime-lifecycle.js.map +1 -0
  63. package/dist/hermes/models/hermes-runtime-models.d.ts +29 -0
  64. package/dist/hermes/models/hermes-runtime-models.js +125 -0
  65. package/dist/hermes/models/hermes-runtime-models.js.map +1 -0
  66. package/dist/hermes/models/hermes-runtime-process.d.ts +22 -0
  67. package/dist/hermes/models/hermes-runtime-process.js +130 -0
  68. package/dist/hermes/models/hermes-runtime-process.js.map +1 -0
  69. package/dist/hermes/models/hermes-runtime-sessions.d.ts +5 -0
  70. package/dist/hermes/models/hermes-runtime-sessions.js +71 -0
  71. package/dist/hermes/models/hermes-runtime-sessions.js.map +1 -0
  72. package/dist/hermes/models/hermes-runtime-skills.d.ts +13 -0
  73. package/dist/hermes/models/hermes-runtime-skills.js +322 -0
  74. package/dist/hermes/models/hermes-runtime-skills.js.map +1 -0
  75. package/dist/hermes/models/hermes-runtime-types.d.ts +19 -0
  76. package/dist/hermes/models/hermes-runtime-types.js +2 -0
  77. package/dist/hermes/models/hermes-runtime-types.js.map +1 -0
  78. package/dist/hermes/models/hermes-runtime-usage.d.ts +22 -0
  79. package/dist/hermes/models/hermes-runtime-usage.js +211 -0
  80. package/dist/hermes/models/hermes-runtime-usage.js.map +1 -0
  81. package/dist/hermes/models/hermes-runtime-values.d.ts +14 -0
  82. package/dist/hermes/models/hermes-runtime-values.js +105 -0
  83. package/dist/hermes/models/hermes-runtime-values.js.map +1 -0
  84. package/dist/i18n/index.js +4 -0
  85. package/dist/i18n/index.js.map +1 -1
  86. package/dist/index.js +115 -9
  87. package/dist/index.js.map +1 -1
  88. package/dist/platform/service-manager-common.d.ts +5 -2
  89. package/dist/platform/service-manager-common.js +18 -7
  90. package/dist/platform/service-manager-common.js.map +1 -1
  91. package/dist/platform/service-manager.d.ts +16 -5
  92. package/dist/platform/service-manager.js +85 -50
  93. package/dist/platform/service-manager.js.map +1 -1
  94. package/dist/relay/chat-history.js +18 -0
  95. package/dist/relay/chat-history.js.map +1 -1
  96. package/dist/relay/gateway-client.js +4 -3
  97. package/dist/relay/gateway-client.js.map +1 -1
  98. package/dist/relay/mobile-chat-run-bridge.d.ts +93 -0
  99. package/dist/relay/mobile-chat-run-bridge.js +68 -0
  100. package/dist/relay/mobile-chat-run-bridge.js.map +1 -0
  101. package/dist/relay/openclaw-voice-input.d.ts +13 -0
  102. package/dist/relay/openclaw-voice-input.js +18 -0
  103. package/dist/relay/openclaw-voice-input.js.map +1 -0
  104. package/dist/relay/relay-manager.d.ts +0 -3
  105. package/dist/relay/relay-manager.js +39 -170
  106. package/dist/relay/relay-manager.js.map +1 -1
  107. package/dist/relay/session-context.js +11 -1
  108. package/dist/relay/session-context.js.map +1 -1
  109. package/dist/relay/slash-command-catalog.d.ts +1 -1
  110. package/dist/relay/slash-command-catalog.generated.d.ts +0 -5
  111. package/dist/relay/slash-command-catalog.generated.js +0 -6
  112. package/dist/relay/slash-command-catalog.generated.js.map +1 -1
  113. package/dist/relay/voice-input.d.ts +11 -0
  114. package/dist/relay/voice-input.js +118 -0
  115. package/dist/relay/voice-input.js.map +1 -0
  116. package/dist/runtime-adapters.d.ts +19 -0
  117. package/dist/runtime-adapters.js +39 -0
  118. package/dist/runtime-adapters.js.map +1 -0
  119. package/package.json +3 -3
  120. package/dist/commands/voice-reply.d.ts +0 -39
  121. package/dist/commands/voice-reply.js +0 -329
  122. package/dist/commands/voice-reply.js.map +0 -1
  123. package/dist/relay/voice-reply-preference.d.ts +0 -25
  124. package/dist/relay/voice-reply-preference.js +0 -103
  125. package/dist/relay/voice-reply-preference.js.map +0 -1
@@ -0,0 +1,8 @@
1
+ export type { HermesChatResult, HermesToolLogEvent, HermesUsageSnapshot, } from "./models/hermes-runtime-types.js";
2
+ export { resolveHermesBin, runHermes, runHermesWithInput, stripHermesSecurityReviewNotices, stripHermesSessionResumeNotices, } from "./models/hermes-runtime-process.js";
3
+ export { handleHermesCommand } from "./models/hermes-runtime-command-router.js";
4
+ export { buildHermesAssistantDeltaPayload, buildHermesRuntimeContextHint, isHermesSlashCommandMessage, parseHermesToolLogLine, runHermesChat, selectHermesSessionForCompletedChat, } from "./models/hermes-runtime-chat.js";
5
+ export { collectHermesUsageSnapshot, listHermesSessions, parseHermesSessionUsageSnapshot, parseHermesStatusSnapshot, readHermesStatusSnapshot, } from "./models/hermes-runtime-usage.js";
6
+ export { isDuplicateHermesCronJob } from "./models/hermes-runtime-cron.js";
7
+ export { parseHermesSkillsList } from "./models/hermes-runtime-skills.js";
8
+ export { extractDeliverablePaths } from "./models/hermes-runtime-artifacts.js";
@@ -0,0 +1,8 @@
1
+ export { resolveHermesBin, runHermes, runHermesWithInput, stripHermesSecurityReviewNotices, stripHermesSessionResumeNotices, } from "./models/hermes-runtime-process.js";
2
+ export { handleHermesCommand } from "./models/hermes-runtime-command-router.js";
3
+ export { buildHermesAssistantDeltaPayload, buildHermesRuntimeContextHint, isHermesSlashCommandMessage, parseHermesToolLogLine, runHermesChat, selectHermesSessionForCompletedChat, } from "./models/hermes-runtime-chat.js";
4
+ export { collectHermesUsageSnapshot, listHermesSessions, parseHermesSessionUsageSnapshot, parseHermesStatusSnapshot, readHermesStatusSnapshot, } from "./models/hermes-runtime-usage.js";
5
+ export { isDuplicateHermesCronJob } from "./models/hermes-runtime-cron.js";
6
+ export { parseHermesSkillsList } from "./models/hermes-runtime-skills.js";
7
+ export { extractDeliverablePaths } from "./models/hermes-runtime-artifacts.js";
8
+ //# sourceMappingURL=hermes-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermes-runtime.js","sourceRoot":"","sources":["../../src/hermes/hermes-runtime.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,kBAAkB,EAClB,gCAAgC,EAChC,+BAA+B,GAChC,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAChF,OAAO,EACL,gCAAgC,EAChC,6BAA6B,EAC7B,2BAA2B,EAC3B,sBAAsB,EACtB,aAAa,EACb,mCAAmC,GACpC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,EAClB,+BAA+B,EAC/B,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC"}
@@ -0,0 +1,15 @@
1
+ export interface HermesSessionItem {
2
+ sessionKey: string;
3
+ hermesSessionId: string;
4
+ displayName?: string;
5
+ derivedTitle?: string;
6
+ label?: string;
7
+ lastActivityAt?: string;
8
+ kind: "hermes";
9
+ }
10
+ export declare function getMappedHermesSessionId(sessionKey: string): Promise<string | undefined>;
11
+ export declare function rememberHermesSession(sessionKey: string, item: HermesSessionItem): Promise<void>;
12
+ export declare function forgetHermesSession(sessionKeyOrId: string, hermesSessionId?: string): Promise<void>;
13
+ export declare function listStoredHermesSessions(): Promise<HermesSessionItem[]>;
14
+ export declare function mergeLiveHermesSessionsWithStoredAliases(liveSessions: HermesSessionItem[], storedSessions: HermesSessionItem[]): HermesSessionItem[];
15
+ export declare function parseHermesSessionsList(output: string, now?: Date): HermesSessionItem[];
@@ -0,0 +1,152 @@
1
+ import { existsSync } from "fs";
2
+ import { mkdir, readFile, writeFile } from "fs/promises";
3
+ import { homedir } from "os";
4
+ import { dirname, join } from "path";
5
+ const STORE_PATH = process.env.CLAWCONNECT_HERMES_SESSION_STORE
6
+ ?? join(homedir(), ".clawconnect", "hermes", "sessions.json");
7
+ const HERMES_ID_PATTERN = /\b\d{8}_\d{6}_[A-Za-z0-9]+\b/;
8
+ export async function getMappedHermesSessionId(sessionKey) {
9
+ if (sessionKey.startsWith("hermes:")) {
10
+ return sessionKey.slice("hermes:".length).trim() || undefined;
11
+ }
12
+ const store = await readStore();
13
+ return store.sessions[sessionKey]?.hermesSessionId;
14
+ }
15
+ export async function rememberHermesSession(sessionKey, item) {
16
+ const store = await readStore();
17
+ const now = new Date().toISOString();
18
+ store.sessions[sessionKey] = {
19
+ sessionKey,
20
+ hermesSessionId: item.hermesSessionId,
21
+ displayName: item.displayName ?? item.derivedTitle ?? item.hermesSessionId,
22
+ preview: item.label,
23
+ lastActivityAt: item.lastActivityAt ?? now,
24
+ updatedAt: now,
25
+ };
26
+ await writeStore(store);
27
+ }
28
+ export async function forgetHermesSession(sessionKeyOrId, hermesSessionId) {
29
+ const store = await readStore();
30
+ const normalizedSessionKey = sessionKeyOrId.trim();
31
+ const normalizedHermesId = hermesSessionId?.trim() || normalizedSessionKey;
32
+ let changed = false;
33
+ for (const [key, item] of Object.entries(store.sessions)) {
34
+ if (key === normalizedSessionKey || item.sessionKey === normalizedSessionKey || item.hermesSessionId === normalizedHermesId) {
35
+ delete store.sessions[key];
36
+ changed = true;
37
+ }
38
+ }
39
+ if (changed) {
40
+ await writeStore(store);
41
+ }
42
+ }
43
+ export async function listStoredHermesSessions() {
44
+ const store = await readStore();
45
+ return Object.values(store.sessions).map((item) => ({
46
+ sessionKey: item.sessionKey,
47
+ hermesSessionId: item.hermesSessionId,
48
+ displayName: item.displayName,
49
+ derivedTitle: item.displayName,
50
+ label: item.preview,
51
+ lastActivityAt: item.lastActivityAt ?? item.updatedAt,
52
+ kind: "hermes",
53
+ }));
54
+ }
55
+ export function mergeLiveHermesSessionsWithStoredAliases(liveSessions, storedSessions) {
56
+ if (liveSessions.length === 0) {
57
+ return sortHermesSessions(storedSessions);
58
+ }
59
+ return sortHermesSessions(liveSessions.map((liveSession) => {
60
+ const aliases = storedSessions.filter((stored) => stored.hermesSessionId === liveSession.hermesSessionId);
61
+ const preferredAlias = aliases.find((stored) => !stored.sessionKey.toLowerCase().startsWith("hermes:"))
62
+ ?? aliases[0];
63
+ if (!preferredAlias) {
64
+ return liveSession;
65
+ }
66
+ return {
67
+ ...liveSession,
68
+ sessionKey: preferredAlias.sessionKey,
69
+ displayName: liveSession.displayName ?? preferredAlias.displayName,
70
+ derivedTitle: liveSession.derivedTitle ?? preferredAlias.derivedTitle,
71
+ label: liveSession.label ?? preferredAlias.label,
72
+ lastActivityAt: liveSession.lastActivityAt ?? preferredAlias.lastActivityAt,
73
+ };
74
+ }));
75
+ }
76
+ export function parseHermesSessionsList(output, now = new Date()) {
77
+ const items = [];
78
+ for (const rawLine of output.split(/\r?\n/)) {
79
+ const line = rawLine.trim();
80
+ if (!line || line.startsWith("Title ") || line.startsWith("─")) {
81
+ continue;
82
+ }
83
+ const idMatch = line.match(HERMES_ID_PATTERN);
84
+ if (!idMatch) {
85
+ continue;
86
+ }
87
+ const hermesSessionId = idMatch[0];
88
+ const beforeId = line.slice(0, idMatch.index).trimEnd();
89
+ const columns = beforeId.split(/\s{2,}/).map((value) => value.trim()).filter(Boolean);
90
+ const title = columns[0] && columns[0] !== "—" ? columns[0] : undefined;
91
+ const preview = columns.length > 1 && columns[1] !== "—" ? columns[1] : undefined;
92
+ const lastActiveText = columns.length > 2 ? columns.slice(2).join(" ") : undefined;
93
+ items.push({
94
+ sessionKey: `hermes:${hermesSessionId}`,
95
+ hermesSessionId,
96
+ displayName: title ?? preview ?? hermesSessionId,
97
+ derivedTitle: title ?? preview,
98
+ label: preview,
99
+ lastActivityAt: parseRelativeLastActive(lastActiveText, now),
100
+ kind: "hermes",
101
+ });
102
+ }
103
+ return items;
104
+ }
105
+ function sortHermesSessions(sessions) {
106
+ return [...sessions].sort((left, right) => {
107
+ const leftTime = left.lastActivityAt ? Date.parse(left.lastActivityAt) : 0;
108
+ const rightTime = right.lastActivityAt ? Date.parse(right.lastActivityAt) : 0;
109
+ return rightTime - leftTime;
110
+ });
111
+ }
112
+ async function readStore() {
113
+ if (!existsSync(STORE_PATH)) {
114
+ return { version: 1, sessions: {} };
115
+ }
116
+ try {
117
+ const raw = await readFile(STORE_PATH, "utf8");
118
+ const parsed = JSON.parse(raw);
119
+ return {
120
+ version: 1,
121
+ sessions: parsed.sessions && typeof parsed.sessions === "object" ? parsed.sessions : {},
122
+ };
123
+ }
124
+ catch {
125
+ return { version: 1, sessions: {} };
126
+ }
127
+ }
128
+ async function writeStore(store) {
129
+ await mkdir(dirname(STORE_PATH), { recursive: true });
130
+ await writeFile(STORE_PATH, JSON.stringify(store, null, 2), "utf8");
131
+ }
132
+ function parseRelativeLastActive(value, now) {
133
+ const normalized = value?.trim().toLowerCase();
134
+ if (!normalized) {
135
+ return undefined;
136
+ }
137
+ if (normalized === "just now" || normalized === "now") {
138
+ return now.toISOString();
139
+ }
140
+ const match = normalized.match(/^(\d+)\s*(s|sec|secs|m|min|mins|h|hr|hrs|d|day|days)\s+ago$/);
141
+ if (!match) {
142
+ return undefined;
143
+ }
144
+ const amount = Number.parseInt(match[1], 10);
145
+ const unit = match[2];
146
+ const ms = unit.startsWith("s") ? amount * 1000
147
+ : unit.startsWith("m") ? amount * 60_000
148
+ : unit.startsWith("h") ? amount * 3_600_000
149
+ : amount * 86_400_000;
150
+ return new Date(now.getTime() - ms).toISOString();
151
+ }
152
+ //# sourceMappingURL=hermes-session-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermes-session-store.js","sourceRoot":"","sources":["../../src/hermes/hermes-session-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export type PreparedHermesVoiceInput = {
2
+ method: "chat.send";
3
+ params: unknown;
4
+ run: {
5
+ runId: string;
6
+ sessionKey: string;
7
+ };
8
+ };
9
+ export declare function prepareHermesVoiceInputCommand(params: unknown, options: {
10
+ requestId?: string;
11
+ }): Promise<PreparedHermesVoiceInput>;
12
+ export declare function resolveHermesVoiceInputRunId(params: unknown, requestId?: string): string;
13
+ export declare function resolveHermesVoiceInputSessionKey(params: unknown): string;
@@ -0,0 +1,27 @@
1
+ import { prepareVoiceSendParams } from "../relay/voice-input.js";
2
+ export async function prepareHermesVoiceInputCommand(params, options) {
3
+ return {
4
+ method: "chat.send",
5
+ params: await prepareVoiceSendParams(params),
6
+ run: {
7
+ runId: resolveHermesVoiceInputRunId(params, options.requestId),
8
+ sessionKey: resolveHermesVoiceInputSessionKey(params),
9
+ },
10
+ };
11
+ }
12
+ export function resolveHermesVoiceInputRunId(params, requestId) {
13
+ const record = params && typeof params === "object" && !Array.isArray(params)
14
+ ? params
15
+ : {};
16
+ const idempotencyKey = typeof record.idempotencyKey === "string" ? record.idempotencyKey.trim() : "";
17
+ const relayRequestId = typeof requestId === "string" ? requestId.trim() : "";
18
+ return idempotencyKey || relayRequestId || `hermes-${Date.now()}`;
19
+ }
20
+ export function resolveHermesVoiceInputSessionKey(params) {
21
+ const record = params && typeof params === "object" && !Array.isArray(params)
22
+ ? params
23
+ : {};
24
+ const sessionKey = typeof record.sessionKey === "string" ? record.sessionKey.trim() : "";
25
+ return sessionKey || "main";
26
+ }
27
+ //# sourceMappingURL=hermes-voice-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermes-voice-input.js","sourceRoot":"","sources":["../../src/hermes/hermes-voice-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAWjE,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,MAAe,EACf,OAEC;IAED,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE,MAAM,sBAAsB,CAAC,MAAM,CAAC;QAC5C,GAAG,EAAE;YACH,KAAK,EAAE,4BAA4B,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC;YAC9D,UAAU,EAAE,iCAAiC,CAAC,MAAM,CAAC;SACtD;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,MAAe,EAAE,SAAkB;IAC9E,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAC3E,CAAC,CAAE,MAAkC;QACrC,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,cAAc,GAAG,OAAO,MAAM,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACrG,MAAM,cAAc,GAAG,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,OAAO,cAAc,IAAI,cAAc,IAAI,UAAU,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,MAAe;IAC/D,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAC3E,CAAC,CAAE,MAAkC;QACrC,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,UAAU,GAAG,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACzF,OAAO,UAAU,IAAI,MAAM,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function extractDeliverablePaths(text: string, options?: {
2
+ userMessage?: string;
3
+ }): string[];
@@ -0,0 +1,65 @@
1
+ import { existsSync } from "fs";
2
+ import { homedir } from "os";
3
+ import { extname, join, resolve } from "path";
4
+ export function extractDeliverablePaths(text, options = {}) {
5
+ if (options.userMessage !== undefined && !hasDeliverableSendIntent(options.userMessage)) {
6
+ return [];
7
+ }
8
+ const allowed = new Set([
9
+ ".png", ".jpg", ".jpeg", ".gif", ".webp", ".bmp", ".tiff", ".svg",
10
+ ".mp4", ".mov", ".avi", ".mkv", ".webm",
11
+ ".mp3", ".wav", ".ogg", ".m4a", ".flac",
12
+ ".pdf", ".docx", ".doc", ".odt", ".rtf", ".txt", ".md",
13
+ ".xlsx", ".xls", ".csv", ".tsv", ".json", ".xml", ".yaml", ".yml",
14
+ ".pptx", ".ppt", ".odp", ".zip", ".tar", ".gz", ".tgz", ".bz2", ".7z",
15
+ ".html", ".htm",
16
+ ]);
17
+ const paths = new Set();
18
+ const pattern = /(?:^|[\s("'`::])((?:~|\/)[^\s"'`<>|]+?\.[A-Za-z0-9]{1,8})(?=$|[\s).,"'`])/g;
19
+ for (const match of text.matchAll(pattern)) {
20
+ const rawPath = match[1];
21
+ const absolutePath = rawPath.startsWith("~/") ? join(homedir(), rawPath.slice(2)) : rawPath;
22
+ if (allowed.has(extname(absolutePath).toLowerCase()) && existsSync(resolve(absolutePath))) {
23
+ paths.add(resolve(absolutePath));
24
+ }
25
+ }
26
+ return [...paths];
27
+ }
28
+ function hasDeliverableSendIntent(message) {
29
+ const text = message.trim().toLowerCase();
30
+ if (!text) {
31
+ return false;
32
+ }
33
+ if (/(不要|不用|别|无需|不需要).{0,20}(发|发送|传|上传|转发|分享|附件|attach|send|upload|share|deliver)/.test(text)
34
+ || /(只要|仅要).{0,20}(路径|文件名|名字|文本|文字)/.test(text)
35
+ || /\b(do not|don't|dont|no need to|without|not need to)\b.{0,30}\b(send|upload|attach|share|deliver)\b/.test(text)
36
+ || /\bonly\b.{0,30}\b(path|filename|file name|text)\b/.test(text)) {
37
+ return false;
38
+ }
39
+ const deliverableWords = [
40
+ "文件", "图片", "照片", "图", "附件", "文档", "报告", "表格", "截图", "压缩包", "备份", "录音", "音频", "视频",
41
+ "file", "image", "photo", "picture", "attachment", "document", "report", "spreadsheet", "screenshot", "archive",
42
+ "zip", "pdf", "doc", "docx", "xlsx", "ppt", "pptx",
43
+ ].join("|");
44
+ const sendVerbs = [
45
+ "发", "发送", "传", "上传", "转发", "分享", "发给", "传给", "send", "upload", "attach", "share", "deliver",
46
+ ].join("|");
47
+ if (new RegExp(`(你.{0,6}(能|可以|会)|能不能|可不可以|能否|是否|会不会|支持).{0,30}(${sendVerbs}).{0,30}(${deliverableWords}).{0,8}(吗|么|嘛|\\?|?)?`).test(text)) {
48
+ return false;
49
+ }
50
+ const directChinesePatterns = [
51
+ new RegExp(`(把|将).{0,50}(${deliverableWords}).{0,30}(${sendVerbs})(给我|到手机|到移动端|过来|回来|一下|给这边)?`),
52
+ new RegExp(`(${sendVerbs})(这张|这个|这份|该|那张|那份|一张|几张|一些|些|一下)?[^,。,.!??]{0,24}(${deliverableWords})(给我|到手机|到移动端|过来|回来|一下|给这边)?`),
53
+ new RegExp(`(${sendVerbs})(给我|到手机|到移动端|过来|回来).{0,50}(${deliverableWords})?`),
54
+ new RegExp(`(给我|帮我).{0,20}(${sendVerbs}).{0,50}(${deliverableWords})`),
55
+ ];
56
+ if (directChinesePatterns.some((pattern) => pattern.test(text))) {
57
+ return true;
58
+ }
59
+ const englishPatterns = [
60
+ new RegExp(`\\b(send|upload|attach|share|deliver)\\b.{0,50}\\b(${deliverableWords})\\b`),
61
+ new RegExp(`\\b(${deliverableWords})\\b.{0,50}\\b(send|upload|attach|share|deliver)\\b`),
62
+ ];
63
+ return englishPatterns.some((pattern) => pattern.test(text));
64
+ }
65
+ //# sourceMappingURL=hermes-runtime-artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermes-runtime-artifacts.js","sourceRoot":"","sources":["../../../src/hermes/models/hermes-runtime-artifacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { LocalResult } from "../../commands/local-runtime.js";
2
+ export declare function runHermesBackupCreate(params: unknown): LocalResult;
3
+ export declare function runHermesBackupList(): LocalResult;
4
+ export declare function runHermesBackupDelete(params: unknown): LocalResult;
5
+ export declare function runHermesBackupRestore(params: unknown): LocalResult;
@@ -0,0 +1,128 @@
1
+ import { readdirSync, statSync, unlinkSync } from "fs";
2
+ import { homedir } from "os";
3
+ import { basename, join, resolve } from "path";
4
+ import { HERMES_HOME_DIR, runHermes } from "./hermes-runtime-process.js";
5
+ import { runHermesOutput } from "./hermes-runtime-command-utils.js";
6
+ import { sanitizeFileName, stringParam, toRecord } from "./hermes-runtime-values.js";
7
+ export function runHermesBackupCreate(params) {
8
+ const record = toRecord(params);
9
+ const args = ["backup"];
10
+ const outputPath = normalizeHermesBackupOutputPath(record);
11
+ if (outputPath)
12
+ args.push("--output", outputPath);
13
+ if (record.quick === true)
14
+ args.push("--quick");
15
+ const label = stringParam(record, "label", "title");
16
+ if (label)
17
+ args.push("--label", label);
18
+ const output = runHermes(args, 10 * 60_000);
19
+ const backup = backupRecordFromOutput(output);
20
+ if (!backup) {
21
+ return { ok: false, error: output.trim() || "backup_archive_not_created" };
22
+ }
23
+ return { ok: true, payload: { output, backup, backups: listHermesBackups(), maxBackups: 0 } };
24
+ }
25
+ function normalizeHermesBackupOutputPath(record) {
26
+ const explicit = stringParam(record, "output", "outputPath");
27
+ if (explicit) {
28
+ return explicit;
29
+ }
30
+ const rawFilename = stringParam(record, "filename");
31
+ if (!rawFilename) {
32
+ return undefined;
33
+ }
34
+ if (rawFilename.startsWith("/") || rawFilename.startsWith("~/")) {
35
+ return rawFilename;
36
+ }
37
+ let filename = sanitizeFileName(rawFilename);
38
+ if (!filename.toLowerCase().endsWith(".zip")) {
39
+ filename = `${filename}.zip`;
40
+ }
41
+ if (!filename.startsWith("hermes-backup")) {
42
+ filename = `hermes-backup-${filename}`;
43
+ }
44
+ return join(homedir(), filename);
45
+ }
46
+ export function runHermesBackupList() {
47
+ return { ok: true, payload: { backups: listHermesBackups(), maxBackups: 0 } };
48
+ }
49
+ export function runHermesBackupDelete(params) {
50
+ const id = stringParam(toRecord(params), "backupId", "id", "path");
51
+ if (!id)
52
+ return { ok: false, error: "backup_id_required" };
53
+ const backup = findHermesBackup(id);
54
+ if (!backup)
55
+ return { ok: false, error: "backup_not_found" };
56
+ const backupPath = stringParam(backup, "path");
57
+ if (!backupPath)
58
+ return { ok: false, error: "backup_path_missing" };
59
+ unlinkSync(backupPath);
60
+ return { ok: true, payload: { backup, backups: listHermesBackups(), maxBackups: 0 } };
61
+ }
62
+ export function runHermesBackupRestore(params) {
63
+ const id = stringParam(toRecord(params), "backupId", "id", "path");
64
+ if (!id)
65
+ return { ok: false, error: "backup_id_required" };
66
+ const backup = findHermesBackup(id);
67
+ if (!backup)
68
+ return { ok: false, error: "backup_not_found" };
69
+ const backupPath = stringParam(backup, "path");
70
+ if (!backupPath)
71
+ return { ok: false, error: "backup_path_missing" };
72
+ const result = runHermesOutput(["import", backupPath, "--force"], 10 * 60_000);
73
+ if (!result.ok) {
74
+ return result;
75
+ }
76
+ return {
77
+ ok: true,
78
+ payload: {
79
+ ...(toRecord(result.payload)),
80
+ backup,
81
+ backups: listHermesBackups(),
82
+ maxBackups: 0,
83
+ },
84
+ };
85
+ }
86
+ function backupRecordFromOutput(output) {
87
+ const match = output.match(/Backup complete:\s*(.+\.zip)/);
88
+ const filePath = match?.[1]?.trim();
89
+ return filePath ? backupRecordFromPath(filePath) : undefined;
90
+ }
91
+ function listHermesBackups() {
92
+ const candidates = [homedir(), HERMES_HOME_DIR].flatMap((dir) => {
93
+ try {
94
+ return readdirSync(dir).map((name) => join(dir, name));
95
+ }
96
+ catch {
97
+ return [];
98
+ }
99
+ });
100
+ return candidates
101
+ .filter((filePath) => basename(filePath).startsWith("hermes-backup") && filePath.endsWith(".zip"))
102
+ .map(backupRecordFromPath)
103
+ .filter((item) => Boolean(item))
104
+ .sort((left, right) => String(right.createdAt ?? "").localeCompare(String(left.createdAt ?? "")));
105
+ }
106
+ function findHermesBackup(idOrPath) {
107
+ const resolved = idOrPath.startsWith("/") || idOrPath.startsWith("~") ? resolve(idOrPath.replace(/^~(?=\/)/, homedir())) : undefined;
108
+ return listHermesBackups().find((backup) => backup.id === idOrPath || backup.path === idOrPath || backup.path === resolved);
109
+ }
110
+ function backupRecordFromPath(filePath) {
111
+ try {
112
+ const resolved = resolve(filePath.replace(/^~(?=\/)/, homedir()));
113
+ const stat = statSync(resolved);
114
+ return {
115
+ id: resolved,
116
+ title: basename(resolved),
117
+ filename: basename(resolved),
118
+ path: resolved,
119
+ sizeBytes: stat.size,
120
+ createdAt: stat.birthtime.toISOString(),
121
+ updatedAt: stat.mtime.toISOString(),
122
+ };
123
+ }
124
+ catch {
125
+ return undefined;
126
+ }
127
+ }
128
+ //# sourceMappingURL=hermes-runtime-backups.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermes-runtime-backups.js","sourceRoot":"","sources":["../../../src/hermes/models/hermes-runtime-backups.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { LocalCommandContext } from "../../commands/local-runtime.js";
2
+ import { type HermesSessionItem } from "../hermes-session-store.js";
3
+ import type { HermesChatResult, HermesToolLogEvent, HermesUsageSnapshot } from "./hermes-runtime-types.js";
4
+ export declare function runHermesChat(params: unknown, context?: LocalCommandContext): Promise<HermesChatResult>;
5
+ export declare function isHermesSlashCommandMessage(message: string): boolean;
6
+ export declare function selectHermesSessionForCompletedChat(sessions: HermesSessionItem[], options?: {
7
+ beforeSessions?: HermesSessionItem[];
8
+ resume?: string;
9
+ userMessage?: string;
10
+ }): HermesSessionItem | undefined;
11
+ export declare function runHermesSlashCommand(params: {
12
+ message: string;
13
+ sessionKey: string;
14
+ hermesSessionId?: unknown;
15
+ }): Promise<HermesChatResult>;
16
+ export declare function buildHermesAssistantDeltaPayload(params: {
17
+ runId: string;
18
+ sessionKey: string;
19
+ seq: number;
20
+ timestampMs: number;
21
+ delta: string;
22
+ }): {
23
+ runId: string;
24
+ sessionKey: string;
25
+ state: string;
26
+ role: string;
27
+ seq: number;
28
+ ts: number;
29
+ delta: string;
30
+ message: {
31
+ role: string;
32
+ timestamp: number;
33
+ content: {
34
+ type: string;
35
+ text: string;
36
+ }[];
37
+ };
38
+ };
39
+ export declare function parseHermesToolLogLine(line: string): HermesToolLogEvent | null;
40
+ export declare function buildHermesRuntimeContextHint(snapshot: HermesUsageSnapshot): string | undefined;