@yoooclaw/phone-notifications 1.12.0 → 1.12.2

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 (78) hide show
  1. package/README.md +212 -29
  2. package/dist/bin/ntf.cjs +918 -113
  3. package/dist/bin/ntf.cjs.map +15 -10
  4. package/dist/cli/helpers.d.ts +27 -0
  5. package/dist/cli/helpers.d.ts.map +1 -1
  6. package/dist/cli/image-list.d.ts +3 -0
  7. package/dist/cli/image-list.d.ts.map +1 -0
  8. package/dist/cli/image-path.d.ts +3 -0
  9. package/dist/cli/image-path.d.ts.map +1 -0
  10. package/dist/cli/image-status.d.ts +3 -0
  11. package/dist/cli/image-status.d.ts.map +1 -0
  12. package/dist/cli/image-storage-path.d.ts +3 -0
  13. package/dist/cli/image-storage-path.d.ts.map +1 -0
  14. package/dist/cli/index.d.ts.map +1 -1
  15. package/dist/cli/ntf-query.d.ts +11 -0
  16. package/dist/cli/ntf-query.d.ts.map +1 -1
  17. package/dist/cli/ntf-summary-job.d.ts +3 -0
  18. package/dist/cli/ntf-summary-job.d.ts.map +1 -0
  19. package/dist/cli/ntf-summary.d.ts.map +1 -1
  20. package/dist/cli/ntf-sync.d.ts.map +1 -1
  21. package/dist/env.d.ts +3 -0
  22. package/dist/env.d.ts.map +1 -1
  23. package/dist/image/handler.d.ts +19 -0
  24. package/dist/image/handler.d.ts.map +1 -0
  25. package/dist/image/index.d.ts +3 -0
  26. package/dist/image/index.d.ts.map +1 -0
  27. package/dist/image/store.d.ts +76 -0
  28. package/dist/image/store.d.ts.map +1 -0
  29. package/dist/index.cjs +9089 -7137
  30. package/dist/index.cjs.map +40 -35
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/light-rules/client.d.ts +58 -0
  33. package/dist/light-rules/client.d.ts.map +1 -0
  34. package/dist/light-rules/gateway.d.ts.map +1 -1
  35. package/dist/light-rules/types.d.ts +13 -8
  36. package/dist/light-rules/types.d.ts.map +1 -1
  37. package/dist/notification/storage.d.ts +1 -0
  38. package/dist/notification/storage.d.ts.map +1 -1
  39. package/dist/notification/summary.d.ts +144 -0
  40. package/dist/notification/summary.d.ts.map +1 -0
  41. package/dist/plugin/images.d.ts +16 -0
  42. package/dist/plugin/images.d.ts.map +1 -0
  43. package/dist/plugin/lifecycle.d.ts +2 -0
  44. package/dist/plugin/lifecycle.d.ts.map +1 -1
  45. package/dist/plugin/light-rules-tools.d.ts +2 -2
  46. package/dist/plugin/light-rules-tools.d.ts.map +1 -1
  47. package/dist/plugin/notifications.d.ts +5 -3
  48. package/dist/plugin/notifications.d.ts.map +1 -1
  49. package/dist/plugin/recordings.d.ts.map +1 -1
  50. package/dist/recording/handler.d.ts +1 -0
  51. package/dist/recording/handler.d.ts.map +1 -1
  52. package/dist/recording/index.d.ts +1 -0
  53. package/dist/recording/index.d.ts.map +1 -1
  54. package/dist/recording/result-writer.d.ts +9 -0
  55. package/dist/recording/result-writer.d.ts.map +1 -0
  56. package/dist/recording/storage.d.ts +2 -0
  57. package/dist/recording/storage.d.ts.map +1 -1
  58. package/dist/recording/transcript-document.d.ts +1 -0
  59. package/dist/recording/transcript-document.d.ts.map +1 -1
  60. package/dist/tunnel/frame-slimmer.d.ts +37 -0
  61. package/dist/tunnel/frame-slimmer.d.ts.map +1 -0
  62. package/dist/tunnel/proxy.d.ts.map +1 -1
  63. package/dist/types.d.ts +120 -0
  64. package/dist/types.d.ts.map +1 -1
  65. package/dist/update/checker.d.ts +2 -1
  66. package/dist/update/checker.d.ts.map +1 -1
  67. package/dist/update/index.d.ts.map +1 -1
  68. package/openclaw.plugin.json +13 -1
  69. package/package.json +3 -2
  70. package/skills/notification-monitor/SKILL.md +14 -13
  71. package/skills/notification-query/SKILL.md +101 -7
  72. package/skills/notification-to-memory/SKILL.md +57 -22
  73. package/skills/notification-to-memory/references/step-0-preflight.md +0 -40
  74. package/skills/notification-to-memory/references/step-1-scan-pending.md +0 -137
  75. package/skills/notification-to-memory/references/step-2-process-dates.md +0 -98
  76. package/skills/notification-to-memory/references/step-3-check-cron-status.md +0 -38
  77. package/skills/notification-to-memory/references/step-4-final-reporting.md +0 -57
  78. package/skills/notification-to-memory/scripts/select-memory-prompt.sh +0 -18
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../node_modules/ws/lib/constants.js", "../node_modules/ws/lib/buffer-util.js", "../node_modules/ws/lib/limiter.js", "../node_modules/ws/lib/permessage-deflate.js", "../node_modules/ws/lib/validation.js", "../node_modules/ws/lib/receiver.js", "../node_modules/ws/lib/sender.js", "../node_modules/ws/lib/event-target.js", "../node_modules/ws/lib/extension.js", "../node_modules/ws/lib/websocket.js", "../node_modules/ws/lib/stream.js", "../node_modules/ws/lib/subprotocol.js", "../node_modules/ws/lib/websocket-server.js", "../src/logger.ts", "../src/version.ts", "../src/light/repeat.ts", "../src/cli/helpers.ts", "../src/light/validators.ts", "../src/light-rules/names.ts", "../src/light-rules/storage.ts", "../src/light-rules/gateway.ts", "../src/light-rules/registry.ts", "../src/light/protocol.ts", "../src/plugin/light-rules-tools.ts", "../src/auth/credentials.ts", "../src/profile/detect.ts", "../src/profile/paths.ts", "../src/profile/runtime-paths.ts", "../src/light/sender.ts", "../src/env.ts", "../src/light-rules/inline-evaluator.ts", "../src/light-rules/evaluation-scheduler.ts", "../src/light-rules/pi-invoker.ts", "../src/host-sdk.ts", "../src/profile/llm/openclaw.ts", "../src/profile/llm/jvsclaw.ts", "../src/profile/llm/index.ts", "../src/index.ts", "../src/update/channel.ts", "../src/update/index.ts", "../src/plugin/shared.ts", "../src/plugin/runtime-state.ts", "../src/update/semver.ts", "../src/update/checker.ts", "../src/update/executor.ts", "../src/update/restart.ts", "../src/plugin/auto-update.ts", "../src/plugin/cli.ts", "../src/cli/auth.ts", "../src/cli/ntf-query.ts", "../src/cli/ntf-search.ts", "../src/cli/ntf-summary.ts", "../src/cli/ntf-stats.ts", "../src/cli/ntf-sync.ts", "../src/cli/ntf-monitor.ts", "../src/monitor/fetch-gen.ts", "../src/cli/light-send.ts", "../src/cli/light-setup-tools.ts", "../src/tunnel/status.ts", "../src/cli/tunnel-status.ts", "../src/cli/ntf-storage-path.ts", "../src/cli/log-search.ts", "../src/cli/env.ts", "../src/cli/doctor.ts", "../src/cli/doctor/check-dangerous-flags.ts", "../src/cli/doctor/check-trusted-proxy.ts", "../src/cli/doctor/check-state-dir-perms.ts", "../src/cli/doctor/check-tool-policy.ts", "../src/cli/doctor/check-credentials.ts", "../src/cli/doctor/check-tunnel.ts", "../src/cli/doctor/check-node-version.ts", "../src/cli/doctor/check-plugin-version.ts", "../src/cli/doctor/checkers.ts", "../src/cli/rec-list.ts", "../src/cli/rec-status.ts", "../src/cli/rec-storage-path.ts", "../src/cli/rec-setup.ts", "../src/cli/update.ts", "../src/cli/index.ts", "../src/plugin/ntf-bin.ts", "../src/plugin/light-control.ts", "../src/plugin/lifecycle.ts", "../src/notification/app-name-map.ts", "../src/notification/storage.ts", "../src/notification/feishu-normalize.ts", "../src/ingest-context.ts", "../src/recording/storage.ts", "../src/recording/state-machine.ts", "../src/recording/transcript-document.ts", "../src/recording/downloader.ts", "../src/recording/asr.ts", "../src/recording/whisper-local.ts", "../src/recording/handler.ts", "../src/tunnel/service.ts", "../src/tunnel/relay-client.ts", "../node_modules/ws/wrapper.mjs", "../src/tunnel/utils.ts", "../src/tunnel/proxy.ts", "../src/tunnel/device-identity.ts", "../src/tunnel/http-proxy.ts", "../src/tunnel/ws-proxy.ts", "../src/tunnel/connect-status-reporter.ts", "../src/profile/auth/base-apikey.ts", "../src/profile/auth/openclaw.ts", "../src/profile/auth/arkclaw.ts", "../src/profile/auth/jvsclaw.ts", "../src/profile/auth/index.ts", "../src/plugin/notifications.ts", "../src/plugin/recordings.ts", "../src/plugin/runtime-mode.ts"],
3
+ "sources": ["../node_modules/ws/lib/constants.js", "../node_modules/ws/lib/buffer-util.js", "../node_modules/ws/lib/limiter.js", "../node_modules/ws/lib/permessage-deflate.js", "../node_modules/ws/lib/validation.js", "../node_modules/ws/lib/receiver.js", "../node_modules/ws/lib/sender.js", "../node_modules/ws/lib/event-target.js", "../node_modules/ws/lib/extension.js", "../node_modules/ws/lib/websocket.js", "../node_modules/ws/lib/stream.js", "../node_modules/ws/lib/subprotocol.js", "../node_modules/ws/lib/websocket-server.js", "../src/logger.ts", "../src/version.ts", "../src/cli/helpers.ts", "../src/cli/ntf-query.ts", "../src/notification/summary.ts", "../src/notification/storage.ts", "../src/notification/feishu-normalize.ts", "../src/ingest-context.ts", "../src/light/repeat.ts", "../src/light/validators.ts", "../src/light-rules/names.ts", "../src/light-rules/storage.ts", "../src/light-rules/gateway.ts", "../src/light/protocol.ts", "../src/auth/credentials.ts", "../src/profile/detect.ts", "../src/profile/paths.ts", "../src/profile/runtime-paths.ts", "../src/env.ts", "../src/light-rules/client.ts", "../src/plugin/light-rules-tools.ts", "../src/light-rules/registry.ts", "../src/index.ts", "../src/update/channel.ts", "../src/update/index.ts", "../src/plugin/shared.ts", "../src/plugin/runtime-state.ts", "../src/update/semver.ts", "../src/update/checker.ts", "../src/update/executor.ts", "../src/update/restart.ts", "../src/plugin/auto-update.ts", "../src/plugin/cli.ts", "../src/cli/auth.ts", "../src/cli/ntf-search.ts", "../src/cli/ntf-summary.ts", "../src/cli/ntf-summary-job.ts", "../src/cli/ntf-stats.ts", "../src/cli/ntf-sync.ts", "../src/cli/ntf-monitor.ts", "../src/monitor/fetch-gen.ts", "../src/light/sender.ts", "../src/cli/light-send.ts", "../src/cli/light-setup-tools.ts", "../src/tunnel/status.ts", "../src/cli/tunnel-status.ts", "../src/cli/ntf-storage-path.ts", "../src/cli/log-search.ts", "../src/cli/env.ts", "../src/cli/doctor.ts", "../src/cli/doctor/check-dangerous-flags.ts", "../src/cli/doctor/check-trusted-proxy.ts", "../src/cli/doctor/check-state-dir-perms.ts", "../src/cli/doctor/check-tool-policy.ts", "../src/cli/doctor/check-credentials.ts", "../src/cli/doctor/check-tunnel.ts", "../src/cli/doctor/check-node-version.ts", "../src/cli/doctor/check-plugin-version.ts", "../src/cli/doctor/checkers.ts", "../src/cli/rec-list.ts", "../src/cli/rec-status.ts", "../src/cli/rec-storage-path.ts", "../src/cli/rec-setup.ts", "../src/cli/image-list.ts", "../src/cli/image-status.ts", "../src/cli/image-path.ts", "../src/cli/image-storage-path.ts", "../src/cli/update.ts", "../src/cli/index.ts", "../src/plugin/ntf-bin.ts", "../src/plugin/lifecycle.ts", "../src/notification/app-name-map.ts", "../src/recording/storage.ts", "../src/recording/state-machine.ts", "../src/recording/transcript-document.ts", "../src/recording/downloader.ts", "../src/recording/asr.ts", "../src/recording/whisper-local.ts", "../src/recording/handler.ts", "../src/recording/result-writer.ts", "../src/image/store.ts", "../src/image/handler.ts", "../src/tunnel/service.ts", "../src/tunnel/relay-client.ts", "../node_modules/ws/wrapper.mjs", "../src/tunnel/utils.ts", "../src/tunnel/proxy.ts", "../src/host-sdk.ts", "../src/tunnel/device-identity.ts", "../src/tunnel/http-proxy.ts", "../src/tunnel/ws-proxy.ts", "../src/tunnel/frame-slimmer.ts", "../src/tunnel/connect-status-reporter.ts", "../src/profile/auth/base-apikey.ts", "../src/profile/auth/openclaw.ts", "../src/profile/auth/arkclaw.ts", "../src/profile/auth/jvsclaw.ts", "../src/profile/auth/index.ts", "../src/plugin/notifications.ts", "../src/plugin/recordings.ts", "../src/plugin/images.ts", "../src/plugin/runtime-mode.ts"],
4
4
  "sourcesContent": [
5
5
  "'use strict';\n\nconst BINARY_TYPES = ['nodebuffer', 'arraybuffer', 'fragments'];\nconst hasBlob = typeof Blob !== 'undefined';\n\nif (hasBlob) BINARY_TYPES.push('blob');\n\nmodule.exports = {\n BINARY_TYPES,\n CLOSE_TIMEOUT: 30000,\n EMPTY_BUFFER: Buffer.alloc(0),\n GUID: '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',\n hasBlob,\n kForOnEventAttribute: Symbol('kIsForOnEventAttribute'),\n kListener: Symbol('kListener'),\n kStatusCode: Symbol('status-code'),\n kWebSocket: Symbol('websocket'),\n NOOP: () => {}\n};\n",
6
6
  "'use strict';\n\nconst { EMPTY_BUFFER } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\n\n/**\n * Merges an array of buffers into a new buffer.\n *\n * @param {Buffer[]} list The array of buffers to concat\n * @param {Number} totalLength The total length of buffers in the list\n * @return {Buffer} The resulting buffer\n * @public\n */\nfunction concat(list, totalLength) {\n if (list.length === 0) return EMPTY_BUFFER;\n if (list.length === 1) return list[0];\n\n const target = Buffer.allocUnsafe(totalLength);\n let offset = 0;\n\n for (let i = 0; i < list.length; i++) {\n const buf = list[i];\n target.set(buf, offset);\n offset += buf.length;\n }\n\n if (offset < totalLength) {\n return new FastBuffer(target.buffer, target.byteOffset, offset);\n }\n\n return target;\n}\n\n/**\n * Masks a buffer using the given mask.\n *\n * @param {Buffer} source The buffer to mask\n * @param {Buffer} mask The mask to use\n * @param {Buffer} output The buffer where to store the result\n * @param {Number} offset The offset at which to start writing\n * @param {Number} length The number of bytes to mask.\n * @public\n */\nfunction _mask(source, mask, output, offset, length) {\n for (let i = 0; i < length; i++) {\n output[offset + i] = source[i] ^ mask[i & 3];\n }\n}\n\n/**\n * Unmasks a buffer using the given mask.\n *\n * @param {Buffer} buffer The buffer to unmask\n * @param {Buffer} mask The mask to use\n * @public\n */\nfunction _unmask(buffer, mask) {\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] ^= mask[i & 3];\n }\n}\n\n/**\n * Converts a buffer to an `ArrayBuffer`.\n *\n * @param {Buffer} buf The buffer to convert\n * @return {ArrayBuffer} Converted buffer\n * @public\n */\nfunction toArrayBuffer(buf) {\n if (buf.length === buf.buffer.byteLength) {\n return buf.buffer;\n }\n\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length);\n}\n\n/**\n * Converts `data` to a `Buffer`.\n *\n * @param {*} data The data to convert\n * @return {Buffer} The buffer\n * @throws {TypeError}\n * @public\n */\nfunction toBuffer(data) {\n toBuffer.readOnly = true;\n\n if (Buffer.isBuffer(data)) return data;\n\n let buf;\n\n if (data instanceof ArrayBuffer) {\n buf = new FastBuffer(data);\n } else if (ArrayBuffer.isView(data)) {\n buf = new FastBuffer(data.buffer, data.byteOffset, data.byteLength);\n } else {\n buf = Buffer.from(data);\n toBuffer.readOnly = false;\n }\n\n return buf;\n}\n\nmodule.exports = {\n concat,\n mask: _mask,\n toArrayBuffer,\n toBuffer,\n unmask: _unmask\n};\n\n/* istanbul ignore else */\nif (!process.env.WS_NO_BUFFER_UTIL) {\n try {\n const bufferUtil = require('bufferutil');\n\n module.exports.mask = function (source, mask, output, offset, length) {\n if (length < 48) _mask(source, mask, output, offset, length);\n else bufferUtil.mask(source, mask, output, offset, length);\n };\n\n module.exports.unmask = function (buffer, mask) {\n if (buffer.length < 32) _unmask(buffer, mask);\n else bufferUtil.unmask(buffer, mask);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n",
@@ -17,49 +17,48 @@
17
17
  "/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst http = require('http');\nconst { Duplex } = require('stream');\nconst { createHash } = require('crypto');\n\nconst extension = require('./extension');\nconst PerMessageDeflate = require('./permessage-deflate');\nconst subprotocol = require('./subprotocol');\nconst WebSocket = require('./websocket');\nconst { CLOSE_TIMEOUT, GUID, kWebSocket } = require('./constants');\n\nconst keyRegex = /^[+/0-9A-Za-z]{22}==$/;\n\nconst RUNNING = 0;\nconst CLOSING = 1;\nconst CLOSED = 2;\n\n/**\n * Class representing a WebSocket server.\n *\n * @extends EventEmitter\n */\nclass WebSocketServer extends EventEmitter {\n /**\n * Create a `WebSocketServer` instance.\n *\n * @param {Object} options Configuration options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\n * automatically send a pong in response to a ping\n * @param {Number} [options.backlog=511] The maximum length of the queue of\n * pending connections\n * @param {Boolean} [options.clientTracking=true] Specifies whether or not to\n * track clients\n * @param {Number} [options.closeTimeout=30000] Duration in milliseconds to\n * wait for the closing handshake to finish after `websocket.close()` is\n * called\n * @param {Function} [options.handleProtocols] A hook to handle protocols\n * @param {String} [options.host] The hostname where to bind the server\n * @param {Number} [options.maxBufferedChunks=1048576] The maximum number of\n * buffered data chunks\n * @param {Number} [options.maxFragments=131072] The maximum number of message\n * fragments\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Boolean} [options.noServer=false] Enable no server mode\n * @param {String} [options.path] Accept only connections matching this path\n * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable\n * permessage-deflate\n * @param {Number} [options.port] The port where to bind the server\n * @param {(http.Server|https.Server)} [options.server] A pre-created HTTP/S\n * server to use\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @param {Function} [options.verifyClient] A hook to reject connections\n * @param {Function} [options.WebSocket=WebSocket] Specifies the `WebSocket`\n * class to use. It must be the `WebSocket` class or class that extends it\n * @param {Function} [callback] A listener for the `listening` event\n */\n constructor(options, callback) {\n super();\n\n options = {\n allowSynchronousEvents: true,\n autoPong: true,\n maxBufferedChunks: 1024 * 1024,\n maxFragments: 128 * 1024,\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: false,\n handleProtocols: null,\n clientTracking: true,\n closeTimeout: CLOSE_TIMEOUT,\n verifyClient: null,\n noServer: false,\n backlog: null, // use default (511 as implemented in net.js)\n server: null,\n host: null,\n path: null,\n port: null,\n WebSocket,\n ...options\n };\n\n if (\n (options.port == null && !options.server && !options.noServer) ||\n (options.port != null && (options.server || options.noServer)) ||\n (options.server && options.noServer)\n ) {\n throw new TypeError(\n 'One and only one of the \"port\", \"server\", or \"noServer\" options ' +\n 'must be specified'\n );\n }\n\n if (options.port != null) {\n this._server = http.createServer((req, res) => {\n const body = http.STATUS_CODES[426];\n\n res.writeHead(426, {\n 'Content-Length': body.length,\n 'Content-Type': 'text/plain'\n });\n res.end(body);\n });\n this._server.listen(\n options.port,\n options.host,\n options.backlog,\n callback\n );\n } else if (options.server) {\n this._server = options.server;\n }\n\n if (this._server) {\n const emitConnection = this.emit.bind(this, 'connection');\n\n this._removeListeners = addListeners(this._server, {\n listening: this.emit.bind(this, 'listening'),\n error: this.emit.bind(this, 'error'),\n upgrade: (req, socket, head) => {\n this.handleUpgrade(req, socket, head, emitConnection);\n }\n });\n }\n\n if (options.perMessageDeflate === true) options.perMessageDeflate = {};\n if (options.clientTracking) {\n this.clients = new Set();\n this._shouldEmitClose = false;\n }\n\n this.options = options;\n this._state = RUNNING;\n }\n\n /**\n * Returns the bound address, the address family name, and port of the server\n * as reported by the operating system if listening on an IP socket.\n * If the server is listening on a pipe or UNIX domain socket, the name is\n * returned as a string.\n *\n * @return {(Object|String|null)} The address of the server\n * @public\n */\n address() {\n if (this.options.noServer) {\n throw new Error('The server is operating in \"noServer\" mode');\n }\n\n if (!this._server) return null;\n return this._server.address();\n }\n\n /**\n * Stop the server from accepting new connections and emit the `'close'` event\n * when all existing connections are closed.\n *\n * @param {Function} [cb] A one-time listener for the `'close'` event\n * @public\n */\n close(cb) {\n if (this._state === CLOSED) {\n if (cb) {\n this.once('close', () => {\n cb(new Error('The server is not running'));\n });\n }\n\n process.nextTick(emitClose, this);\n return;\n }\n\n if (cb) this.once('close', cb);\n\n if (this._state === CLOSING) return;\n this._state = CLOSING;\n\n if (this.options.noServer || this.options.server) {\n if (this._server) {\n this._removeListeners();\n this._removeListeners = this._server = null;\n }\n\n if (this.clients) {\n if (!this.clients.size) {\n process.nextTick(emitClose, this);\n } else {\n this._shouldEmitClose = true;\n }\n } else {\n process.nextTick(emitClose, this);\n }\n } else {\n const server = this._server;\n\n this._removeListeners();\n this._removeListeners = this._server = null;\n\n //\n // The HTTP/S server was created internally. Close it, and rely on its\n // `'close'` event.\n //\n server.close(() => {\n emitClose(this);\n });\n }\n }\n\n /**\n * See if a given request should be handled by this server instance.\n *\n * @param {http.IncomingMessage} req Request object to inspect\n * @return {Boolean} `true` if the request is valid, else `false`\n * @public\n */\n shouldHandle(req) {\n if (this.options.path) {\n const index = req.url.indexOf('?');\n const pathname = index !== -1 ? req.url.slice(0, index) : req.url;\n\n if (pathname !== this.options.path) return false;\n }\n\n return true;\n }\n\n /**\n * Handle a HTTP Upgrade request.\n *\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @public\n */\n handleUpgrade(req, socket, head, cb) {\n socket.on('error', socketOnError);\n\n const key = req.headers['sec-websocket-key'];\n const upgrade = req.headers.upgrade;\n const version = +req.headers['sec-websocket-version'];\n\n if (req.method !== 'GET') {\n const message = 'Invalid HTTP method';\n abortHandshakeOrEmitwsClientError(this, req, socket, 405, message);\n return;\n }\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n const message = 'Invalid Upgrade header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (key === undefined || !keyRegex.test(key)) {\n const message = 'Missing or invalid Sec-WebSocket-Key header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (version !== 13 && version !== 8) {\n const message = 'Missing or invalid Sec-WebSocket-Version header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message, {\n 'Sec-WebSocket-Version': '13, 8'\n });\n return;\n }\n\n if (!this.shouldHandle(req)) {\n abortHandshake(socket, 400);\n return;\n }\n\n const secWebSocketProtocol = req.headers['sec-websocket-protocol'];\n let protocols = new Set();\n\n if (secWebSocketProtocol !== undefined) {\n try {\n protocols = subprotocol.parse(secWebSocketProtocol);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Protocol header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n const secWebSocketExtensions = req.headers['sec-websocket-extensions'];\n const extensions = {};\n\n if (\n this.options.perMessageDeflate &&\n secWebSocketExtensions !== undefined\n ) {\n const perMessageDeflate = new PerMessageDeflate({\n ...this.options.perMessageDeflate,\n isServer: true,\n maxPayload: this.options.maxPayload\n });\n\n try {\n const offers = extension.parse(secWebSocketExtensions);\n\n if (offers[PerMessageDeflate.extensionName]) {\n perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]);\n extensions[PerMessageDeflate.extensionName] = perMessageDeflate;\n }\n } catch (err) {\n const message =\n 'Invalid or unacceptable Sec-WebSocket-Extensions header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n //\n // Optionally call external client verification handler.\n //\n if (this.options.verifyClient) {\n const info = {\n origin:\n req.headers[`${version === 8 ? 'sec-websocket-origin' : 'origin'}`],\n secure: !!(req.socket.authorized || req.socket.encrypted),\n req\n };\n\n if (this.options.verifyClient.length === 2) {\n this.options.verifyClient(info, (verified, code, message, headers) => {\n if (!verified) {\n return abortHandshake(socket, code || 401, message, headers);\n }\n\n this.completeUpgrade(\n extensions,\n key,\n protocols,\n req,\n socket,\n head,\n cb\n );\n });\n return;\n }\n\n if (!this.options.verifyClient(info)) return abortHandshake(socket, 401);\n }\n\n this.completeUpgrade(extensions, key, protocols, req, socket, head, cb);\n }\n\n /**\n * Upgrade the connection to WebSocket.\n *\n * @param {Object} extensions The accepted extensions\n * @param {String} key The value of the `Sec-WebSocket-Key` header\n * @param {Set} protocols The subprotocols\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @throws {Error} If called more than once with the same socket\n * @private\n */\n completeUpgrade(extensions, key, protocols, req, socket, head, cb) {\n //\n // Destroy the socket if the client has already sent a FIN packet.\n //\n if (!socket.readable || !socket.writable) return socket.destroy();\n\n if (socket[kWebSocket]) {\n throw new Error(\n 'server.handleUpgrade() was called more than once with the same ' +\n 'socket, possibly due to a misconfiguration'\n );\n }\n\n if (this._state > RUNNING) return abortHandshake(socket, 503);\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n const headers = [\n 'HTTP/1.1 101 Switching Protocols',\n 'Upgrade: websocket',\n 'Connection: Upgrade',\n `Sec-WebSocket-Accept: ${digest}`\n ];\n\n const ws = new this.options.WebSocket(null, undefined, this.options);\n\n if (protocols.size) {\n //\n // Optionally call external protocol selection handler.\n //\n const protocol = this.options.handleProtocols\n ? this.options.handleProtocols(protocols, req)\n : protocols.values().next().value;\n\n if (protocol) {\n headers.push(`Sec-WebSocket-Protocol: ${protocol}`);\n ws._protocol = protocol;\n }\n }\n\n if (extensions[PerMessageDeflate.extensionName]) {\n const params = extensions[PerMessageDeflate.extensionName].params;\n const value = extension.format({\n [PerMessageDeflate.extensionName]: [params]\n });\n headers.push(`Sec-WebSocket-Extensions: ${value}`);\n ws._extensions = extensions;\n }\n\n //\n // Allow external modification/inspection of handshake headers.\n //\n this.emit('headers', headers, req);\n\n socket.write(headers.concat('\\r\\n').join('\\r\\n'));\n socket.removeListener('error', socketOnError);\n\n ws.setSocket(socket, head, {\n allowSynchronousEvents: this.options.allowSynchronousEvents,\n maxBufferedChunks: this.options.maxBufferedChunks,\n maxFragments: this.options.maxFragments,\n maxPayload: this.options.maxPayload,\n skipUTF8Validation: this.options.skipUTF8Validation\n });\n\n if (this.clients) {\n this.clients.add(ws);\n ws.on('close', () => {\n this.clients.delete(ws);\n\n if (this._shouldEmitClose && !this.clients.size) {\n process.nextTick(emitClose, this);\n }\n });\n }\n\n cb(ws, req);\n }\n}\n\nmodule.exports = WebSocketServer;\n\n/**\n * Add event listeners on an `EventEmitter` using a map of <event, listener>\n * pairs.\n *\n * @param {EventEmitter} server The event emitter\n * @param {Object.<String, Function>} map The listeners to add\n * @return {Function} A function that will remove the added listeners when\n * called\n * @private\n */\nfunction addListeners(server, map) {\n for (const event of Object.keys(map)) server.on(event, map[event]);\n\n return function removeListeners() {\n for (const event of Object.keys(map)) {\n server.removeListener(event, map[event]);\n }\n };\n}\n\n/**\n * Emit a `'close'` event on an `EventEmitter`.\n *\n * @param {EventEmitter} server The event emitter\n * @private\n */\nfunction emitClose(server) {\n server._state = CLOSED;\n server.emit('close');\n}\n\n/**\n * Handle socket errors.\n *\n * @private\n */\nfunction socketOnError() {\n this.destroy();\n}\n\n/**\n * Close the connection when preconditions are not fulfilled.\n *\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} [message] The HTTP response body\n * @param {Object} [headers] Additional HTTP response headers\n * @private\n */\nfunction abortHandshake(socket, code, message, headers) {\n //\n // The socket is writable unless the user destroyed or ended it before calling\n // `server.handleUpgrade()` or in the `verifyClient` function, which is a user\n // error. Handling this does not make much sense as the worst that can happen\n // is that some of the data written by the user might be discarded due to the\n // call to `socket.end()` below, which triggers an `'error'` event that in\n // turn causes the socket to be destroyed.\n //\n message = message || http.STATUS_CODES[code];\n headers = {\n Connection: 'close',\n 'Content-Type': 'text/html',\n 'Content-Length': Buffer.byteLength(message),\n ...headers\n };\n\n socket.once('finish', socket.destroy);\n\n socket.end(\n `HTTP/1.1 ${code} ${http.STATUS_CODES[code]}\\r\\n` +\n Object.keys(headers)\n .map((h) => `${h}: ${headers[h]}`)\n .join('\\r\\n') +\n '\\r\\n\\r\\n' +\n message\n );\n}\n\n/**\n * Emit a `'wsClientError'` event on a `WebSocketServer` if there is at least\n * one listener for it, otherwise call `abortHandshake()`.\n *\n * @param {WebSocketServer} server The WebSocket server\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} message The HTTP response body\n * @param {Object} [headers] The HTTP response headers\n * @private\n */\nfunction abortHandshakeOrEmitwsClientError(\n server,\n req,\n socket,\n code,\n message,\n headers\n) {\n if (server.listenerCount('wsClientError')) {\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshakeOrEmitwsClientError);\n\n server.emit('wsClientError', err, socket, req);\n } else {\n abortHandshake(socket, code, message, headers);\n }\n}\n",
18
18
  "import { appendFileSync, mkdirSync, readdirSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { PLUGIN_VERSION } from \"./version.js\";\n\nexport interface Logger {\n info: (msg: string) => void;\n warn: (msg: string) => void;\n error: (msg: string) => void;\n}\n\nconst DEFAULT_LOG_RETENTION_DAYS = 30;\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\nexport interface PluginFileLoggerOptions {\n version?: string;\n retentionDays?: number;\n}\n\nconst REDACTED = \"[redacted]\";\nconst REDACTED_SECRET = \"[redacted-secret]\";\nconst REDACTED_URL = \"[redacted-url]\";\n\nconst SECRET_KEYS = [\n \"apiKey\",\n \"api_key\",\n \"appKey\",\n \"authorization\",\n \"password\",\n \"secret\",\n \"token\",\n \"accessToken\",\n \"refreshToken\",\n \"gatewayToken\",\n \"gatewayPassword\",\n \"apnsToken\",\n \"deviceToken\",\n \"X-Api-Key-Id\",\n \"x-api-key-id\",\n \"x-openclaw-password\",\n];\n\nconst USER_TEXT_KEYS = [\n \"accountId\",\n \"body\",\n \"content\",\n \"conversationName\",\n \"deviceId\",\n \"loginAccount\",\n \"metadata\",\n \"name\",\n \"raw\",\n \"rawResponse\",\n \"reason\",\n \"recordResult\",\n \"recordingName\",\n \"resBody\",\n \"response\",\n \"senderName\",\n \"sourceText\",\n \"sourceTextList\",\n \"summary\",\n \"summaryResult\",\n \"summaryText\",\n \"text\",\n \"title\",\n \"transcript\",\n \"transcriptData\",\n \"userId\",\n];\n\nconst USER_URL_KEYS = [\n \"audio\",\n \"audioOssUrl\",\n \"fileUrl\",\n \"oss_audio_url\",\n \"oss_srt_url\",\n \"srt\",\n \"url\",\n];\n\nconst SENSITIVE_QUERY_KEYS = [\n \"access_token\",\n \"api_key\",\n \"apikey\",\n \"authorization\",\n \"fileUrl\",\n \"password\",\n \"refresh_token\",\n \"secret\",\n \"signature\",\n \"token\",\n \"x-api-key-id\",\n \"x-oss-security-token\",\n];\n\nexport function isBetaPluginVersion(version = PLUGIN_VERSION): boolean {\n return /\\bbeta\\b/i.test(version);\n}\n\nexport function createVersionAwareLogger(\n upstream: Logger,\n options: Pick<PluginFileLoggerOptions, \"version\"> = {},\n): Logger {\n if (isBetaPluginVersion(options.version ?? PLUGIN_VERSION)) {\n return upstream;\n }\n\n return {\n info(msg: string) {\n upstream.info(redactLogMessage(msg));\n },\n warn(msg: string) {\n upstream.warn(redactLogMessage(msg));\n },\n error(msg: string) {\n upstream.error(redactLogMessage(msg));\n },\n };\n}\n\n/**\n * 插件级文件 Logger。\n * 在调用原始 api.logger 的同时,把日志追加写入\n * `<stateDir>/plugins/phone-notifications/logs/YYYY-MM-DD.log`。\n * beta 版本保留原始日志;正式版保留 INFO,并对日志里的用户数据做兜底脱敏。\n */\nexport class PluginFileLogger implements Logger {\n private readonly logsDir: string;\n private readonly redactLogs: boolean;\n private readonly retentionDays: number;\n private lastPruneDateKey: string | null = null;\n\n constructor(\n private readonly upstream: Logger,\n stateDir: string,\n options: PluginFileLoggerOptions = {},\n ) {\n this.logsDir = join(stateDir, \"plugins\", \"phone-notifications\", \"logs\");\n this.redactLogs = !isBetaPluginVersion(options.version ?? PLUGIN_VERSION);\n this.retentionDays =\n Number.isFinite(options.retentionDays) && (options.retentionDays ?? 0) > 0\n ? options.retentionDays!\n : DEFAULT_LOG_RETENTION_DAYS;\n\n mkdirSync(this.logsDir, { recursive: true });\n const now = new Date();\n this.pruneExpiredLogs(now);\n this.lastPruneDateKey = formatDate(now);\n }\n\n info(msg: string): void {\n this.prepareLogDate(new Date());\n const safeMsg = this.formatLogMessage(msg);\n this.upstream.info(safeMsg);\n this.append(\"INFO\", safeMsg);\n }\n\n warn(msg: string): void {\n const safeMsg = this.formatLogMessage(msg);\n this.upstream.warn(safeMsg);\n this.append(\"WARN\", safeMsg);\n }\n\n error(msg: string): void {\n const safeMsg = this.formatLogMessage(msg);\n this.upstream.error(safeMsg);\n this.append(\"ERROR\", safeMsg);\n }\n\n private formatLogMessage(msg: string): string {\n return this.redactLogs ? redactLogMessage(msg) : msg;\n }\n\n private append(level: string, msg: string): void {\n const now = new Date();\n const dateKey = this.prepareLogDate(now);\n const time = formatLocalTimestamp(now);\n const line = `${time} [${level}] ${msg}\\n`;\n try {\n appendFileSync(join(this.logsDir, `${dateKey}.log`), line);\n } catch {\n // 写文件失败不影响主流程\n }\n }\n\n private prepareLogDate(now: Date): string {\n const dateKey = formatDate(now);\n if (this.lastPruneDateKey !== dateKey) {\n this.pruneExpiredLogs(now);\n this.lastPruneDateKey = dateKey;\n }\n return dateKey;\n }\n\n private pruneExpiredLogs(now: Date): void {\n const cutoffMs = now.getTime() - this.retentionDays * DAY_MS;\n const cutoffDate = formatDate(new Date(cutoffMs));\n\n try {\n for (const entry of readdirSync(this.logsDir, { withFileTypes: true })) {\n if (!entry.isFile()) continue;\n const match = /^(\\d{4}-\\d{2}-\\d{2})\\.log$/.exec(entry.name);\n if (match && match[1] < cutoffDate) {\n rmSync(join(this.logsDir, entry.name), { force: true });\n }\n }\n } catch {\n // 清理失败不影响主流程\n }\n }\n}\n\nexport function redactLogMessage(msg: string): string {\n let redacted = String(msg);\n\n redacted = redactQuotedObjectFields(redacted, SECRET_KEYS, REDACTED_SECRET);\n redacted = redactQuotedObjectFields(redacted, USER_TEXT_KEYS, REDACTED);\n redacted = redactQuotedObjectFields(redacted, USER_URL_KEYS, REDACTED_URL);\n\n redacted = redactStructuredKeyValueFields(\n redacted,\n SECRET_KEYS,\n REDACTED_SECRET,\n );\n redacted = redactStructuredKeyValueFields(redacted, USER_TEXT_KEYS, REDACTED);\n redacted = redactStructuredKeyValueFields(redacted, USER_URL_KEYS, REDACTED_URL);\n\n redacted = redactKeyValueFields(redacted, SECRET_KEYS, REDACTED_SECRET);\n redacted = redactKeyValueFields(redacted, USER_TEXT_KEYS, REDACTED);\n redacted = redactKeyValueFields(redacted, USER_URL_KEYS, REDACTED_URL);\n\n redacted = redactColonTextFields(redacted, SECRET_KEYS, REDACTED_SECRET);\n redacted = redactColonTextFields(redacted, USER_TEXT_KEYS, REDACTED);\n redacted = redactQueryParams(redacted, SENSITIVE_QUERY_KEYS);\n redacted = redactBearerTokens(redacted);\n redacted = redactLikelyUserUrls(redacted);\n redacted = redactEmails(redacted);\n redacted = redactPhoneNumbers(redacted);\n redacted = redactJwtTokens(redacted);\n redacted = redactLongHexTokens(redacted);\n\n return redacted;\n}\n\nfunction redactQuotedObjectFields(\n input: string,\n keys: string[],\n placeholder: string,\n): string {\n const keyPattern = buildKeyPattern(keys);\n return input.replace(\n new RegExp(\n `([\"'])(${keyPattern})\\\\1\\\\s*:\\\\s*(?:\"(?:\\\\\\\\.|[^\"\\\\\\\\])*\"|'(?:\\\\\\\\.|[^'\\\\\\\\])*'|[^,}\\\\]]+)`,\n \"gi\",\n ),\n (_match, quote: string, key: string) =>\n `${quote}${key}${quote}: \"${placeholder}\"`,\n );\n}\n\nfunction redactKeyValueFields(\n input: string,\n keys: string[],\n placeholder: string,\n): string {\n const keyPattern = buildKeyPattern(keys);\n return input.replace(\n new RegExp(\n `(?<![?&])\\\\b(${keyPattern})\\\\s*=\\\\s*(?:Bearer\\\\s+[^,\\\\s)]+|\"(?:\\\\\\\\.|[^\"\\\\\\\\])*\"|'(?:\\\\\\\\.|[^'\\\\\\\\])*'|[^,\\\\s)]+)`,\n \"gi\",\n ),\n (_match, key: string) => `${key}=${placeholder}`,\n );\n}\n\nfunction redactStructuredKeyValueFields(\n input: string,\n keys: string[],\n placeholder: string,\n): string {\n const keyPattern = buildKeyPattern(keys);\n const regex = new RegExp(`\\\\b(${keyPattern})\\\\s*=\\\\s*([\\\\[{])`, \"gi\");\n let result = \"\";\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(input))) {\n const valueStart = regex.lastIndex - 1;\n const valueEnd = findStructuredValueEnd(input, valueStart);\n if (valueEnd === null) {\n continue;\n }\n\n result += input.slice(lastIndex, match.index);\n result += `${match[1]}=${placeholder}`;\n lastIndex = valueEnd;\n regex.lastIndex = valueEnd;\n }\n\n if (lastIndex === 0) {\n return input;\n }\n\n return result + input.slice(lastIndex);\n}\n\nfunction findStructuredValueEnd(input: string, start: number): number | null {\n const open = input[start];\n const close = open === \"{\" ? \"}\" : \"]\";\n const stack: string[] = [close];\n let quote: string | null = null;\n let escaped = false;\n\n for (let i = start + 1; i < input.length; i++) {\n const ch = input[i];\n\n if (quote) {\n if (escaped) {\n escaped = false;\n } else if (ch === \"\\\\\") {\n escaped = true;\n } else if (ch === quote) {\n quote = null;\n }\n continue;\n }\n\n if (ch === \"\\\"\" || ch === \"'\") {\n quote = ch;\n continue;\n }\n\n if (ch === \"{\" || ch === \"[\") {\n stack.push(ch === \"{\" ? \"}\" : \"]\");\n continue;\n }\n\n if (ch === stack[stack.length - 1]) {\n stack.pop();\n if (stack.length === 0) {\n return i + 1;\n }\n }\n }\n\n return null;\n}\n\nfunction redactColonTextFields(\n input: string,\n keys: string[],\n placeholder: string,\n): string {\n const keyPattern = buildKeyPattern(keys);\n return input.replace(\n new RegExp(`\\\\b(${keyPattern})\\\\s*:\\\\s*([^,\\\\n]+)`, \"gi\"),\n (_match, key: string) => `${key}: ${placeholder}`,\n );\n}\n\nfunction redactQueryParams(input: string, keys: string[]): string {\n const keyPattern = buildKeyPattern(keys);\n return input.replace(\n new RegExp(`([?&](${keyPattern})=)([^&#\\\\s]+)`, \"gi\"),\n (_match, prefix: string) => `${prefix}${encodeURIComponent(REDACTED)}`,\n );\n}\n\nfunction redactBearerTokens(input: string): string {\n return input.replace(\n /\\b(Bearer\\s+)[A-Za-z0-9._~+/=-]+/gi,\n `$1${REDACTED_SECRET}`,\n );\n}\n\nfunction redactJwtTokens(input: string): string {\n return input.replace(\n /\\beyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\b/g,\n REDACTED_SECRET,\n );\n}\n\nfunction redactLongHexTokens(input: string): string {\n return input.replace(/\\b[a-f0-9]{32,}\\b/gi, REDACTED_SECRET);\n}\n\nfunction redactEmails(input: string): string {\n return input.replace(\n /\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b/gi,\n \"[redacted-email]\",\n );\n}\n\nfunction redactPhoneNumbers(input: string): string {\n return input.replace(\n /\\b1[3-9]\\d{9}\\b/g,\n (phone) => `${phone.slice(0, 3)}****${phone.slice(-4)}`,\n );\n}\n\nfunction redactLikelyUserUrls(input: string): string {\n return input.replace(/https?:\\/\\/[^\\s\"',)]+/gi, (rawUrl) =>\n redactUrl(rawUrl),\n );\n}\n\nfunction redactUrl(rawUrl: string): string {\n try {\n const url = new URL(rawUrl);\n for (const key of Array.from(url.searchParams.keys())) {\n if (\n SENSITIVE_QUERY_KEYS.some(\n (sensitiveKey) => sensitiveKey.toLowerCase() === key.toLowerCase(),\n )\n ) {\n url.searchParams.set(key, REDACTED);\n }\n }\n\n if (shouldRedactUrlPath(url)) {\n return `${url.origin}/${REDACTED_URL}`;\n }\n\n return url.toString();\n } catch {\n return rawUrl;\n }\n}\n\nfunction shouldRedactUrlPath(url: URL): boolean {\n const host = url.hostname.toLowerCase();\n const path = decodeURIComponent(url.pathname).toLowerCase();\n if (\n /(^|\\.)((oss|cos|s3|storage|cdn)[.-])/.test(host)\n || /(aliyuncs|myqcloud|amazonaws|oss|storage|cdn)/.test(host)\n ) {\n return true;\n }\n return (\n /\\/(audio|avatar|feedback|log|logs|recording|recordings)\\//.test(path)\n || /\\.(aac|flac|json|m4a|md|mp3|ogg|opus|srt|wav|zip)$/i.test(path)\n );\n}\n\nfunction buildKeyPattern(keys: string[]): string {\n return keys.map(escapeRegExp).join(\"|\");\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction formatDate(d: Date): string {\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n return `${y}-${m}-${day}`;\n}\n\nexport function formatLocalTimestamp(d: Date): string {\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n const hh = String(d.getHours()).padStart(2, \"0\");\n const mm = String(d.getMinutes()).padStart(2, \"0\");\n const ss = String(d.getSeconds()).padStart(2, \"0\");\n const ms = String(d.getMilliseconds()).padStart(3, \"0\");\n\n const offsetMinutes = -d.getTimezoneOffset();\n const sign = offsetMinutes >= 0 ? \"+\" : \"-\";\n const absOffsetMinutes = Math.abs(offsetMinutes);\n const offsetHours = String(Math.floor(absOffsetMinutes / 60)).padStart(2, \"0\");\n const offsetMins = String(absOffsetMinutes % 60).padStart(2, \"0\");\n\n return `${y}-${m}-${day}T${hh}:${mm}:${ss}.${ms}${sign}${offsetHours}:${offsetMins}`;\n}\n",
19
19
  "import { readFileSync } from \"node:fs\";\n\ndeclare const __PLUGIN_VERSION__: string | undefined;\n\ninterface PackageJson {\n version?: string;\n}\n\nfunction readBuildInjectedVersion(): string | undefined {\n if (typeof __PLUGIN_VERSION__ !== \"string\") {\n return undefined;\n }\n\n const version = __PLUGIN_VERSION__.trim();\n return version || undefined;\n}\n\nfunction readPluginVersionFromPackageJson(): string | undefined {\n try {\n const packageJsonUrl = new URL(\"../package.json\", import.meta.url);\n const packageJson = JSON.parse(\n readFileSync(packageJsonUrl, \"utf-8\"),\n ) as PackageJson;\n const version = packageJson.version?.trim();\n return version || undefined;\n } catch {\n return undefined;\n }\n}\n\nexport const PLUGIN_VERSION =\n readBuildInjectedVersion() ??\n readPluginVersionFromPackageJson() ??\n \"unknown\";\n",
20
+ "import { existsSync, readFileSync, readdirSync, mkdirSync } from \"node:fs\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { join, isAbsolute } from \"node:path\";\nimport type { StoredNotification } from \"../notification/storage.js\";\n\n/**\n * Minimal Commander.js Command interface.\n * The real `Command` instance comes from the openclaw runtime at registration time;\n * we only declare the subset we use so that `commander` need not be a direct dep.\n */\nexport interface CliCommand {\n command(nameAndArgs: string): CliCommand;\n description(str: string): CliCommand;\n version(str: string, flags?: string, description?: string): CliCommand;\n option(flags: string, description: string, defaultValue?: string): CliCommand;\n requiredOption(flags: string, description: string): CliCommand;\n action(fn: (...args: any[]) => void | Promise<void>): CliCommand;\n}\n\nexport interface CliContext {\n workspaceDir?: string;\n stateDir?: string;\n}\n\n/** Resolve the notifications storage directory (stateDir → workspace fallback) */\nexport function resolveNotificationsDir(ctx: CliContext): string | null {\n if (ctx.stateDir) {\n const dir = join(\n ctx.stateDir,\n \"plugins\",\n \"phone-notifications\",\n \"notifications\",\n );\n if (existsSync(dir)) return dir;\n }\n if (ctx.workspaceDir) {\n const dir = join(ctx.workspaceDir, \"notifications\");\n if (existsSync(dir)) return dir;\n }\n return null;\n}\n\n/** List available date keys (YYYY-MM-DD) sorted descending */\nexport function listDateKeys(dir: string): string[] {\n const pattern = /^(\\d{4}-\\d{2}-\\d{2})\\.json$/;\n const keys: string[] = [];\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (!entry.isFile()) continue;\n const m = pattern.exec(entry.name);\n if (m) keys.push(m[1]);\n }\n return keys.sort().reverse();\n}\n\n/** Read notifications for a specific date */\nexport function readDateFile(\n dir: string,\n dateKey: string,\n): StoredNotification[] {\n const filePath = join(dir, `${dateKey}.json`);\n if (!existsSync(filePath)) return [];\n try {\n return JSON.parse(readFileSync(filePath, \"utf-8\"));\n } catch {\n return [];\n }\n}\n\n/** Format today as YYYY-MM-DD */\nexport function today(): string {\n return formatDate(new Date());\n}\n\n/** Format a Date as YYYY-MM-DD */\nexport function formatDate(d: Date): string {\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n return `${y}-${m}-${day}`;\n}\n\n/** Get date N days ago as YYYY-MM-DD */\nexport function daysAgo(n: number): string {\n const d = new Date();\n d.setDate(d.getDate() - n);\n return formatDate(d);\n}\n\n/** Filter date keys to a [from, to] range (inclusive) */\nexport function filterDateRange(\n keys: string[],\n from: string,\n to: string,\n): string[] {\n return keys.filter((k) => k >= from && k <= to);\n}\n\n/** Parse an ISO 8601 timestamp and exit with a CLI error on invalid input */\nexport function parseIsoTime(\n value: string,\n optionName: \"--from\" | \"--to\",\n): number {\n const isoPattern =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d{1,3})?)?(Z|[+-]\\d{2}:\\d{2})$/;\n if (!isoPattern.test(value)) {\n exitError(\n \"INVALID_TIME\",\n `${optionName} 必须是 ISO 8601 时间,例如 2026-03-01T09:00:00+08:00`,\n );\n }\n\n const ts = Date.parse(value);\n if (Number.isNaN(ts)) {\n exitError(\n \"INVALID_TIME\",\n `${optionName} 不是合法时间,例如 2026-03-01T09:00:00+08:00`,\n );\n }\n return ts;\n}\n\n/** Sort notifications by timestamp descending (newest first) */\nexport function sortNotificationsByTimestampDesc(\n items: StoredNotification[],\n): StoredNotification[] {\n return items.sort((a, b) => Date.parse(b.timestamp) - Date.parse(a.timestamp));\n}\n\nconst APP_ALIAS_GROUPS = [\n [\"微信\", \"wechat\", \"weixin\", \"com.tencent.mm\", \"com.tencent.xin\"],\n [\"企业微信\", \"wecom\", \"wxwork\", \"com.tencent.wework\"],\n [\"飞书\", \"feishu\", \"lark\", \"com.ss.android.lark\", \"com.bytedance.ee.lark\", \"com.larksuite.suite\"],\n [\"钉钉\", \"dingtalk\", \"com.alibaba.android.rimet\"],\n [\"qq\", \"腾讯qq\", \"com.tencent.mobileqq\"],\n];\n\nfunction normalizeLookupText(value: string): string {\n return value.trim().toLowerCase();\n}\n\nfunction appAliasGroup(value: string): string[] | null {\n const normalized = normalizeLookupText(value);\n if (!normalized) return null;\n return APP_ALIAS_GROUPS.find((group) =>\n group.some((candidate) => normalizeLookupText(candidate) === normalized),\n ) ?? null;\n}\n\nexport function matchesNotificationAppFilter(\n item: StoredNotification,\n app: string,\n): boolean {\n const filter = normalizeLookupText(app);\n if (!filter) return true;\n\n const candidates = [item.appName, item.appDisplayName]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0);\n if (candidates.some((candidate) => normalizeLookupText(candidate) === filter)) {\n return true;\n }\n\n const filterGroup = appAliasGroup(app);\n if (!filterGroup) return false;\n return candidates.some((candidate) => appAliasGroup(candidate) === filterGroup);\n}\n\n/** Async version of listDateKeys */\nexport async function listDateKeysAsync(dir: string): Promise<string[]> {\n const pattern = /^(\\d{4}-\\d{2}-\\d{2})\\.json$/;\n const keys: string[] = [];\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isFile()) continue;\n const m = pattern.exec(entry.name);\n if (m) keys.push(m[1]);\n }\n return keys.sort().reverse();\n}\n\n/** Async version of readDateFile */\nexport async function readDateFileAsync(\n dir: string,\n dateKey: string,\n): Promise<StoredNotification[]> {\n const filePath = join(dir, `${dateKey}.json`);\n if (!existsSync(filePath)) return [];\n try {\n const content = await readFile(filePath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n return [];\n }\n}\n\n/** Write progress message to stderr (visible to caller, won't pollute JSON stdout) */\nexport function progress(message: string): void {\n process.stderr.write(message + \"\\n\");\n}\n\n/** Print JSON result to stdout */\nexport function output(data: unknown): void {\n process.stdout.write(JSON.stringify(data, null, 2) + \"\\n\");\n}\n\n/** Print error JSON and exit with code 1 */\nexport function exitError(code: string, message: string): never {\n output({ ok: false, error: { code, message } });\n process.exit(1);\n}\n\n/** Resolve the recordings storage directory (stateDir → workspace fallback) */\nexport function resolveRecordingsDir(ctx: CliContext): string | null {\n if (ctx.stateDir) {\n const dir = join(\n ctx.stateDir,\n \"plugins\",\n \"phone-notifications\",\n \"recordings\",\n );\n if (existsSync(dir)) return dir;\n }\n if (ctx.workspaceDir) {\n const dir = join(ctx.workspaceDir, \"recordings\");\n if (existsSync(dir)) return dir;\n }\n return null;\n}\n\n/** Recording index entry (mirrors RecordingIndexEntry from storage.ts) */\nexport interface CliRecordingEntry {\n id: string;\n clientLabel?: string;\n metadata: {\n name: string;\n duration_sec: number;\n file_size_bytes: number;\n created_at: string;\n transfer_status: string;\n [key: string]: unknown;\n };\n status: string;\n audioFile?: string;\n srtFile?: string;\n transcriptDataFile?: string;\n transcriptFile?: string;\n summaryFile?: string;\n title?: string;\n lastError?: string;\n ingestedAt: string;\n updatedAt: string;\n}\n\n/** Resolve the asr-config.json path; creates parent dirs if needed */\nexport function resolveAsrConfigPath(ctx: CliContext): string {\n let base: string;\n if (ctx.stateDir) {\n base = join(ctx.stateDir, \"plugins\", \"phone-notifications\", \"recordings\");\n } else if (ctx.workspaceDir) {\n base = join(ctx.workspaceDir, \"recordings\");\n } else {\n exitError(\n \"STORAGE_UNAVAILABLE\",\n \"无法确定录音存储目录:stateDir 和 workspaceDir 均未设置\",\n );\n }\n mkdirSync(base, { recursive: true });\n return join(base, \"asr-config.json\");\n}\n\n/** Mask an API key, keeping first 4 and last 4 chars */\nexport function maskApiKey(key: string): string {\n if (key.length <= 8) return \"***\";\n return `${key.slice(0, 4)}***${key.slice(-4)}`;\n}\n\n/** Read recording index.json */\nexport function readRecordingIndex(\n dir: string,\n): CliRecordingEntry[] {\n const indexPath = join(dir, \"index.json\");\n if (!existsSync(indexPath)) return [];\n try {\n const raw = JSON.parse(readFileSync(indexPath, \"utf-8\"));\n return Array.isArray(raw?.recordings) ? raw.recordings : [];\n } catch {\n return [];\n }\n}\n\n/** Resolve the images storage directory (stateDir → workspace fallback) */\nexport function resolveImagesDir(ctx: CliContext): string | null {\n if (ctx.stateDir) {\n const dir = join(\n ctx.stateDir,\n \"plugins\",\n \"phone-notifications\",\n \"images\",\n );\n if (existsSync(dir)) return dir;\n }\n if (ctx.workspaceDir) {\n const dir = join(ctx.workspaceDir, \"images\");\n if (existsSync(dir)) return dir;\n }\n return null;\n}\n\n/** Image index entry (mirrors ImageIndexEntry from image/store.ts) */\nexport interface CliImageEntry {\n imageId: string;\n clientLabel?: string;\n metadata: {\n oss_image_url: string;\n created_at: string;\n mime_type?: string;\n width?: number;\n height?: number;\n size_bytes?: number;\n source_app?: string;\n caption?: string;\n [key: string]: unknown;\n };\n localFile?: string;\n thumbnail?: string;\n status: string;\n lastError?: string;\n syncedAt?: string;\n}\n\n/** Read image index.json (sorted by created_at desc) */\nexport function readImageIndex(dir: string): CliImageEntry[] {\n const indexPath = join(dir, \"index.json\");\n if (!existsSync(indexPath)) return [];\n try {\n const raw = JSON.parse(readFileSync(indexPath, \"utf-8\"));\n const images: CliImageEntry[] = Array.isArray(raw?.images) ? raw.images : [];\n return images.sort((a, b) =>\n b.metadata.created_at.localeCompare(a.metadata.created_at),\n );\n } catch {\n return [];\n }\n}\n\n/** Resolve an image's stored file to an absolute path */\nexport function resolveImageFile(dir: string, relative: string): string {\n return isAbsolute(relative) ? relative : join(dir, relative);\n}\n",
21
+ "import type { StoredNotification } from \"../notification/storage.js\";\nimport {\n exitError,\n listDateKeysAsync,\n parseIsoTime,\n readDateFileAsync,\n sortNotificationsByTimestampDesc,\n matchesNotificationAppFilter,\n} from \"./helpers.js\";\n\nexport interface RawNotificationQueryOptions {\n from?: string;\n to?: string;\n app?: string;\n sender?: string;\n conversationType?: string;\n keyword?: string;\n limit?: string;\n client?: string;\n}\n\nexport interface NotificationQueryOptions {\n from?: string;\n to?: string;\n app?: string;\n sender?: string;\n conversationType?: string;\n keyword?: string;\n client?: string;\n limit: number;\n fromTs: number | null;\n toTs: number | null;\n fromDateKey: string | null;\n toDateKey: string | null;\n}\n\nexport interface NotificationQueryStats {\n daysScanned: number;\n itemsScanned: number;\n matched: number;\n stoppedAfterLimit: boolean;\n}\n\nexport interface NotificationQueryResult {\n notifications: StoredNotification[];\n stats: NotificationQueryStats;\n}\n\nexport function parsePositiveIntegerOption(\n rawValue: string | undefined,\n defaultValue: number,\n optionName: string,\n errorCode: string,\n): number {\n const value = rawValue && rawValue.length > 0 ? rawValue : String(defaultValue);\n if (!/^\\d+$/.test(value)) {\n exitError(errorCode, `${optionName} 必须是大于 0 的整数`);\n }\n\n const parsed = Number.parseInt(value, 10);\n if (parsed <= 0) {\n exitError(errorCode, `${optionName} 必须是大于 0 的整数`);\n }\n return parsed;\n}\n\nexport function parseNotificationQueryOptions(\n opts: RawNotificationQueryOptions,\n defaultLimit = 100,\n): NotificationQueryOptions {\n const limit = parsePositiveIntegerOption(\n opts.limit,\n defaultLimit,\n \"--limit\",\n \"INVALID_LIMIT\",\n );\n\n if (\n opts.conversationType\n && opts.conversationType !== \"group\"\n && opts.conversationType !== \"private\"\n ) {\n exitError(\n \"INVALID_CONVERSATION_TYPE\",\n \"--conversation-type 只能是 group 或 private\",\n );\n }\n\n const hasFrom = typeof opts.from === \"string\" && opts.from.length > 0;\n const hasTo = typeof opts.to === \"string\" && opts.to.length > 0;\n const fromTs = hasFrom ? parseIsoTime(opts.from!, \"--from\") : null;\n const toTs = hasTo ? parseIsoTime(opts.to!, \"--to\") : null;\n\n if (fromTs !== null && toTs !== null && fromTs > toTs) {\n exitError(\"INVALID_TIME_RANGE\", \"--from 不能晚于 --to\");\n }\n\n return {\n from: opts.from,\n to: opts.to,\n app: opts.app,\n sender: opts.sender,\n conversationType: opts.conversationType,\n keyword: opts.keyword,\n client: opts.client,\n limit,\n fromTs,\n toTs,\n fromDateKey: hasFrom ? opts.from!.slice(0, 10) : null,\n toDateKey: hasTo ? opts.to!.slice(0, 10) : null,\n };\n}\n\nexport function matchesNotificationQuery(\n item: StoredNotification,\n opts: NotificationQueryOptions,\n): boolean {\n if (opts.client && opts.client !== \"all\") {\n const label = item.clientLabel ?? \"legacy\";\n if (label !== opts.client) return false;\n }\n if (opts.app && !matchesNotificationAppFilter(item, opts.app)) return false;\n if (\n opts.conversationType\n && item.conversationType !== opts.conversationType\n ) {\n return false;\n }\n\n const senderHaystack = [item.senderName, item.title]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n .join(\"\\n\");\n if (opts.sender && !senderHaystack.includes(opts.sender)) return false;\n\n const keywordHaystack = [\n item.title,\n item.content,\n item.senderName,\n item.conversationName,\n ]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n .join(\"\\n\");\n if (opts.keyword && !keywordHaystack.includes(opts.keyword)) return false;\n\n const itemTs = Date.parse(item.timestamp);\n if (Number.isNaN(itemTs)) return false;\n if (opts.fromTs !== null && itemTs < opts.fromTs) return false;\n if (opts.toTs !== null && itemTs > opts.toTs) return false;\n\n return true;\n}\n\nexport async function collectMatchingNotifications(\n dir: string,\n opts: NotificationQueryOptions,\n): Promise<StoredNotification[]> {\n const result = await collectMatchingNotificationsWithStats(dir, opts);\n return result.notifications;\n}\n\nexport async function collectMatchingNotificationsWithStats(\n dir: string,\n opts: NotificationQueryOptions,\n): Promise<NotificationQueryResult> {\n const keys = await listDateKeysAsync(dir);\n const results: StoredNotification[] = [];\n const stats: NotificationQueryStats = {\n daysScanned: 0,\n itemsScanned: 0,\n matched: 0,\n stoppedAfterLimit: false,\n };\n\n for (const dateKey of keys) {\n if (opts.fromDateKey && dateKey < opts.fromDateKey) continue;\n if (opts.toDateKey && dateKey > opts.toDateKey) continue;\n\n stats.daysScanned += 1;\n const items = sortNotificationsByTimestampDesc([\n ...(await readDateFileAsync(dir, dateKey)),\n ]);\n for (const item of items) {\n stats.itemsScanned += 1;\n if (!matchesNotificationQuery(item, opts)) continue;\n stats.matched += 1;\n results.push(item);\n if (results.length >= opts.limit) {\n stats.stoppedAfterLimit = true;\n return { notifications: results, stats };\n }\n }\n }\n\n return {\n notifications: sortNotificationsByTimestampDesc(results).slice(0, opts.limit),\n stats,\n };\n}\n",
22
+ "import type { StoredNotification } from \"./storage.js\";\nimport {\n collectMatchingNotificationsWithStats,\n type NotificationQueryOptions,\n type NotificationQueryStats,\n} from \"../cli/ntf-query.js\";\n\nexport type CountRow<T extends Record<string, unknown>> = T & { count: number };\n\nexport const NOTIFICATION_SUMMARY_STATUS_EVENT = \"notification.summary.status\";\nexport const NOTIFICATION_SUMMARY_RESULT_EVENT = \"notification.summary.result\";\nexport const DEFAULT_NOTIFICATION_SUMMARY_LIMIT = 700;\nexport const MAX_NOTIFICATION_SUMMARY_LIMIT = 3000;\nconst DEFAULT_CHUNK_SIZE = 150;\nconst DEFAULT_TOP_LIMIT = 8;\nconst DEFAULT_SAMPLE_LIMIT = 12;\nconst DEFAULT_MAX_CONTENT = 120;\n\nconst ATTENTION_KEYWORDS = [\n \"待办\",\n \"需要\",\n \"麻烦\",\n \"确认\",\n \"回复\",\n \"审批\",\n \"开会\",\n \"会议\",\n \"安排\",\n \"截止\",\n \"紧急\",\n \"异常\",\n \"失败\",\n \"风险\",\n \"todo\",\n \"deadline\",\n \"urgent\",\n \"error\",\n \"failed\",\n];\n\nexport type NotificationSummaryPhase =\n | \"queued\"\n | \"scanning\"\n | \"snapshot_created\"\n | \"summarizing\"\n | \"merging\"\n | \"complete\"\n | \"failed\";\n\nexport type NotificationSummaryJobStatus =\n | \"queued\"\n | \"running\"\n | \"complete\"\n | \"failed\";\n\nexport interface NotificationSummaryOptions {\n from?: unknown;\n to?: unknown;\n app?: unknown;\n sender?: unknown;\n conversationType?: unknown;\n keyword?: unknown;\n client?: unknown;\n limit?: unknown;\n chunkSize?: unknown;\n sample?: unknown;\n top?: unknown;\n maxContent?: unknown;\n}\n\nexport interface NotificationSummaryProgressEvent {\n jobId?: string;\n phase: NotificationSummaryPhase;\n status: NotificationSummaryJobStatus;\n message: string;\n updatedAt: string;\n totalNotifications?: number;\n totalChunks?: number;\n doneChunks?: number;\n doneNotifications?: number;\n percent?: number;\n range?: {\n newest: string | null;\n oldest: string | null;\n };\n scan?: NotificationQueryStats & { elapsedMs: number };\n error?: {\n code: string;\n message: string;\n };\n}\n\nexport type NotificationSummaryStatusEvent =\n NotificationSummaryProgressEvent & { jobId: string };\n\nexport interface NotificationSummaryResultEvent {\n jobId: string;\n status: \"complete\" | \"failed\";\n ok: boolean;\n updatedAt: string;\n message: string;\n title?: string;\n markdown?: string;\n total?: number;\n limit?: number;\n cappedLimit?: boolean;\n range?: {\n newest: string | null;\n oldest: string | null;\n };\n progress?: {\n totalChunks: number;\n doneChunks: number;\n totalNotifications: number;\n doneNotifications: number;\n };\n scan?: NotificationQueryStats & { elapsedMs: number };\n byApp?: CountRow<{ app: string }>[];\n bySender?: CountRow<{ sender: string }>[];\n byConversation?: CountRow<{\n conversationName: string;\n conversationType?: string;\n }>[];\n error?: {\n code: string;\n message: string;\n };\n}\n\nexport interface NotificationSummaryResult {\n ok: true;\n jobId?: string;\n total: number;\n limit: number;\n cappedLimit: boolean;\n chunkSize: number;\n range: {\n newest: string | null;\n oldest: string | null;\n };\n scan: NotificationQueryStats & { elapsedMs: number };\n progress: {\n totalChunks: number;\n doneChunks: number;\n totalNotifications: number;\n doneNotifications: number;\n };\n byApp: CountRow<{ app: string }>[];\n bySender: CountRow<{ sender: string }>[];\n byConversation: CountRow<{\n conversationName: string;\n conversationType?: string;\n }>[];\n latest: CompactNotification[];\n displayMarkdown: string;\n markdown: string;\n}\n\nexport class NotificationSummaryError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n ) {\n super(message);\n this.name = \"NotificationSummaryError\";\n }\n}\n\nexport interface CompactNotification {\n appName: string;\n appDisplayName?: string;\n title: string;\n content: string;\n timestamp: string;\n senderName?: string;\n conversationType?: string;\n conversationName?: string;\n}\n\ninterface NormalizedSummaryOptions {\n query: NotificationQueryOptions;\n chunkSize: number;\n sampleLimit: number;\n topLimit: number;\n maxContent: number;\n cappedLimit: boolean;\n}\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction readPositiveInteger(\n value: unknown,\n defaultValue: number,\n fieldName: string,\n): number {\n if (value === undefined || value === null || value === \"\") {\n return defaultValue;\n }\n\n const parsed =\n typeof value === \"number\"\n ? value\n : typeof value === \"string\" && /^\\d+$/.test(value)\n ? Number.parseInt(value, 10)\n : Number.NaN;\n\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new NotificationSummaryError(\n \"INVALID_PARAMS\",\n `${fieldName} 必须是大于 0 的整数`,\n );\n }\n return parsed;\n}\n\nfunction parseIsoTime(value: string | undefined, fieldName: string): number | null {\n if (!value) return null;\n const ts = Date.parse(value);\n if (Number.isNaN(ts)) {\n throw new NotificationSummaryError(\n \"INVALID_PARAMS\",\n `${fieldName} 必须是合法 ISO 8601 时间`,\n );\n }\n return ts;\n}\n\nfunction truncate(value: string, maxLength = DEFAULT_MAX_CONTENT): string {\n if (value.length <= maxLength) return value;\n return `${value.slice(0, maxLength - 1)}…`;\n}\n\nfunction compactNotification(\n item: StoredNotification,\n maxContent: number,\n): CompactNotification {\n const result: CompactNotification = {\n appName: item.appName,\n title: truncate(item.title, maxContent),\n content: truncate(item.content, maxContent),\n timestamp: item.timestamp,\n };\n if (item.appDisplayName) result.appDisplayName = item.appDisplayName;\n if (item.senderName) result.senderName = item.senderName;\n if (item.conversationType) result.conversationType = item.conversationType;\n if (item.conversationName) result.conversationName = item.conversationName;\n return result;\n}\n\nfunction notificationSender(item: CompactNotification | StoredNotification): string {\n return item.senderName?.trim()\n || item.conversationName?.trim()\n || item.title.trim()\n || \"(unknown)\";\n}\n\nfunction notificationApp(item: CompactNotification | StoredNotification): string {\n return item.appDisplayName?.trim() || item.appName.trim() || \"(unknown)\";\n}\n\nfunction notificationConversation(\n item: CompactNotification | StoredNotification,\n): {\n conversationName: string;\n conversationType?: string;\n} {\n const conversationName =\n item.conversationName?.trim() || item.title.trim() || \"(unknown)\";\n return {\n conversationName,\n ...(item.conversationType ? { conversationType: item.conversationType } : {}),\n };\n}\n\nfunction increment<T extends Record<string, unknown>>(\n map: Map<string, CountRow<T>>,\n key: string,\n seed: T,\n): void {\n const existing = map.get(key);\n if (existing) {\n existing.count += 1;\n return;\n }\n map.set(key, { ...seed, count: 1 });\n}\n\nfunction topRows<T extends Record<string, unknown>>(\n map: Map<string, CountRow<T>>,\n limit: number,\n): CountRow<T>[] {\n return [...map.values()].sort((a, b) => b.count - a.count).slice(0, limit);\n}\n\nfunction formatTopRows<T extends Record<string, unknown>>(\n rows: CountRow<T>[],\n labelKey: keyof T,\n): string {\n if (rows.length === 0) return \"无\";\n return rows\n .map((row) => `${String(row[labelKey])} ${row.count}`)\n .join(\";\");\n}\n\nfunction compactLine(item: CompactNotification): string {\n const app = notificationApp(item);\n const sender = notificationSender(item);\n return `[${item.timestamp}] ${app} · ${sender}: ${item.content}`;\n}\n\nfunction isAttentionCandidate(item: CompactNotification): boolean {\n const text = `${item.title}\\n${item.content}`.toLowerCase();\n return ATTENTION_KEYWORDS.some((keyword) => text.includes(keyword.toLowerCase()));\n}\n\nfunction normalizeSummaryOptions(\n opts: NotificationSummaryOptions,\n): NormalizedSummaryOptions {\n const from = readString(opts.from);\n const to = readString(opts.to);\n const app = readString(opts.app);\n const sender = readString(opts.sender);\n const conversationType = readString(opts.conversationType);\n const keyword = readString(opts.keyword);\n const client = readString(opts.client);\n const rawLimit = readPositiveInteger(\n opts.limit,\n DEFAULT_NOTIFICATION_SUMMARY_LIMIT,\n \"limit\",\n );\n const limit = Math.min(rawLimit, MAX_NOTIFICATION_SUMMARY_LIMIT);\n const fromTs = parseIsoTime(from, \"from\");\n const toTs = parseIsoTime(to, \"to\");\n\n if (\n conversationType\n && conversationType !== \"group\"\n && conversationType !== \"private\"\n ) {\n throw new NotificationSummaryError(\n \"INVALID_PARAMS\",\n \"conversationType 只能是 group 或 private\",\n );\n }\n\n if (fromTs !== null && toTs !== null && fromTs > toTs) {\n throw new NotificationSummaryError(\"INVALID_PARAMS\", \"from 不能晚于 to\");\n }\n\n return {\n query: {\n ...(from ? { from } : {}),\n ...(to ? { to } : {}),\n ...(app ? { app } : {}),\n ...(sender ? { sender } : {}),\n ...(conversationType ? { conversationType } : {}),\n ...(keyword ? { keyword } : {}),\n ...(client ? { client } : {}),\n limit,\n fromTs,\n toTs,\n fromDateKey: from ? from.slice(0, 10) : null,\n toDateKey: to ? to.slice(0, 10) : null,\n },\n chunkSize: readPositiveInteger(opts.chunkSize, DEFAULT_CHUNK_SIZE, \"chunkSize\"),\n sampleLimit: readPositiveInteger(opts.sample, DEFAULT_SAMPLE_LIMIT, \"sample\"),\n topLimit: readPositiveInteger(opts.top, DEFAULT_TOP_LIMIT, \"top\"),\n maxContent: readPositiveInteger(opts.maxContent, DEFAULT_MAX_CONTENT, \"maxContent\"),\n cappedLimit: rawLimit !== limit,\n };\n}\n\nfunction buildChunkSummary(\n chunkId: string,\n notifications: CompactNotification[],\n): string {\n const byApp = new Map<string, CountRow<{ app: string }>>();\n const bySender = new Map<string, CountRow<{ sender: string }>>();\n\n for (const item of notifications) {\n increment(byApp, notificationApp(item), { app: notificationApp(item) });\n increment(bySender, notificationSender(item), {\n sender: notificationSender(item),\n });\n }\n\n const latest = notifications.slice(0, 5).map(compactLine);\n const attention = notifications\n .filter(isAttentionCandidate)\n .slice(0, 5)\n .map(compactLine);\n\n return [\n `### 分片 ${chunkId}`,\n \"\",\n `- 数量: ${notifications.length}`,\n `- 主要 App: ${formatTopRows(topRows(byApp, 5), \"app\")}`,\n `- 主要发送人/会话: ${formatTopRows(topRows(bySender, 8), \"sender\")}`,\n \"\",\n \"可能需要关注:\",\n ...(attention.length > 0\n ? attention.map((line) => `- ${line}`)\n : [\"- 无明显待办、风险或异常样例\"]),\n \"\",\n \"最近样例:\",\n ...(latest.length > 0 ? latest.map((line) => `- ${line}`) : [\"- 无\"]),\n ].join(\"\\n\");\n}\n\nfunction buildMarkdown(params: {\n total: number;\n limit: number;\n cappedLimit: boolean;\n range: { newest: string | null; oldest: string | null };\n scan: NotificationQueryStats & { elapsedMs: number };\n byApp: CountRow<{ app: string }>[];\n bySender: CountRow<{ sender: string }>[];\n byConversation: CountRow<{\n conversationName: string;\n conversationType?: string;\n }>[];\n attention: string[];\n chunkSummaries: string[];\n}): string {\n const capLine = params.cappedLimit\n ? `- 覆盖上限: 请求数量超过上限,已按最近 ${params.limit} 条处理`\n : `- 覆盖上限: 最近 ${params.limit} 条`;\n\n return [\n \"# 通知总结\",\n \"\",\n `- 通知数: ${params.total}`,\n capLine,\n `- 时间范围: ${params.range.oldest ?? \"-\"} 至 ${params.range.newest ?? \"-\"}`,\n `- 扫描: ${params.scan.daysScanned} 天 / ${params.scan.itemsScanned} 条,命中 ${params.scan.matched} 条,用时 ${params.scan.elapsedMs}ms`,\n \"\",\n \"## 总体分布\",\n \"\",\n `- 主要 App: ${formatTopRows(params.byApp, \"app\")}`,\n `- 主要发送人/会话: ${formatTopRows(params.bySender, \"sender\")}`,\n `- 主要会话: ${formatTopRows(params.byConversation, \"conversationName\")}`,\n \"\",\n \"## 可能需要关注\",\n \"\",\n ...(params.attention.length > 0\n ? params.attention.map((line) => `- ${line}`)\n : [\"- 未发现明显待办、风险、失败或紧急样例\"]),\n \"\",\n \"## 分片摘要\",\n \"\",\n ...(params.chunkSummaries.length > 0 ? params.chunkSummaries : [\"无通知\"]),\n \"\",\n ].join(\"\\n\").trimEnd() + \"\\n\";\n}\n\nfunction buildDisplayMarkdown(params: {\n total: number;\n limit: number;\n cappedLimit: boolean;\n range: { newest: string | null; oldest: string | null };\n scan: NotificationQueryStats & { elapsedMs: number };\n byApp: CountRow<{ app: string }>[];\n bySender: CountRow<{ sender: string }>[];\n byConversation: CountRow<{\n conversationName: string;\n conversationType?: string;\n }>[];\n attention: string[];\n latest: CompactNotification[];\n}): string {\n if (params.total === 0) {\n return [\n \"# 未读通知总结\",\n \"\",\n \"没有找到符合条件的通知。\",\n \"\",\n `扫描范围:${params.scan.daysScanned} 天 / ${params.scan.itemsScanned} 条,用时 ${params.scan.elapsedMs}ms。`,\n ].join(\"\\n\");\n }\n\n const coverage = params.cappedLimit\n ? `请求数量超过上限,已按最近 ${params.limit} 条处理`\n : `最近 ${params.limit} 条内命中 ${params.total} 条`;\n const range = `${params.range.oldest ?? \"-\"} 至 ${params.range.newest ?? \"-\"}`;\n const latest = params.latest.slice(0, 8).map(compactLine);\n\n return [\n \"# 未读通知总结\",\n \"\",\n `共整理 ${params.total} 条通知,覆盖 ${coverage}。`,\n `时间范围:${range}。`,\n \"\",\n \"## 主要来源\",\n \"\",\n `- App:${formatTopRows(params.byApp, \"app\")}`,\n `- 发送人/会话:${formatTopRows(params.bySender, \"sender\")}`,\n `- 会话:${formatTopRows(params.byConversation, \"conversationName\")}`,\n \"\",\n \"## 需要关注\",\n \"\",\n ...(params.attention.length > 0\n ? params.attention.map((line) => `- ${line}`)\n : [\"- 未发现明显待办、风险、失败或紧急样例\"]),\n \"\",\n \"## 最近样例\",\n \"\",\n ...(latest.length > 0 ? latest.map((line) => `- ${line}`) : [\"- 无\"]),\n ].join(\"\\n\");\n}\n\nfunction summarizeProgress(params: {\n totalChunks: number;\n doneChunks: number;\n chunks: CompactNotification[][];\n}): {\n doneChunks: number;\n doneNotifications: number;\n percent: number;\n} {\n const doneNotifications = params.chunks\n .slice(0, params.doneChunks)\n .reduce((sum, chunk) => sum + chunk.length, 0);\n const percent =\n params.totalChunks === 0\n ? 100\n : Math.round((params.doneChunks / params.totalChunks) * 100);\n return {\n doneChunks: params.doneChunks,\n doneNotifications,\n percent,\n };\n}\n\nasync function yieldToEventLoop(): Promise<void> {\n await new Promise<void>((resolve) => setTimeout(resolve, 0));\n}\n\nexport async function runNotificationSummary(params: {\n notificationsDir: string;\n options?: NotificationSummaryOptions;\n jobId?: string;\n onProgress?: (event: NotificationSummaryProgressEvent) => void | Promise<void>;\n}): Promise<NotificationSummaryResult> {\n const options = normalizeSummaryOptions(params.options ?? {});\n\n const emit = async (\n event: Omit<NotificationSummaryProgressEvent, \"updatedAt\" | \"jobId\">,\n ) => {\n await params.onProgress?.({\n ...(params.jobId ? { jobId: params.jobId } : {}),\n updatedAt: nowIso(),\n ...event,\n });\n await yieldToEventLoop();\n };\n\n await emit({\n phase: \"scanning\",\n status: \"running\",\n message: \"正在扫描通知...\",\n });\n\n const startedAtMs = Date.now();\n const queryResult = await collectMatchingNotificationsWithStats(\n params.notificationsDir,\n options.query,\n );\n const elapsedMs = Date.now() - startedAtMs;\n const notifications = queryResult.notifications;\n const scan = {\n ...queryResult.stats,\n elapsedMs,\n };\n const compact = notifications.map((item) =>\n compactNotification(item, options.maxContent),\n );\n const chunks: CompactNotification[][] = [];\n for (let start = 0; start < compact.length; start += options.chunkSize) {\n chunks.push(compact.slice(start, start + options.chunkSize));\n }\n\n const range = {\n newest: notifications[0]?.timestamp ?? null,\n oldest: notifications[notifications.length - 1]?.timestamp ?? null,\n };\n\n await emit({\n phase: \"snapshot_created\",\n status: \"running\",\n message: `已找到 ${notifications.length} 条通知,拆成 ${chunks.length} 个分片`,\n totalNotifications: notifications.length,\n totalChunks: chunks.length,\n doneChunks: 0,\n doneNotifications: 0,\n percent: chunks.length === 0 ? 100 : 0,\n range,\n scan,\n });\n\n const byApp = new Map<string, CountRow<{ app: string }>>();\n const bySender = new Map<string, CountRow<{ sender: string }>>();\n const byConversation = new Map<\n string,\n CountRow<{ conversationName: string; conversationType?: string }>\n >();\n for (const item of notifications) {\n const app = notificationApp(item);\n const sender = notificationSender(item);\n const conversation = notificationConversation(item);\n increment(byApp, app, { app });\n increment(bySender, sender, { sender });\n increment(byConversation, `${conversation.conversationName}\\0${conversation.conversationType ?? \"\"}`, conversation);\n }\n\n const chunkSummaries: string[] = [];\n for (let index = 0; index < chunks.length; index += 1) {\n const chunk = chunks[index]!;\n chunkSummaries.push(\n buildChunkSummary(String(index + 1).padStart(4, \"0\"), chunk),\n );\n const progress = summarizeProgress({\n totalChunks: chunks.length,\n doneChunks: index + 1,\n chunks,\n });\n await emit({\n phase: \"summarizing\",\n status: \"running\",\n message: `正在整理通知摘要:${progress.doneChunks}/${chunks.length} 个分片`,\n totalNotifications: notifications.length,\n totalChunks: chunks.length,\n ...progress,\n range,\n scan,\n });\n }\n\n await emit({\n phase: \"merging\",\n status: \"running\",\n message: \"正在合并摘要...\",\n totalNotifications: notifications.length,\n totalChunks: chunks.length,\n ...summarizeProgress({\n totalChunks: chunks.length,\n doneChunks: chunks.length,\n chunks,\n }),\n range,\n scan,\n });\n\n const byAppRows = topRows(byApp, options.topLimit);\n const bySenderRows = topRows(bySender, options.topLimit);\n const byConversationRows = topRows(byConversation, options.topLimit);\n const attention = compact\n .filter(isAttentionCandidate)\n .slice(0, 8)\n .map(compactLine);\n const markdown = buildMarkdown({\n total: notifications.length,\n limit: options.query.limit,\n cappedLimit: options.cappedLimit,\n range,\n scan,\n byApp: byAppRows,\n bySender: bySenderRows,\n byConversation: byConversationRows,\n attention,\n chunkSummaries,\n });\n const displayMarkdown = buildDisplayMarkdown({\n total: notifications.length,\n limit: options.query.limit,\n cappedLimit: options.cappedLimit,\n range,\n scan,\n byApp: byAppRows,\n bySender: bySenderRows,\n byConversation: byConversationRows,\n attention,\n latest: compact.slice(0, options.sampleLimit),\n });\n\n const result: NotificationSummaryResult = {\n ok: true,\n ...(params.jobId ? { jobId: params.jobId } : {}),\n total: notifications.length,\n limit: options.query.limit,\n cappedLimit: options.cappedLimit,\n chunkSize: options.chunkSize,\n range,\n scan,\n progress: {\n totalChunks: chunks.length,\n doneChunks: chunks.length,\n totalNotifications: notifications.length,\n doneNotifications: notifications.length,\n },\n byApp: byAppRows,\n bySender: bySenderRows,\n byConversation: byConversationRows,\n latest: compact.slice(0, options.sampleLimit),\n displayMarkdown,\n markdown,\n };\n\n await emit({\n phase: \"complete\",\n status: \"complete\",\n message: \"通知摘要已完成,正在推送总结内容...\",\n totalNotifications: notifications.length,\n totalChunks: chunks.length,\n doneChunks: chunks.length,\n doneNotifications: notifications.length,\n percent: 100,\n range,\n scan,\n });\n\n return result;\n}\n",
23
+ "import {\n accessSync,\n mkdirSync,\n appendFileSync,\n readFileSync,\n writeFileSync,\n existsSync,\n rmSync,\n constants,\n} from \"node:fs\";\nimport { createHash } from \"node:crypto\";\nimport { join } from \"node:path\";\nimport type { RawNotification } from \"../types.js\";\nimport { normalizeFeishuFields } from \"./feishu-normalize.js\";\nimport { currentClientLabel } from \"../ingest-context.js\";\n\ninterface Logger {\n info: (message: string) => void;\n warn: (message: string) => void;\n}\n\nexport type NotificationConversationType = \"private\" | \"group\";\n\nexport interface StorageContext {\n stateDir: string;\n workspaceDir?: string;\n}\n\n/** Stored notification entry (JSON format, append-only) */\nexport interface StoredNotification {\n /** 来源客户端 label;旧数据无该字段,查询时视为 legacy */\n clientLabel?: string;\n /** 包名 */\n appName: string;\n /** 应用显示名(由映射补全),缺省时与 appName 一致 */\n appDisplayName?: string;\n title: string;\n content: string;\n /** ISO 8601 with timezone, e.g. \"2026-03-02T08:30:00+08:00\" */\n timestamp: string;\n /**\n * 结构化发送人。当前主要用于飞书消息:\n * iOS 通知里 title 通常是发送人,subtitle 用来区分群聊名。\n */\n senderName?: string;\n /** 结构化会话类型。当前主要用于飞书消息区分群聊/私聊。 */\n conversationType?: NotificationConversationType;\n /** 结构化会话名。当前主要用于飞书群聊名(通常来自 subtitle)。 */\n conversationName?: string;\n}\n\nconst NOTIFICATION_DIR_NAME = \"notifications\";\nconst ID_INDEX_DIR_NAME = \".ids\";\nconst CONTENT_KEY_INDEX_DIR_NAME = \".keys\";\n\nexport interface NotificationIngestResult {\n received: number;\n ingested: number;\n dedupedById: number;\n dedupedByContent: number;\n invalid: number;\n /**\n * 本次 ingest 实际新写入的条目(去重 / 非法之后的产物)。\n * 用于后续事件驱动链路(如 light-rule agent 评估)拿到本次新增的通知列表,\n * 不需要重新读盘。\n */\n inserted: StoredNotification[];\n}\n\ntype WriteOutcome =\n | { kind: \"ingested\"; entry: StoredNotification }\n | { kind: \"dedupedById\" }\n | { kind: \"dedupedByContent\" }\n | { kind: \"invalid\" };\n\nexport function getStateFallbackNotificationDir(stateDir: string): string {\n return join(stateDir, \"plugins\", \"phone-notifications\", NOTIFICATION_DIR_NAME);\n}\n\nfunction computeLagMs(timestamp: string | undefined): number | null {\n if (!timestamp) return null;\n const t = new Date(timestamp).getTime();\n if (Number.isNaN(t)) return null;\n return Date.now() - t;\n}\n\nfunction buildFallbackContent(n: RawNotification): string {\n const body = n.body?.trim();\n if (body) {\n return body;\n }\n\n const fallback: string[] = [];\n if (n.category) {\n fallback.push(`category:${n.category}`);\n }\n if (n.metadata && Object.keys(n.metadata).length > 0) {\n fallback.push(`metadata:${JSON.stringify(n.metadata)}`);\n }\n return fallback.join(\" ; \") || \"-\";\n}\n\nfunction ensureWritableDirectory(dir: string): boolean {\n try {\n mkdirSync(dir, { recursive: true });\n accessSync(dir, constants.R_OK | constants.W_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function resolveNotificationStorageDir(\n ctx: StorageContext,\n logger: Pick<Logger, \"info\" | \"warn\">,\n): string {\n // 优先使用 stateDir(插件私有稳定路径),避免通知随 workspace 切换而分散\n const stateNotifDir = getStateFallbackNotificationDir(ctx.stateDir);\n\n if (ensureWritableDirectory(stateNotifDir)) {\n logger.info(`通知将写入 stateDir 路径: ${stateNotifDir}`);\n return stateNotifDir;\n }\n\n // stateDir 不可用时回退到 workspaceDir\n if (ctx.workspaceDir) {\n const workspaceDir = join(ctx.workspaceDir, NOTIFICATION_DIR_NAME);\n if (ensureWritableDirectory(workspaceDir)) {\n logger.warn(\n `stateDir 不可用,通知已回退到 workspace 路径: ${workspaceDir}`,\n );\n return workspaceDir;\n }\n }\n\n throw new Error(`通知存储目录不可用: ${stateNotifDir}`);\n}\n\n/** 包名 → 应用显示名(异步,未命中时内部可拉取后返回);不提供则落库仅用 appName */\nexport type ResolveDisplayName = (packageName: string) => Promise<string>;\n\nexport class NotificationStorage {\n private dir: string;\n private idIndexDir: string;\n private contentKeyIndexDir: string;\n private idCache = new Map<string, Set<string>>();\n private contentKeyCache = new Map<string, Set<string>>();\n private dateWriteChains = new Map<string, Promise<void>>();\n private resolveDisplayName: ResolveDisplayName | undefined;\n\n constructor(\n dir: string,\n private logger: Logger,\n resolveDisplayName?: ResolveDisplayName,\n ) {\n this.dir = dir;\n this.idIndexDir = join(dir, ID_INDEX_DIR_NAME);\n this.contentKeyIndexDir = join(dir, CONTENT_KEY_INDEX_DIR_NAME);\n this.resolveDisplayName = resolveDisplayName;\n }\n\n getStorageDir(): string {\n return this.dir;\n }\n\n async init() {\n mkdirSync(this.dir, { recursive: true });\n mkdirSync(this.idIndexDir, { recursive: true });\n rmSync(this.contentKeyIndexDir, { recursive: true, force: true });\n mkdirSync(this.contentKeyIndexDir, { recursive: true });\n }\n\n async ingest(\n items: RawNotification[],\n ingestId?: string,\n ): Promise<NotificationIngestResult> {\n const result: NotificationIngestResult = {\n received: items.length,\n ingested: 0,\n dedupedById: 0,\n dedupedByContent: 0,\n invalid: 0,\n inserted: [],\n };\n\n const traceTag = ingestId ? `[${ingestId}]` : \"\";\n for (const n of items) {\n const outcome = await this.writeNotification(n);\n const lagMs = computeLagMs(n.timestamp);\n const lagPart = lagMs === null ? \"lag=?\" : `lag=${lagMs}ms`;\n this.logger.info(\n `ingest${traceTag}: app=${n.app ?? \"Unknown\"} id=${n.id ?? \"-\"} ts=${n.timestamp} ${lagPart} outcome=${outcome.kind}`,\n );\n switch (outcome.kind) {\n case \"ingested\":\n result.ingested += 1;\n result.inserted.push(outcome.entry);\n break;\n case \"dedupedById\":\n result.dedupedById += 1;\n break;\n case \"dedupedByContent\":\n result.dedupedByContent += 1;\n break;\n case \"invalid\":\n result.invalid += 1;\n break;\n }\n }\n return result;\n }\n\n private async writeNotification(n: RawNotification): Promise<WriteOutcome> {\n const ts = new Date(n.timestamp);\n if (Number.isNaN(ts.getTime())) {\n this.logger.warn(`忽略非法 timestamp 的通知: ${n.id}`);\n return { kind: \"invalid\" };\n }\n\n const dateKey = this.formatDate(ts);\n const filePath = join(this.dir, `${dateKey}.json`);\n const normalizedId = typeof n.id === \"string\" ? n.id.trim() : \"\";\n const entry = this.buildStoredNotification(n);\n\n return this.withDateWriteLock(dateKey, async () => {\n if (normalizedId && this.hasNotificationId(dateKey, entry.clientLabel ?? \"legacy\", normalizedId)) {\n return { kind: \"dedupedById\" };\n }\n\n if (this.hasNotificationContentKey(dateKey, filePath, entry)) {\n return { kind: \"dedupedByContent\" };\n }\n\n const appDisplayName = this.resolveDisplayName\n ? await this.resolveDisplayName(entry.appName)\n : entry.appName;\n\n const storedEntry: StoredNotification = {\n ...entry,\n appDisplayName,\n };\n\n const arr = this.readStoredNotifications(filePath);\n arr.push(storedEntry);\n writeFileSync(filePath, JSON.stringify(arr, null, 2), \"utf-8\");\n\n if (normalizedId) {\n this.recordNotificationId(dateKey, storedEntry.clientLabel ?? \"legacy\", normalizedId);\n }\n this.recordNotificationContentKey(dateKey, filePath, storedEntry);\n return { kind: \"ingested\", entry: storedEntry };\n });\n }\n\n private buildStoredNotification(n: RawNotification): StoredNotification {\n const appName = typeof n.app === \"string\" && n.app ? n.app : \"Unknown\";\n const clientLabel = currentClientLabel(\"default\");\n const feishu = normalizeFeishuFields(n);\n if (feishu) {\n return {\n clientLabel,\n appName,\n title: feishu.title,\n content: feishu.content || buildFallbackContent(n),\n timestamp: n.timestamp,\n ...feishu.structured,\n };\n }\n return {\n clientLabel,\n appName,\n title: typeof n.title === \"string\" ? n.title : \"\",\n content: buildFallbackContent(n),\n timestamp: n.timestamp,\n };\n }\n\n private formatDate(d: Date): string {\n const year = d.getFullYear();\n const month = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n }\n\n private getIdIndexPath(dateKey: string): string {\n return join(this.idIndexDir, `${dateKey}.ids`);\n }\n\n private getIdSet(dateKey: string): Set<string> {\n const cached = this.idCache.get(dateKey);\n if (cached) {\n return cached;\n }\n\n const idPath = this.getIdIndexPath(dateKey);\n const ids = new Set<string>();\n if (existsSync(idPath)) {\n const lines = readFileSync(idPath, \"utf-8\").split(/\\r?\\n/);\n for (const line of lines) {\n const id = line.trim();\n if (id) {\n ids.add(id);\n }\n }\n }\n\n this.idCache.set(dateKey, ids);\n return ids;\n }\n\n private buildNotificationIdKey(clientLabel: string, id: string): string {\n if (this.usesLegacyIdKey(clientLabel)) {\n return id;\n }\n return `${clientLabel}\\x1f${id}`;\n }\n\n private usesLegacyIdKey(clientLabel: string): boolean {\n return clientLabel === \"legacy\" || clientLabel === \"default\";\n }\n\n private hasNotificationId(dateKey: string, clientLabel: string, id: string): boolean {\n const ids = this.getIdSet(dateKey);\n return ids.has(this.buildNotificationIdKey(clientLabel, id))\n || (this.usesLegacyIdKey(clientLabel) && ids.has(id));\n }\n\n private getContentKeyIndexPath(dateKey: string): string {\n return join(this.contentKeyIndexDir, `${dateKey}.keys`);\n }\n\n private getContentKeySet(dateKey: string, filePath: string): Set<string> {\n const cached = this.contentKeyCache.get(dateKey);\n if (cached) {\n return cached;\n }\n\n const keyPath = this.getContentKeyIndexPath(dateKey);\n const keys = new Set<string>();\n\n if (existsSync(filePath)) {\n for (const item of this.readStoredNotifications(filePath)) {\n keys.add(this.buildNotificationContentKey(item));\n }\n }\n\n if (keys.size > 0) {\n writeFileSync(keyPath, `${Array.from(keys).join(\"\\n\")}\\n`, \"utf-8\");\n } else if (existsSync(keyPath)) {\n rmSync(keyPath, { force: true });\n }\n\n this.contentKeyCache.set(dateKey, keys);\n return keys;\n }\n\n private hasNotificationContentKey(\n dateKey: string,\n filePath: string,\n entry: Pick<StoredNotification, \"appName\" | \"title\" | \"content\" | \"timestamp\" | \"clientLabel\">,\n ): boolean {\n const keys = this.getContentKeySet(dateKey, filePath);\n return this.contentKeyLabels(entry.clientLabel).some((clientLabel) =>\n keys.has(this.buildNotificationContentKey({ ...entry, clientLabel })),\n );\n }\n\n private recordNotificationId(dateKey: string, clientLabel: string, id: string) {\n const ids = this.getIdSet(dateKey);\n const key = this.buildNotificationIdKey(clientLabel, id);\n if (ids.has(key)) {\n return;\n }\n\n appendFileSync(this.getIdIndexPath(dateKey), `${key}\\n`, \"utf-8\");\n ids.add(key);\n }\n\n private recordNotificationContentKey(\n dateKey: string,\n filePath: string,\n entry: Pick<StoredNotification, \"appName\" | \"title\" | \"content\" | \"timestamp\" | \"clientLabel\">,\n ) {\n const keys = this.getContentKeySet(dateKey, filePath);\n const key = this.buildNotificationContentKey(entry);\n\n if (keys.has(key)) {\n return;\n }\n\n appendFileSync(this.getContentKeyIndexPath(dateKey), `${key}\\n`, \"utf-8\");\n keys.add(key);\n }\n\n private buildNotificationContentKey(\n entry: Pick<StoredNotification, \"appName\" | \"title\" | \"content\" | \"timestamp\" | \"clientLabel\">,\n ): string {\n return createHash(\"sha256\")\n .update(entry.clientLabel ?? \"legacy\")\n .update(\"\\x1f\")\n .update(entry.appName)\n .update(\"\\x1f\")\n .update(entry.title)\n .update(\"\\x1f\")\n .update(entry.content)\n .update(\"\\x1f\")\n .update(entry.timestamp)\n .digest(\"hex\");\n }\n\n private contentKeyLabels(clientLabel: string | undefined): string[] {\n const label = clientLabel ?? \"legacy\";\n return label === \"default\" ? [\"default\", \"legacy\"] : [label];\n }\n\n private readStoredNotifications(filePath: string): StoredNotification[] {\n if (!existsSync(filePath)) {\n return [];\n }\n\n try {\n const parsed = JSON.parse(readFileSync(filePath, \"utf-8\"));\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n }\n\n private async withDateWriteLock<T>(\n dateKey: string,\n task: () => Promise<T>,\n ): Promise<T> {\n const previous = this.dateWriteChains.get(dateKey) ?? Promise.resolve();\n let release!: () => void;\n const current = new Promise<void>((resolve) => {\n release = resolve;\n });\n const chain = previous.then(() => current);\n this.dateWriteChains.set(dateKey, chain);\n\n await previous;\n try {\n return await task();\n } finally {\n release();\n if (this.dateWriteChains.get(dateKey) === chain) {\n this.dateWriteChains.delete(dateKey);\n }\n }\n }\n\n async close() {\n this.idCache.clear();\n this.contentKeyCache.clear();\n this.dateWriteChains.clear();\n }\n}\n",
24
+ "import type { RawNotification } from \"../types.js\";\nimport type { NotificationConversationType } from \"./storage.js\";\n\nexport interface FeishuStructuredFields {\n senderName?: string;\n conversationType?: NotificationConversationType;\n conversationName?: string;\n}\n\nexport interface FeishuNormalizedNotification {\n title: string;\n content: string;\n structured: FeishuStructuredFields;\n}\n\nfunction normalizeOptionalText(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction isFeishuApp(appName: string): boolean {\n const normalized = appName.trim().toLowerCase();\n if (!normalized) {\n return false;\n }\n return (\n normalized === \"飞书\"\n || normalized === \"feishu\"\n || normalized === \"lark\"\n || normalized === \"com.ss.android.lark\"\n || normalized === \"com.bytedance.ee.lark\"\n || normalized === \"com.larksuite.suite\"\n || normalized.includes(\"feishu\")\n || normalized.includes(\"lark\")\n || normalized.includes(\"飞书\")\n );\n}\n\nfunction isFeishuAppLabel(text: string): boolean {\n const t = text.trim().toLowerCase();\n return t === \"飞书\" || t === \"lark\" || t === \"feishu\";\n}\n\nfunction extractColonSender(body: string): string | undefined {\n if (!body) return undefined;\n const candidates = [body.indexOf(\":\"), body.indexOf(\":\")].filter((i) => i > 0);\n if (candidates.length === 0) return undefined;\n const idx = Math.min(...candidates);\n const senderName = body.slice(0, idx).trim();\n return senderName || undefined;\n}\n\nfunction findMetadataTextByKey(\n value: unknown,\n targetKey: string,\n depth = 0,\n): { found: boolean; value?: string } {\n if (!value || typeof value !== \"object\" || depth > 4) {\n return { found: false };\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n const match = findMetadataTextByKey(item, targetKey, depth + 1);\n if (match.found) {\n return match;\n }\n }\n return { found: false };\n }\n\n for (const [key, child] of Object.entries(value as Record<string, unknown>)) {\n if (key.trim().toLowerCase() === targetKey) {\n return { found: true, value: normalizeOptionalText(child) };\n }\n }\n\n for (const child of Object.values(value as Record<string, unknown>)) {\n const match = findMetadataTextByKey(child, targetKey, depth + 1);\n if (match.found) {\n return match;\n }\n }\n\n return { found: false };\n}\n\nfunction deriveStructured(n: RawNotification): FeishuStructuredFields {\n const subtitle = findMetadataTextByKey(n.metadata, \"subtitle\");\n\n // iOS 路径:通知元数据带 subtitle key(群聊为群名,私聊为空)。\n if (subtitle.found) {\n const senderName = normalizeOptionalText(n.title);\n const structured: FeishuStructuredFields = {\n conversationType: subtitle.value ? \"group\" : \"private\",\n };\n if (senderName) {\n structured.senderName = senderName;\n }\n if (subtitle.value) {\n structured.conversationName = subtitle.value;\n }\n return structured;\n }\n\n // Android 路径:title 退化为 app 名(如 \"飞书\"),实际发送人在 body 里以 \"name: content\" 形式出现。\n const rawTitle = typeof n.title === \"string\" ? n.title : \"\";\n if (isFeishuAppLabel(rawTitle)) {\n const senderName = extractColonSender(n.body ?? \"\");\n if (senderName) {\n return {\n senderName,\n conversationType: \"private\",\n };\n }\n }\n\n return {};\n}\n\nfunction buildTitle(n: RawNotification, structured: FeishuStructuredFields): string {\n if (structured.conversationType === \"group\" && structured.conversationName) {\n return structured.conversationName;\n }\n // Android 私聊 title 是 app 名,用 body 解析出的 senderName 顶上去,跟 iOS 对齐。\n if (structured.conversationType === \"private\" && structured.senderName) {\n return structured.senderName;\n }\n return typeof n.title === \"string\" ? n.title : \"\";\n}\n\nfunction buildContent(n: RawNotification, structured: FeishuStructuredFields): string {\n const body = n.body?.trim();\n\n if (structured.conversationType === \"group\" && structured.senderName && body) {\n const half = `${structured.senderName}:`;\n const full = `${structured.senderName}:`;\n return body.startsWith(half) || body.startsWith(full)\n ? body\n : `${structured.senderName}: ${body}`;\n }\n\n if (structured.conversationType === \"private\" && structured.senderName && body) {\n const half = `${structured.senderName}:`;\n const full = `${structured.senderName}:`;\n if (body.startsWith(half)) return body.slice(half.length).trimStart();\n if (body.startsWith(full)) return body.slice(full.length).trimStart();\n return body;\n }\n\n return body ?? \"\";\n}\n\nexport function normalizeFeishuFields(\n n: RawNotification,\n): FeishuNormalizedNotification | undefined {\n const appName = typeof n.app === \"string\" ? n.app : \"\";\n if (!isFeishuApp(appName)) {\n return undefined;\n }\n\n const structured = deriveStructured(n);\n\n // Feishu 通知但任何规则都没命中:让 caller 走默认归一化路径,避免与非 Feishu 通知行为分裂。\n if (\n structured.senderName === undefined\n && structured.conversationType === undefined\n && structured.conversationName === undefined\n ) {\n return undefined;\n }\n\n return {\n title: buildTitle(n, structured),\n content: buildContent(n, structured),\n structured,\n };\n}\n",
25
+ "import { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport interface IngestContext {\n clientLabel?: string;\n authKind?: \"relay-api-key\" | \"http-api-key\" | \"gateway-token\" | \"local\" | string;\n}\n\nconst storage = new AsyncLocalStorage<IngestContext>();\n\nexport function runWithIngestContext<T>(context: IngestContext | undefined, fn: () => T): T {\n return storage.run(context ?? {}, fn);\n}\n\nexport function getIngestContext(): IngestContext {\n return storage.getStore() ?? {};\n}\n\nexport function currentClientLabel(fallback = \"legacy\"): string {\n return getIngestContext().clientLabel?.trim() || fallback;\n}\n",
20
26
  "export interface RepeatConfig {\n repeat?: boolean;\n repeat_times?: number;\n}\n\nexport type RepeatArgument = RepeatConfig | boolean | number | undefined;\n\nexport function normalizeRepeatTimes(input?: RepeatArgument): number {\n if (typeof input === \"boolean\") {\n return input ? 0 : 1;\n }\n\n if (typeof input === \"number\") {\n return validateRepeatTimes(input);\n }\n\n if (!input) {\n return 1;\n }\n\n if (input.repeat_times !== undefined) {\n return validateRepeatTimes(input.repeat_times);\n }\n\n if (input.repeat !== undefined) {\n return input.repeat ? 0 : 1;\n }\n\n return 1;\n}\n\nexport function assertAncsRepeatTimes(repeatTimes: number): void {\n if (repeatTimes !== 0 && repeatTimes !== 1) {\n throw new Error(\n \"当前 ANCS 路径仅支持 repeat_times=0(无限循环)或 1(播放一轮);N>=2 需非 ANCS 路径\",\n );\n }\n}\n\nfunction validateRepeatTimes(value: number): number {\n if (!Number.isInteger(value) || value < 0) {\n throw new Error(\"repeat_times 必须是 >=0 的整数\");\n }\n\n return value;\n}\n",
21
- "import { existsSync, readFileSync, readdirSync, mkdirSync } from \"node:fs\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { StoredNotification } from \"../notification/storage.js\";\n\n/**\n * Minimal Commander.js Command interface.\n * The real `Command` instance comes from the openclaw runtime at registration time;\n * we only declare the subset we use so that `commander` need not be a direct dep.\n */\nexport interface CliCommand {\n command(nameAndArgs: string): CliCommand;\n description(str: string): CliCommand;\n version(str: string, flags?: string, description?: string): CliCommand;\n option(flags: string, description: string, defaultValue?: string): CliCommand;\n requiredOption(flags: string, description: string): CliCommand;\n action(fn: (...args: any[]) => void | Promise<void>): CliCommand;\n}\n\nexport interface CliContext {\n workspaceDir?: string;\n stateDir?: string;\n}\n\n/** Resolve the notifications storage directory (stateDir → workspace fallback) */\nexport function resolveNotificationsDir(ctx: CliContext): string | null {\n if (ctx.stateDir) {\n const dir = join(\n ctx.stateDir,\n \"plugins\",\n \"phone-notifications\",\n \"notifications\",\n );\n if (existsSync(dir)) return dir;\n }\n if (ctx.workspaceDir) {\n const dir = join(ctx.workspaceDir, \"notifications\");\n if (existsSync(dir)) return dir;\n }\n return null;\n}\n\n/** List available date keys (YYYY-MM-DD) sorted descending */\nexport function listDateKeys(dir: string): string[] {\n const pattern = /^(\\d{4}-\\d{2}-\\d{2})\\.json$/;\n const keys: string[] = [];\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (!entry.isFile()) continue;\n const m = pattern.exec(entry.name);\n if (m) keys.push(m[1]);\n }\n return keys.sort().reverse();\n}\n\n/** Read notifications for a specific date */\nexport function readDateFile(\n dir: string,\n dateKey: string,\n): StoredNotification[] {\n const filePath = join(dir, `${dateKey}.json`);\n if (!existsSync(filePath)) return [];\n try {\n return JSON.parse(readFileSync(filePath, \"utf-8\"));\n } catch {\n return [];\n }\n}\n\n/** Format today as YYYY-MM-DD */\nexport function today(): string {\n return formatDate(new Date());\n}\n\n/** Format a Date as YYYY-MM-DD */\nexport function formatDate(d: Date): string {\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n return `${y}-${m}-${day}`;\n}\n\n/** Get date N days ago as YYYY-MM-DD */\nexport function daysAgo(n: number): string {\n const d = new Date();\n d.setDate(d.getDate() - n);\n return formatDate(d);\n}\n\n/** Filter date keys to a [from, to] range (inclusive) */\nexport function filterDateRange(\n keys: string[],\n from: string,\n to: string,\n): string[] {\n return keys.filter((k) => k >= from && k <= to);\n}\n\n/** Parse an ISO 8601 timestamp and exit with a CLI error on invalid input */\nexport function parseIsoTime(\n value: string,\n optionName: \"--from\" | \"--to\",\n): number {\n const isoPattern =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d{1,3})?)?(Z|[+-]\\d{2}:\\d{2})$/;\n if (!isoPattern.test(value)) {\n exitError(\n \"INVALID_TIME\",\n `${optionName} 必须是 ISO 8601 时间,例如 2026-03-01T09:00:00+08:00`,\n );\n }\n\n const ts = Date.parse(value);\n if (Number.isNaN(ts)) {\n exitError(\n \"INVALID_TIME\",\n `${optionName} 不是合法时间,例如 2026-03-01T09:00:00+08:00`,\n );\n }\n return ts;\n}\n\n/** Sort notifications by timestamp descending (newest first) */\nexport function sortNotificationsByTimestampDesc(\n items: StoredNotification[],\n): StoredNotification[] {\n return items.sort((a, b) => Date.parse(b.timestamp) - Date.parse(a.timestamp));\n}\n\nconst APP_ALIAS_GROUPS = [\n [\"微信\", \"wechat\", \"weixin\", \"com.tencent.mm\", \"com.tencent.xin\"],\n [\"企业微信\", \"wecom\", \"wxwork\", \"com.tencent.wework\"],\n [\"飞书\", \"feishu\", \"lark\", \"com.ss.android.lark\", \"com.bytedance.ee.lark\", \"com.larksuite.suite\"],\n [\"钉钉\", \"dingtalk\", \"com.alibaba.android.rimet\"],\n [\"qq\", \"腾讯qq\", \"com.tencent.mobileqq\"],\n];\n\nfunction normalizeLookupText(value: string): string {\n return value.trim().toLowerCase();\n}\n\nfunction appAliasGroup(value: string): string[] | null {\n const normalized = normalizeLookupText(value);\n if (!normalized) return null;\n return APP_ALIAS_GROUPS.find((group) =>\n group.some((candidate) => normalizeLookupText(candidate) === normalized),\n ) ?? null;\n}\n\nexport function matchesNotificationAppFilter(\n item: StoredNotification,\n app: string,\n): boolean {\n const filter = normalizeLookupText(app);\n if (!filter) return true;\n\n const candidates = [item.appName, item.appDisplayName]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0);\n if (candidates.some((candidate) => normalizeLookupText(candidate) === filter)) {\n return true;\n }\n\n const filterGroup = appAliasGroup(app);\n if (!filterGroup) return false;\n return candidates.some((candidate) => appAliasGroup(candidate) === filterGroup);\n}\n\n/** Async version of listDateKeys */\nexport async function listDateKeysAsync(dir: string): Promise<string[]> {\n const pattern = /^(\\d{4}-\\d{2}-\\d{2})\\.json$/;\n const keys: string[] = [];\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isFile()) continue;\n const m = pattern.exec(entry.name);\n if (m) keys.push(m[1]);\n }\n return keys.sort().reverse();\n}\n\n/** Async version of readDateFile */\nexport async function readDateFileAsync(\n dir: string,\n dateKey: string,\n): Promise<StoredNotification[]> {\n const filePath = join(dir, `${dateKey}.json`);\n if (!existsSync(filePath)) return [];\n try {\n const content = await readFile(filePath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n return [];\n }\n}\n\n/** Write progress message to stderr (visible to caller, won't pollute JSON stdout) */\nexport function progress(message: string): void {\n process.stderr.write(message + \"\\n\");\n}\n\n/** Print JSON result to stdout */\nexport function output(data: unknown): void {\n process.stdout.write(JSON.stringify(data, null, 2) + \"\\n\");\n}\n\n/** Print error JSON and exit with code 1 */\nexport function exitError(code: string, message: string): never {\n output({ ok: false, error: { code, message } });\n process.exit(1);\n}\n\n/** Resolve the recordings storage directory (stateDir → workspace fallback) */\nexport function resolveRecordingsDir(ctx: CliContext): string | null {\n if (ctx.stateDir) {\n const dir = join(\n ctx.stateDir,\n \"plugins\",\n \"phone-notifications\",\n \"recordings\",\n );\n if (existsSync(dir)) return dir;\n }\n if (ctx.workspaceDir) {\n const dir = join(ctx.workspaceDir, \"recordings\");\n if (existsSync(dir)) return dir;\n }\n return null;\n}\n\n/** Recording index entry (mirrors RecordingIndexEntry from storage.ts) */\nexport interface CliRecordingEntry {\n id: string;\n clientLabel?: string;\n metadata: {\n name: string;\n duration_sec: number;\n file_size_bytes: number;\n created_at: string;\n transfer_status: string;\n [key: string]: unknown;\n };\n status: string;\n audioFile?: string;\n srtFile?: string;\n transcriptDataFile?: string;\n transcriptFile?: string;\n summaryFile?: string;\n title?: string;\n lastError?: string;\n ingestedAt: string;\n updatedAt: string;\n}\n\n/** Resolve the asr-config.json path; creates parent dirs if needed */\nexport function resolveAsrConfigPath(ctx: CliContext): string {\n let base: string;\n if (ctx.stateDir) {\n base = join(ctx.stateDir, \"plugins\", \"phone-notifications\", \"recordings\");\n } else if (ctx.workspaceDir) {\n base = join(ctx.workspaceDir, \"recordings\");\n } else {\n exitError(\n \"STORAGE_UNAVAILABLE\",\n \"无法确定录音存储目录:stateDir 和 workspaceDir 均未设置\",\n );\n }\n mkdirSync(base, { recursive: true });\n return join(base, \"asr-config.json\");\n}\n\n/** Mask an API key, keeping first 4 and last 4 chars */\nexport function maskApiKey(key: string): string {\n if (key.length <= 8) return \"***\";\n return `${key.slice(0, 4)}***${key.slice(-4)}`;\n}\n\n/** Read recording index.json */\nexport function readRecordingIndex(\n dir: string,\n): CliRecordingEntry[] {\n const indexPath = join(dir, \"index.json\");\n if (!existsSync(indexPath)) return [];\n try {\n const raw = JSON.parse(readFileSync(indexPath, \"utf-8\"));\n return Array.isArray(raw?.recordings) ? raw.recordings : [];\n } catch {\n return [];\n }\n}\n",
22
27
  "import type { LightPixelFramePixel, LightSegment } from \"../types.js\";\nimport { output, exitError } from \"../cli/helpers.js\";\n\nexport const VALID_MODES = [\n \"wave\",\n \"breath\",\n \"strobe\",\n \"steady\",\n \"color_flow\",\n \"pixel_frame\",\n] as const;\nexport const MAX_SEGMENTS = 12;\n\nexport interface ValidationError {\n field: string;\n message: string;\n}\n\nexport interface ValidationWarning {\n field: string;\n code: string;\n message: string;\n}\n\nexport type ValidationResult =\n | { valid: true; segments: LightSegment[]; warnings: ValidationWarning[] }\n | { valid: false; errors: ValidationError[] };\n\nexport function validateSegments(segments: unknown): ValidationResult {\n if (!Array.isArray(segments)) {\n return { valid: false, errors: [{ field: \"segments\", message: \"必须是数组\" }] };\n }\n if (segments.length === 0) {\n return { valid: false, errors: [{ field: \"segments\", message: \"不能为空\" }] };\n }\n if (segments.length > MAX_SEGMENTS) {\n return {\n valid: false,\n errors: [{ field: \"segments\", message: `最多 ${MAX_SEGMENTS} 段` }],\n };\n }\n\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n for (let i = 0; i < segments.length; i++) {\n validateSegment(segments[i], `segments[${i}]`, errors, warnings);\n }\n\n if (errors.length > 0) return { valid: false, errors };\n return { valid: true, segments: segments as LightSegment[], warnings };\n}\n\n/**\n * 解析 JSON 字符串并校验 segments,失败时直接 exitError。\n * 适用于 CLI action 中的统一入口。\n */\nexport function parseAndValidateSegments(json: string): LightSegment[] {\n let parsed: unknown;\n try {\n parsed = JSON.parse(json);\n } catch {\n exitError(\"VALIDATION_FAILED\", \"segments 必须是合法的 JSON\");\n }\n\n const result = validateSegments(parsed);\n if (!result.valid) {\n output({ ok: false, error: { code: \"VALIDATION_FAILED\", details: result.errors } });\n process.exit(1);\n }\n\n return result.segments;\n}\n\nfunction validateSegment(\n seg: unknown,\n prefix: string,\n errors: ValidationError[],\n warnings: ValidationWarning[],\n): void {\n if (!isRecord(seg)) {\n errors.push({ field: prefix, message: \"必须是对象\" });\n return;\n }\n\n const mode = seg.mode;\n if (!VALID_MODES.includes(mode as (typeof VALID_MODES)[number])) {\n errors.push({\n field: `${prefix}.mode`,\n message: `不支持的模式 '${String(mode)}',可选:${VALID_MODES.join(\"/\")}`,\n });\n }\n\n validateNonNegativeNumber(seg.duration_s, `${prefix}.duration_s`, errors, \"必须是 ≥0 的数字(0 表示无限时长)\");\n\n switch (mode) {\n case \"wave\":\n validateForegroundSegment(seg, prefix, errors);\n validateOptionalNonNegativeNumber(seg.interval_ms, `${prefix}.interval_ms`, errors);\n validateOptionalDirection(seg.direction, `${prefix}.direction`, errors);\n validateOptionalWindow(seg.window, `${prefix}.window`, errors);\n validateOptionalBackground(seg.background, `${prefix}.background`, errors);\n break;\n case \"color_flow\":\n validateForegroundSegment(seg, prefix, errors);\n validateOptionalNonNegativeNumber(seg.interval_ms, `${prefix}.interval_ms`, errors);\n validateOptionalDirection(seg.direction, `${prefix}.direction`, errors);\n validateOptionalWindow(seg.window, `${prefix}.window`, errors);\n validateOptionalBackground(seg.background, `${prefix}.background`, errors);\n type RgbLike = Parameters<typeof hasNonZeroRgb>[0];\n if (!hasNonZeroRgb(seg.color as RgbLike) && !hasNonZeroRgb(seg.background as RgbLike)) {\n errors.push({\n field: prefix,\n message: \"color_flow 至少需要一组非零颜色锚点(color 或 background)\",\n });\n }\n detectColorFlowSingleAnchorMisuse(seg, prefix, warnings);\n break;\n case \"breath\":\n validateForegroundSegment(seg, prefix, errors);\n validateOptionalBreathTiming(seg.breath_timing, `${prefix}.breath_timing`, errors);\n break;\n case \"strobe\":\n validateForegroundSegment(seg, prefix, errors);\n validateOptionalNonNegativeNumber(seg.interval_ms, `${prefix}.interval_ms`, errors);\n break;\n case \"steady\":\n validateForegroundSegment(seg, prefix, errors);\n break;\n case \"pixel_frame\":\n validatePixelFrame(seg.pixels, `${prefix}.pixels`, errors);\n break;\n default:\n validateOptionalNonNegativeNumber(seg.brightness, `${prefix}.brightness`, errors);\n validateOptionalColor(seg.color, `${prefix}.color`, errors);\n validateOptionalNonNegativeNumber(seg.interval_ms, `${prefix}.interval_ms`, errors);\n validateOptionalDirection(seg.direction, `${prefix}.direction`, errors);\n validateOptionalWindow(seg.window, `${prefix}.window`, errors);\n validateOptionalBreathTiming(seg.breath_timing, `${prefix}.breath_timing`, errors);\n validateOptionalBackground(seg.background, `${prefix}.background`, errors);\n }\n}\n\nfunction validateForegroundSegment(\n seg: Record<string, unknown>,\n prefix: string,\n errors: ValidationError[],\n): void {\n validateNumberInRange(\n seg.brightness,\n `${prefix}.brightness`,\n errors,\n 0,\n 255,\n \"必须是 0–255 的数字\",\n );\n validateColor(seg.color, `${prefix}.color`, errors);\n\n if (seg.mode !== \"steady\" && seg.brightness === 0) {\n errors.push({\n field: `${prefix}.brightness`,\n message: \"brightness=0 仅 steady 模式允许;其它模式会在固件侧被过滤\",\n });\n }\n}\n\nfunction validatePixelFrame(\n value: unknown,\n field: string,\n errors: ValidationError[],\n): void {\n if (!Array.isArray(value)) {\n errors.push({ field, message: \"pixel_frame 必须提供 pixels 数组(1–7 项)\" });\n return;\n }\n\n if (value.length < 1 || value.length > 7) {\n errors.push({ field, message: \"pixels 必须为 1–7 项\" });\n }\n\n const seen = new Set<number>();\n for (let i = 0; i < value.length; i++) {\n const pixel = value[i];\n const prefix = `${field}[${i}]`;\n if (!isRecord(pixel)) {\n errors.push({ field: prefix, message: \"必须是对象\" });\n continue;\n }\n\n const idx = pixel.index;\n if (!Number.isInteger(idx) || (idx as number) < 0 || (idx as number) > 6) {\n errors.push({ field: `${prefix}.index`, message: \"index 必须是 0–6 的整数\" });\n } else if (seen.has(idx as number)) {\n errors.push({ field: `${prefix}.index`, message: `index=${idx} 重复` });\n } else {\n seen.add(idx as number);\n }\n\n validateNumberInRange(\n pixel.brightness,\n `${prefix}.brightness`,\n errors,\n 0,\n 255,\n \"必须是 0–255 的数字\",\n );\n validateColor(pixel.color, `${prefix}.color`, errors);\n }\n}\n\nfunction validateOptionalBreathTiming(\n value: unknown,\n field: string,\n errors: ValidationError[],\n): void {\n if (value === undefined) return;\n if (!isRecord(value)) {\n errors.push({ field, message: \"必须是对象\" });\n return;\n }\n\n validatePositiveNumber(\n value.rise_ms,\n `${field}.rise_ms`,\n errors,\n \"rise_ms 必须是 >0 的数字(不支持 0ms)\",\n );\n validateNonNegativeNumber(\n value.hold_ms,\n `${field}.hold_ms`,\n errors,\n \"hold_ms 必须是 ≥0 的数字\",\n );\n validatePositiveNumber(\n value.fall_ms,\n `${field}.fall_ms`,\n errors,\n \"fall_ms 必须是 >0 的数字(不支持 0ms)\",\n );\n validateNonNegativeNumber(\n value.off_ms,\n `${field}.off_ms`,\n errors,\n \"off_ms 必须是 ≥0 的数字\",\n );\n}\n\nfunction validateOptionalBackground(\n value: unknown,\n field: string,\n errors: ValidationError[],\n): void {\n if (value === undefined) return;\n if (!isRecord(value)) {\n errors.push({ field, message: \"必须包含 r/g/b/brightness 数值\" });\n return;\n }\n\n validateColor(value, field, errors);\n validateNumberInRange(\n value.brightness,\n `${field}.brightness`,\n errors,\n 0,\n 255,\n \"必须是 0–255 的数字\",\n );\n}\n\nfunction validateOptionalColor(\n value: unknown,\n field: string,\n errors: ValidationError[],\n): void {\n if (value === undefined) return;\n validateColor(value, field, errors);\n}\n\nfunction validateColor(\n value: unknown,\n field: string,\n errors: ValidationError[],\n): void {\n if (!isRecord(value)) {\n errors.push({ field, message: \"必须包含 r/g/b 数值\" });\n return;\n }\n\n validateNumberInRange(value.r, `${field}.r`, errors, 0, 255, \"必须是 0–255 的数字\");\n validateNumberInRange(value.g, `${field}.g`, errors, 0, 255, \"必须是 0–255 的数字\");\n validateNumberInRange(value.b, `${field}.b`, errors, 0, 255, \"必须是 0–255 的数字\");\n}\n\nfunction validateOptionalDirection(\n value: unknown,\n field: string,\n errors: ValidationError[],\n): void {\n if (value === undefined) return;\n if (value !== \"ltr\" && value !== \"rtl\") {\n errors.push({ field, message: \"direction 必须是 ltr 或 rtl\" });\n }\n}\n\nfunction validateOptionalWindow(\n value: unknown,\n field: string,\n errors: ValidationError[],\n): void {\n if (value === undefined) return;\n if (value !== 1 && value !== 2 && value !== 3) {\n errors.push({ field, message: \"window 仅支持 1/2/3\" });\n }\n}\n\nfunction validateOptionalNonNegativeNumber(\n value: unknown,\n field: string,\n errors: ValidationError[],\n): void {\n if (value === undefined) return;\n validateNonNegativeNumber(value, field, errors, \"必须是 ≥0 的数字\");\n}\n\nfunction validatePositiveNumber(\n value: unknown,\n field: string,\n errors: ValidationError[],\n message: string,\n): void {\n if (value === undefined) return;\n if (!isFiniteNumber(value) || value <= 0) {\n errors.push({ field, message });\n }\n}\n\nfunction validateNonNegativeNumber(\n value: unknown,\n field: string,\n errors: ValidationError[],\n message: string,\n): void {\n if (!isFiniteNumber(value) || value < 0) {\n errors.push({ field, message });\n }\n}\n\nfunction validateNumberInRange(\n value: unknown,\n field: string,\n errors: ValidationError[],\n min: number,\n max: number,\n message: string,\n): void {\n if (!isFiniteNumber(value) || value < min || value > max) {\n errors.push({ field, message });\n }\n}\n\nfunction hasNonZeroRgb(\n value: Pick<LightPixelFramePixel[\"color\"], \"r\" | \"g\" | \"b\"> | { r?: unknown; g?: unknown; b?: unknown } | undefined,\n): boolean {\n if (!value) return false;\n return [value.r, value.g, value.b].some((channel) => isFiniteNumber(channel) && channel > 0);\n}\n\n/**\n * color_flow 是「调色板沿圆周流动」,由 1~2 个颜色锚点插值得到。\n * 当用户/模型只给单一极端纯色锚点(如纯红 R=255、G=B=0)且没有底色锚点时,\n * 实际效果是「同色系亮暗环状流动」(红→暗红),而不是多色调色板流动。\n * 这是已知的 bug 模式(详见 imp-custom-led-ai-read.md「模式选择易错对照」):\n * 上层往往是把用户的\"单色波浪\"误映射到 color_flow,应该改用 wave 模式。\n * 此处不阻塞,只 push 一条 warning 让前端/审计可见。\n */\nfunction detectColorFlowSingleAnchorMisuse(\n seg: Record<string, unknown>,\n prefix: string,\n warnings: ValidationWarning[],\n): void {\n const color = seg.color as { r?: unknown; g?: unknown; b?: unknown } | undefined;\n const background = seg.background as\n | { r?: unknown; g?: unknown; b?: unknown; brightness?: unknown }\n | undefined;\n\n const fgChannels = extractChannels(color);\n const bgChannels = extractChannels(background);\n if (!fgChannels) return;\n\n const bgBrightnessRaw = background?.brightness;\n const bgBrightness = isFiniteNumber(bgBrightnessRaw) ? bgBrightnessRaw : 0;\n const bgActive = !!bgChannels && bgChannels.some((c) => c > 0) && bgBrightness > 0;\n if (bgActive) return;\n\n const fgActiveChannels = fgChannels.filter((c) => c > 0);\n if (fgActiveChannels.length !== 1) return;\n if (fgActiveChannels[0] < 192) return;\n\n warnings.push({\n field: prefix,\n code: \"COLOR_FLOW_SINGLE_ANCHOR_MISUSE\",\n message:\n \"color_flow 仅设置了单一极端纯色前景锚点(无有效底色锚点),实际效果是同色系亮暗环状流动,不是多色调色板流动。\" +\n \"若用户期望的是\\\"单色波浪\\\",请改用 mode='wave';若期望多色流动,请同时设置 background 作为第二锚点。\",\n });\n}\n\nfunction extractChannels(\n value: { r?: unknown; g?: unknown; b?: unknown } | undefined,\n): [number, number, number] | null {\n if (!value) return null;\n const r = isFiniteNumber(value.r) ? value.r : 0;\n const g = isFiniteNumber(value.g) ? value.g : 0;\n const b = isFiniteNumber(value.b) ? value.b : 0;\n return [r, g, b];\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n",
23
28
  "export const LIGHT_RULE_GATEWAY_METHODS = {\n list: \"lightrules.list\",\n create: \"lightrules.create\",\n update: \"lightrules.update\",\n delete: \"lightrules.delete\",\n} as const;\n\nexport const LIGHT_RULE_GATEWAY_METHOD_LIST = [\n LIGHT_RULE_GATEWAY_METHODS.list,\n LIGHT_RULE_GATEWAY_METHODS.create,\n LIGHT_RULE_GATEWAY_METHODS.update,\n LIGHT_RULE_GATEWAY_METHODS.delete,\n] as const;\n\nexport const LIGHT_RULE_TOOL_NAMES = {\n list: \"lightrules_list\",\n create: \"lightrules_create\",\n update: \"lightrules_update\",\n delete: \"lightrules_delete\",\n} as const;\n\nexport const LIGHT_RULE_TOOL_NAME_LIST = [\n LIGHT_RULE_TOOL_NAMES.list,\n LIGHT_RULE_TOOL_NAMES.create,\n LIGHT_RULE_TOOL_NAMES.update,\n LIGHT_RULE_TOOL_NAMES.delete,\n] as const;\n",
24
29
  "import {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n rmSync,\n readdirSync,\n statSync,\n} from \"node:fs\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport type { LightSegment } from \"../types.js\";\nimport type { LightRuleMeta } from \"./types.js\";\nimport { assertAncsRepeatTimes, normalizeRepeatTimes } from \"../light/repeat.js\";\n\nexport interface LightRuleStorageContext {\n workspaceDir?: string;\n stateDir?: string;\n}\n\nfunction addUniquePath(paths: string[], path: string | undefined): void {\n if (!path) return;\n\n const normalized = resolve(path);\n if (!paths.includes(normalized)) {\n paths.push(normalized);\n }\n}\n\nfunction inferSiblingWorkspaceDir(stateDir: string): string | undefined {\n const stateDirName = basename(stateDir);\n if (!stateDirName.startsWith(\".\")) return undefined;\n\n // JVSClaw may keep plugin state under /home/admin/.openclaw while the\n // runtime workspace is /home/admin/openclaw/workspace.\n const siblingStateDir = join(dirname(stateDir), stateDirName.slice(1));\n const siblingWorkspaceDir = join(siblingStateDir, \"workspace\");\n return existsSync(siblingWorkspaceDir) ? siblingWorkspaceDir : undefined;\n}\n\nfunction resolveBaseDirs(ctx: LightRuleStorageContext): string[] {\n const dirs: string[] = [];\n\n addUniquePath(dirs, ctx.workspaceDir);\n\n if (ctx.stateDir) {\n addUniquePath(dirs, inferSiblingWorkspaceDir(ctx.stateDir));\n\n const inferredWorkspaceDir = join(ctx.stateDir, \"workspace\");\n if (existsSync(inferredWorkspaceDir)) {\n addUniquePath(dirs, inferredWorkspaceDir);\n }\n\n addUniquePath(dirs, ctx.stateDir);\n }\n\n if (dirs.length === 0) {\n throw new Error(\"workspaceDir and stateDir both unavailable\");\n }\n\n return dirs;\n}\n\nfunction resolveWriteBaseDir(ctx: LightRuleStorageContext): string {\n return resolveBaseDirs(ctx)[0];\n}\n\nfunction tasksDirs(ctx: LightRuleStorageContext): string[] {\n return resolveBaseDirs(ctx).map((baseDir) => join(baseDir, \"tasks\"));\n}\n\nfunction writeTasksDir(ctx: LightRuleStorageContext): string {\n return join(resolveWriteBaseDir(ctx), \"tasks\");\n}\n\nfunction normalizeLightRuleLookupName(name: string): string {\n return name.trim().replace(/\\.json$/i, \"\");\n}\n\nfunction resolveLightRuleTask(\n ctx: LightRuleStorageContext,\n name: string,\n): { taskDir: string; meta: LightRuleMeta } | null {\n const normalizedName = normalizeLightRuleLookupName(name);\n if (!normalizedName) return null;\n\n const dirs = tasksDirs(ctx);\n\n for (const dir of dirs) {\n const directTaskDir = join(dir, normalizedName);\n const directMeta = readMeta(directTaskDir);\n if (directMeta) {\n return {\n taskDir: directTaskDir,\n meta: directMeta,\n };\n }\n }\n\n for (const dir of dirs) {\n if (!existsSync(dir)) continue;\n\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n\n const taskDir = join(dir, entry.name);\n const meta = readMeta(taskDir);\n if (meta?.name === normalizedName) {\n return {\n taskDir,\n meta,\n };\n }\n }\n }\n\n return null;\n}\n\nfunction readOptionalString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed || undefined;\n}\n\nfunction readMeta(taskDir: string): LightRuleMeta | null {\n const metaPath = join(taskDir, \"meta.json\");\n if (!existsSync(metaPath)) return null;\n try {\n const raw = JSON.parse(readFileSync(metaPath, \"utf-8\"));\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return null;\n if (raw.type !== \"light-rule\") return null;\n if (!Array.isArray(raw.segments)) return null;\n const name = readOptionalString(raw.name) ?? basename(taskDir);\n const title = readOptionalString(raw.title) ?? name;\n const description = readOptionalString(raw.description) ?? name;\n const createdAt =\n readOptionalString(raw.createdAt) ?? statSync(metaPath).birthtime.toISOString();\n const enabled = typeof raw.enabled === \"boolean\" ? raw.enabled : true;\n const repeatTimes = normalizeRepeatTimes({\n repeat: raw.repeat,\n repeat_times: raw.repeat_times,\n });\n assertAncsRepeatTimes(repeatTimes);\n return {\n ...raw,\n name,\n title,\n type: \"light-rule\",\n description,\n segments: raw.segments,\n repeat_times: repeatTimes,\n enabled,\n createdAt,\n } as LightRuleMeta;\n } catch {\n return null;\n }\n}\n\nfunction writeMeta(taskDir: string, meta: LightRuleMeta): void {\n writeFileSync(join(taskDir, \"meta.json\"), JSON.stringify(meta, null, 2), \"utf-8\");\n}\n\nexport function listLightRules(ctx: LightRuleStorageContext): LightRuleMeta[] {\n const rules: LightRuleMeta[] = [];\n const seenNames = new Set<string>();\n\n for (const dir of tasksDirs(ctx)) {\n if (!existsSync(dir)) continue;\n\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const meta = readMeta(join(dir, entry.name));\n if (!meta || seenNames.has(meta.name)) continue;\n\n rules.push(meta);\n seenNames.add(meta.name);\n }\n }\n\n return rules;\n}\n\nexport function getLightRule(\n ctx: LightRuleStorageContext,\n name: string,\n): LightRuleMeta | null {\n return resolveLightRuleTask(ctx, name)?.meta ?? null;\n}\n\nexport function createLightRule(\n ctx: LightRuleStorageContext,\n params: {\n name: string;\n title: string;\n description: string;\n segments: LightSegment[];\n repeat_times?: number;\n repeat?: boolean;\n },\n): { meta: LightRuleMeta } {\n const existing = resolveLightRuleTask(ctx, params.name);\n if (existing) {\n throw new LightRuleError(\"ALREADY_EXISTS\", `灯效规则 '${params.name}' 已存在`);\n }\n\n const dir = writeTasksDir(ctx);\n const taskDir = join(dir, params.name);\n\n if (existsSync(taskDir)) {\n throw new LightRuleError(\"ALREADY_EXISTS\", `灯效规则 '${params.name}' 已存在`);\n }\n\n mkdirSync(taskDir, { recursive: true });\n\n const repeatTimes = normalizeRepeatTimes({\n repeat: params.repeat,\n repeat_times: params.repeat_times,\n });\n assertAncsRepeatTimes(repeatTimes);\n\n const meta: LightRuleMeta = {\n name: params.name,\n title: params.title,\n type: \"light-rule\",\n description: params.description,\n segments: params.segments,\n repeat_times: repeatTimes,\n enabled: true,\n createdAt: new Date().toISOString(),\n };\n\n writeMeta(taskDir, meta);\n\n return { meta };\n}\n\nexport function updateLightRule(\n ctx: LightRuleStorageContext,\n params: {\n name: string;\n title?: string;\n description?: string;\n segments?: LightSegment[];\n repeat_times?: number;\n repeat?: boolean;\n enabled?: boolean;\n },\n): { meta: LightRuleMeta } {\n const resolved = resolveLightRuleTask(ctx, params.name);\n const taskDir = resolved?.taskDir;\n const meta = resolved?.meta;\n\n if (!taskDir || !meta) {\n throw new LightRuleError(\"NOT_FOUND\", `灯效规则 '${params.name}' 不存在`);\n }\n\n if (params.description !== undefined) {\n meta.description = params.description;\n }\n if (params.title !== undefined) {\n meta.title = params.title;\n }\n if (params.segments !== undefined) {\n meta.segments = params.segments;\n }\n if (params.repeat !== undefined || params.repeat_times !== undefined) {\n meta.repeat_times = normalizeRepeatTimes({\n repeat: params.repeat,\n repeat_times: params.repeat_times,\n });\n assertAncsRepeatTimes(meta.repeat_times);\n }\n if (params.enabled !== undefined) {\n meta.enabled = params.enabled;\n }\n\n meta.updatedAt = new Date().toISOString();\n writeMeta(taskDir, meta);\n\n return { meta };\n}\n\nexport function deleteLightRule(\n ctx: LightRuleStorageContext,\n name: string,\n): { name: string } {\n const resolved = resolveLightRuleTask(ctx, name);\n const taskDir = resolved?.taskDir;\n const meta = resolved?.meta;\n\n if (!taskDir || !meta) {\n throw new LightRuleError(\"NOT_FOUND\", `灯效规则 '${name}' 不存在`);\n }\n\n rmSync(taskDir, { recursive: true, force: true });\n\n return { name: meta.name };\n}\n\nexport class LightRuleError extends Error {\n constructor(\n public code: string,\n message: string,\n ) {\n super(message);\n this.name = \"LightRuleError\";\n }\n}\n",
25
- "import type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport type { Logger } from \"../logger.js\";\nimport { assertAncsRepeatTimes, normalizeRepeatTimes } from \"../light/repeat.js\";\nimport { validateSegments } from \"../light/validators.js\";\nimport { LIGHT_RULE_GATEWAY_METHODS } from \"./names.js\";\nimport type { LightSegment } from \"../types.js\";\nimport type { BroadcastFn } from \"../update/types.js\";\nimport type {\n LightRuleCreateParams,\n LightRuleUpdateParams,\n LightRuleDeleteParams,\n} from \"./types.js\";\nimport { LightRuleError } from \"./storage.js\";\nimport type { LightRuleRegistry } from \"./registry.js\";\n\nfunction resolveRuleIdentifier(params: unknown): string | undefined {\n if (!params || typeof params !== \"object\") return undefined;\n\n const raw = params as Record<string, unknown>;\n const candidates = [raw.name, raw.id, raw.ruleId, raw.ruleName];\n for (const candidate of candidates) {\n if (typeof candidate !== \"string\") continue;\n const normalized = candidate.trim().replace(/\\.json$/i, \"\");\n if (normalized) return normalized;\n }\n\n return undefined;\n}\n\nexport function registerLightRulesGateway(\n api: OpenClawPluginApi,\n registry: LightRuleRegistry,\n logger: Pick<Logger, \"info\" | \"warn\">,\n rememberBroadcast?: (broadcast: BroadcastFn | undefined) => void,\n): void {\n type GatewayHandler = Parameters<OpenClawPluginApi[\"registerGatewayMethod\"]>[1];\n\n const registerGatewayMethodWithBroadcastCapture = (\n method: string,\n handler: GatewayHandler,\n ): void => {\n api.registerGatewayMethod(method, (opts) => {\n rememberBroadcast?.(opts.context?.broadcast);\n return handler(opts);\n });\n };\n\n // lightrules.list\n registerGatewayMethodWithBroadcastCapture(LIGHT_RULE_GATEWAY_METHODS.list, async ({ respond }) => {\n try {\n registry.reload();\n const rules = registry.list().map((rule) => ({\n ...rule,\n id: rule.name,\n }));\n respond(true, { ok: true, rules });\n } catch (err: any) {\n logger.warn(`${LIGHT_RULE_GATEWAY_METHODS.list} failed: ${err?.message}`);\n respond(false, null, {\n code: \"INTERNAL_ERROR\",\n message: err?.message ?? \"Unknown error\",\n });\n }\n });\n\n // lightrules.create\n registerGatewayMethodWithBroadcastCapture(\n LIGHT_RULE_GATEWAY_METHODS.create,\n async ({ params, respond }) => {\n const { name, title, description, segments, repeat, repeat_times } =\n params as unknown as LightRuleCreateParams;\n const resolvedTitle = typeof title === \"string\" && title.trim() ? title.trim() : name;\n\n if (!name || typeof name !== \"string\") {\n respond(false, null, { code: \"INVALID_PARAMS\", message: \"name is required\" });\n return;\n }\n if (!description || typeof description !== \"string\") {\n respond(false, null, { code: \"INVALID_PARAMS\", message: \"description is required\" });\n return;\n }\n\n const validation = validateSegments(segments);\n if (!validation.valid) {\n respond(false, null, {\n code: \"VALIDATION_FAILED\",\n message: JSON.stringify(validation.errors),\n });\n return;\n }\n\n let repeatTimes: number;\n try {\n repeatTimes = normalizeRepeatTimes({ repeat, repeat_times });\n assertAncsRepeatTimes(repeatTimes);\n } catch (err: any) {\n respond(false, null, {\n code: \"VALIDATION_FAILED\",\n message: err?.message ?? \"Unknown error\",\n });\n return;\n }\n\n try {\n const result = await registry.create({\n name,\n title: resolvedTitle,\n description,\n segments: validation.segments,\n repeat_times: repeatTimes,\n });\n logger.info(`Light rule created: ${name}`);\n respond(true, {\n ok: true,\n id: result.meta.name,\n name: result.meta.name,\n title: result.meta.title,\n rule: result.meta,\n });\n } catch (err: any) {\n if (err instanceof LightRuleError) {\n respond(false, null, { code: err.code, message: err.message });\n } else {\n logger.warn(`${LIGHT_RULE_GATEWAY_METHODS.create} failed: ${err?.message}`);\n respond(false, null, {\n code: \"INTERNAL_ERROR\",\n message: err?.message ?? \"Unknown error\",\n });\n }\n }\n },\n );\n\n // lightrules.update\n registerGatewayMethodWithBroadcastCapture(\n LIGHT_RULE_GATEWAY_METHODS.update,\n async ({ params, respond }) => {\n const { title, description, segments, repeat, repeat_times, enabled } =\n params as unknown as LightRuleUpdateParams;\n const name = resolveRuleIdentifier(params);\n const resolvedTitle = typeof title === \"string\" ? title.trim() : undefined;\n\n if (!name) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"name is required (or provide id/ruleId/ruleName)\",\n });\n return;\n }\n if (title !== undefined && !resolvedTitle) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"title must be a non-empty string\",\n });\n return;\n }\n if (description !== undefined && typeof description !== \"string\") {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"description must be a string\",\n });\n return;\n }\n\n let validatedSegments: LightSegment[] | undefined;\n if (segments !== undefined) {\n const validation = validateSegments(segments);\n if (!validation.valid) {\n respond(false, null, {\n code: \"VALIDATION_FAILED\",\n message: JSON.stringify(validation.errors),\n });\n return;\n }\n validatedSegments = validation.segments;\n }\n\n let repeatTimes: number | undefined;\n if (repeat !== undefined || repeat_times !== undefined) {\n try {\n repeatTimes = normalizeRepeatTimes({ repeat, repeat_times });\n assertAncsRepeatTimes(repeatTimes);\n } catch (err: any) {\n respond(false, null, {\n code: \"VALIDATION_FAILED\",\n message: err?.message ?? \"Unknown error\",\n });\n return;\n }\n }\n\n try {\n const result = await registry.update({\n name,\n title: resolvedTitle,\n description,\n segments: validatedSegments,\n repeat_times: repeatTimes,\n enabled,\n });\n logger.info(`Light rule updated: ${name}`);\n respond(true, {\n ok: true,\n id: result.meta.name,\n name: result.meta.name,\n title: result.meta.title,\n updated: true,\n rule: result.meta,\n });\n } catch (err: any) {\n if (err instanceof LightRuleError) {\n respond(false, null, { code: err.code, message: err.message });\n } else {\n logger.warn(`${LIGHT_RULE_GATEWAY_METHODS.update} failed: ${err?.message}`);\n respond(false, null, {\n code: \"INTERNAL_ERROR\",\n message: err?.message ?? \"Unknown error\",\n });\n }\n }\n },\n );\n\n // lightrules.delete\n registerGatewayMethodWithBroadcastCapture(\n LIGHT_RULE_GATEWAY_METHODS.delete,\n async ({ params, respond }) => {\n const name = resolveRuleIdentifier(params as unknown as LightRuleDeleteParams);\n\n if (!name) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"name is required (or provide id/ruleId/ruleName)\",\n });\n return;\n }\n try {\n const result = await registry.delete(name);\n logger.info(`Light rule deleted: ${result.name}`);\n respond(true, {\n ok: true,\n id: result.name,\n name: result.name,\n deleted: true,\n });\n } catch (err: any) {\n if (err instanceof LightRuleError) {\n respond(false, null, { code: err.code, message: err.message });\n } else {\n logger.warn(`${LIGHT_RULE_GATEWAY_METHODS.delete} failed: ${err?.message}`);\n respond(false, null, {\n code: \"INTERNAL_ERROR\",\n message: err?.message ?? \"Unknown error\",\n });\n }\n }\n },\n );\n}\n",
26
- "/**\n * LightRuleRegistry —— 灯效规则的内存索引 + CRUD 包装\n *\n * 角色定位:\n * - 在事件驱动重构方案下,每条通知到达时都需要拿到\"当前 enabled 的全部规则\"\n * 用来拼装 Agent 的 system prompt。如果每次都扫盘 N 个 meta.json,\n * 5 秒延迟预算会被磨穿,所以引入这个常驻内存的 index。\n * - 同时它是 storage.ts 的 CRUD 包装:所有 create/update/delete 都会先落盘、\n * 再更新内存 Map,保证两者一致。\n *\n * 本类**不**做规则匹配 —— 匹配交给 Agent。registry 只负责\"有哪些规则\"和\n * \"按需拼装 prompt\"。\n *\n * 写路径用一个 promise 链做串行化(最朴素的 mutex),保证并发 CRUD\n * 不会出现\"内存和磁盘交错\"的状态。\n *\n * 见 prd-lightrules-event-driven-refactor.md §数据模型 / §触发流程\n */\n\nimport {\n createLightRule,\n deleteLightRule,\n listLightRules,\n updateLightRule,\n type LightRuleStorageContext,\n} from \"./storage.js\";\nimport type { LightRuleMeta } from \"./types.js\";\n\nexport { LightRuleError } from \"./storage.js\";\n\ntype CreateParams = Parameters<typeof createLightRule>[1];\ntype UpdateParams = Parameters<typeof updateLightRule>[1];\ntype CreateResult = ReturnType<typeof createLightRule>;\ntype UpdateResult = ReturnType<typeof updateLightRule>;\ntype DeleteResult = ReturnType<typeof deleteLightRule>;\n\nexport class LightRuleRegistry {\n private readonly ctx: LightRuleStorageContext;\n /** name → meta 的内存索引;落盘成功后才更新 */\n private readonly index = new Map<string, LightRuleMeta>();\n /** 写路径串行化锁:每次 mutate 都 chain 在前一次之后 */\n private writeChain: Promise<unknown> = Promise.resolve();\n\n constructor(ctx: LightRuleStorageContext) {\n this.ctx = ctx;\n this.reload();\n }\n\n /**\n * 从磁盘重新加载全部规则到内存。仅在构造时和外部显式触发时使用。\n * 正常 CRUD 路径不应该调用本方法 —— 通过 create/update/delete 增量维护即可。\n */\n reload(): void {\n this.index.clear();\n for (const meta of listLightRules(this.ctx)) {\n this.index.set(meta.name, meta);\n }\n }\n\n /** 全部规则(包含 disabled),调用方不要改返回值。 */\n list(): LightRuleMeta[] {\n return Array.from(this.index.values());\n }\n\n /** 仅 enabled 的规则。事件驱动评估链路使用。 */\n getEnabled(): LightRuleMeta[] {\n return this.list().filter((rule) => rule.enabled);\n }\n\n /** 按名字精确查找;不存在返回 null。 */\n get(name: string): LightRuleMeta | null {\n return this.index.get(name) ?? null;\n }\n\n /**\n * 创建规则。落盘成功后再写入内存索引。\n * 失败时 storage 抛 LightRuleError,内存索引保持不变。\n */\n async create(params: CreateParams): Promise<CreateResult> {\n return this.runExclusive(() => {\n const result = createLightRule(this.ctx, params);\n this.index.set(result.meta.name, result.meta);\n return result;\n });\n }\n\n /**\n * 更新规则。落盘成功后再刷新内存条目。\n */\n async update(params: UpdateParams): Promise<UpdateResult> {\n return this.runExclusive(() => {\n const result = updateLightRule(this.ctx, params);\n this.index.set(result.meta.name, result.meta);\n return result;\n });\n }\n\n /**\n * 删除规则。落盘成功后再从内存索引移除。\n */\n async delete(name: string): Promise<DeleteResult> {\n return this.runExclusive(() => {\n const result = deleteLightRule(this.ctx, name);\n this.index.delete(result.name);\n return result;\n });\n }\n\n /**\n * 拼装 Agent 评估用的 system prompt。\n *\n * 当前实现是一个最小可用骨架:列出全部 enabled 规则的 title + name + description。\n * M3 接入真实 Agent 链路时,会按 prd-lightrules-event-driven-refactor.md §Prompt 拼装\n * 的模板补齐\"任务说明 / 输出约束\"等段落。\n *\n * 现在先把方法签名冻结,避免后续散落在多个调用点。\n */\n buildSystemPrompt(): string {\n const enabled = this.getEnabled();\n if (enabled.length === 0) {\n return \"当前没有启用任何灯效规则。\";\n }\n\n const lines: string[] = [\n '你是一个判断\"通知 → 灯效规则\"是否命中的助手。',\n \"\",\n \"下面是用户当前启用的全部灯效规则(按创建时间倒序):\",\n \"\",\n ];\n\n const sorted = [...enabled].sort((a, b) =>\n (b.createdAt ?? \"\").localeCompare(a.createdAt ?? \"\"),\n );\n\n sorted.forEach((rule, idx) => {\n lines.push(\n `[${idx + 1}] title: ${rule.title}`,\n ` name: ${rule.name}`,\n ` description: ${rule.description}`,\n \"\",\n );\n });\n\n lines.push(\n '任务:根据用户接下来发给你的\"通知\"内容,判断哪些规则被命中。',\n \"- 命中 0 条:不调用任何工具,直接结束。\",\n \"- 命中 1 条或多条:对每一条命中的规则调用一次 trigger_light(rule_name)。\",\n \"- 不要回复任何自由文本;判定结果**只**通过 tool calling 表达。\",\n '- 拿不准的时候倾向于\"不触发\",避免骚扰用户。',\n );\n\n return lines.join(\"\\n\");\n }\n\n /**\n * 把一段同步操作排队进 write chain,保证 mutate 串行执行。\n *\n * 用 promise 链做 mutex 是最简单的方案:每次 runExclusive 都把\n * `writeChain` 推进一步。即使前一个任务失败,链也会继续往下走,\n * 后续任务不会被永久阻塞。\n */\n private runExclusive<T>(fn: () => T): Promise<T> {\n const next = this.writeChain.then(\n () => fn(),\n () => fn(),\n );\n // 不让链上的失败传播下去(已在 then 的 onRejected 回调里吸收)\n this.writeChain = next.catch(() => undefined);\n return next;\n }\n}\n",
30
+ "import type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport type { Logger } from \"../logger.js\";\nimport { assertAncsRepeatTimes, normalizeRepeatTimes } from \"../light/repeat.js\";\nimport { validateSegments } from \"../light/validators.js\";\nimport { LIGHT_RULE_GATEWAY_METHODS } from \"./names.js\";\nimport type { LightSegment } from \"../types.js\";\nimport type { BroadcastFn } from \"../update/types.js\";\nimport { LightRuleError } from \"./storage.js\";\nimport type { LightRuleRegistry } from \"./registry.js\";\n\n// gateway 走本地 LightRuleRegistry(落盘 tasks/*/meta.json),与 Agent 工具\n// 走云端 Notification Intelligence Service 的形态不同,因此这里用本地参数类型,\n// 不复用 types.ts 中已被云端 ruleText 形态占用的 LightRule*Params。\ninterface GatewayCreateParams {\n name: string;\n title?: string;\n description: string;\n segments: unknown;\n repeat?: boolean;\n repeat_times?: number;\n}\n\ninterface GatewayUpdateParams {\n title?: string;\n description?: string;\n segments?: unknown;\n repeat?: boolean;\n repeat_times?: number;\n enabled?: boolean;\n}\n\nfunction resolveRuleIdentifier(params: unknown): string | undefined {\n if (!params || typeof params !== \"object\") return undefined;\n\n const raw = params as Record<string, unknown>;\n const candidates = [raw.name, raw.id, raw.ruleId, raw.ruleName];\n for (const candidate of candidates) {\n if (typeof candidate !== \"string\") continue;\n const normalized = candidate.trim().replace(/\\.json$/i, \"\");\n if (normalized) return normalized;\n }\n\n return undefined;\n}\n\nexport function registerLightRulesGateway(\n api: OpenClawPluginApi,\n registry: LightRuleRegistry,\n logger: Pick<Logger, \"info\" | \"warn\">,\n rememberBroadcast?: (broadcast: BroadcastFn | undefined) => void,\n): void {\n type GatewayHandler = Parameters<OpenClawPluginApi[\"registerGatewayMethod\"]>[1];\n\n const registerGatewayMethodWithBroadcastCapture = (\n method: string,\n handler: GatewayHandler,\n ): void => {\n api.registerGatewayMethod(method, (opts) => {\n rememberBroadcast?.(opts.context?.broadcast);\n return handler(opts);\n });\n };\n\n // lightrules.list\n registerGatewayMethodWithBroadcastCapture(LIGHT_RULE_GATEWAY_METHODS.list, async ({ respond }) => {\n try {\n registry.reload();\n const rules = registry.list().map((rule) => ({\n ...rule,\n id: rule.name,\n }));\n respond(true, { ok: true, rules });\n } catch (err: any) {\n logger.warn(`${LIGHT_RULE_GATEWAY_METHODS.list} failed: ${err?.message}`);\n respond(false, null, {\n code: \"INTERNAL_ERROR\",\n message: err?.message ?? \"Unknown error\",\n });\n }\n });\n\n // lightrules.create\n registerGatewayMethodWithBroadcastCapture(\n LIGHT_RULE_GATEWAY_METHODS.create,\n async ({ params, respond }) => {\n const { name, title, description, segments, repeat, repeat_times } =\n params as unknown as GatewayCreateParams;\n const resolvedTitle = typeof title === \"string\" && title.trim() ? title.trim() : name;\n\n if (!name || typeof name !== \"string\") {\n respond(false, null, { code: \"INVALID_PARAMS\", message: \"name is required\" });\n return;\n }\n if (!description || typeof description !== \"string\") {\n respond(false, null, { code: \"INVALID_PARAMS\", message: \"description is required\" });\n return;\n }\n\n const validation = validateSegments(segments);\n if (!validation.valid) {\n respond(false, null, {\n code: \"VALIDATION_FAILED\",\n message: JSON.stringify(validation.errors),\n });\n return;\n }\n\n let repeatTimes: number;\n try {\n repeatTimes = normalizeRepeatTimes({ repeat, repeat_times });\n assertAncsRepeatTimes(repeatTimes);\n } catch (err: any) {\n respond(false, null, {\n code: \"VALIDATION_FAILED\",\n message: err?.message ?? \"Unknown error\",\n });\n return;\n }\n\n try {\n const result = await registry.create({\n name,\n title: resolvedTitle,\n description,\n segments: validation.segments,\n repeat_times: repeatTimes,\n });\n logger.info(`Light rule created: ${name}`);\n respond(true, {\n ok: true,\n id: result.meta.name,\n name: result.meta.name,\n title: result.meta.title,\n rule: result.meta,\n });\n } catch (err: any) {\n if (err instanceof LightRuleError) {\n respond(false, null, { code: err.code, message: err.message });\n } else {\n logger.warn(`${LIGHT_RULE_GATEWAY_METHODS.create} failed: ${err?.message}`);\n respond(false, null, {\n code: \"INTERNAL_ERROR\",\n message: err?.message ?? \"Unknown error\",\n });\n }\n }\n },\n );\n\n // lightrules.update\n registerGatewayMethodWithBroadcastCapture(\n LIGHT_RULE_GATEWAY_METHODS.update,\n async ({ params, respond }) => {\n const { title, description, segments, repeat, repeat_times, enabled } =\n params as unknown as GatewayUpdateParams;\n const name = resolveRuleIdentifier(params);\n const resolvedTitle = typeof title === \"string\" ? title.trim() : undefined;\n\n if (!name) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"name is required (or provide id/ruleId/ruleName)\",\n });\n return;\n }\n if (title !== undefined && !resolvedTitle) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"title must be a non-empty string\",\n });\n return;\n }\n if (description !== undefined && typeof description !== \"string\") {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"description must be a string\",\n });\n return;\n }\n\n let validatedSegments: LightSegment[] | undefined;\n if (segments !== undefined) {\n const validation = validateSegments(segments);\n if (!validation.valid) {\n respond(false, null, {\n code: \"VALIDATION_FAILED\",\n message: JSON.stringify(validation.errors),\n });\n return;\n }\n validatedSegments = validation.segments;\n }\n\n let repeatTimes: number | undefined;\n if (repeat !== undefined || repeat_times !== undefined) {\n try {\n repeatTimes = normalizeRepeatTimes({ repeat, repeat_times });\n assertAncsRepeatTimes(repeatTimes);\n } catch (err: any) {\n respond(false, null, {\n code: \"VALIDATION_FAILED\",\n message: err?.message ?? \"Unknown error\",\n });\n return;\n }\n }\n\n try {\n const result = await registry.update({\n name,\n title: resolvedTitle,\n description,\n segments: validatedSegments,\n repeat_times: repeatTimes,\n enabled,\n });\n logger.info(`Light rule updated: ${name}`);\n respond(true, {\n ok: true,\n id: result.meta.name,\n name: result.meta.name,\n title: result.meta.title,\n updated: true,\n rule: result.meta,\n });\n } catch (err: any) {\n if (err instanceof LightRuleError) {\n respond(false, null, { code: err.code, message: err.message });\n } else {\n logger.warn(`${LIGHT_RULE_GATEWAY_METHODS.update} failed: ${err?.message}`);\n respond(false, null, {\n code: \"INTERNAL_ERROR\",\n message: err?.message ?? \"Unknown error\",\n });\n }\n }\n },\n );\n\n // lightrules.delete\n registerGatewayMethodWithBroadcastCapture(\n LIGHT_RULE_GATEWAY_METHODS.delete,\n async ({ params, respond }) => {\n const name = resolveRuleIdentifier(params);\n\n if (!name) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"name is required (or provide id/ruleId/ruleName)\",\n });\n return;\n }\n try {\n const result = await registry.delete(name);\n logger.info(`Light rule deleted: ${result.name}`);\n respond(true, {\n ok: true,\n id: result.name,\n name: result.name,\n deleted: true,\n });\n } catch (err: any) {\n if (err instanceof LightRuleError) {\n respond(false, null, { code: err.code, message: err.message });\n } else {\n logger.warn(`${LIGHT_RULE_GATEWAY_METHODS.delete} failed: ${err?.message}`);\n respond(false, null, {\n code: \"INTERNAL_ERROR\",\n message: err?.message ?? \"Unknown error\",\n });\n }\n }\n },\n );\n}\n",
27
31
  "import type { LightSegment } from \"../types.js\";\nimport { assertAncsRepeatTimes, normalizeRepeatTimes, type RepeatArgument } from \"./repeat.js\";\nimport { validateSegments } from \"./validators.js\";\n\nexport const MAX_LIGHT_SEGMENTS = 12;\n\nconst PROTOCOL_DIGITS = [\n \"\\u0080\",\n \"\\u0081\",\n \"\\u0082\",\n \"\\u0083\",\n \"\\u0084\",\n \"\\u0091\",\n \"\\u0092\",\n \"\\u0093\",\n \"\\u0094\",\n \"\\u0095\",\n \"\\u0096\",\n \"\\u0097\",\n] as const;\n\n/** \\u009A = play once, \\u009B = infinite loop */\nconst LED_SEPARATOR_ONCE = \"\\u009A\";\nconst LED_SEPARATOR_LOOP = \"\\u009B\";\n\n/** v0–v10 mapped by index; duration_s=0 is special-cased to v11 (infinite) */\nconst DURATION_STEPS_S = [0.5, 1, 2, 3, 5, 6, 8, 16, 24, 32, 48] as const;\n/** v0–v10 mapped by index; removed 400ms, added 50ms */\nconst INTERVAL_STEPS_MS = [50, 100, 200, 300, 500, 600, 800, 1600, 2400, 3200, 4800] as const;\nconst BREATH_STEPS_MS = [1040, 1560, 2080, 2600, 3100, 4160] as const;\nconst BRIGHTNESS_STEPS = [32, 64, 96, 128, 192, 255] as const;\nconst COLOR_STEPS = [0, 32, 64, 128, 192, 255] as const;\nconst BACKGROUND_BRIGHTNESS_STEPS = [0, 32, 64, 96, 128, 192, 255] as const;\nconst MULTI_CHANNEL_COLOR_COEFFICIENTS = { r: 1, g: 0.25, b: 0.25 } as const;\nconst PURE_WHITE_COLOR_COEFFICIENTS = { r: 1, g: 0.35, b: 0.35 } as const;\n\n/**\n * mode → wire-protocol M value.\n * color_flow encodes to M=v4 (firmware enum APP_LED_CUSTOM_MODE_WAVE_RAINBOW).\n * \"WAVE_RAINBOW\" is a legacy firmware name and does NOT imply rainbow/multi-color semantics;\n * the TS-side enum uses color_flow to avoid that confusion. See imp-custom-led-ai-read.md\n * \"模式选择易错对照\" for the mapping rules.\n */\nconst MODE_TO_INDEX: Record<LightSegment[\"mode\"], number> = {\n wave: 0,\n breath: 1,\n strobe: 2,\n steady: 3,\n color_flow: 4,\n pixel_frame: 5,\n};\n\nexport function buildLightEffectApnsBody(\n segments: LightSegment[],\n repeatInput?: RepeatArgument,\n visibleTextOverride?: string,\n): string {\n assertSegmentCount(segments);\n assertSegmentsValid(segments);\n\n const repeatTimes = normalizeRepeatTimes(repeatInput);\n assertAncsRepeatTimes(repeatTimes);\n\n const visibleText = resolveVisibleText(visibleTextOverride, segments);\n const separator = repeatTimes === 0 ? LED_SEPARATOR_LOOP : LED_SEPARATOR_ONCE;\n const payload = segments.map((segment) => encodeSegment(segment)).join(\"\");\n return `${visibleText}${separator}${payload}`;\n}\n\nfunction resolveVisibleText(\n override: string | undefined,\n segments: LightSegment[],\n): string {\n const trimmed = override?.trim();\n if (trimmed) return trimmed;\n return summarizeSegments(segments);\n}\n\nfunction assertSegmentCount(segments: LightSegment[]): void {\n if (segments.length < 1 || segments.length > MAX_LIGHT_SEGMENTS) {\n throw new Error(`light_control supports 1-${MAX_LIGHT_SEGMENTS} segments`);\n }\n}\n\nfunction summarizeSegments(segments: LightSegment[]): string {\n const modeDesc = segments.map((segment) => segment.mode).join(\"+\");\n return `Effect: ${modeDesc} (${segments.length} segment${segments.length > 1 ? \"s\" : \"\"})`;\n}\n\nfunction assertSegmentsValid(segments: LightSegment[]): void {\n const validation = validateSegments(segments);\n if (!validation.valid) {\n throw new Error(\n validation.errors.map((error) => `${error.field}: ${error.message}`).join(\"; \"),\n );\n }\n}\n\nfunction encodeSegment(segment: LightSegment): string {\n const common = [\n MODE_TO_INDEX[segment.mode],\n quantizeDuration(segment.duration_s),\n ];\n\n let values: number[];\n switch (segment.mode) {\n case \"wave\":\n case \"color_flow\":\n const color = normalizeProtocolColor(segment.color);\n const background = normalizeProtocolColor(segment.background);\n values = [\n ...common,\n quantize(segment.interval_ms ?? 200, INTERVAL_STEPS_MS),\n quantizeBrightnessValue(segment.brightness ?? 0),\n quantize(color.r, COLOR_STEPS),\n quantize(color.g, COLOR_STEPS),\n quantize(color.b, COLOR_STEPS),\n segment.direction === \"rtl\" ? 1 : 0,\n quantizeWindow(segment.window ?? 2),\n quantize(background.r, COLOR_STEPS),\n quantize(background.g, COLOR_STEPS),\n quantize(background.b, COLOR_STEPS),\n quantize(segment.background?.brightness ?? 0, BACKGROUND_BRIGHTNESS_STEPS),\n ];\n break;\n case \"breath\":\n const breathColor = normalizeProtocolColor(segment.color);\n values = [\n ...common,\n quantizeBreathRiseFall(segment.breath_timing?.rise_ms),\n quantizeBreathHoldOff(segment.breath_timing?.hold_ms),\n quantizeBreathRiseFall(segment.breath_timing?.fall_ms),\n quantizeBreathHoldOff(segment.breath_timing?.off_ms),\n quantizeBrightnessValue(segment.brightness ?? 0),\n quantize(breathColor.r, COLOR_STEPS),\n quantize(breathColor.g, COLOR_STEPS),\n quantize(breathColor.b, COLOR_STEPS),\n ];\n break;\n case \"strobe\":\n const strobeColor = normalizeProtocolColor(segment.color);\n values = [\n ...common,\n quantize(segment.interval_ms ?? 200, INTERVAL_STEPS_MS),\n quantizeBrightnessValue(segment.brightness ?? 0),\n quantize(strobeColor.r, COLOR_STEPS),\n quantize(strobeColor.g, COLOR_STEPS),\n quantize(strobeColor.b, COLOR_STEPS),\n ];\n break;\n case \"steady\":\n const steadyColor = normalizeProtocolColor(segment.color);\n values = [\n ...common,\n quantizeBrightnessValue(segment.brightness ?? 0),\n quantize(steadyColor.r, COLOR_STEPS),\n quantize(steadyColor.g, COLOR_STEPS),\n quantize(steadyColor.b, COLOR_STEPS),\n ];\n break;\n case \"pixel_frame\":\n values = encodePixelFrameValues(common, segment);\n break;\n }\n\n return values.map((value) => PROTOCOL_DIGITS[value]).join(\"\");\n}\n\nfunction encodePixelFrameValues(common: number[], segment: LightSegment): number[] {\n const pixels = segment.pixels ?? [];\n return [\n ...common,\n pixels.length - 1,\n ...pixels.flatMap((pixel) => {\n const color = normalizeProtocolColor(pixel.color);\n return [\n pixel.index,\n quantize(color.r, COLOR_STEPS),\n quantize(color.g, COLOR_STEPS),\n quantize(color.b, COLOR_STEPS),\n quantizeBrightnessValue(pixel.brightness),\n ];\n }),\n ];\n}\n\nexport function normalizeProtocolColor(\n color:\n | Pick<NonNullable<LightSegment[\"color\"]>, \"r\" | \"g\" | \"b\">\n | Pick<NonNullable<LightSegment[\"background\"]>, \"r\" | \"g\" | \"b\">\n | undefined,\n): { r: number; g: number; b: number } {\n const normalized = {\n r: color?.r ?? 0,\n g: color?.g ?? 0,\n b: color?.b ?? 0,\n };\n\n if (isPureWhiteProtocolColor(normalized)) {\n return applyProtocolColorCoefficients(normalized, PURE_WHITE_COLOR_COEFFICIENTS);\n }\n\n if (countActiveProtocolColorChannels(normalized) <= 1) {\n return normalized;\n }\n\n return applyProtocolColorCoefficients(normalized, MULTI_CHANNEL_COLOR_COEFFICIENTS);\n}\n\nfunction countActiveProtocolColorChannels(color: { r: number; g: number; b: number }): number {\n return Number(color.r > 0) + Number(color.g > 0) + Number(color.b > 0);\n}\n\nfunction isPureWhiteProtocolColor(color: { r: number; g: number; b: number }): boolean {\n return color.r === 255 && color.g === 255 && color.b === 255;\n}\n\nfunction applyProtocolColorCoefficients(\n color: { r: number; g: number; b: number },\n coefficients: { r: number; g: number; b: number },\n): { r: number; g: number; b: number } {\n return {\n r: scaleProtocolColorChannel(color.r, coefficients.r),\n g: scaleProtocolColorChannel(color.g, coefficients.g),\n b: scaleProtocolColorChannel(color.b, coefficients.b),\n };\n}\n\nfunction scaleProtocolColorChannel(value: number, coefficient: number): number {\n return Math.max(0, Math.min(255, Math.round(value * coefficient)));\n}\n\nfunction quantize(value: number, steps: readonly number[]): number {\n let bestIndex = 0;\n let bestDistance = Number.POSITIVE_INFINITY;\n\n for (const [index, step] of steps.entries()) {\n const distance = Math.abs(value - step);\n if (distance < bestDistance) {\n bestIndex = index;\n bestDistance = distance;\n }\n }\n\n return bestIndex;\n}\n\n/** duration_s=0 maps to v11 (infinite); otherwise quantize to DURATION_STEPS_S */\nfunction quantizeDuration(duration_s: number): number {\n if (duration_s === 0) return 11;\n return quantize(duration_s, DURATION_STEPS_S);\n}\n\n/**\n * brightness=0 maps to v11 (explicit off / pixel-off).\n * Otherwise quantize to BRIGHTNESS_STEPS (v0–v5).\n */\nfunction quantizeBrightnessValue(brightness: number): number {\n if (brightness === 0) return 11;\n return quantize(brightness, BRIGHTNESS_STEPS);\n}\n\nfunction quantizeBreathRiseFall(value: number | undefined): number {\n return quantize(value ?? 1040, BREATH_STEPS_MS);\n}\n\nfunction quantizeBreathHoldOff(value: number | undefined): number {\n if (value === 0) {\n return 5;\n }\n\n return quantize(value ?? 1040, BREATH_STEPS_MS.slice(0, 5));\n}\n\nfunction quantizeWindow(value: 1 | 2 | 3): number {\n return value - 1;\n}\n",
28
- "import type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport type { Logger } from \"../logger.js\";\nimport { assertAncsRepeatTimes, normalizeRepeatTimes } from \"../light/repeat.js\";\nimport { validateSegments, type ValidationWarning } from \"../light/validators.js\";\nimport { LightRuleError } from \"../light-rules/registry.js\";\nimport { LIGHT_RULE_TOOL_NAMES } from \"../light-rules/names.js\";\nimport type { LightRuleRegistry } from \"../light-rules/registry.js\";\nimport type { LightRuleCreateParams, LightRuleUpdateParams } from \"../light-rules/types.js\";\nimport { MAX_LIGHT_SEGMENTS } from \"../light/protocol.js\";\n\nconst segmentItemSchema = {\n type: \"object\",\n required: [\"mode\", \"duration_s\"],\n additionalProperties: false,\n properties: {\n mode: {\n type: \"string\",\n enum: [\"wave\", \"breath\", \"strobe\", \"steady\", \"color_flow\", \"pixel_frame\"],\n description:\n \"灯效模式:wave 波浪(单色跑马)/ breath 呼吸 / strobe 频闪 / steady 常亮 / \" +\n \"color_flow 流光(1~2 锚点调色板流动;**不是彩虹**,无法生成 7 色彩虹波浪)/ \" +\n \"pixel_frame 逐组像素帧。\" +\n \"易错对照:用户说\\\"红色/蓝色波浪\\\"等单一颜色波浪 → 必须用 wave;用户说\\\"彩虹/七彩/rainbow\\\" → 固件不支持,需告知限制。\",\n },\n duration_s: { type: \"number\", minimum: 0, description: \"持续时长(秒),0 表示无限\" },\n brightness: { type: \"number\", minimum: 0, maximum: 255 },\n color: {\n type: \"object\",\n required: [\"r\", \"g\", \"b\"],\n additionalProperties: false,\n properties: {\n r: { type: \"number\", minimum: 0, maximum: 255 },\n g: { type: \"number\", minimum: 0, maximum: 255 },\n b: { type: \"number\", minimum: 0, maximum: 255 },\n },\n },\n interval_ms: { type: \"number\", minimum: 0 },\n direction: { type: \"string\", enum: [\"ltr\", \"rtl\"] },\n window: { type: \"number\", enum: [1, 2, 3] },\n breath_timing: {\n type: \"object\",\n additionalProperties: false,\n properties: {\n rise_ms: { type: \"number\", minimum: 0 },\n hold_ms: { type: \"number\", minimum: 0 },\n fall_ms: { type: \"number\", minimum: 0 },\n off_ms: { type: \"number\", minimum: 0 },\n },\n },\n frames: { type: \"array\", items: { type: \"array\", items: { type: \"number\" } } },\n frame_duration_ms: { type: \"number\", minimum: 0 },\n background: {\n type: \"object\",\n required: [\"r\", \"g\", \"b\"],\n additionalProperties: false,\n properties: {\n r: { type: \"number\", minimum: 0, maximum: 255 },\n g: { type: \"number\", minimum: 0, maximum: 255 },\n b: { type: \"number\", minimum: 0, maximum: 255 },\n },\n },\n },\n} as const;\n\nconst segmentsSchema = {\n type: \"array\",\n description: \"灯效段序列,1–12 段,按顺序播放\",\n minItems: 1,\n maxItems: MAX_LIGHT_SEGMENTS,\n items: segmentItemSchema,\n} as const;\n\nfunction ok(data: object): { content: [{ type: \"text\"; text: string }]; details: object } {\n return { content: [{ type: \"text\" as const, text: JSON.stringify(data) }], details: data };\n}\n\nfunction err(\n code: string,\n message: string,\n): { content: [{ type: \"text\"; text: string }]; details: object } {\n const data = { ok: false, error: { code, message } };\n return { content: [{ type: \"text\" as const, text: JSON.stringify(data) }], details: data };\n}\n\nexport function registerLightRulesTools(\n api: OpenClawPluginApi,\n registry: LightRuleRegistry,\n logger: Pick<Logger, \"info\" | \"warn\">,\n): void {\n // lightrules_list\n api.registerTool({\n name: LIGHT_RULE_TOOL_NAMES.list,\n label: \"List Light Rules\",\n description:\n '列出所有灯效规则(包含 enabled/disabled 状态)。当用户说\"列出灯效规则\"、\"有哪些灯效规则\"、\"查看规则\"等时调用。' +\n \"注意:灯效规则的所有 CRUD 操作必须通过 lightrules_* 工具完成,禁止直接用 write/edit 修改 tasks/*/meta.json。\",\n parameters: { type: \"object\", properties: {}, additionalProperties: false },\n async execute(_toolCallId, _params) {\n try {\n registry.reload();\n const rules = registry.list().map((rule) => ({ ...rule, id: rule.name }));\n return ok({ ok: true, rules });\n } catch (e: any) {\n logger.warn(`${LIGHT_RULE_TOOL_NAMES.list} tool failed: ${e?.message}`);\n return err(\"INTERNAL_ERROR\", e?.message ?? \"Unknown error\");\n }\n },\n });\n\n // lightrules_create\n api.registerTool({\n name: LIGHT_RULE_TOOL_NAMES.create,\n label: \"Create Light Rule\",\n description:\n '创建一条持久灯效规则,指定内部标识 name、展示名 title、自然语言触发描述和灯效参数。规则会保存到 tasks/<name>/meta.json,并由通知到达后的事件驱动评估触发。' +\n '当用户说\"收到某类通知/消息时亮灯/闪灯/变灯效\"、\"当老板发消息亮红灯\"、\"新增/创建灯效规则\"等时调用。' +\n \"不要直接调用 light_control 代替创建规则;light_control 只会立即亮一次灯,不会出现在灯效规则查询中。\",\n parameters: {\n type: \"object\",\n required: [\"name\", \"title\", \"description\", \"segments\"],\n additionalProperties: false,\n properties: {\n name: {\n type: \"string\",\n description: \"规则的内部唯一标识符(英文 slug,如 red_light_on_wechat)\",\n },\n title: {\n type: \"string\",\n description:\n \"规则的展示名/短标题,应是对 description 的总结凝练,例如“老板微信红灯”\",\n },\n description: {\n type: \"string\",\n description:\n \"自然语言触发条件,同时作为规则用途说明。Agent 按此字段判断是否命中,必须清晰描述「何时触发」\",\n },\n segments: segmentsSchema,\n repeat_times: {\n type: \"number\",\n description: \"整条灯效序列重复次数,0=无限循环,1=播放一次(默认)\",\n },\n },\n },\n async execute(_toolCallId, params) {\n const { name, title, description, segments, repeat_times } =\n params as LightRuleCreateParams;\n const resolvedTitle = typeof title === \"string\" && title.trim() ? title.trim() : name;\n\n if (!name || typeof name !== \"string\")\n return err(\"INVALID_PARAMS\", \"name is required\");\n if (!description || typeof description !== \"string\")\n return err(\"INVALID_PARAMS\", \"description is required\");\n\n const validation = validateSegments(segments);\n if (!validation.valid) return err(\"VALIDATION_FAILED\", JSON.stringify(validation.errors));\n\n let repeatTimes: number;\n try {\n repeatTimes = normalizeRepeatTimes({ repeat_times });\n assertAncsRepeatTimes(repeatTimes);\n } catch (e: any) {\n return err(\"VALIDATION_FAILED\", e?.message ?? \"Unknown error\");\n }\n\n try {\n const result = await registry.create({\n name,\n title: resolvedTitle,\n description,\n segments: validation.segments,\n repeat_times: repeatTimes,\n });\n logger.info(`${LIGHT_RULE_TOOL_NAMES.create} tool: created ${name}`);\n for (const warning of validation.warnings) {\n logger.warn(\n `${LIGHT_RULE_TOOL_NAMES.create} validation warning [${warning.code}] ${warning.field}: ${warning.message}`,\n );\n }\n return ok({\n ok: true,\n id: result.meta.name,\n name: result.meta.name,\n title: result.meta.title,\n rule: result.meta,\n ...(validation.warnings.length > 0 ? { warnings: validation.warnings } : {}),\n });\n } catch (e: any) {\n if (e instanceof LightRuleError) return err(e.code, e.message);\n logger.warn(`${LIGHT_RULE_TOOL_NAMES.create} tool failed: ${e?.message}`);\n return err(\"INTERNAL_ERROR\", e?.message ?? \"Unknown error\");\n }\n },\n });\n\n // lightrules_update\n api.registerTool({\n name: LIGHT_RULE_TOOL_NAMES.update,\n label: \"Update Light Rule\",\n description:\n '修改灯效规则(启用/禁用、改 title、改描述、改灯效参数)。当用户说\"禁用某条规则\"、\"启用规则\"、\"修改灯效规则\"等时调用。' +\n \"必须传入要修改的规则标识 name;如果只知道展示名、序号或不确定 name,先调用 lightrules_list 获取规则列表后再更新。\",\n parameters: {\n type: \"object\",\n required: [\"name\"],\n additionalProperties: false,\n properties: {\n name: { type: \"string\", description: \"要修改的规则名称(唯一标识符)\" },\n title: {\n type: \"string\",\n description: \"新的展示名/短标题(可选)\",\n },\n description: { type: \"string\", description: \"新的触发条件描述(可选)\" },\n enabled: { type: \"boolean\", description: \"true=启用,false=禁用\" },\n segments: { ...segmentsSchema, description: \"新的灯效段序列(可选,不填则保持不变)\" },\n repeat_times: { type: \"number\", description: \"新的重复次数(可选)\" },\n },\n },\n async execute(_toolCallId, params) {\n const { name, title, description, enabled, segments, repeat_times } =\n params as LightRuleUpdateParams;\n const resolvedTitle = typeof title === \"string\" ? title.trim() : undefined;\n\n if (!name || typeof name !== \"string\")\n return err(\n \"INVALID_PARAMS\",\n \"name is required; call lightrules_list first if you do not know the rule name\",\n );\n if (title !== undefined && !resolvedTitle)\n return err(\"INVALID_PARAMS\", \"title must be a non-empty string\");\n if (description !== undefined && typeof description !== \"string\")\n return err(\"INVALID_PARAMS\", \"description must be a string\");\n\n let validatedSegments;\n let segmentWarnings: ValidationWarning[] = [];\n if (segments !== undefined) {\n const validation = validateSegments(segments);\n if (!validation.valid) return err(\"VALIDATION_FAILED\", JSON.stringify(validation.errors));\n validatedSegments = validation.segments;\n segmentWarnings = validation.warnings;\n }\n\n let repeatTimes: number | undefined;\n if (repeat_times !== undefined) {\n try {\n repeatTimes = normalizeRepeatTimes({ repeat_times });\n assertAncsRepeatTimes(repeatTimes);\n } catch (e: any) {\n return err(\"VALIDATION_FAILED\", e?.message ?? \"Unknown error\");\n }\n }\n\n try {\n const result = await registry.update({\n name,\n title: resolvedTitle,\n description,\n segments: validatedSegments,\n repeat_times: repeatTimes,\n enabled,\n });\n logger.info(`${LIGHT_RULE_TOOL_NAMES.update} tool: updated ${name}`);\n for (const warning of segmentWarnings) {\n logger.warn(\n `${LIGHT_RULE_TOOL_NAMES.update} validation warning [${warning.code}] ${warning.field}: ${warning.message}`,\n );\n }\n return ok({\n ok: true,\n name: result.meta.name,\n title: result.meta.title,\n updated: true,\n rule: result.meta,\n ...(segmentWarnings.length > 0 ? { warnings: segmentWarnings } : {}),\n });\n } catch (e: any) {\n if (e instanceof LightRuleError) return err(e.code, e.message);\n logger.warn(`${LIGHT_RULE_TOOL_NAMES.update} tool failed: ${e?.message}`);\n return err(\"INTERNAL_ERROR\", e?.message ?? \"Unknown error\");\n }\n },\n });\n\n // lightrules_delete\n api.registerTool({\n name: LIGHT_RULE_TOOL_NAMES.delete,\n label: \"Delete Light Rule\",\n description:\n '删除一条灯效规则(不可恢复)。当用户说\"删除灯效规则\"、\"移除规则\"等时调用。',\n parameters: {\n type: \"object\",\n required: [\"name\"],\n additionalProperties: false,\n properties: {\n name: { type: \"string\", description: \"要删除的规则名称\" },\n },\n },\n async execute(_toolCallId, params) {\n const { name } = params as { name: string };\n\n if (!name || typeof name !== \"string\")\n return err(\"INVALID_PARAMS\", \"name is required\");\n\n try {\n const result = await registry.delete(name);\n logger.info(`${LIGHT_RULE_TOOL_NAMES.delete} tool: deleted ${name}`);\n return ok({ ok: true, name: result.name, deleted: true });\n } catch (e: any) {\n if (e instanceof LightRuleError) return err(e.code, e.message);\n logger.warn(`${LIGHT_RULE_TOOL_NAMES.delete} tool failed: ${e?.message}`);\n return err(\"INTERNAL_ERROR\", e?.message ?? \"Unknown error\");\n }\n },\n });\n}\n",
29
32
  "import {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n watch,\n} from \"node:fs\";\nimport { dirname, basename } from \"node:path\";\nimport { resolveStateFile } from \"../host.js\";\n\ninterface Credentials {\n /**\n * 推荐:API Key 明文(例如 ock_xxx)\n */\n apiKey?: string;\n /**\n * CLI multi-key 共享格式。存在该字段时以它为准;空数组表示显式未配置 key。\n */\n apiKeys?: ApiKeyEntry[];\n /**\n * 兼容旧字段:历史上这里存的是 token;现在等价于 apiKey\n */\n token?: string;\n /**\n * 当前环境(development / production),由 ntf env switch 写入\n */\n env?: string;\n /**\n * jvsclaw 专用:上次置换 apiKey 时使用的 link_secret 哈希。\n * 用于重置后检测宿主下发的密文是否变化,避免继续复用旧实例 apiKey。\n */\n jvsclawLinkSecretHash?: string;\n}\n\ninterface ApiKeyEntry {\n label?: string;\n key?: string;\n default?: boolean;\n createdAt?: string;\n}\n\nconst API_KEY_ENV = \"YOOOCLAW_API_KEY\";\n\nexport function credentialsPath(): string {\n return resolveStateFile(\"credentials.json\");\n}\n\nexport function readCredentials(): Credentials {\n const path = credentialsPath();\n if (!existsSync(path)) return {};\n try {\n return JSON.parse(readFileSync(path, \"utf-8\"));\n } catch {\n return {};\n }\n}\n\nexport function writeCredentials(creds: Credentials): void {\n const path = credentialsPath();\n mkdirSync(dirname(path), { recursive: true, mode: 0o700 });\n writeFileSync(path, JSON.stringify(creds, null, 2), {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n}\n\nfunction normalizedKey(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction loadApiKeyFromMulti(creds: Credentials): string | undefined {\n if (!Array.isArray(creds.apiKeys)) return undefined;\n const entries = creds.apiKeys\n .map((entry) => ({\n key: normalizedKey(entry?.key),\n default: entry?.default === true,\n }))\n .filter((entry): entry is { key: string; default: boolean } => Boolean(entry.key));\n return entries.find((entry) => entry.default)?.key ?? entries[0]?.key;\n}\n\nexport function loadApiKey(): string | undefined {\n const env = normalizedKey(process.env[API_KEY_ENV]);\n if (env) return env;\n\n const creds = readCredentials();\n if (Array.isArray(creds.apiKeys)) {\n return loadApiKeyFromMulti(creds);\n }\n return normalizedKey(creds.apiKey) ?? normalizedKey(creds.token);\n}\n\nexport function writeSingleApiKey(apiKey: string): void {\n const creds = readCredentials();\n delete creds.apiKeys;\n writeCredentials({ ...creds, apiKey, token: undefined });\n}\n\nexport function clearApiKeys(): void {\n const creds = readCredentials();\n delete creds.apiKey;\n delete creds.apiKeys;\n delete creds.token;\n writeCredentials(creds);\n}\n\nexport function requireApiKey(): string {\n const apiKey = loadApiKey();\n if (!apiKey) {\n throw new Error(\n `API Key 未设置,请先写入 ${credentialsPath()},或通过宿主 CLI 执行 ntf auth set-api-key <apiKey>`,\n );\n }\n return apiKey;\n}\n\n// ---- Backward-compatible exports (旧代码仍可编译;语义等价于 apiKey) ----\nexport function loadToken(): string | undefined {\n return loadApiKey();\n}\n\nexport function requireToken(): string {\n return requireApiKey();\n}\n\n/** 监听 credentials 文件变化(如 set-token 后)触发 callback;返回取消监听的函数 */\nexport function watchCredentials(onChange: () => void): () => void {\n const path = credentialsPath();\n const dir = dirname(path);\n const filename = basename(path);\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n const delayMs = 200;\n\n const listener = (_event: string, changedName: string | null) => {\n if (!changedName || (changedName !== filename && !changedName.endsWith(filename))) return;\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => {\n debounceTimer = null;\n onChange();\n }, delayMs);\n };\n\n let watcher: ReturnType<typeof watch> | null = null;\n try {\n watcher = watch(dir, { persistent: false }, listener);\n } catch {\n // 目录可能不存在\n }\n\n return () => {\n if (debounceTimer) clearTimeout(debounceTimer);\n watcher?.close();\n };\n}\n",
30
33
  "/**\n * 宿主检测。\n *\n * - detectHostKind():旧的路径/状态目录家族检测(openclaw | qclaw),行为与 host.ts 完全一致。\n * - resolveClawKind():新的渠道 Profile 选择(openclaw | arkclaw | jvsclaw),\n * 优先级 PHONE_NOTIFICATIONS_CLAW_PROFILE 环境变量 > 持久化 profile >\n * jvsclaw 直解 tgz 痕迹 > openclaw。\n */\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { ClawKind, HostKind } from \"./types.js\";\nimport {\n DEFAULT_JVSCLAW_STATE_DIR,\n loadQClawMeta,\n hasOpenClawMarkers,\n resolveConfigPathFromEnv,\n resolvePersistedProfileStateDirs,\n resolvePluginConfigPathOverrideFromEnv,\n resolveStateDirFromEnv,\n trimToUndefined,\n} from \"./paths.js\";\n\nfunction detectHostKindFromPath(value: string | undefined): HostKind | undefined {\n if (!value) {\n return undefined;\n }\n const normalized = value.replace(/\\\\/g, \"/\").toLowerCase();\n if (\n normalized.endsWith(\"/.qclaw\") ||\n normalized.includes(\"/.qclaw/\") ||\n normalized.endsWith(\"/.qclow\") ||\n normalized.includes(\"/.qclow/\")\n ) {\n return \"qclaw\";\n }\n if (normalized.endsWith(\"/.openclaw\") || normalized.includes(\"/.openclaw/\")) {\n return \"openclaw\";\n }\n return undefined;\n}\n\nexport function detectHostKind(): HostKind {\n if (\n trimToUndefined(process.env.QCLAW_STATE_DIR) ||\n trimToUndefined(process.env.QCLAW_CONFIG_PATH) ||\n trimToUndefined(process.env.QCLAW_HOME)\n ) {\n return \"qclaw\";\n }\n\n const pathHintKind =\n detectHostKindFromPath(resolveStateDirFromEnv()) ??\n detectHostKindFromPath(resolveConfigPathFromEnv());\n if (pathHintKind) {\n return pathHintKind;\n }\n\n if (hasOpenClawMarkers()) {\n return \"openclaw\";\n }\n\n if (loadQClawMeta()) {\n return \"qclaw\";\n }\n\n return \"openclaw\";\n}\n\nconst VALID_CLAW_KINDS: ReadonlySet<string> = new Set<ClawKind>([\n \"openclaw\",\n \"arkclaw\",\n \"jvsclaw\",\n]);\nconst PLUGIN_ID = \"phone-notifications\";\n\n/** 读取持久化到可写 stateDir/.env 的 PHONE_NOTIFICATIONS_CLAW_PROFILE。 */\nfunction readPersistedClawProfile(): string | undefined {\n for (const stateDir of resolvePersistedProfileStateDirs()) {\n let content: string;\n try {\n content = readFileSync(join(stateDir, \".env\"), \"utf-8\");\n } catch {\n continue;\n }\n for (const line of content.split(\"\\n\")) {\n const eq = line.indexOf(\"=\");\n if (eq < 1) continue;\n if (line.slice(0, eq).trim() === \"PHONE_NOTIFICATIONS_CLAW_PROFILE\") {\n return line.slice(eq + 1).trim();\n }\n }\n }\n return undefined;\n}\n\nfunction hasJvsclawEnvHint(): boolean {\n return Boolean(\n trimToUndefined(process.env.JVSCLAW_STATE_DIR) ||\n trimToUndefined(process.env.JVSCLAW_CONFIG_PATH) ||\n trimToUndefined(process.env.JVSCLAW_HOME),\n );\n}\n\nfunction readPluginLinkSecret(configPath: string | undefined): string | undefined {\n if (!configPath) return undefined;\n\n let config: unknown;\n try {\n config = JSON.parse(readFileSync(configPath, \"utf-8\"));\n } catch {\n return undefined;\n }\n\n const entries = readObject(readObject(config, \"plugins\"), \"entries\");\n const pluginEntry = readObject(entries, PLUGIN_ID);\n const pluginConfig = readObject(pluginEntry, \"config\");\n const linkSecret = pluginConfig?.link_secret;\n return typeof linkSecret === \"string\"\n ? linkSecret.trim() || undefined\n : undefined;\n}\n\nfunction hasJvsclawLinkSecret(): boolean {\n const paths = [\n resolvePluginConfigPathOverrideFromEnv(),\n resolveConfigPathFromEnv(),\n join(DEFAULT_JVSCLAW_STATE_DIR, \"openclaw.json\"),\n ].filter((value, index, arr): value is string => Boolean(value) && arr.indexOf(value) === index);\n\n return paths.some((configPath) => Boolean(readPluginLinkSecret(configPath)));\n}\n\nfunction readObject(\n value: unknown,\n key: string,\n): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n const nested = (value as Record<string, unknown>)[key];\n return nested && typeof nested === \"object\"\n ? (nested as Record<string, unknown>)\n : undefined;\n}\n\n/**\n * 选择渠道 Profile。\n * 优先级:PHONE_NOTIFICATIONS_CLAW_PROFILE 环境变量 > 持久化的 .env(安装脚本 --channel)\n * > jvsclaw 直解 tgz 的运行期/配置痕迹 > 默认 openclaw。\n * 安装脚本带 --channel 时写入 .env,运行期零歧义;jvsclaw 线上直解 tgz 时没有这一步,\n * 需要从 JVSCLAW_* env 或宿主注入的 link_secret 识别。\n */\nexport function resolveClawKind(): ClawKind {\n const fromEnv = trimToUndefined(process.env.PHONE_NOTIFICATIONS_CLAW_PROFILE)?.toLowerCase();\n if (fromEnv && VALID_CLAW_KINDS.has(fromEnv)) {\n return fromEnv as ClawKind;\n }\n\n const persisted = readPersistedClawProfile()?.toLowerCase();\n if (persisted && VALID_CLAW_KINDS.has(persisted)) {\n return persisted as ClawKind;\n }\n\n if (hasJvsclawEnvHint() || hasJvsclawLinkSecret()) {\n return \"jvsclaw\";\n }\n\n // 自动检测兜底:qclaw 与 openclaw 同属 apiKey 家族,统一归为 openclaw。\n return \"openclaw\";\n}\n",
31
34
  "/**\n * 宿主原始路径解析。\n *\n * 注意:这里解析的是宿主暴露的目录,不保证可写。JvsClaw 可能把\n * JVSCLAW_STATE_DIR / JVSCLAW_HOME 指向只读 rootfs(例如 /opt/jvs-claw)。\n * 插件自己的可写目录必须通过 runtime-paths.ts 解析。\n */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\ninterface QClawMeta {\n stateDir?: string;\n configPath?: string;\n}\n\nexport const DEFAULT_JVSCLAW_STATE_DIR = \"/home/admin/.openclaw\";\nexport const PHONE_NOTIFICATIONS_STATE_DIR_ENV = \"PHONE_NOTIFICATIONS_STATE_DIR\";\nexport const PHONE_NOTIFICATIONS_CONFIG_PATH_ENV = \"PHONE_NOTIFICATIONS_CONFIG_PATH\";\n\nexport function trimToUndefined(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed || undefined;\n}\n\nexport function homeDir(): string {\n return process.env.HOME || process.env.USERPROFILE || \"/tmp\";\n}\n\nexport function expandUserPath(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n if (value === \"~\") {\n return homeDir();\n }\n if (value.startsWith(\"~/\")) {\n return join(homeDir(), value.slice(2));\n }\n return value;\n}\n\nfunction candidateMetaPaths(): string[] {\n const home = homeDir();\n return [\n join(home, \".qclaw\", \"qclaw.json\"),\n join(home, \".qclow\", \"qclaw.json\"),\n ];\n}\n\nexport function loadQClawMeta(): QClawMeta | undefined {\n for (const metaPath of candidateMetaPaths()) {\n if (!existsSync(metaPath)) {\n continue;\n }\n try {\n const parsed = JSON.parse(readFileSync(metaPath, \"utf-8\")) as QClawMeta;\n return {\n stateDir: expandUserPath(trimToUndefined(parsed?.stateDir)),\n configPath: expandUserPath(trimToUndefined(parsed?.configPath)),\n };\n } catch {\n // ignore invalid metadata and keep trying\n }\n }\n return undefined;\n}\n\n/** 插件可写状态目录的显式覆盖。与宿主原始 stateDir 分离。 */\nexport function resolvePluginStateDirOverrideFromEnv(): string | undefined {\n return expandUserPath(\n trimToUndefined(process.env[PHONE_NOTIFICATIONS_STATE_DIR_ENV]),\n );\n}\n\n/** 插件使用的配置文件显式覆盖。与宿主原始 configPath 分离。 */\nexport function resolvePluginConfigPathOverrideFromEnv(): string | undefined {\n return expandUserPath(\n trimToUndefined(process.env[PHONE_NOTIFICATIONS_CONFIG_PATH_ENV]),\n );\n}\n\n/** 解析宿主暴露的原始状态目录环境变量。返回值不保证可写。 */\nexport function resolveStateDirFromEnv(): string | undefined {\n return expandUserPath(\n trimToUndefined(process.env.JVSCLAW_STATE_DIR) ??\n trimToUndefined(process.env.JVSCLAW_HOME) ??\n trimToUndefined(process.env.OPENCLAW_STATE_DIR) ??\n trimToUndefined(process.env.QCLAW_STATE_DIR) ??\n trimToUndefined(process.env.OPENCLAW_ROOT) ??\n trimToUndefined(process.env.OPENCLAW_HOME) ??\n trimToUndefined(process.env.QCLAW_HOME),\n );\n}\n\n/** 解析宿主暴露的原始配置文件环境变量。返回值不保证可写。 */\nexport function resolveConfigPathFromEnv(): string | undefined {\n return expandUserPath(\n trimToUndefined(process.env.JVSCLAW_CONFIG_PATH) ??\n trimToUndefined(process.env.OPENCLAW_CONFIG_PATH) ??\n trimToUndefined(process.env.QCLAW_CONFIG_PATH),\n );\n}\n\nexport function hasOpenClawMarkers(): boolean {\n const baseDir = join(homeDir(), \".openclaw\");\n return [\n join(baseDir, \"openclaw.json\"),\n join(baseDir, \"credentials.json\"),\n join(baseDir, \"extensions\"),\n ].some((candidate) => existsSync(candidate));\n}\n\n/**\n * 解析宿主原始状态目录。仅用于必须与宿主运行时交互的场景,例如 Gateway\n * 设备配对。插件文件写入请使用 runtime-paths.ts 的 resolveStateDir()。\n */\nexport function resolveHostStateDir(stateDir?: string): string {\n const explicitDir = expandUserPath(trimToUndefined(stateDir));\n if (explicitDir) {\n return explicitDir;\n }\n\n const envDir = resolveStateDirFromEnv();\n if (envDir) {\n return envDir;\n }\n\n if (hasOpenClawMarkers()) {\n return join(homeDir(), \".openclaw\");\n }\n\n const meta = loadQClawMeta();\n if (meta?.stateDir) {\n return meta.stateDir;\n }\n if (meta?.configPath) {\n return dirname(meta.configPath);\n }\n\n return join(homeDir(), \".openclaw\");\n}\n\n/** 解析宿主原始配置文件路径。返回值不保证位于可写目录。 */\nexport function resolveHostConfigPath(\n stateDir = resolveHostStateDir(),\n): string {\n const envConfigPath = resolveConfigPathFromEnv();\n if (envConfigPath) {\n return envConfigPath;\n }\n\n const meta = loadQClawMeta();\n if (\n meta?.configPath &&\n (!meta.stateDir || !stateDir || meta.stateDir === stateDir)\n ) {\n return meta.configPath;\n }\n\n return join(stateDir, \"openclaw.json\");\n}\n\n/**\n * 返回可能持久化 PHONE_NOTIFICATIONS_CLAW_PROFILE 的目录。\n * detect.ts 使用这些候选路径判断渠道,避免因宿主只读根目录而漏读 JvsClaw 配置。\n */\nexport function resolvePersistedProfileStateDirs(): string[] {\n const dirs: string[] = [];\n const add = (dir: string | undefined) => {\n if (dir && !dirs.includes(dir)) {\n dirs.push(dir);\n }\n };\n\n add(resolvePluginStateDirOverrideFromEnv());\n add(DEFAULT_JVSCLAW_STATE_DIR);\n add(resolveHostStateDir());\n return dirs;\n}\n",
32
35
  "/**\n * 插件可写路径解析。\n *\n * 宿主原始目录与插件可写目录在 OpenClaw / QClaw 下通常相同,但 JvsClaw\n * 可能把宿主目录指向只读 rootfs。所有插件文件写入都应经过这里。\n */\nimport { join } from \"node:path\";\nimport { resolveClawKind } from \"./detect.js\";\nimport {\n DEFAULT_JVSCLAW_STATE_DIR,\n resolveHostConfigPath,\n resolveHostStateDir,\n resolvePluginConfigPathOverrideFromEnv,\n resolvePluginStateDirOverrideFromEnv,\n} from \"./paths.js\";\n\n/**\n * 解析插件可写状态目录。\n *\n * PHONE_NOTIFICATIONS_STATE_DIR 是明确的可写覆盖;JVSCLAW_STATE_DIR 等变量\n * 只描述宿主原始目录,不参与 JvsClaw 插件文件写入。\n */\nexport function resolveStateDir(hostStateDir?: string): string {\n const override = resolvePluginStateDirOverrideFromEnv();\n if (override) {\n return override;\n }\n\n if (resolveClawKind() === \"jvsclaw\") {\n return DEFAULT_JVSCLAW_STATE_DIR;\n }\n\n return resolveHostStateDir(hostStateDir);\n}\n\n/** 解析插件应使用的配置文件路径。 */\nexport function resolveConfigPath(hostStateDir?: string): string {\n const override = resolvePluginConfigPathOverrideFromEnv();\n if (override) {\n return override;\n }\n\n if (resolveClawKind() === \"jvsclaw\") {\n return join(resolveStateDir(hostStateDir), \"openclaw.json\");\n }\n\n return resolveHostConfigPath(resolveHostStateDir(hostStateDir));\n}\n\n/** 解析插件可写状态目录中的文件。 */\nexport function resolveStateFile(\n filename: string,\n hostStateDir?: string,\n): string {\n return join(resolveStateDir(hostStateDir), filename);\n}\n",
33
- "import { randomUUID } from \"node:crypto\";\nimport { buildLightEffectApnsBody } from \"./protocol.js\";\nimport { getEnvUrls } from \"../env.js\";\nimport type { LightSegment } from \"../types.js\";\nimport type { RepeatArgument } from \"./repeat.js\";\n\nexport interface SendLightResult {\n ok: boolean;\n bizUniqueId?: string;\n response?: unknown;\n status?: number;\n error?: string;\n}\n\nexport async function sendLightEffect(\n apiKey: string,\n segments: LightSegment[],\n logger?: { info: (msg: string) => void; warn: (msg: string) => void },\n repeatInput?: RepeatArgument,\n reason?: string,\n title?: string,\n): Promise<SendLightResult> {\n const apiUrl = getEnvUrls().lightApiUrl;\n const appKey = \"phone-notifications\";\n const templateId = process.env.LIGHT_TEMPLATE_ID;\n const resolvedTitle = resolveLightTitle(title, reason, segments);\n\n logger?.info(\n `Light sender: apiUrl=${apiUrl ?? \"UNSET\"}, appKey=${appKey ? appKey.substring(0, 8) + \"…\" : \"UNSET\"}, templateId=${templateId ?? \"UNSET\"}, apiKey=${apiKey ? apiKey.substring(0, 20) + \"…\" : \"EMPTY\"}, title=${resolvedTitle}, reason=${reason ?? \"\"}, segments=${JSON.stringify(segments)}`,\n );\n\n if (!apiUrl || !appKey || !templateId) {\n return {\n ok: false,\n error:\n \"灯效 API 未配置,请确认构建时已封装 OPENCLAW_HOST_* / LIGHT_APP_KEY / LIGHT_TEMPLATE_ID\",\n };\n }\n\n let bizContent: string;\n try {\n bizContent = buildLightEffectApnsBody(segments, repeatInput, reason);\n } catch (error: any) {\n return { ok: false, error: error?.message ?? String(error) };\n }\n const bizUniqueId = randomUUID();\n\n const requestBody = {\n appKey,\n bizMap: { noticeType: \"APP_NOTIFICATION_IMPORTANT\", title: resolvedTitle, reason },\n bizUniqueId,\n paramsMap: { bizContent },\n pushType: \"SPECIFY_PUSH\",\n templateId,\n };\n\n logger?.info(\n `Light sender: POST ${apiUrl}, bizUniqueId=${bizUniqueId}, body=${JSON.stringify(requestBody).substring(0, 500)}`,\n );\n\n const res = await fetch(apiUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Api-Key-Id\": apiKey.startsWith(\"Bearer \")\n ? apiKey.slice(\"Bearer \".length)\n : apiKey,\n },\n body: JSON.stringify(requestBody),\n });\n\n const resBody = await res.text();\n if (!res.ok) {\n logger?.warn(\n `Light sender: FAILED ${res.status}, url=${apiUrl}, resBody=${resBody.substring(0, 500)}`,\n );\n return { ok: false, status: res.status, error: resBody };\n }\n\n logger?.info(`Light sender: OK bizUniqueId=${bizUniqueId}, resBody=${resBody.substring(0, 200)}`);\n return { ok: true, bizUniqueId, response: JSON.parse(resBody) };\n}\n\nfunction resolveLightTitle(\n title: string | undefined,\n reason: string | undefined,\n segments: LightSegment[],\n): string {\n const trimmedTitle = title?.trim();\n if (trimmedTitle) return trimmedTitle;\n\n const trimmedReason = reason?.trim();\n if (trimmedReason) return trimmedReason;\n\n const modeDesc = segments.map((segment) => segment.mode).join(\"+\");\n return `Effect: ${modeDesc || \"custom\"}`;\n}\n",
34
- "import { randomBytes } from \"node:crypto\";\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { readCredentials } from \"./auth/credentials.js\";\nimport { resolveStateFile } from \"./host.js\";\n\n// 容错解析:先按换行切分,再按 KEY= 边界切分,恢复历史上把多条记录粘在同一行的 .env。\n// lookbehind 限定前一个字符不是标识符字符,避免在 key 内部错误切分。\nfunction parseEnvContent(content: string): Map<string, string> {\n const entries = new Map<string, string>();\n const tokens = content\n .split(/\\r?\\n/)\n .flatMap((line) => line.split(/(?<![A-Z0-9_])(?=[A-Z_][A-Z0-9_]*=)/));\n for (const token of tokens) {\n const trimmed = token.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eq = trimmed.indexOf(\"=\");\n if (eq < 1) continue;\n const key = trimmed.slice(0, eq).trim();\n if (!/^[A-Z_][A-Z0-9_]*$/.test(key)) continue;\n entries.set(key, trimmed.slice(eq + 1).trim());\n }\n return entries;\n}\n\nfunction writeDotEnv(key: string, value: string): void {\n const path = resolveStateFile(\".env\");\n mkdirSync(dirname(path), { recursive: true });\n const existing = existsSync(path) ? readFileSync(path, \"utf-8\") : \"\";\n const entries = parseEnvContent(existing);\n entries.set(key, value);\n const output =\n Array.from(entries, ([k, v]) => `${k}=${v}`).join(\"\\n\") + \"\\n\";\n const tmpPath = `${path}.tmp.${process.pid}.${randomBytes(4).toString(\"hex\")}`;\n try {\n // JvsClaw may leave an existing .env read-only while its state directory\n // remains writable. Replacing a sibling temp file avoids reopening it.\n writeFileSync(tmpPath, output, { encoding: \"utf-8\", mode: 0o600 });\n renameSync(tmpPath, path);\n } catch (error) {\n try {\n rmSync(tmpPath, { force: true });\n } catch {\n // ignore tmp cleanup failure\n }\n throw error;\n }\n}\n\nexport type EnvName = \"development\" | \"test\" | \"production\";\n\nconst DEFAULT_ENV_HOSTS: Record<EnvName, string> = {\n development: \"openclaw-service-dev.yoooclaw.com\",\n test: \"openclaw-service-test.yoooclaw.com\",\n production: \"openclaw-service.yoooclaw.com\",\n};\n\ninterface EnvUrls {\n lightApiUrl: string;\n appNameMapUrl: string;\n relayTunnelUrl: string;\n modelProxyLongRecordingSubmitTaskUrl: string;\n modelProxyLongRecordingQueryTaskResultBaseUrl: string;\n gatewayConnectStatusUrl: string;\n /** jvsclaw 实例就绪/密文换 apiKey 接口(复用插件现有接口 host)。 */\n clawManagerInstanceReadyUrl: string;\n}\n\nfunction normalizeHost(host: string | undefined): string | undefined {\n const trimmed = host?.trim();\n if (!trimmed) return undefined;\n return trimmed\n .replace(/^https?:\\/\\//, \"\")\n .replace(/^wss?:\\/\\//, \"\")\n .replace(/\\/+$/, \"\");\n}\n\nfunction getEnvHost(env: EnvName): string {\n let host: string | undefined;\n switch (env) {\n case \"development\":\n host = process.env.OPENCLAW_HOST_DEVELOPMENT;\n break;\n case \"test\":\n host = process.env.OPENCLAW_HOST_TEST;\n break;\n case \"production\":\n host = process.env.OPENCLAW_HOST_PRODUCTION;\n break;\n }\n return normalizeHost(host) ?? DEFAULT_ENV_HOSTS[env];\n}\n\nfunction buildEnvUrls(host: string): EnvUrls {\n const https = `https://${host}`;\n const wss = `wss://${host}`;\n return {\n lightApiUrl: `${https}/api/message/tob/sendMessage`,\n relayTunnelUrl: `${wss}/message/messages/ws/plugin`,\n appNameMapUrl: `${https}/api/application-config/app-package/config-all`,\n modelProxyLongRecordingSubmitTaskUrl: `${https}/api/model-proxy/long-recording/submit-task`,\n modelProxyLongRecordingQueryTaskResultBaseUrl: `${https}/api/model-proxy/long-recording/query-task-result`,\n gatewayConnectStatusUrl: `${https}/api/message/messageBridge/plugin/gateway-connect-status`,\n clawManagerInstanceReadyUrl: `${https}/claw-manager/internal/claw-manager/instance/ready`,\n };\n}\n\nconst VALID_ENVS: ReadonlySet<string> = new Set<string>([\n \"development\",\n \"test\",\n \"production\",\n]);\n\nfunction readDotEnv(): Record<string, string> {\n const path = resolveStateFile(\".env\");\n if (!existsSync(path)) return {};\n return Object.fromEntries(parseEnvContent(readFileSync(path, \"utf-8\")));\n}\n\n/** 读取持久化到 .env 的环境名称;仅反映本地配置,不考虑进程环境变量。 */\nexport function readPersistedEnvName(): EnvName | undefined {\n const fromDotEnv = readDotEnv()[\"PHONE_NOTIFICATIONS_ENV\"]?.trim();\n if (fromDotEnv && VALID_ENVS.has(fromDotEnv)) return fromDotEnv as EnvName;\n return undefined;\n}\n\n/** 读取当前环境名称。优先级:PHONE_NOTIFICATIONS_ENV 环境变量 > .env > credentials.json > 默认 production */\nexport function loadEnvName(): EnvName {\n const fromEnvVar = process.env.PHONE_NOTIFICATIONS_ENV?.trim();\n if (fromEnvVar && VALID_ENVS.has(fromEnvVar)) return fromEnvVar as EnvName;\n\n const fromDotEnv = readPersistedEnvName();\n if (fromDotEnv) return fromDotEnv;\n\n const { env } = readCredentials();\n if (env && VALID_ENVS.has(env)) return env as EnvName;\n\n return \"production\";\n}\n\n/** 持久化当前环境到 .env */\nexport function saveEnvName(env: EnvName): void {\n if (!VALID_ENVS.has(env)) {\n throw new Error(\n `无效的环境名称: ${env},可选值: ${[...VALID_ENVS].join(\", \")}`,\n );\n }\n writeDotEnv(\"PHONE_NOTIFICATIONS_ENV\", env);\n}\n\n/** 获取当前环境的 URL 配置 */\nexport function getEnvUrls(env?: EnvName): EnvUrls {\n return buildEnvUrls(getEnvHost(env ?? loadEnvName()));\n}\n\n/** 获取所有可用环境名称 */\nexport function getAvailableEnvs(): EnvName[] {\n return [\"development\", \"test\", \"production\"];\n}\n",
35
- "/**\n * InlineLightRuleEvaluator —— 进程内灯效规则评估器\n *\n * 事件驱动重构的\"轻量路径\"实现:收到一批新通知后,通过 PiAiInvoker 做一次\n * LLM 匹配,再对命中的规则直接调用 `sendLightEffect`。全流程在插件进程内\n * 完成,不走 cron job / subagent session / agent turn。\n *\n * 与旧路径的关键差异:\n * - 旧:每条通知 → 一次完整 OpenClaw agent session(高 overhead + 贵模型)\n * - 新:每批通知 → 一次 Haiku complete()(数百 token 输入 / 数十 token 输出)\n *\n * 返回值语义:\n * - true:评估链路完整跑完(可能 0 命中、可能触发了 N 次灯效)\n * - false:invoker 调用失败,调用方据此决定是否回退 legacy 路径\n */\n\nimport { requireApiKey } from \"../auth/credentials.js\";\nimport { sendLightEffect } from \"../light/sender.js\";\nimport type { Logger } from \"../logger.js\";\nimport type { StoredNotification } from \"../notification/storage.js\";\nimport type { LightRuleEvaluationTrace } from \"./evaluation-scheduler.js\";\nimport type { PiAiInvoker } from \"./pi-invoker.js\";\nimport type { LightRuleRegistry } from \"./registry.js\";\nimport type { LightRuleMeta } from \"./types.js\";\n\nexport class InlineLightRuleEvaluator {\n private readonly logger: Pick<Logger, \"info\" | \"warn\">;\n private readonly registry: LightRuleRegistry;\n private readonly invoker: PiAiInvoker;\n\n constructor(deps: {\n logger: Pick<Logger, \"info\" | \"warn\">;\n registry: LightRuleRegistry;\n invoker: PiAiInvoker;\n }) {\n this.logger = deps.logger;\n this.registry = deps.registry;\n this.invoker = deps.invoker;\n }\n\n /**\n * 评估一批新通知。\n *\n * @returns true 表示评估流程正常结束;false 表示 invoker 失败,调用方可选择回退。\n */\n async evaluate(\n notifications: StoredNotification[],\n trace?: LightRuleEvaluationTrace,\n ): Promise<boolean> {\n if (notifications.length === 0) return true;\n\n const traceTag = trace?.flushId ?? \"flush_none\";\n\n this.reloadRegistry(\"before evaluation\", traceTag);\n const rules = this.registry.getEnabled();\n if (rules.length === 0) {\n this.logger.info(\n `lightrules[${traceTag}]: no enabled rules (notifications=${notifications.length})`,\n );\n return true;\n }\n\n this.logger.info(\n `lightrules[${traceTag}]: evaluating notifications=${notifications.length} rules=${rules.length}`,\n );\n\n const matchStartedAtMs = Date.now();\n const matches = await this.invoker.matchNotifications(\n notifications,\n rules,\n trace?.flushId,\n );\n const matchElapsedMs = Date.now() - matchStartedAtMs;\n if (matches === null) {\n this.logger.warn(\n `lightrules[${traceTag}]: match failed (notifications=${notifications.length}, rules=${rules.length}, elapsedMs=${matchElapsedMs})`,\n );\n return false;\n }\n\n if (matches.length === 0) {\n this.logger.info(\n `lightrules[${traceTag}]: 0 matches (notifications=${notifications.length}, rules=${rules.length}, elapsedMs=${matchElapsedMs})`,\n );\n return true;\n }\n\n this.logger.info(\n `lightrules[${traceTag}]: matched ${matches.length} hit(s) in ${matchElapsedMs}ms`,\n );\n\n // 同一批里同一条规则只触发一次:多条通知撞同一个规则,按\"一次提醒\"处理,\n // 避免灯效反复抢占,且节省下游 HTTP 调用。\n const firedRules = new Set<string>();\n this.reloadRegistry(\"before triggering\", traceTag);\n for (const match of matches) {\n if (firedRules.has(match.ruleName)) continue;\n const rule = this.registry.get(match.ruleName);\n if (!rule) {\n this.logger.warn(\n `lightrules[${traceTag}]: matched rule '${match.ruleName}' skipped - not found after reload`,\n );\n continue;\n }\n if (!rule.enabled) {\n this.logger.info(\n `lightrules[${traceTag}]: matched rule '${match.ruleName}' skipped - disabled after reload`,\n );\n continue;\n }\n firedRules.add(match.ruleName);\n const notification = notifications[match.notificationIndex];\n await this.triggerLight(rule, notification, traceTag);\n }\n\n this.logger.info(\n `lightrules[${traceTag}]: fired ${firedRules.size} rule(s): ${[...firedRules].join(\", \")} ` +\n `(from ${matches.length} match(es) across ${notifications.length} notification(s))`,\n );\n return true;\n }\n\n private reloadRegistry(stage: string, traceTag: string): void {\n try {\n this.registry.reload();\n } catch (err: any) {\n this.logger.warn(\n `lightrules[${traceTag}]: registry reload failed ${stage}: ${err?.message ?? err}`,\n );\n }\n }\n\n private async triggerLight(\n rule: LightRuleMeta,\n notification: StoredNotification | undefined,\n traceTag: string,\n ): Promise<void> {\n let apiKey: string;\n try {\n apiKey = requireApiKey();\n } catch (err: any) {\n this.logger.warn(\n `lightrules[${traceTag}]: trigger '${rule.name}' skipped - no API key: ${err?.message ?? err}`,\n );\n return;\n }\n\n const reason = buildTriggerReason(rule, notification);\n this.logger.info(\n `lightrules[${traceTag}]: trigger rule='${rule.name}' ` +\n `notificationTs=${notification?.timestamp ?? \"-\"} ` +\n `app=${notification?.appDisplayName ?? notification?.appName ?? \"-\"}`,\n );\n\n const startedAtMs = Date.now();\n try {\n const result = await sendLightEffect(\n apiKey,\n rule.segments,\n this.logger,\n { repeat_times: rule.repeat_times },\n reason,\n rule.title,\n );\n if (result.ok) {\n this.logger.info(\n `lightrules[${traceTag}]: trigger '${rule.name}' ok bizUniqueId=${result.bizUniqueId ?? \"-\"} elapsedMs=${Date.now() - startedAtMs}`,\n );\n } else {\n this.logger.warn(\n `lightrules[${traceTag}]: trigger '${rule.name}' http-failed (${result.status ?? \"?\"}) ` +\n `elapsedMs=${Date.now() - startedAtMs}: ${result.error}`,\n );\n }\n } catch (err: any) {\n this.logger.warn(\n `lightrules[${traceTag}]: trigger '${rule.name}' exception elapsedMs=${Date.now() - startedAtMs}: ${err?.message ?? err}`,\n );\n }\n }\n}\n\nconst REASON_CONTENT_MAX = 40;\n\nfunction buildTriggerReason(\n rule: LightRuleMeta,\n notification: StoredNotification | undefined,\n): string {\n const ruleLabel = rule.title?.trim() || rule.name;\n if (!notification) {\n return `触发\"${ruleLabel}\"灯效`;\n }\n\n const app = notification.appDisplayName?.trim() || notification.appName.trim();\n const sender = notification.senderName?.trim() || notification.title?.trim();\n const conversation = notification.conversationName?.trim();\n const isGroup = notification.conversationType === \"group\";\n\n let where = app;\n if (isGroup) {\n where = conversation ? `${app}群聊\"${conversation}\"` : `${app}群聊`;\n }\n\n const action = sender ? `${sender}发来消息` : \"收到新消息\";\n const snippet = summarizeContent(notification.content);\n const detail = snippet ? `:${snippet}` : \"\";\n\n return `检测到${where}中${action}${detail},触发\"${ruleLabel}\"灯效`;\n}\n\nfunction summarizeContent(content: string | undefined): string {\n const trimmed = content?.trim();\n if (!trimmed) return \"\";\n if (trimmed.length <= REASON_CONTENT_MAX) return trimmed;\n return `${trimmed.slice(0, REASON_CONTENT_MAX)}…`;\n}\n",
36
- "import { randomBytes } from \"node:crypto\";\nimport type { Logger } from \"../logger.js\";\nimport type { StoredNotification } from \"../notification/storage.js\";\n\nexport const DEFAULT_LIGHT_RULE_EVALUATION_DEBOUNCE_MS = 1_000;\n\nexport interface LightRuleEvaluationTrace {\n /** 本批 evaluate 的唯一 id,用于跨模块串联日志。 */\n flushId: string;\n /** 本批 evaluate 涵盖的所有 ingest 来源 id(按入队顺序)。 */\n ingestIds: string[];\n}\n\nexport interface LightRuleEvaluator {\n evaluate(\n notifications: StoredNotification[],\n trace?: LightRuleEvaluationTrace,\n ): Promise<boolean>;\n}\n\nexport interface LightRuleEvaluationSchedulerOptions {\n debounceMs?: number;\n}\n\ninterface PendingEntry {\n notification: StoredNotification;\n ingestId: string;\n enqueuedAtMs: number;\n}\n\nexport class LightRuleEvaluationScheduler {\n private readonly evaluator: LightRuleEvaluator;\n private readonly logger: Pick<Logger, \"info\" | \"warn\">;\n private readonly debounceMs: number;\n private readonly pending: PendingEntry[] = [];\n private timer: ReturnType<typeof setTimeout> | null = null;\n private running = false;\n private flushRequestedWhileRunning = false;\n\n constructor(deps: {\n evaluator: LightRuleEvaluator;\n logger: Pick<Logger, \"info\" | \"warn\">;\n options?: LightRuleEvaluationSchedulerOptions;\n }) {\n this.evaluator = deps.evaluator;\n this.logger = deps.logger;\n const debounceMs =\n deps.options?.debounceMs ?? DEFAULT_LIGHT_RULE_EVALUATION_DEBOUNCE_MS;\n this.debounceMs = Number.isFinite(debounceMs) && debounceMs >= 0\n ? debounceMs\n : DEFAULT_LIGHT_RULE_EVALUATION_DEBOUNCE_MS;\n }\n\n enqueue(\n notifications: StoredNotification[],\n ingestId: string = \"ing_unknown\",\n ): void {\n if (notifications.length === 0) return;\n const enqueuedAtMs = Date.now();\n for (const n of notifications) {\n this.pending.push({ notification: n, ingestId, enqueuedAtMs });\n }\n this.logger.info(\n `lightrules[${ingestId}]: scheduler enqueue ${notifications.length} item(s), ` +\n `pending=${this.pending.length}, debounceMs=${this.debounceMs}, running=${this.running}`,\n );\n this.scheduleFlush();\n }\n\n private scheduleFlush(): void {\n if (this.timer !== null) return;\n\n this.timer = setTimeout(() => {\n this.timer = null;\n void this.drain().catch((err) => {\n this.logger.warn(\n `lightrules: scheduled evaluation failed: ${err?.message ?? err}`,\n );\n });\n }, this.debounceMs);\n\n const maybeNodeTimer = this.timer as { unref?: () => void };\n maybeNodeTimer.unref?.();\n }\n\n private async drain(): Promise<void> {\n if (this.running) {\n this.flushRequestedWhileRunning = true;\n return;\n }\n\n const batch = this.pending.splice(0);\n if (batch.length === 0) return;\n\n const flushId = `flush_${randomBytes(4).toString(\"hex\")}`;\n const ingestIds = uniqueOrdered(batch.map((b) => b.ingestId));\n const firstEnqueuedAtMs = batch[0].enqueuedAtMs;\n const waitedMs = Date.now() - firstEnqueuedAtMs;\n const notifications = batch.map((b) => b.notification);\n\n this.logger.info(\n `lightrules[${flushId}]: drain start batch=${batch.length} ` +\n `ingestIds=[${ingestIds.join(\",\")}] waitedMs=${waitedMs}`,\n );\n\n this.running = true;\n const startedAtMs = Date.now();\n try {\n await this.evaluator.evaluate(notifications, { flushId, ingestIds });\n this.logger.info(\n `lightrules[${flushId}]: drain end elapsedMs=${Date.now() - startedAtMs}`,\n );\n } catch (err: any) {\n this.logger.warn(\n `lightrules[${flushId}]: evaluation failed (notifications=${batch.length}) ` +\n `elapsedMs=${Date.now() - startedAtMs}: ${err?.message ?? err}`,\n );\n } finally {\n this.running = false;\n if (this.pending.length > 0) {\n if (this.flushRequestedWhileRunning) {\n this.flushRequestedWhileRunning = false;\n void this.drain().catch((err) => {\n this.logger.warn(\n `lightrules: queued evaluation failed: ${err?.message ?? err}`,\n );\n });\n } else {\n this.scheduleFlush();\n }\n } else {\n this.flushRequestedWhileRunning = false;\n }\n }\n }\n}\n\nfunction uniqueOrdered(items: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const item of items) {\n if (seen.has(item)) continue;\n seen.add(item);\n out.push(item);\n }\n return out;\n}\n",
37
- "/**\n * PiAiInvoker —— 灯效规则事件驱动评估的\"轻量 LLM 调用\"编排器\n *\n * 每条通知到达后,仅发起一次补全请求,让模型直接输出 JSON 命中结果。\n * 不启动 OpenClaw agent 循环,不加载工具 / skill / system prompt 栈。\n *\n * 本类只负责通用编排(构造 prompt、超时重试、解析);实际\"准备模型 + 补全\"\n * 委托给随宿主 Profile 选择的 LlmCompleter(openclaw 走 agent-runtime,\n * jvsclaw 走本地 OpenAI 兼容端点)。\n *\n * 失败策略:任何环节失败(准备 / 网络 / 解析)都返回 null,调用方决定是否\n * 回退到 legacy agent session 路径;本类不抛。\n */\n\nimport type { StoredNotification } from \"../notification/storage.js\";\nimport type { LightRuleMeta } from \"./types.js\";\nimport type { LlmCompleter } from \"../profile/llm/types.js\";\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_MAX_ATTEMPTS = 2;\nconst MAX_OUTPUT_TOKENS = 1_024;\nconst NO_THINK_DIRECTIVE = \"/no_think\";\n\nexport interface LlmMatchResult {\n /** 命中通知在入参数组中的下标 */\n notificationIndex: number;\n /** 命中规则名 */\n ruleName: string;\n}\n\nexport interface PiAiInvokerOptions {\n timeoutMs?: number;\n maxAttempts?: number;\n}\n\nexport class PiAiInvoker {\n constructor(\n private readonly completer: LlmCompleter,\n private readonly logger: { info: (m: string) => void; warn: (m: string) => void },\n private readonly options: PiAiInvokerOptions = {},\n ) {}\n\n /**\n * 对一批通知和当前启用的规则做一次 LLM 匹配。\n *\n * 返回:\n * - `LlmMatchResult[]`:匹配成功(可能为空数组,即 0 命中)\n * - `null`:调用失败(模型准备失败 / 网络 / 解析)。调用方据此决定是否回退。\n */\n async matchNotifications(\n notifications: StoredNotification[],\n rules: LightRuleMeta[],\n flushId: string = \"flush_none\",\n ): Promise<LlmMatchResult[] | null> {\n if (notifications.length === 0 || rules.length === 0) return [];\n\n const traceTag = flushId;\n\n let prepareResult: Awaited<ReturnType<LlmCompleter[\"prepare\"]>>;\n try {\n prepareResult = await this.completer.prepare(traceTag);\n } catch (err: any) {\n this.logger.warn(\n `PiAiInvoker[${traceTag}]: prepare failed (${this.completer.backend}): ${err?.message ?? String(err)}`,\n );\n return null;\n }\n if (\"error\" in prepareResult) {\n this.logger.warn(\n `PiAiInvoker[${traceTag}]: prepare failed (${this.completer.backend}): ${prepareResult.error}`,\n );\n return null;\n }\n const label = prepareResult.label;\n\n const systemPrompt = buildSystemPrompt(rules);\n const userMessage = buildUserMessage(notifications);\n const baseTimeoutMs = this.options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const maxAttempts = Math.max(1, this.options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS);\n\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n const timeoutMs = baseTimeoutMs * attempt;\n const startedAtMs = Date.now();\n this.logger.info(\n `PiAiInvoker[${traceTag}]: complete attempt ${attempt}/${maxAttempts} ` +\n `model=${label} timeoutMs=${timeoutMs} notifications=${notifications.length} rules=${rules.length}`,\n );\n\n const outcome = await this.completer.complete({\n systemPrompt,\n userMessage,\n temperature: 0,\n maxTokens: MAX_OUTPUT_TOKENS,\n timeoutMs,\n });\n const elapsedMs = Date.now() - startedAtMs;\n\n if (!outcome.ok) {\n const retryable = outcome.retryable && attempt < maxAttempts;\n this.logger.warn(\n `PiAiInvoker[${traceTag}]: complete failed: ${outcome.error} ` +\n `(attempt ${attempt}/${maxAttempts}, timeoutMs=${timeoutMs}, elapsedMs=${elapsedMs}${retryable ? \", retrying\" : \"\"})`,\n );\n if (retryable) {\n continue;\n }\n return null;\n }\n\n const parsed = parseMatchResult(outcome.text, notifications.length, rules);\n const stopReason = outcome.stopReason ? ` stopReason=${outcome.stopReason}` : \"\";\n if (!parsed.ok) {\n const retryable = attempt < maxAttempts;\n this.logger.warn(\n `PiAiInvoker[${traceTag}]: parse failed attempt ${attempt}/${maxAttempts}${stopReason}: ` +\n `${parsed.error} raw=${parsed.snippet}` +\n ` (elapsedMs=${elapsedMs}${retryable ? \", retrying\" : \"\"})`,\n );\n if (retryable) {\n continue;\n }\n return null;\n }\n this.logger.info(\n `PiAiInvoker[${traceTag}]: complete ok attempt ${attempt}/${maxAttempts} ` +\n `${outcome.stopReason ? `stopReason=${outcome.stopReason} ` : \"\"}` +\n `elapsedMs=${elapsedMs} matches=${parsed.matches.length}`,\n );\n return parsed.matches;\n }\n\n return null;\n }\n}\n\nfunction buildSystemPrompt(rules: LightRuleMeta[]): string {\n const lines: string[] = [\n NO_THINK_DIRECTIVE,\n '你是\"手机通知 → 灯效规则\"命中匹配助手。',\n \"这是低延迟分类任务;不要输出推理过程、解释、Markdown 或 <think> 内容。\",\n \"只根据规则 description 和通知字段判断,不要猜测。\",\n \"拿不准就不触发。\",\n \"输出必须是纯 JSON,格式固定为:\",\n '{\"matches\":[{\"i\":<通知下标>,\"rule\":\"<规则name>\"}]}',\n '0 命中输出 {\"matches\":[]}; rule 必须精确等于下方 name。',\n \"\",\n \"匹配要点:\",\n \"- 发件人/联系人规则:优先看 sender,其次 conversation_name、title、content 开头的 \\\"X:\\\"/\\\"X:\\\" 前缀;忽略空白、emoji 和中英文标点差异。\",\n \"- App 通知规则:看 app/appDisplayName 是否符合 description。\",\n \"- 关键词规则:看 title + content 是否包含或语义等价于 description 指定的关键词。\",\n \"- 语义规则:综合 title + content 判断;不要把正文里随便提到的人名当发件人。\",\n \"\",\n \"当前启用规则:\",\n ];\n const sorted = [...rules].sort(\n (a, b) => (b.createdAt ?? \"\").localeCompare(a.createdAt ?? \"\"),\n );\n sorted.forEach((rule, idx) => {\n lines.push(\n `[${idx + 1}] name=${rule.name}`,\n `title=${rule.title}`,\n `description=${rule.description}`,\n );\n });\n return lines.join(\"\\n\");\n}\n\nfunction buildUserMessage(notifications: StoredNotification[]): string {\n const lines: string[] = [\n `以下 ${notifications.length} 条新手机通知,按顺序编号:`,\n \"\",\n ];\n notifications.forEach((n, i) => {\n const app = n.appDisplayName ?? n.appName;\n lines.push(`[${i}] app=${app} time=${n.timestamp}`);\n if (n.senderName) {\n lines.push(` sender: ${n.senderName}`);\n }\n if (n.conversationType) {\n lines.push(` conversation_type: ${n.conversationType}`);\n }\n if (n.conversationName) {\n lines.push(` conversation_name: ${n.conversationName}`);\n }\n lines.push(` title: ${n.title}`, ` content: ${n.content}`, \"\");\n });\n lines.push(\n `请判断每条通知命中了哪些规则,按约定格式输出 JSON。${NO_THINK_DIRECTIVE}`,\n );\n return lines.join(\"\\n\");\n}\n\ntype ParseMatchResult =\n | { ok: true; matches: LlmMatchResult[] }\n | { ok: false; error: string; snippet: string };\n\nfunction parseMatchResult(\n rawText: string,\n notificationCount: number,\n rules: LightRuleMeta[],\n): ParseMatchResult {\n if (!rawText) {\n return { ok: false, error: \"empty response\", snippet: \"\" };\n }\n // 容错:模型有时会套 ```json ... ```,剥掉代码块围栏\n const text = rawText\n .trim()\n .replace(/^```(?:json)?\\s*/i, \"\")\n .replace(/\\s*```$/i, \"\")\n .trim();\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch (err: any) {\n const extracted = extractJsonObject(text);\n if (!extracted) {\n return {\n ok: false,\n error: `invalid JSON: ${err?.message ?? String(err)}`,\n snippet: summarizeRawText(text),\n };\n }\n try {\n parsed = JSON.parse(extracted);\n } catch (extractedErr: any) {\n return {\n ok: false,\n error: `invalid extracted JSON: ${extractedErr?.message ?? String(extractedErr)}`,\n snippet: summarizeRawText(text),\n };\n }\n }\n if (!parsed || typeof parsed !== \"object\") {\n return {\n ok: false,\n error: \"JSON root is not an object\",\n snippet: summarizeRawText(text),\n };\n }\n\n const raw = (parsed as { matches?: unknown }).matches;\n if (!Array.isArray(raw)) {\n return {\n ok: false,\n error: \"JSON object missing matches array\",\n snippet: summarizeRawText(text),\n };\n }\n\n const validRuleNames = new Set(rules.map((r) => r.name));\n const results: LlmMatchResult[] = [];\n for (const m of raw) {\n if (!m || typeof m !== \"object\") continue;\n const entry = m as { i?: unknown; index?: unknown; rule?: unknown };\n const i =\n typeof entry.i === \"number\"\n ? entry.i\n : typeof entry.index === \"number\"\n ? entry.index\n : -1;\n const ruleName = typeof entry.rule === \"string\" ? entry.rule : null;\n if (!Number.isInteger(i) || i < 0 || i >= notificationCount) continue;\n if (!ruleName || !validRuleNames.has(ruleName)) continue;\n results.push({ notificationIndex: i, ruleName });\n }\n return { ok: true, matches: results };\n}\n\nfunction extractJsonObject(text: string): string | null {\n const matchesIndex = text.indexOf('\"matches\"');\n if (matchesIndex < 0) return null;\n\n const start = text.lastIndexOf(\"{\", matchesIndex);\n if (start < 0) return null;\n\n let depth = 0;\n let inString = false;\n let escaped = false;\n for (let i = start; i < text.length; i += 1) {\n const ch = text[i];\n if (inString) {\n if (escaped) {\n escaped = false;\n } else if (ch === \"\\\\\") {\n escaped = true;\n } else if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n } else if (ch === \"{\") {\n depth += 1;\n } else if (ch === \"}\") {\n depth -= 1;\n if (depth === 0) {\n return text.slice(start, i + 1);\n }\n }\n }\n\n return null;\n}\n\nfunction summarizeRawText(text: string): string {\n const compact = text.replace(/\\s+/g, \" \").trim();\n if (compact.length <= 160) return JSON.stringify(compact);\n return JSON.stringify(`${compact.slice(0, 160)}...`);\n}\n",
38
- "import { createRequire } from \"node:module\";\nimport { resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\n/**\n * Plugins extracted under ~/.openclaw/extensions are outside the host package's\n * node_modules tree. Resolve SDK subpaths relative to the running host entry\n * when Node's normal package lookup cannot see the OpenClaw installation.\n */\nexport function resolveHostSdkModuleFromHostEntry(\n specifier: string,\n hostEntry: string | undefined = process.argv[1],\n): string {\n if (!hostEntry?.trim()) return \"\";\n\n try {\n return createRequire(resolve(hostEntry)).resolve(specifier);\n } catch {\n return \"\";\n }\n}\n\nexport async function importHostSdkModule<T>(\n specifier: string,\n hostEntry: string | undefined = process.argv[1],\n): Promise<T> {\n try {\n return (await import(specifier)) as T;\n } catch (primaryError) {\n const resolvedPath = resolveHostSdkModuleFromHostEntry(specifier, hostEntry);\n if (!resolvedPath) throw primaryError;\n return (await import(pathToFileURL(resolvedPath).href)) as T;\n }\n}\n",
39
- "/**\n * openclaw / arkclaw 的 LLM 后端:经 openclaw/plugin-sdk/agent-runtime 跟随主 Agent 模型。\n *\n * 关键点:agent-runtime 通过**动态 import 懒加载**,而非顶层静态 import。\n * 这样构建产物不再有顶层 `require(\"openclaw/plugin-sdk/agent-runtime\")`。\n * 安装器负责把缺少该必需 SDK 的宿主挡在安装流程外,避免用户只看到插件加载堆栈。\n */\nimport type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport { importHostSdkModule } from \"../../host-sdk.js\";\nimport type {\n LlmCompleter,\n LlmCompletionOutcome,\n LlmCompletionRequest,\n LlmPrepareResult,\n} from \"./types.js\";\n\nconst DEFAULT_PROVIDER = \"anthropic\";\nconst DEFAULT_MODEL_ID = \"claude-haiku-4-5-20251001\";\nconst DEFAULT_AGENT_ID = \"main\";\n\nexport interface OpenclawLlmOptions {\n /** 显式 provider/model 覆盖;省略则跟随 agent 默认模型。 */\n provider?: string;\n modelId?: string;\n /** 选定 agent 的完整 modelRef 覆盖,如 \"openrouter/auto\"。 */\n modelRef?: string;\n /** 无显式 provider/model 时使用该 agent 的配置模型。 */\n agentId?: string;\n}\n\ntype AgentRuntime = typeof import(\"openclaw/plugin-sdk/agent-runtime\");\ntype PreparedCompletion = Awaited<\n ReturnType<AgentRuntime[\"prepareSimpleCompletionModel\"]>\n>;\n\nlet agentRuntimePromise: Promise<AgentRuntime> | undefined;\nfunction loadAgentRuntime(): Promise<AgentRuntime> {\n if (!agentRuntimePromise) {\n agentRuntimePromise = importHostSdkModule<AgentRuntime>(\n \"openclaw/plugin-sdk/agent-runtime\",\n );\n }\n return agentRuntimePromise;\n}\n\nexport class OpenclawLlmCompleter implements LlmCompleter {\n readonly backend = \"openclaw agent-runtime\";\n\n private cachedPrepared?: { label: string; prepared: PreparedCompletion };\n\n constructor(\n private readonly api: OpenClawPluginApi,\n private readonly logger: { info: (m: string) => void; warn: (m: string) => void },\n private readonly options: OpenclawLlmOptions = {},\n ) {}\n\n async prepare(traceTag: string): Promise<LlmPrepareResult> {\n if (this.cachedPrepared) {\n this.logger.info(\n `OpenclawLlmCompleter[${traceTag}]: prepare cache hit model=${this.cachedPrepared.label}`,\n );\n return { label: this.cachedPrepared.label };\n }\n\n let runtime: AgentRuntime;\n try {\n runtime = await loadAgentRuntime();\n } catch (err: any) {\n return {\n error: `缺少必需的 OpenClaw SDK openclaw/plugin-sdk/agent-runtime,请升级 OpenClaw 后重新安装插件: ${err?.message ?? String(err)}`,\n };\n }\n\n const { label, prepared } = await this.prepareWith(runtime);\n if (\"error\" in prepared) {\n return { error: String(prepared.error) };\n }\n this.cachedPrepared = { label, prepared };\n this.logger.info(\n `OpenclawLlmCompleter[${traceTag}]: prepare ok model=${label} cached=true`,\n );\n return { label };\n }\n\n async complete(req: LlmCompletionRequest): Promise<LlmCompletionOutcome> {\n if (!this.cachedPrepared) {\n return { ok: false, retryable: false, error: \"model not prepared\" };\n }\n const { prepared } = this.cachedPrepared;\n if (\"error\" in prepared) {\n return { ok: false, retryable: false, error: String(prepared.error) };\n }\n\n let runtime: AgentRuntime;\n try {\n runtime = await loadAgentRuntime();\n } catch (err: any) {\n return { ok: false, retryable: false, error: err?.message ?? String(err) };\n }\n\n try {\n const resp = await runtime.completeWithPreparedSimpleCompletionModel({\n model: prepared.model,\n auth: prepared.auth,\n context: {\n systemPrompt: req.systemPrompt,\n messages: [\n { role: \"user\", content: req.userMessage, timestamp: Date.now() },\n ],\n },\n options: {\n temperature: req.temperature,\n maxTokens: req.maxTokens,\n signal: AbortSignal.timeout(req.timeoutMs),\n cacheRetention: \"short\",\n },\n });\n\n if (resp.stopReason === \"error\" || resp.stopReason === \"aborted\") {\n return {\n ok: false,\n retryable: resp.stopReason === \"aborted\",\n error: `stopReason=${resp.stopReason}: ${resp.errorMessage ?? \"n/a\"}`,\n };\n }\n const stopReason =\n typeof resp.stopReason === \"string\" ? resp.stopReason : undefined;\n return {\n ok: true,\n text: extractText(resp.content),\n ...(stopReason ? { stopReason } : {}),\n };\n } catch (err: any) {\n const message = err?.message ?? String(err);\n const retryable =\n err?.name === \"AbortError\" || /\\babort(?:ed)?\\b/i.test(message);\n return { ok: false, retryable, error: message };\n }\n }\n\n private async prepareWith(\n runtime: AgentRuntime,\n ): Promise<{ label: string; prepared: PreparedCompletion }> {\n if (this.options.provider || this.options.modelId) {\n const provider = this.options.provider ?? DEFAULT_PROVIDER;\n const modelId = this.options.modelId ?? DEFAULT_MODEL_ID;\n const prepared = await runtime.prepareSimpleCompletionModel({\n cfg: this.api.config,\n provider,\n modelId,\n });\n return { label: `${provider}/${modelId}`, prepared };\n }\n\n const agentId = this.options.agentId?.trim() || DEFAULT_AGENT_ID;\n const modelRef = this.options.modelRef?.trim();\n const prepared = await runtime.prepareSimpleCompletionModelForAgent({\n cfg: this.api.config,\n agentId,\n ...(modelRef ? { modelRef } : {}),\n });\n const label =\n \"selection\" in prepared && prepared.selection\n ? `${prepared.selection.provider}/${prepared.selection.modelId} (agent=${agentId})`\n : `agent=${agentId} default model`;\n return { label, prepared };\n }\n}\n\nfunction extractText(content: unknown): string {\n if (!Array.isArray(content)) return \"\";\n const parts: string[] = [];\n for (const c of content) {\n if (c && typeof c === \"object\" && (c as any).type === \"text\") {\n const t = (c as any).text;\n if (typeof t === \"string\") parts.push(t);\n }\n }\n return parts.join(\"\");\n}\n",
40
- "/**\n * jvsclaw 的 LLM 后端:直接调用本地 OpenAI 兼容端点。\n *\n * POST http://localhost:18801/v1/jarvis/chat/completions\n * { \"model\": \"qwen3.6-plus\", \"messages\": [...], \"stream\": false }\n *\n * jvsclaw 基线无 openclaw/plugin-sdk/agent-runtime,故灯效规则 LLM 匹配改走此后端,\n * 不依赖宿主 agent 模型解析。地址/模型可用环境变量覆盖。\n */\nimport type {\n LlmCompleter,\n LlmCompletionOutcome,\n LlmCompletionRequest,\n LlmPrepareResult,\n} from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"http://localhost:18801\";\nconst COMPLETIONS_PATH = \"/v1/jarvis/chat/completions\";\nconst DEFAULT_MODEL = \"qwen3.6-plus\";\n\nfunction resolveBaseUrl(): string {\n return (process.env.JVSCLAW_LLM_BASE_URL?.trim() || DEFAULT_BASE_URL).replace(\n /\\/+$/,\n \"\",\n );\n}\n\nfunction resolveModel(): string {\n return process.env.JVSCLAW_LLM_MODEL?.trim() || DEFAULT_MODEL;\n}\n\ninterface ChatCompletionResponse {\n choices?: Array<{ finish_reason?: string; message?: { content?: string } }>;\n}\n\nexport class JvsclawLlmCompleter implements LlmCompleter {\n readonly backend = \"jvsclaw local\";\n\n private readonly url = `${resolveBaseUrl()}${COMPLETIONS_PATH}`;\n private readonly model = resolveModel();\n\n async prepare(_traceTag: string): Promise<LlmPrepareResult> {\n // 本地端点无需远程准备步骤,模型固定。\n return { label: `${this.model} (jvsclaw local)` };\n }\n\n async complete(req: LlmCompletionRequest): Promise<LlmCompletionOutcome> {\n try {\n const resp = await fetch(this.url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n model: this.model,\n messages: [\n { role: \"system\", content: req.systemPrompt },\n { role: \"user\", content: req.userMessage },\n ],\n stream: false,\n temperature: req.temperature,\n max_tokens: req.maxTokens,\n }),\n signal: AbortSignal.timeout(req.timeoutMs),\n });\n\n if (!resp.ok) {\n // 5xx 视为可重试(瞬时),4xx 视为不可重试(请求/配置问题)。\n return {\n ok: false,\n retryable: resp.status >= 500,\n error: `HTTP ${resp.status}`,\n };\n }\n\n const json = (await resp.json()) as ChatCompletionResponse;\n const choice = json.choices?.[0];\n const text = choice?.message?.content;\n if (typeof text !== \"string\") {\n return { ok: false, retryable: false, error: \"响应缺少 choices[0].message.content\" };\n }\n const stopReason =\n typeof choice?.finish_reason === \"string\" ? choice.finish_reason : undefined;\n return { ok: true, text, ...(stopReason ? { stopReason } : {}) };\n } catch (err: any) {\n const message = err?.message ?? String(err);\n const retryable =\n err?.name === \"AbortError\" ||\n err?.name === \"TimeoutError\" ||\n /\\babort(?:ed)?\\b|timeout|ECONNREFUSED|ECONNRESET/i.test(message);\n return { ok: false, retryable, error: message };\n }\n }\n}\n",
41
- "/**\n * 按当前渠道 Profile 选择 LLM 后端。\n */\nimport type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport { resolveClawKind } from \"../detect.js\";\nimport type { LlmCompleter } from \"./types.js\";\nimport { OpenclawLlmCompleter, type OpenclawLlmOptions } from \"./openclaw.js\";\nimport { JvsclawLlmCompleter } from \"./jvsclaw.js\";\n\nexport interface LlmCompleterDeps {\n api: OpenClawPluginApi;\n logger: { info: (m: string) => void; warn: (m: string) => void };\n /** openclaw/arkclaw 的 provider/model 选择项(jvsclaw 忽略)。 */\n openclawOptions?: OpenclawLlmOptions;\n}\n\nexport function resolveLlmCompleter(deps: LlmCompleterDeps): LlmCompleter {\n switch (resolveClawKind()) {\n case \"jvsclaw\":\n return new JvsclawLlmCompleter();\n case \"arkclaw\":\n case \"openclaw\":\n default:\n return new OpenclawLlmCompleter(deps.api, deps.logger, deps.openclawOptions);\n }\n}\n\nexport type { LlmCompleter } from \"./types.js\";\nexport { OpenclawLlmCompleter } from \"./openclaw.js\";\nexport { JvsclawLlmCompleter } from \"./jvsclaw.js\";\n",
42
- "import type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport type { Logger } from \"./logger.js\";\nimport {\n createVersionAwareLogger,\n PluginFileLogger as PluginLogger,\n} from \"./logger.js\";\nimport {\n RecordingStorage,\n type RecordingStatusEvent,\n} from \"./recording/index.js\";\nimport type { NotificationStorage } from \"./notification/storage.js\";\nimport { registerLightRulesGateway } from \"./light-rules/gateway.js\";\nimport {\n LIGHT_RULE_GATEWAY_METHOD_LIST,\n LIGHT_RULE_TOOL_NAME_LIST,\n LIGHT_RULE_TOOL_NAMES,\n} from \"./light-rules/names.js\";\nimport { registerLightRulesTools } from \"./plugin/light-rules-tools.js\";\nimport { InlineLightRuleEvaluator } from \"./light-rules/inline-evaluator.js\";\nimport { LightRuleEvaluationScheduler } from \"./light-rules/evaluation-scheduler.js\";\nimport { PiAiInvoker } from \"./light-rules/pi-invoker.js\";\nimport { resolveLlmCompleter } from \"./profile/llm/index.js\";\nimport { LightRuleRegistry } from \"./light-rules/registry.js\";\nimport { join } from \"node:path\";\nimport { registerAutoUpdateLifecycle } from \"./plugin/auto-update.js\";\nimport { registerPluginCli } from \"./plugin/cli.js\";\nimport { ensureNtfBinInstalled } from \"./plugin/ntf-bin.js\";\n\n// 解析 plugin 自身安装目录。多个方案都被 bun build 静态求值(坑):\n// - import.meta.url 被替换成 build 机器源码绝对路径\n// - module.path 被替换成 \"src/index.ts\"\n// - __dirname 被 bun 在 bundle 顶部注入的 `var __dirname = \"<src>\"` 屏蔽\n// 解法:scripts/build.ts 后处理时把 bun 注入的 `var __dirname = ...` 行删掉,\n// 让 Node CJS module wrapper 注入的真值(dist/ 所在目录)生效。\ndeclare const __dirname: string;\nimport { registerLightControlTool } from \"./plugin/light-control.js\";\nimport {\n registerRelayTunnelLifecycle,\n registerStorageLifecycle,\n} from \"./plugin/lifecycle.js\";\nimport { registerNotificationInterfaces } from \"./plugin/notifications.js\";\nimport { registerRecordingInterfaces } from \"./plugin/recordings.js\";\nimport { isPluginCliInvocation } from \"./plugin/runtime-mode.js\";\nimport { resolvePluginStateDir } from \"./plugin/runtime-state.js\";\nimport { resolveStateDir } from \"./host.js\";\nimport type { GatewayHandler } from \"./plugin/shared.js\";\nimport { RELAY_TUNNEL_GATEWAY_CLIENT_INSTANCE_ID } from \"./tunnel/proxy.js\";\nimport type { PluginConfig, RawNotification } from \"./types.js\";\nimport type { BroadcastFn } from \"./update/types.js\";\n\nconst LIGHT_RULE_PROMPT_GUIDANCE = [\n \"灯效规则路由提示:\",\n `- 当用户表达“收到/当/如果/有某类通知或消息时,亮灯/闪灯/变成某种灯效”时,这是持久灯效规则请求,必须调用 ${LIGHT_RULE_TOOL_NAMES.create} 或 ${LIGHT_RULE_TOOL_NAMES.update}。`,\n \"- 不要为这类通知触发规则直接调用 light_control;light_control 只用于当前立即执行的一次性灯效、测试或预览。\",\n \"- 不要手写或编辑 tasks/*/meta.json;灯效规则的创建、修改、删除和查询都走 lightrules_* 工具。\",\n].join(\"\\n\");\n\nexport default {\n id: \"phone-notifications\",\n name: \"Phone Notifications & Light Control\",\n\n register(api: OpenClawPluginApi) {\n const config = (api.pluginConfig ?? {}) as PluginConfig;\n const ignoredApps = new Set(config.ignoredApps ?? []);\n\n let storage: NotificationStorage | null = null;\n let recordingStorage: RecordingStorage | null = null;\n let broadcastFn: BroadcastFn | null = null;\n let autoUpdateLifecycle: ReturnType<typeof registerAutoUpdateLifecycle> | null = null;\n let tunnelService: ReturnType<typeof registerRelayTunnelLifecycle> = null;\n\n const openclawDir = resolvePluginStateDir(api);\n const logger: Logger = openclawDir\n ? new PluginLogger(api.logger, openclawDir)\n : createVersionAwareLogger(api.logger);\n\n const lightRuleCtx: { workspaceDir?: string; stateDir?: string } = {\n stateDir: openclawDir,\n };\n const asrDataDir =\n openclawDir ??\n resolveStateDir() ??\n process.cwd();\n\n // jvsclaw 线上通道会直接解压 tgz,不走 install-jvsclaw.sh/npm link。\n // 因此独立 `ntf` 命令需要在任何注册模式下自修复,包括 `openclaw ntf ...`\n // 这种 CLI-only 加载路径。\n ensureNtfBinInstalled({\n ntfCjsPath: join(__dirname, \"bin\", \"ntf.cjs\"),\n stateDir: openclawDir,\n logger,\n });\n\n if (isPluginCliInvocation()) {\n registerPluginCli(api, {\n logger,\n openclawDir,\n });\n logger.info(\n \"检测到插件 CLI 命令执行上下文,仅注册 CLI,跳过后台服务以避免影响 Relay tunnel 常驻连接\",\n );\n return;\n }\n\n api.on(\"before_prompt_build\", () => ({\n appendSystemContext: LIGHT_RULE_PROMPT_GUIDANCE,\n }));\n\n function cacheBroadcast(broadcast: BroadcastFn | undefined): void {\n if (!broadcast) {\n return;\n }\n\n const changed = broadcastFn !== broadcast;\n broadcastFn = broadcast;\n if (changed) {\n autoUpdateLifecycle?.notifyBroadcastReady();\n }\n }\n\n function isDirectMobileGatewayRequest(\n opts: Parameters<GatewayHandler>[0],\n ): boolean {\n const client = opts.client?.connect?.client;\n if (!client) return false;\n if (client.instanceId === RELAY_TUNNEL_GATEWAY_CLIENT_INSTANCE_ID) {\n return false;\n }\n return client.id === \"openclaw-ios\" || client.id === \"openclaw-android\";\n }\n\n async function deactivateRelayForDirectGatewayRequest(\n method: string,\n opts: Parameters<GatewayHandler>[0],\n ): Promise<void> {\n if (!tunnelService || !isDirectMobileGatewayRequest(opts)) return;\n\n const client = opts.client?.connect?.client;\n try {\n await tunnelService.deactivateForExternalTunnel(\n `gateway method ${method} from ${client?.id ?? \"unknown\"}`,\n );\n } catch (err: any) {\n logger.warn(\n `Relay tunnel: failed to deactivate after direct gateway method ${method}: ${err?.message ?? String(err)}`,\n );\n }\n }\n\n function registerGatewayMethodWithBroadcastCapture(\n method: string,\n handler: GatewayHandler,\n ): void {\n api.registerGatewayMethod(method, async (opts) => {\n cacheBroadcast(opts.context?.broadcast);\n await deactivateRelayForDirectGatewayRequest(method, opts);\n return handler(opts);\n });\n }\n\n function filterNotifications(items: RawNotification[]): RawNotification[] {\n return items.filter((notification) => !ignoredApps.has(notification.app));\n }\n\n function notifyRecordingStatus(event: RecordingStatusEvent): void {\n const relayEmitted =\n tunnelService?.emitEvent(\"recording.status\", event) ?? false;\n\n if (!broadcastFn) {\n if (relayEmitted) return;\n logger.warn(\n `[recording.status] broadcast 不可用,跳过状态事件: ${event.recordingId} -> ${event.transfer_status}`,\n );\n return;\n }\n\n broadcastFn(\"recording.status\", event);\n }\n\n const lightRuleRegistry = new LightRuleRegistry(lightRuleCtx);\n const llmCompleter = resolveLlmCompleter({ api, logger });\n const lightRuleInvoker = new PiAiInvoker(llmCompleter, logger);\n const inlineLightRuleEvaluator = new InlineLightRuleEvaluator({\n logger,\n registry: lightRuleRegistry,\n invoker: lightRuleInvoker,\n });\n const lightRuleEvaluationScheduler = new LightRuleEvaluationScheduler({\n evaluator: inlineLightRuleEvaluator,\n logger,\n });\n\n registerStorageLifecycle({\n api,\n logger,\n lightRuleCtx,\n setStorage(nextStorage) {\n storage = nextStorage;\n },\n setRecordingStorage(nextRecordingStorage) {\n recordingStorage = nextRecordingStorage;\n },\n onStorageReady() {\n // storage service start 完成后 lightRuleCtx 才被回填到真实的 workspaceDir,\n // 此时重新扫盘加载已有规则。\n lightRuleRegistry.reload();\n },\n });\n\n tunnelService = registerRelayTunnelLifecycle({\n api,\n config,\n logger,\n openclawDir,\n });\n\n registerNotificationInterfaces({\n api,\n logger,\n getStorage: () => storage,\n filterNotifications,\n registerGatewayMethod: registerGatewayMethodWithBroadcastCapture,\n tunnelService,\n onAfterIngest(inserted, ingestId) {\n lightRuleEvaluationScheduler.enqueue(inserted, ingestId);\n },\n });\n\n registerLightControlTool(api, logger);\n\n registerRecordingInterfaces({\n api,\n logger,\n asrDataDir,\n getRecordingStorage: () => recordingStorage,\n notifyRecordingStatus,\n registerGatewayMethod: registerGatewayMethodWithBroadcastCapture,\n shouldBroadcastStatusOnHttp: () => !!broadcastFn,\n tunnelService,\n });\n\n registerLightRulesGateway(api, lightRuleRegistry, logger, cacheBroadcast);\n registerLightRulesTools(api, lightRuleRegistry, logger);\n logger.info(\n `灯效规则方法已注册: gateway=${LIGHT_RULE_GATEWAY_METHOD_LIST.join(\", \")}; tools=${LIGHT_RULE_TOOL_NAME_LIST.join(\", \")}`,\n );\n\n autoUpdateLifecycle = registerAutoUpdateLifecycle({\n api,\n config,\n logger,\n getBroadcastFn: () => broadcastFn,\n cacheBroadcast,\n tunnelService,\n });\n\n registerPluginCli(api, {\n logger,\n openclawDir,\n });\n },\n};\n",
36
+ "import { randomBytes } from \"node:crypto\";\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { readCredentials } from \"./auth/credentials.js\";\nimport { resolveStateFile } from \"./host.js\";\n\n// 容错解析:先按换行切分,再按 KEY= 边界切分,恢复历史上把多条记录粘在同一行的 .env。\n// lookbehind 限定前一个字符不是标识符字符,避免在 key 内部错误切分。\nfunction parseEnvContent(content: string): Map<string, string> {\n const entries = new Map<string, string>();\n const tokens = content\n .split(/\\r?\\n/)\n .flatMap((line) => line.split(/(?<![A-Z0-9_])(?=[A-Z_][A-Z0-9_]*=)/));\n for (const token of tokens) {\n const trimmed = token.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eq = trimmed.indexOf(\"=\");\n if (eq < 1) continue;\n const key = trimmed.slice(0, eq).trim();\n if (!/^[A-Z_][A-Z0-9_]*$/.test(key)) continue;\n entries.set(key, trimmed.slice(eq + 1).trim());\n }\n return entries;\n}\n\nfunction writeDotEnv(key: string, value: string): void {\n const path = resolveStateFile(\".env\");\n mkdirSync(dirname(path), { recursive: true });\n const existing = existsSync(path) ? readFileSync(path, \"utf-8\") : \"\";\n const entries = parseEnvContent(existing);\n entries.set(key, value);\n const output =\n Array.from(entries, ([k, v]) => `${k}=${v}`).join(\"\\n\") + \"\\n\";\n const tmpPath = `${path}.tmp.${process.pid}.${randomBytes(4).toString(\"hex\")}`;\n try {\n // JvsClaw may leave an existing .env read-only while its state directory\n // remains writable. Replacing a sibling temp file avoids reopening it.\n writeFileSync(tmpPath, output, { encoding: \"utf-8\", mode: 0o600 });\n renameSync(tmpPath, path);\n } catch (error) {\n try {\n rmSync(tmpPath, { force: true });\n } catch {\n // ignore tmp cleanup failure\n }\n throw error;\n }\n}\n\nexport type EnvName = \"development\" | \"test\" | \"production\";\n\nconst DEFAULT_ENV_HOSTS: Record<EnvName, string> = {\n development: \"openclaw-service-dev.yoooclaw.com\",\n test: \"openclaw-service-test.yoooclaw.com\",\n production: \"openclaw-service.yoooclaw.com\",\n};\n\nexport const NOTIFICATION_INTELLIGENCE_LIGHT_RULES_PLUGIN_PATH =\n \"/api/plugin/notification-intelligence/light-rules\";\nconst NOTIFICATION_INTELLIGENCE_LIGHT_RULES_APP_PATH =\n \"/api/notification-intelligence/light-rules\";\nconst NOTIFICATION_INTELLIGENCE_PLUGIN_BASE_PATH =\n \"/api/plugin/notification-intelligence\";\nconst NOTIFICATION_INTELLIGENCE_APP_BASE_PATH =\n \"/api/notification-intelligence\";\n\ninterface EnvUrls {\n lightApiUrl: string;\n notificationIntelligenceLightRulesPluginUrl: string;\n appNameMapUrl: string;\n relayTunnelUrl: string;\n modelProxyLongRecordingSubmitTaskUrl: string;\n modelProxyLongRecordingQueryTaskResultBaseUrl: string;\n gatewayConnectStatusUrl: string;\n /** jvsclaw 实例就绪/密文换 apiKey 接口(复用插件现有接口 host)。 */\n clawManagerInstanceReadyUrl: string;\n}\n\nfunction normalizeHost(host: string | undefined): string | undefined {\n const trimmed = host?.trim();\n if (!trimmed) return undefined;\n return trimmed\n .replace(/^https?:\\/\\//, \"\")\n .replace(/^wss?:\\/\\//, \"\")\n .replace(/\\/+$/, \"\");\n}\n\nfunction getEnvHost(env: EnvName): string {\n let host: string | undefined;\n switch (env) {\n case \"development\":\n host = process.env.OPENCLAW_HOST_DEVELOPMENT;\n break;\n case \"test\":\n host = process.env.OPENCLAW_HOST_TEST;\n break;\n case \"production\":\n host = process.env.OPENCLAW_HOST_PRODUCTION;\n break;\n }\n return normalizeHost(host) ?? DEFAULT_ENV_HOSTS[env];\n}\n\nexport function normalizeNotificationIntelligenceLightRulesPluginUrl(\n url: string,\n): string {\n const trimmed = url.trim().replace(/\\/+$/, \"\");\n if (!trimmed) return trimmed;\n\n if (trimmed.endsWith(NOTIFICATION_INTELLIGENCE_LIGHT_RULES_PLUGIN_PATH)) {\n return trimmed;\n }\n\n if (trimmed.endsWith(NOTIFICATION_INTELLIGENCE_LIGHT_RULES_APP_PATH)) {\n const origin = trimmed.slice(\n 0,\n -NOTIFICATION_INTELLIGENCE_LIGHT_RULES_APP_PATH.length,\n );\n return `${origin}${NOTIFICATION_INTELLIGENCE_LIGHT_RULES_PLUGIN_PATH}`;\n }\n\n if (trimmed.endsWith(NOTIFICATION_INTELLIGENCE_PLUGIN_BASE_PATH)) {\n return `${trimmed}/light-rules`;\n }\n\n if (trimmed.endsWith(NOTIFICATION_INTELLIGENCE_APP_BASE_PATH)) {\n const origin = trimmed.slice(\n 0,\n -NOTIFICATION_INTELLIGENCE_APP_BASE_PATH.length,\n );\n return `${origin}${NOTIFICATION_INTELLIGENCE_LIGHT_RULES_PLUGIN_PATH}`;\n }\n\n if (/^https?:\\/\\/[^/]+$/i.test(trimmed)) {\n return `${trimmed}${NOTIFICATION_INTELLIGENCE_LIGHT_RULES_PLUGIN_PATH}`;\n }\n\n return trimmed;\n}\n\nfunction buildEnvUrls(host: string): EnvUrls {\n const https = `https://${host}`;\n const wss = `wss://${host}`;\n const lightRulesUrl = normalizeNotificationIntelligenceLightRulesPluginUrl(\n process.env.NOTIFICATION_INTELLIGENCE_LIGHT_RULES_URL ||\n `${https}${NOTIFICATION_INTELLIGENCE_LIGHT_RULES_PLUGIN_PATH}`,\n );\n return {\n lightApiUrl: `${https}/api/message/tob/sendMessage`,\n notificationIntelligenceLightRulesPluginUrl: lightRulesUrl,\n relayTunnelUrl: `${wss}/message/messages/ws/plugin`,\n appNameMapUrl: `${https}/api/application-config/app-package/config-all`,\n modelProxyLongRecordingSubmitTaskUrl: `${https}/api/model-proxy/long-recording/submit-task`,\n modelProxyLongRecordingQueryTaskResultBaseUrl: `${https}/api/model-proxy/long-recording/query-task-result`,\n gatewayConnectStatusUrl: `${https}/api/message/messageBridge/plugin/gateway-connect-status`,\n clawManagerInstanceReadyUrl: `${https}/claw-manager/internal/claw-manager/instance/ready`,\n };\n}\n\nconst VALID_ENVS: ReadonlySet<string> = new Set<string>([\n \"development\",\n \"test\",\n \"production\",\n]);\n\nfunction readDotEnv(): Record<string, string> {\n const path = resolveStateFile(\".env\");\n if (!existsSync(path)) return {};\n return Object.fromEntries(parseEnvContent(readFileSync(path, \"utf-8\")));\n}\n\n/** 读取持久化到 .env 的环境名称;仅反映本地配置,不考虑进程环境变量。 */\nexport function readPersistedEnvName(): EnvName | undefined {\n const fromDotEnv = readDotEnv()[\"PHONE_NOTIFICATIONS_ENV\"]?.trim();\n if (fromDotEnv && VALID_ENVS.has(fromDotEnv)) return fromDotEnv as EnvName;\n return undefined;\n}\n\n/** 读取当前环境名称。优先级:PHONE_NOTIFICATIONS_ENV 环境变量 > .env > credentials.json > 默认 production */\nexport function loadEnvName(): EnvName {\n const fromEnvVar = process.env.PHONE_NOTIFICATIONS_ENV?.trim();\n if (fromEnvVar && VALID_ENVS.has(fromEnvVar)) return fromEnvVar as EnvName;\n\n const fromDotEnv = readPersistedEnvName();\n if (fromDotEnv) return fromDotEnv;\n\n const { env } = readCredentials();\n if (env && VALID_ENVS.has(env)) return env as EnvName;\n\n return \"production\";\n}\n\n/** 持久化当前环境到 .env */\nexport function saveEnvName(env: EnvName): void {\n if (!VALID_ENVS.has(env)) {\n throw new Error(\n `无效的环境名称: ${env},可选值: ${[...VALID_ENVS].join(\", \")}`,\n );\n }\n writeDotEnv(\"PHONE_NOTIFICATIONS_ENV\", env);\n}\n\n/** 获取当前环境的 URL 配置 */\nexport function getEnvUrls(env?: EnvName): EnvUrls {\n return buildEnvUrls(getEnvHost(env ?? loadEnvName()));\n}\n\n/** 获取所有可用环境名称 */\nexport function getAvailableEnvs(): EnvName[] {\n return [\"development\", \"test\", \"production\"];\n}\n",
37
+ "import { requireApiKey } from \"../auth/credentials.js\";\nimport {\n getEnvUrls,\n NOTIFICATION_INTELLIGENCE_LIGHT_RULES_PLUGIN_PATH,\n normalizeNotificationIntelligenceLightRulesPluginUrl,\n} from \"../env.js\";\nimport type { LightRuleMeta, LightRuleUpdateParams } from \"./types.js\";\n\nexport type LightRuleRecord = LightRuleMeta & { id: string };\n\nexport interface LightRuleCreateInput {\n ruleText: string;\n}\n\nexport interface LightRuleCreateResult {\n id: string;\n name: string;\n requestId?: string;\n warning?: string;\n}\n\nexport interface LightRuleUpdateResult {\n id?: string;\n name?: string;\n title?: string;\n requestId?: string;\n warning?: string;\n updated: true;\n rule?: LightRuleRecord;\n}\n\nexport interface LightRuleDeleteResult {\n id: string;\n name: string;\n requestId?: string;\n}\n\nexport interface LightRuleService {\n list(): Promise<LightRuleRecord[]>;\n create(params: LightRuleCreateInput): Promise<LightRuleCreateResult>;\n update(identifier: string, patch: LightRuleUpdateParams): Promise<LightRuleUpdateResult>;\n delete(identifier: string): Promise<LightRuleDeleteResult>;\n}\n\ninterface ResponseBean<T> {\n code?: string;\n msg?: string;\n message?: string;\n data?: T | null;\n}\n\ninterface BusinessResponse {\n success?: boolean;\n requestId?: string;\n message?: string;\n [key: string]: unknown;\n}\n\ninterface ResolvedIdentifier {\n id: string;\n name: string;\n}\n\nexport class LightRuleApiError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n public readonly status?: number,\n ) {\n super(message);\n this.name = \"LightRuleApiError\";\n }\n}\n\nexport class NotificationIntelligenceLightRuleClient implements LightRuleService {\n constructor(\n private readonly deps: {\n logger?: { info: (message: string) => void; warn: (message: string) => void };\n baseUrl?: string;\n } = {},\n ) {}\n\n async list(): Promise<LightRuleRecord[]> {\n const data = await this.request<{ success?: boolean; rules?: unknown[] }>(\"\");\n const rules = Array.isArray(data.rules) ? data.rules : [];\n return rules.map((rule) => normalizeRuleRecord(rule));\n }\n\n async create(params: LightRuleCreateInput): Promise<LightRuleCreateResult> {\n const ruleText = params.ruleText.trim();\n if (!ruleText) {\n throw new LightRuleApiError(\"INVALID_PARAMS\", \"ruleText is required\");\n }\n\n const data = await this.request<BusinessResponse & { id?: unknown; name?: unknown; warning?: unknown }>(\n \"\",\n {\n method: \"POST\",\n body: JSON.stringify({ ruleText }),\n },\n );\n\n const id = readNonEmptyString(data.id);\n const name = readNonEmptyString(data.name);\n if (!id || !name) {\n throw new LightRuleApiError(\n \"INVALID_RESPONSE\",\n \"Notification Intelligence create response missing id/name\",\n );\n }\n\n return {\n id,\n name,\n requestId: readNonEmptyString(data.requestId),\n warning: readNonEmptyString(data.warning),\n };\n }\n\n async update(\n identifier: string,\n patch: LightRuleUpdateParams,\n ): Promise<LightRuleUpdateResult> {\n const body = sanitizeUpdatePatch(patch);\n if (Object.keys(body).length === 0) {\n throw new LightRuleApiError(\"INVALID_PARAMS\", \"at least one update field is required\");\n }\n\n const normalized = normalizeLookupIdentifier(identifier);\n if (!normalized) {\n throw new LightRuleApiError(\"INVALID_PARAMS\", \"rule id/name is required\");\n }\n\n if (shouldPatchIdentifierDirectly(normalized)) {\n try {\n this.deps.logger?.info(\n `Light rules API update: direct PATCH identifier=${normalized} patchKeys=${formatPatchKeys(body)}`,\n );\n return await this.patchResolvedRule({ id: normalized, name: normalized }, body);\n } catch (err) {\n if (!shouldResolveAfterDirectPatch(err)) throw err;\n this.deps.logger?.info(\n `Light rules API update: direct PATCH missed identifier=${normalized}; resolving by list`,\n );\n }\n }\n\n const resolved = await this.resolveIdentifier(normalized);\n this.deps.logger?.info(\n `Light rules API update: PATCH targetId=${resolved.id} identifier=${normalized} patchKeys=${formatPatchKeys(body)}`,\n );\n return this.patchResolvedRule(resolved, body);\n }\n\n private async patchResolvedRule(\n resolved: ResolvedIdentifier,\n body: Record<string, unknown>,\n ): Promise<LightRuleUpdateResult> {\n const data = await this.request<\n BusinessResponse & {\n id?: unknown;\n name?: unknown;\n title?: unknown;\n rule?: unknown;\n warning?: unknown;\n }\n >(`/${encodeURIComponent(resolved.id)}`, {\n method: \"PATCH\",\n body: JSON.stringify(body),\n });\n\n const rule = data.rule ? normalizeRuleRecord(data.rule) : undefined;\n return {\n id: readNonEmptyString(data.id) ?? rule?.id ?? resolved.id,\n name: readNonEmptyString(data.name) ?? rule?.name ?? resolved.name,\n title: readNonEmptyString(data.title) ?? rule?.title,\n requestId: readNonEmptyString(data.requestId),\n warning: readNonEmptyString(data.warning),\n updated: true,\n rule,\n };\n }\n\n async delete(identifier: string): Promise<LightRuleDeleteResult> {\n const resolved = await this.resolveIdentifier(identifier);\n const data = await this.request<BusinessResponse & { id?: unknown; name?: unknown }>(\n `/${encodeURIComponent(resolved.id)}`,\n { method: \"DELETE\" },\n );\n return {\n id: readNonEmptyString(data.id) ?? resolved.id,\n name: readNonEmptyString(data.name) ?? resolved.name,\n requestId: readNonEmptyString(data.requestId),\n };\n }\n\n private async resolveIdentifier(identifier: string): Promise<ResolvedIdentifier> {\n const normalized = normalizeLookupIdentifier(identifier);\n if (!normalized) {\n throw new LightRuleApiError(\"INVALID_PARAMS\", \"rule id/name is required\");\n }\n\n const rules = await this.list();\n const found = rules.find((rule) => rule.id === normalized || rule.name === normalized);\n if (!found) {\n throw new LightRuleApiError(\"NOT_FOUND\", `灯效规则 '${normalized}' 不存在`);\n }\n\n return { id: found.id, name: found.name };\n }\n\n private async request<T extends BusinessResponse>(\n path: string,\n init: RequestInit = {},\n ): Promise<T> {\n const url = `${this.baseUrl()}${path}`;\n const startedAt = Date.now();\n const res = await fetch(url, {\n ...init,\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Api-Key-Id\": this.apiKeyHeader(),\n ...(init.headers ?? {}),\n },\n });\n const text = await res.text();\n let parsed: any = null;\n try {\n parsed = parseJsonResponse(text);\n } catch (err) {\n if (res.ok) throw err;\n }\n\n if (!res.ok) {\n const message =\n readNonEmptyString(parsed?.msg) ??\n readNonEmptyString(parsed?.message) ??\n readNonEmptyString((parsed?.data as BusinessResponse | null | undefined)?.message) ??\n readNonEmptyString(text) ??\n `HTTP ${res.status}`;\n this.deps.logger?.warn(\n `Light rules API: ${init.method ?? \"GET\"} ${url} failed status=${res.status} message=${message}`,\n );\n throw new LightRuleApiError(\n String(res.status),\n decorateRemoteErrorMessage(message, url),\n res.status,\n );\n }\n\n const bean = parsed as ResponseBean<T> | null;\n if (!bean || typeof bean !== \"object\") {\n throw new LightRuleApiError(\"INVALID_RESPONSE\", \"empty or invalid JSON response\");\n }\n\n if (bean.code && bean.code !== \"000000\") {\n throw new LightRuleApiError(bean.code, bean.msg ?? bean.message ?? \"remote request failed\");\n }\n\n const data = (bean.data ?? bean) as T | null;\n if (!data || typeof data !== \"object\") {\n throw new LightRuleApiError(\"INVALID_RESPONSE\", \"response data is empty\");\n }\n\n if (data.success === false) {\n throw new LightRuleApiError(\n \"BUSINESS_FAILED\",\n data.message ?? \"remote business request failed\",\n );\n }\n\n this.deps.logger?.info(\n `Light rules API: ${init.method ?? \"GET\"} ${url} ok elapsedMs=${Date.now() - startedAt}`,\n );\n return data;\n }\n\n private baseUrl(): string {\n const configuredBaseUrl = this.deps.baseUrl?.trim();\n return normalizeNotificationIntelligenceLightRulesPluginUrl(\n configuredBaseUrl ||\n getEnvUrls().notificationIntelligenceLightRulesPluginUrl,\n );\n }\n\n private apiKeyHeader(): string {\n let apiKey: string;\n try {\n apiKey = requireApiKey();\n } catch (err: any) {\n throw new LightRuleApiError(\"AUTH_REQUIRED\", err?.message ?? String(err));\n }\n return apiKey.startsWith(\"Bearer \") ? apiKey.slice(\"Bearer \".length) : apiKey;\n }\n}\n\nfunction normalizeRuleRecord(value: unknown): LightRuleRecord {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new LightRuleApiError(\"INVALID_RESPONSE\", \"invalid light rule item\");\n }\n const raw = value as Partial<LightRuleMeta> & { id?: unknown };\n const name = readNonEmptyString(raw.name);\n const id = readNonEmptyString(raw.id) ?? name;\n if (!id || !name) {\n throw new LightRuleApiError(\"INVALID_RESPONSE\", \"light rule item missing id/name\");\n }\n return {\n ...(raw as LightRuleMeta),\n id,\n name,\n title: readNonEmptyString(raw.title) ?? name,\n type: \"light-rule\",\n description: readNonEmptyString(raw.description) ?? name,\n segments: Array.isArray(raw.segments) ? raw.segments : [],\n repeat_times: typeof raw.repeat_times === \"number\" ? raw.repeat_times : 1,\n enabled: typeof raw.enabled === \"boolean\" ? raw.enabled : true,\n createdAt: readNonEmptyString(raw.createdAt) ?? new Date(0).toISOString(),\n };\n}\n\nfunction sanitizeUpdatePatch(params: LightRuleUpdateParams): Record<string, unknown> {\n const patch: Record<string, unknown> = {};\n for (const key of [\n \"ruleText\",\n \"title\",\n \"description\",\n \"enabled\",\n \"segments\",\n \"repeat_times\",\n \"repeat\",\n ] as const) {\n if (params[key] !== undefined) {\n patch[key] = params[key];\n }\n }\n return patch;\n}\n\nfunction parseJsonResponse(text: string): any {\n if (!text.trim()) return null;\n try {\n return JSON.parse(text);\n } catch (err: any) {\n throw new LightRuleApiError(\n \"INVALID_RESPONSE\",\n `invalid JSON response: ${err?.message ?? String(err)}`,\n );\n }\n}\n\nfunction normalizeLookupIdentifier(value: string): string {\n return value.trim().replace(/\\.json$/i, \"\");\n}\n\nfunction shouldPatchIdentifierDirectly(identifier: string): boolean {\n return /^[A-Za-z0-9][A-Za-z0-9._:-]*$/.test(identifier);\n}\n\nfunction shouldResolveAfterDirectPatch(err: unknown): boolean {\n if (!(err instanceof LightRuleApiError)) return false;\n return err.status === 404 || err.code === \"404\" || err.code === \"NOT_FOUND\";\n}\n\nfunction formatPatchKeys(body: Record<string, unknown>): string {\n const keys = Object.keys(body);\n return keys.length > 0 ? keys.join(\",\") : \"none\";\n}\n\nfunction readNonEmptyString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed || undefined;\n}\n\nfunction decorateRemoteErrorMessage(message: string, url: string): string {\n if (!/jwt is missing/i.test(message)) return message;\n if (url.includes(NOTIFICATION_INTELLIGENCE_LIGHT_RULES_PLUGIN_PATH)) {\n return (\n `${message}。请求已命中插件侧 API ` +\n `${NOTIFICATION_INTELLIGENCE_LIGHT_RULES_PLUGIN_PATH},插件侧鉴权应只使用 ` +\n `X-Api-Key-Id;当前 401 来自云端 JWT 鉴权层,说明该插件前缀没有被网关/服务端放行到 API Key 鉴权。` +\n `请后端检查网关白名单和 Notification Intelligence Service 插件路由:${url}`\n );\n }\n return (\n `${message}。灯效规则应调用插件侧 API ` +\n `/api/plugin/notification-intelligence/light-rules,并通过 X-Api-Key-Id 鉴权;` +\n `当前请求可能命中了 App 端 JWT 接口:${url}`\n );\n}\n",
38
+ "import type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport type { Logger } from \"../logger.js\";\nimport { assertAncsRepeatTimes, normalizeRepeatTimes } from \"../light/repeat.js\";\nimport { validateSegments, type ValidationWarning } from \"../light/validators.js\";\nimport { MAX_LIGHT_SEGMENTS } from \"../light/protocol.js\";\nimport { LightRuleApiError, type LightRuleService } from \"../light-rules/client.js\";\nimport { LIGHT_RULE_TOOL_NAMES } from \"../light-rules/names.js\";\nimport type { LightRuleUpdateParams } from \"../light-rules/types.js\";\n\nconst segmentItemSchema = {\n type: \"object\",\n required: [\"mode\", \"duration_s\"],\n additionalProperties: false,\n properties: {\n mode: {\n type: \"string\",\n enum: [\"wave\", \"breath\", \"strobe\", \"steady\", \"color_flow\", \"pixel_frame\"],\n description:\n \"灯效模式:wave 波浪 / breath 呼吸 / strobe 频闪 / steady 常亮 / color_flow 流光 / pixel_frame 逐组像素帧\",\n },\n duration_s: { type: \"number\", minimum: 0, description: \"持续时长(秒),0 表示无限\" },\n brightness: { type: \"number\", minimum: 0, maximum: 255 },\n color: {\n type: \"object\",\n required: [\"r\", \"g\", \"b\"],\n additionalProperties: false,\n properties: {\n r: { type: \"number\", minimum: 0, maximum: 255 },\n g: { type: \"number\", minimum: 0, maximum: 255 },\n b: { type: \"number\", minimum: 0, maximum: 255 },\n },\n },\n interval_ms: { type: \"number\", minimum: 0 },\n direction: { type: \"string\", enum: [\"ltr\", \"rtl\"] },\n window: { type: \"number\", enum: [1, 2, 3] },\n breath_timing: {\n type: \"object\",\n additionalProperties: false,\n properties: {\n rise_ms: { type: \"number\", minimum: 0 },\n hold_ms: { type: \"number\", minimum: 0 },\n fall_ms: { type: \"number\", minimum: 0 },\n off_ms: { type: \"number\", minimum: 0 },\n },\n },\n frames: { type: \"array\", items: { type: \"array\", items: { type: \"number\" } } },\n frame_duration_ms: { type: \"number\", minimum: 0 },\n background: {\n type: \"object\",\n required: [\"r\", \"g\", \"b\"],\n additionalProperties: false,\n properties: {\n r: { type: \"number\", minimum: 0, maximum: 255 },\n g: { type: \"number\", minimum: 0, maximum: 255 },\n b: { type: \"number\", minimum: 0, maximum: 255 },\n brightness: { type: \"number\", minimum: 0, maximum: 255 },\n },\n },\n },\n} as const;\n\nconst segmentsSchema = {\n type: \"array\",\n description: \"灯效段序列,1-12 段,按顺序播放\",\n minItems: 1,\n maxItems: MAX_LIGHT_SEGMENTS,\n items: segmentItemSchema,\n} as const;\n\nfunction ok(data: object): { content: [{ type: \"text\"; text: string }]; details: object } {\n return { content: [{ type: \"text\" as const, text: JSON.stringify(data) }], details: data };\n}\n\nfunction err(\n code: string,\n message: string,\n): { content: [{ type: \"text\"; text: string }]; details: object } {\n const data = { ok: false, error: { code, message } };\n return { content: [{ type: \"text\" as const, text: JSON.stringify(data) }], details: data };\n}\n\nfunction toolError(e: unknown): ReturnType<typeof err> {\n if (e instanceof LightRuleApiError) return err(e.code, e.message);\n const message = e instanceof Error ? e.message : String(e);\n return err(\"INTERNAL_ERROR\", message);\n}\n\nfunction resolveRuleIdentifier(params: unknown): string | undefined {\n if (!params || typeof params !== \"object\") return undefined;\n const raw = params as Record<string, unknown>;\n for (const candidate of [raw.id, raw.name, raw.ruleId, raw.ruleName]) {\n if (typeof candidate !== \"string\") continue;\n const normalized = candidate.trim().replace(/\\.json$/i, \"\");\n if (normalized) return normalized;\n }\n return undefined;\n}\n\nfunction readTrimmedString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed || undefined;\n}\n\nfunction hasAnyPlainUpdateField(params: Record<string, unknown>): boolean {\n return [\n \"title\",\n \"description\",\n \"enabled\",\n \"segments\",\n \"repeat_times\",\n \"repeat\",\n ].some((key) => params[key] !== undefined);\n}\n\nfunction formatPatchKeys(patch: LightRuleUpdateParams): string {\n const keys = Object.keys(patch);\n return keys.length > 0 ? keys.join(\",\") : \"none\";\n}\n\ntype BuildPatchResult =\n | { ok: true; patch: LightRuleUpdateParams; warnings: ValidationWarning[] }\n | { ok: false; code: string; message: string };\n\nfunction buildUpdatePatch(params: Record<string, unknown>): BuildPatchResult {\n const ruleText = readTrimmedString(params.ruleText);\n if (params.ruleText !== undefined) {\n if (!ruleText) {\n return { ok: false, code: \"INVALID_PARAMS\", message: \"ruleText must be a non-empty string\" };\n }\n if (hasAnyPlainUpdateField(params)) {\n return {\n ok: false,\n code: \"INVALID_PARAMS\",\n message:\n \"ruleText cannot be mixed with title/enabled/description/segments/repeat_times/repeat\",\n };\n }\n return { ok: true, patch: { ruleText }, warnings: [] };\n }\n\n const patch: LightRuleUpdateParams = {};\n const warnings: ValidationWarning[] = [];\n\n if (params.title !== undefined) {\n const title = readTrimmedString(params.title);\n if (!title) return { ok: false, code: \"INVALID_PARAMS\", message: \"title must be a non-empty string\" };\n patch.title = title;\n }\n if (params.description !== undefined) {\n if (typeof params.description !== \"string\") {\n return { ok: false, code: \"INVALID_PARAMS\", message: \"description must be a string\" };\n }\n patch.description = params.description;\n }\n if (params.enabled !== undefined) {\n if (typeof params.enabled !== \"boolean\") {\n return { ok: false, code: \"INVALID_PARAMS\", message: \"enabled must be a boolean\" };\n }\n patch.enabled = params.enabled;\n }\n if (params.segments !== undefined) {\n const validation = validateSegments(params.segments);\n if (!validation.valid) {\n return { ok: false, code: \"VALIDATION_FAILED\", message: JSON.stringify(validation.errors) };\n }\n patch.segments = validation.segments;\n warnings.push(...validation.warnings);\n }\n if (params.repeat_times !== undefined || params.repeat !== undefined) {\n if (params.repeat_times !== undefined && typeof params.repeat_times !== \"number\") {\n return { ok: false, code: \"INVALID_PARAMS\", message: \"repeat_times must be a number\" };\n }\n if (params.repeat !== undefined && typeof params.repeat !== \"boolean\") {\n return { ok: false, code: \"INVALID_PARAMS\", message: \"repeat must be a boolean\" };\n }\n try {\n const repeatTimes = normalizeRepeatTimes({\n repeat: params.repeat,\n repeat_times: params.repeat_times,\n });\n assertAncsRepeatTimes(repeatTimes);\n patch.repeat_times = repeatTimes;\n } catch (e: any) {\n return { ok: false, code: \"VALIDATION_FAILED\", message: e?.message ?? \"Unknown error\" };\n }\n }\n\n if (Object.keys(patch).length === 0) {\n return { ok: false, code: \"INVALID_PARAMS\", message: \"at least one update field is required\" };\n }\n\n return { ok: true, patch, warnings };\n}\n\nexport function registerLightRulesTools(\n api: OpenClawPluginApi,\n service: LightRuleService,\n logger: Pick<Logger, \"info\" | \"warn\">,\n): void {\n api.registerTool({\n name: LIGHT_RULE_TOOL_NAMES.list,\n label: \"List Light Rules\",\n description:\n \"列出云端 Notification Intelligence Service 中当前账号的灯效规则(包含 enabled/disabled 状态)。\" +\n \"当用户说“列出灯效规则”“有哪些灯效规则”“查看规则”等时调用。\",\n parameters: { type: \"object\", properties: {}, additionalProperties: false },\n async execute() {\n try {\n const rules = await service.list();\n return ok({ ok: true, rules });\n } catch (e) {\n logger.warn(`${LIGHT_RULE_TOOL_NAMES.list} tool failed: ${(e as Error)?.message}`);\n return toolError(e);\n }\n },\n });\n\n api.registerTool({\n name: LIGHT_RULE_TOOL_NAMES.create,\n label: \"Create Light Rule\",\n description:\n \"创建一条云端持久灯效规则。必须把用户原始自然语言诉求整理成 ruleText 传入,\" +\n \"由 Notification Intelligence Service 的独立 Agent 编译 name/title/description/segments/repeat_times 并保存。\" +\n \"当用户说“收到某类通知/消息时亮灯/闪灯/变灯效”“当老板发消息亮红灯”“新增/创建灯效规则”等时调用。\",\n parameters: {\n type: \"object\",\n required: [\"ruleText\"],\n additionalProperties: false,\n properties: {\n ruleText: {\n type: \"string\",\n description: \"用户原始自然语言规则,例如“老板发微信时红灯快闪”\",\n },\n },\n },\n async execute(_toolCallId, params) {\n const ruleText = readTrimmedString((params as { ruleText?: unknown }).ruleText);\n if (!ruleText) return err(\"INVALID_PARAMS\", \"ruleText is required\");\n\n try {\n const result = await service.create({ ruleText });\n logger.info(`${LIGHT_RULE_TOOL_NAMES.create} tool: created ${result.id}/${result.name}`);\n return ok({\n ok: true,\n id: result.id,\n name: result.name,\n ...(result.warning ? { warning: result.warning } : {}),\n ...(result.requestId ? { requestId: result.requestId } : {}),\n });\n } catch (e) {\n logger.warn(`${LIGHT_RULE_TOOL_NAMES.create} tool failed: ${(e as Error)?.message}`);\n return toolError(e);\n }\n },\n });\n\n api.registerTool({\n name: LIGHT_RULE_TOOL_NAMES.update,\n label: \"Update Light Rule\",\n description:\n \"修改云端灯效规则。优先传 id;如果只知道展示名或 name,先调用 lightrules_list 获取规则列表。\" +\n \"传 ruleText 表示让独立 Agent 重新编译规则语义;传 title/enabled/description/segments/repeat_times 表示普通字段局部更新。\" +\n \"ruleText 不能和普通字段在同一次调用中混用。\",\n parameters: {\n type: \"object\",\n additionalProperties: false,\n anyOf: [\n { required: [\"id\"] },\n { required: [\"name\"] },\n { required: [\"ruleId\"] },\n { required: [\"ruleName\"] },\n ],\n properties: {\n id: { type: \"string\", description: \"云端规则 ID(优先使用)\" },\n name: { type: \"string\", description: \"规则语义化 name,兼容旧调用\" },\n ruleId: { type: \"string\", description: \"规则 ID,兼容字段\" },\n ruleName: { type: \"string\", description: \"规则 name,兼容字段\" },\n ruleText: { type: \"string\", description: \"新的自然语言规则,传入后由独立 Agent 重编译\" },\n title: { type: \"string\", description: \"新的展示名/短标题(可选)\" },\n description: { type: \"string\", description: \"新的触发条件描述(可选)\" },\n enabled: { type: \"boolean\", description: \"true=启用,false=禁用\" },\n segments: { ...segmentsSchema, description: \"新的灯效段序列(可选,不填则保持不变)\" },\n repeat_times: { type: \"number\", description: \"新的重复次数:0=无限循环,1=播放一轮\" },\n repeat: { type: \"boolean\", description: \"历史兼容字段:true=无限循环,false=播放一轮\" },\n },\n },\n async execute(_toolCallId, params) {\n const identifier = resolveRuleIdentifier(params);\n if (!identifier) {\n return err(\"INVALID_PARAMS\", \"id is required; call lightrules_list first if needed\");\n }\n\n const patch = buildUpdatePatch(params as Record<string, unknown>);\n if (!patch.ok) return err(patch.code, patch.message);\n\n try {\n logger.info(\n `${LIGHT_RULE_TOOL_NAMES.update} tool: updating ${identifier} patchKeys=${formatPatchKeys(patch.patch)}`,\n );\n const result = await service.update(identifier, patch.patch);\n logger.info(`${LIGHT_RULE_TOOL_NAMES.update} tool: updated ${identifier}`);\n for (const warning of patch.warnings) {\n logger.warn(\n `${LIGHT_RULE_TOOL_NAMES.update} validation warning [${warning.code}] ${warning.field}: ${warning.message}`,\n );\n }\n return ok({\n ok: true,\n id: result.id,\n name: result.name,\n title: result.title,\n updated: true,\n ...(result.rule ? { rule: result.rule } : {}),\n ...(result.warning ? { warning: result.warning } : {}),\n ...(result.requestId ? { requestId: result.requestId } : {}),\n ...(patch.warnings.length > 0 ? { warnings: patch.warnings } : {}),\n });\n } catch (e) {\n logger.warn(`${LIGHT_RULE_TOOL_NAMES.update} tool failed: ${(e as Error)?.message}`);\n return toolError(e);\n }\n },\n });\n\n api.registerTool({\n name: LIGHT_RULE_TOOL_NAMES.delete,\n label: \"Delete Light Rule\",\n description:\n \"删除一条云端灯效规则(云端当前实现为软删除)。优先传 id;如果不确定 id,先调用 lightrules_list。\",\n parameters: {\n type: \"object\",\n additionalProperties: false,\n anyOf: [\n { required: [\"id\"] },\n { required: [\"name\"] },\n { required: [\"ruleId\"] },\n { required: [\"ruleName\"] },\n ],\n properties: {\n id: { type: \"string\", description: \"云端规则 ID(优先使用)\" },\n name: { type: \"string\", description: \"规则语义化 name,兼容旧调用\" },\n ruleId: { type: \"string\", description: \"规则 ID,兼容字段\" },\n ruleName: { type: \"string\", description: \"规则 name,兼容字段\" },\n },\n },\n async execute(_toolCallId, params) {\n const identifier = resolveRuleIdentifier(params);\n if (!identifier) return err(\"INVALID_PARAMS\", \"id is required\");\n\n try {\n const result = await service.delete(identifier);\n logger.info(`${LIGHT_RULE_TOOL_NAMES.delete} tool: deleted ${result.id}/${result.name}`);\n return ok({\n ok: true,\n id: result.id,\n name: result.name,\n deleted: true,\n ...(result.requestId ? { requestId: result.requestId } : {}),\n });\n } catch (e) {\n logger.warn(`${LIGHT_RULE_TOOL_NAMES.delete} tool failed: ${(e as Error)?.message}`);\n return toolError(e);\n }\n },\n });\n}\n",
39
+ "/**\n * LightRuleRegistry —— 灯效规则的内存索引 + CRUD 包装\n *\n * 角色定位:\n * - 在事件驱动重构方案下,每条通知到达时都需要拿到\"当前 enabled 的全部规则\"\n * 用来拼装 Agent system prompt。如果每次都扫盘 N meta.json,\n * 5 秒延迟预算会被磨穿,所以引入这个常驻内存的 index。\n * - 同时它是 storage.ts CRUD 包装:所有 create/update/delete 都会先落盘、\n * 再更新内存 Map,保证两者一致。\n *\n * 本类**不**做规则匹配 —— 匹配交给 Agent。registry 只负责\"有哪些规则\"和\n * \"按需拼装 prompt\"。\n *\n * 写路径用一个 promise 链做串行化(最朴素的 mutex),保证并发 CRUD\n * 不会出现\"内存和磁盘交错\"的状态。\n *\n * prd-lightrules-event-driven-refactor.md §数据模型 / §触发流程\n */\n\nimport {\n createLightRule,\n deleteLightRule,\n listLightRules,\n updateLightRule,\n type LightRuleStorageContext,\n} from \"./storage.js\";\nimport type { LightRuleMeta } from \"./types.js\";\n\nexport { LightRuleError } from \"./storage.js\";\n\ntype CreateParams = Parameters<typeof createLightRule>[1];\ntype UpdateParams = Parameters<typeof updateLightRule>[1];\ntype CreateResult = ReturnType<typeof createLightRule>;\ntype UpdateResult = ReturnType<typeof updateLightRule>;\ntype DeleteResult = ReturnType<typeof deleteLightRule>;\n\nexport class LightRuleRegistry {\n private readonly ctx: LightRuleStorageContext;\n /** name meta 的内存索引;落盘成功后才更新 */\n private readonly index = new Map<string, LightRuleMeta>();\n /** 写路径串行化锁:每次 mutate chain 在前一次之后 */\n private writeChain: Promise<unknown> = Promise.resolve();\n\n constructor(ctx: LightRuleStorageContext) {\n this.ctx = ctx;\n this.reload();\n }\n\n /**\n * 从磁盘重新加载全部规则到内存。仅在构造时和外部显式触发时使用。\n * 正常 CRUD 路径不应该调用本方法 —— 通过 create/update/delete 增量维护即可。\n */\n reload(): void {\n this.index.clear();\n for (const meta of listLightRules(this.ctx)) {\n this.index.set(meta.name, meta);\n }\n }\n\n /** 全部规则(包含 disabled),调用方不要改返回值。 */\n list(): LightRuleMeta[] {\n return Array.from(this.index.values());\n }\n\n /** 仅 enabled 的规则。事件驱动评估链路使用。 */\n getEnabled(): LightRuleMeta[] {\n return this.list().filter((rule) => rule.enabled);\n }\n\n /** 按名字精确查找;不存在返回 null。 */\n get(name: string): LightRuleMeta | null {\n return this.index.get(name) ?? null;\n }\n\n /**\n * 创建规则。落盘成功后再写入内存索引。\n * 失败时 storage LightRuleError,内存索引保持不变。\n */\n async create(params: CreateParams): Promise<CreateResult> {\n return this.runExclusive(() => {\n const result = createLightRule(this.ctx, params);\n this.index.set(result.meta.name, result.meta);\n return result;\n });\n }\n\n /**\n * 更新规则。落盘成功后再刷新内存条目。\n */\n async update(params: UpdateParams): Promise<UpdateResult> {\n return this.runExclusive(() => {\n const result = updateLightRule(this.ctx, params);\n this.index.set(result.meta.name, result.meta);\n return result;\n });\n }\n\n /**\n * 删除规则。落盘成功后再从内存索引移除。\n */\n async delete(name: string): Promise<DeleteResult> {\n return this.runExclusive(() => {\n const result = deleteLightRule(this.ctx, name);\n this.index.delete(result.name);\n return result;\n });\n }\n\n /**\n * 拼装 Agent 评估用的 system prompt。\n *\n * 当前实现是一个最小可用骨架:列出全部 enabled 规则的 title + name + description。\n * M3 接入真实 Agent 链路时,会按 prd-lightrules-event-driven-refactor.md §Prompt 拼装\n * 的模板补齐\"任务说明 / 输出约束\"等段落。\n *\n * 现在先把方法签名冻结,避免后续散落在多个调用点。\n */\n buildSystemPrompt(): string {\n const enabled = this.getEnabled();\n if (enabled.length === 0) {\n return \"当前没有启用任何灯效规则。\";\n }\n\n const lines: string[] = [\n '你是一个判断\"通知 灯效规则\"是否命中的助手。',\n \"\",\n \"下面是用户当前启用的全部灯效规则(按创建时间倒序):\",\n \"\",\n ];\n\n const sorted = [...enabled].sort((a, b) =>\n (b.createdAt ?? \"\").localeCompare(a.createdAt ?? \"\"),\n );\n\n sorted.forEach((rule, idx) => {\n lines.push(\n `[${idx + 1}] title: ${rule.title}`,\n ` name: ${rule.name}`,\n ` description: ${rule.description}`,\n \"\",\n );\n });\n\n lines.push(\n '任务:根据用户接下来发给你的\"通知\"内容,判断哪些规则被命中。',\n \"- 命中 0 条:不调用任何工具,直接结束。\",\n \"- 命中 1 条或多条:对每一条命中的规则调用一次 trigger_light(rule_name)。\",\n \"- 不要回复任何自由文本;判定结果**只**通过 tool calling 表达。\",\n '- 拿不准的时候倾向于\"不触发\",避免骚扰用户。',\n );\n\n return lines.join(\"\\n\");\n }\n\n /**\n * 把一段同步操作排队进 write chain,保证 mutate 串行执行。\n *\n * promise 链做 mutex 是最简单的方案:每次 runExclusive 都把\n * `writeChain` 推进一步。即使前一个任务失败,链也会继续往下走,\n * 后续任务不会被永久阻塞。\n */\n private runExclusive<T>(fn: () => T): Promise<T> {\n const next = this.writeChain.then(\n () => fn(),\n () => fn(),\n );\n // 不让链上的失败传播下去(已在 then onRejected 回调里吸收)\n this.writeChain = next.catch(() => undefined);\n return next;\n }\n}\n",
40
+ "import type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport type { Logger } from \"./logger.js\";\nimport {\n createVersionAwareLogger,\n PluginFileLogger as PluginLogger,\n} from \"./logger.js\";\nimport {\n RecordingStorage,\n type RecordingStatusEvent,\n} from \"./recording/index.js\";\nimport { ImageStorage } from \"./image/index.js\";\nimport {\n NOTIFICATION_SUMMARY_RESULT_EVENT,\n NOTIFICATION_SUMMARY_STATUS_EVENT,\n type NotificationSummaryResultEvent,\n type NotificationSummaryStatusEvent,\n} from \"./notification/summary.js\";\nimport {\n getStateFallbackNotificationDir,\n type NotificationStorage,\n} from \"./notification/storage.js\";\nimport { registerLightRulesGateway } from \"./light-rules/gateway.js\";\nimport {\n LIGHT_RULE_GATEWAY_METHOD_LIST,\n LIGHT_RULE_TOOL_NAME_LIST,\n LIGHT_RULE_TOOL_NAMES,\n} from \"./light-rules/names.js\";\nimport { registerLightRulesTools } from \"./plugin/light-rules-tools.js\";\nimport { NotificationIntelligenceLightRuleClient } from \"./light-rules/client.js\";\nimport { LightRuleRegistry } from \"./light-rules/registry.js\";\nimport { join } from \"node:path\";\nimport { registerAutoUpdateLifecycle } from \"./plugin/auto-update.js\";\nimport { registerPluginCli } from \"./plugin/cli.js\";\nimport { ensureNtfBinInstalled } from \"./plugin/ntf-bin.js\";\n\n// 解析 plugin 自身安装目录。多个方案都被 bun build 静态求值(坑):\n// - import.meta.url 被替换成 build 机器源码绝对路径\n// - module.path 被替换成 \"src/index.ts\"\n// - __dirname 被 bun 在 bundle 顶部注入的 `var __dirname = \"<src>\"` 屏蔽\n// 解法:scripts/build.ts 后处理时把 bun 注入的 `var __dirname = ...` 行删掉,\n// 让 Node CJS module wrapper 注入的真值(dist/ 所在目录)生效。\ndeclare const __dirname: string;\nimport {\n registerRelayTunnelLifecycle,\n registerStorageLifecycle,\n} from \"./plugin/lifecycle.js\";\nimport { registerNotificationInterfaces } from \"./plugin/notifications.js\";\nimport { registerRecordingInterfaces } from \"./plugin/recordings.js\";\nimport { registerImageInterfaces } from \"./plugin/images.js\";\nimport { isPluginCliInvocation } from \"./plugin/runtime-mode.js\";\nimport { resolvePluginStateDir } from \"./plugin/runtime-state.js\";\nimport { resolveStateDir } from \"./host.js\";\nimport type { GatewayHandler } from \"./plugin/shared.js\";\nimport { RELAY_TUNNEL_GATEWAY_CLIENT_INSTANCE_ID } from \"./tunnel/proxy.js\";\nimport type { PluginConfig, RawNotification } from \"./types.js\";\nimport type { BroadcastFn } from \"./update/types.js\";\n\nconst LIGHT_RULE_PROMPT_GUIDANCE = [\n \"灯效规则路由提示:\",\n `- 当用户表达“收到/当/如果/有某类通知或消息时,亮灯/闪灯/变成某种灯效”时,这是云端持久灯效规则请求,必须调用 ${LIGHT_RULE_TOOL_NAMES.create} 或 ${LIGHT_RULE_TOOL_NAMES.update}。`,\n \"- 创建规则时把用户的自然语言诉求整理成 ruleText;由 Notification Intelligence Service 的独立 Agent 编译和保存规则。\",\n \"- 灯效规则的创建、修改、删除和查询都走 lightrules_* 工具;不要手写或编辑 tasks/*/meta.json。\",\n \"- 如果 lightrules_* 工具返回错误,必须如实说明本次查询/修改失败;不要使用聊天历史或旧 toolResult 里的规则列表冒充当前云端结果。\",\n \"- 插件不再提供 OpenClaw 层的一次性 light_control,下发、评估和亮灯原因由云端服务处理。\",\n].join(\"\\n\");\n\nexport default {\n id: \"phone-notifications\",\n name: \"Phone Notifications & Light Control\",\n\n register(api: OpenClawPluginApi) {\n const config = (api.pluginConfig ?? {}) as PluginConfig;\n const ignoredApps = new Set(config.ignoredApps ?? []);\n\n let storage: NotificationStorage | null = null;\n let recordingStorage: RecordingStorage | null = null;\n let imageStorage: ImageStorage | null = null;\n let broadcastFn: BroadcastFn | null = null;\n let autoUpdateLifecycle: ReturnType<typeof registerAutoUpdateLifecycle> | null = null;\n let tunnelService: ReturnType<typeof registerRelayTunnelLifecycle> = null;\n\n const openclawDir = resolvePluginStateDir(api);\n const logger: Logger = openclawDir\n ? new PluginLogger(api.logger, openclawDir)\n : createVersionAwareLogger(api.logger);\n\n const asrDataDir =\n openclawDir ??\n resolveStateDir() ??\n process.cwd();\n\n // jvsclaw 线上通道会直接解压 tgz,不走 install-jvsclaw.sh/npm link。\n // 因此独立 `ntf` 命令需要在任何注册模式下自修复,包括 `openclaw ntf ...`\n // 这种 CLI-only 加载路径。\n ensureNtfBinInstalled({\n ntfCjsPath: join(__dirname, \"bin\", \"ntf.cjs\"),\n stateDir: openclawDir,\n logger,\n });\n\n if (isPluginCliInvocation()) {\n registerPluginCli(api, {\n logger,\n openclawDir,\n });\n logger.info(\n \"检测到插件 CLI 命令执行上下文,仅注册 CLI,跳过后台服务以避免影响 Relay tunnel 常驻连接\",\n );\n return;\n }\n\n api.on(\"before_prompt_build\", () => ({\n appendSystemContext: LIGHT_RULE_PROMPT_GUIDANCE,\n }));\n\n function cacheBroadcast(broadcast: BroadcastFn | undefined): void {\n if (!broadcast) {\n return;\n }\n\n const changed = broadcastFn !== broadcast;\n broadcastFn = broadcast;\n if (changed) {\n autoUpdateLifecycle?.notifyBroadcastReady();\n }\n }\n\n function isDirectMobileGatewayRequest(\n opts: Parameters<GatewayHandler>[0],\n ): boolean {\n const client = opts.client?.connect?.client;\n if (!client) return false;\n if (client.instanceId === RELAY_TUNNEL_GATEWAY_CLIENT_INSTANCE_ID) {\n return false;\n }\n return client.id === \"openclaw-ios\" || client.id === \"openclaw-android\";\n }\n\n async function deactivateRelayForDirectGatewayRequest(\n method: string,\n opts: Parameters<GatewayHandler>[0],\n ): Promise<void> {\n if (!tunnelService || !isDirectMobileGatewayRequest(opts)) return;\n\n const client = opts.client?.connect?.client;\n try {\n await tunnelService.deactivateForExternalTunnel(\n `gateway method ${method} from ${client?.id ?? \"unknown\"}`,\n );\n } catch (err: any) {\n logger.warn(\n `Relay tunnel: failed to deactivate after direct gateway method ${method}: ${err?.message ?? String(err)}`,\n );\n }\n }\n\n function registerGatewayMethodWithBroadcastCapture(\n method: string,\n handler: GatewayHandler,\n ): void {\n api.registerGatewayMethod(method, async (opts) => {\n cacheBroadcast(opts.context?.broadcast);\n await deactivateRelayForDirectGatewayRequest(method, opts);\n return handler(opts);\n });\n }\n\n function filterNotifications(items: RawNotification[]): RawNotification[] {\n return items.filter((notification) => !ignoredApps.has(notification.app));\n }\n\n function notifyRecordingStatus(event: RecordingStatusEvent): void {\n const relayEmitted =\n tunnelService?.emitEvent(\"recording.status\", event) ?? false;\n\n if (!broadcastFn) {\n if (relayEmitted) return;\n logger.warn(\n `[recording.status] broadcast 不可用,跳过状态事件: ${event.recordingId} -> ${event.transfer_status}`,\n );\n return;\n }\n\n broadcastFn(\"recording.status\", event);\n }\n\n function notifyNotificationSummaryStatus(\n event: NotificationSummaryStatusEvent,\n ): void {\n const relayEmitted =\n tunnelService?.emitEvent(NOTIFICATION_SUMMARY_STATUS_EVENT, event)\n ?? false;\n\n if (!broadcastFn) {\n if (relayEmitted) return;\n if (event.phase === \"failed\") {\n logger.warn(\n `[${NOTIFICATION_SUMMARY_STATUS_EVENT}] broadcast 不可用,跳过失败状态事件: ${event.jobId}`,\n );\n }\n return;\n }\n\n broadcastFn(NOTIFICATION_SUMMARY_STATUS_EVENT, event);\n }\n\n function notifyNotificationSummaryResult(\n event: NotificationSummaryResultEvent,\n ): void {\n const relayEmitted =\n tunnelService?.emitEvent(NOTIFICATION_SUMMARY_RESULT_EVENT, event)\n ?? false;\n\n if (!broadcastFn) {\n if (relayEmitted) return;\n if (event.status === \"failed\") {\n logger.warn(\n `[${NOTIFICATION_SUMMARY_RESULT_EVENT}] broadcast 不可用,跳过失败结果事件: ${event.jobId}`,\n );\n }\n return;\n }\n\n broadcastFn(NOTIFICATION_SUMMARY_RESULT_EVENT, event);\n }\n\n // Agent 工具走云端 Notification Intelligence Service;WS gateway 方法走本地\n // LightRuleRegistry(落盘 tasks/*/meta.json),两者各自独立。\n const lightRuleClient = new NotificationIntelligenceLightRuleClient({ logger });\n const lightRuleCtx: { workspaceDir?: string; stateDir?: string } = {\n stateDir: openclawDir,\n };\n const lightRuleRegistry = new LightRuleRegistry(lightRuleCtx);\n\n registerStorageLifecycle({\n api,\n logger,\n lightRuleCtx,\n setStorage(nextStorage) {\n storage = nextStorage;\n },\n setRecordingStorage(nextRecordingStorage) {\n recordingStorage = nextRecordingStorage;\n },\n setImageStorage(nextImageStorage) {\n imageStorage = nextImageStorage;\n },\n onStorageReady() {\n // storage service start 完成后 lightRuleCtx 才被回填到真实 workspaceDir,\n // 此时重新扫盘加载已有规则。\n lightRuleRegistry.reload();\n },\n });\n\n tunnelService = registerRelayTunnelLifecycle({\n api,\n config,\n logger,\n openclawDir,\n });\n\n registerNotificationInterfaces({\n api,\n logger,\n getStorage: () => storage,\n summaryNotificationsDir: getStateFallbackNotificationDir(openclawDir),\n filterNotifications,\n registerGatewayMethod: registerGatewayMethodWithBroadcastCapture,\n notifyNotificationSummaryStatus,\n notifyNotificationSummaryResult,\n tunnelService,\n });\n\n registerRecordingInterfaces({\n api,\n logger,\n asrDataDir,\n getRecordingStorage: () => recordingStorage,\n notifyRecordingStatus,\n registerGatewayMethod: registerGatewayMethodWithBroadcastCapture,\n shouldBroadcastStatusOnHttp: () => !!broadcastFn,\n tunnelService,\n });\n\n registerImageInterfaces({\n api,\n logger,\n getImageStorage: () => imageStorage,\n registerGatewayMethod: registerGatewayMethodWithBroadcastCapture,\n maxBytes: config.image?.maxBytes ?? 0,\n tunnelService,\n });\n\n registerLightRulesGateway(api, lightRuleRegistry, logger, cacheBroadcast);\n registerLightRulesTools(api, lightRuleClient, logger);\n logger.info(\n `灯效规则方法已注册: gateway=${LIGHT_RULE_GATEWAY_METHOD_LIST.join(\", \")}; tools=${LIGHT_RULE_TOOL_NAME_LIST.join(\", \")}`,\n );\n\n autoUpdateLifecycle = registerAutoUpdateLifecycle({\n api,\n config,\n logger,\n getBroadcastFn: () => broadcastFn,\n cacheBroadcast,\n tunnelService,\n });\n\n registerPluginCli(api, {\n logger,\n openclawDir,\n });\n },\n};\n",
43
41
  "import type { EnvName } from \"../env.js\";\nimport type { AutoUpdateConfig } from \"./types.js\";\n\nexport const PRODUCTION_UPDATE_BASE_URL = \"https://artifact.yoooclaw.com/plugin\";\nexport const TEST_UPDATE_BASE_URL = \"https://artifacts-test.yoooclaw.com/plugin\";\n\n/**\n * 解析自动更新频道。\n *\n * 默认规则:\n * - 生产环境的正式安装走 latest,避免正式客户端收到 beta 更新推送\n * - 生产环境的预发布安装继续走 beta,避免 beta 客户端漏掉后续修复\n * - 非生产环境用户显式配置时,以配置为准\n * - 非生产环境默认走 beta\n */\nexport function resolveUpdateChannel(params: {\n configuredChannel?: AutoUpdateConfig[\"channel\"];\n envName: EnvName;\n installedVersion?: string;\n}): \"latest\" | \"beta\" {\n if (params.envName === \"production\") {\n return params.installedVersion?.includes(\"-\") ? \"beta\" : \"latest\";\n }\n\n if (params.configuredChannel) {\n return params.configuredChannel;\n }\n\n return \"beta\";\n}\n\n/**\n * beta 订阅者同时检查 latest,确保正式版转正后能从 prerelease 平滑升级。\n * latest 订阅者只检查正式版,避免稳定安装收到 beta 推送。\n */\nexport function resolveUpdateTags(channel: \"latest\" | \"beta\"): ReadonlyArray<\"latest\" | \"beta\"> {\n return channel === \"beta\" ? [\"latest\", \"beta\"] : [\"latest\"];\n}\n\n/** 解析自动更新制品源。生产默认走正式 OSS;测试环境默认走测试 OSS;其它环境可显式配置。 */\nexport function resolveUpdateBaseUrl(params: {\n configuredBaseUrl?: AutoUpdateConfig[\"baseUrl\"];\n envName: EnvName;\n}): string {\n const configured = params.configuredBaseUrl?.trim().replace(/\\/+$/, \"\");\n if (configured) return configured;\n\n if (params.envName === \"test\") {\n return TEST_UPDATE_BASE_URL;\n }\n\n return PRODUCTION_UPDATE_BASE_URL;\n}\n",
44
- "import { join } from \"node:path\";\nimport type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport type { Logger } from \"../logger.js\";\nimport { resolvePluginStateDir } from \"../plugin/runtime-state.js\";\nimport { PLUGIN_VERSION } from \"../version.js\";\nimport { PRODUCTION_UPDATE_BASE_URL } from \"./channel.js\";\nimport type {\n AutoUpdateConfig,\n BroadcastFn,\n ExternalUpdateNotifier,\n UpdateInfo,\n} from \"./types.js\";\nimport { UpdateChecker } from \"./checker.js\";\nimport {\n buildLastUpdateNotice,\n applyPreparedUpdate,\n cleanupPendingDir,\n executeUpdate,\n markLastUpdateReconciled,\n markLastUpdateRestartStatus,\n readLastUpdateStatus,\n startPreparedUpdater,\n} from \"./executor.js\";\nimport { planGatewayRestart } from \"./restart.js\";\n\nconst PLUGIN_ID = \"phone-notifications\";\n\n/**\n * Windows 上:\n * - Node 进程 emit SIGUSR1 后宿主常会立刻退出(含 process.exit / spawn replacement),\n * 而 Windows IPC(named pipe / TCP loopback)的 socket flush 比 Unix domain socket\n * 慢得多,1.5s grace 也不足以保证 RPC 回复字节先离开当前进程。\n * - 实测:插件在 Windows 上目录替换成功了,但 app 收不到 plugin.update 的回复。\n * - 取舍:Windows 直接走\"手动重启\"路径——spawn detached updater 等待父进程退出,\n * 然后明确提示用户手动重启 openclaw/gateway。这样 respond 永远不会被 gateway\n * 退出打断;用户手动重启时 updater 自然接管目录替换。\n */\nfunction shouldSkipAutoRestart(): boolean {\n return process.platform === \"win32\";\n}\n\nfunction shouldSuppressUpdateNotifications(): boolean {\n return process.platform === \"win32\";\n}\n\nfunction resolveTargetDir(api: OpenClawPluginApi): string {\n try {\n const cfg = (api.runtime as any).config?.loadConfig?.();\n const installPath = cfg?.plugins?.installs?.[PLUGIN_ID]?.installPath;\n if (installPath) return installPath;\n } catch { /* ignore */ }\n return join(resolvePluginStateDir(api), \"extensions\", PLUGIN_ID);\n}\n\nasync function updateConfigRecord(\n api: OpenClawPluginApi,\n version: string,\n targetDir: string,\n tgzUrl: string,\n): Promise<void> {\n const configApi = (api.runtime as any).config;\n if (!configApi) return;\n const cfg = configApi.loadConfig();\n if (!cfg.plugins) cfg.plugins = {};\n if (!cfg.plugins.installs) cfg.plugins.installs = {};\n cfg.plugins.installs[PLUGIN_ID] = {\n ...cfg.plugins.installs[PLUGIN_ID],\n source: \"archive\" as const,\n sourcePath: tgzUrl,\n installPath: targetDir,\n version,\n installedAt: new Date().toISOString(),\n };\n await configApi.writeConfigFile(cfg);\n}\n\n/**\n * 在\"不依赖 gateway 自动重启\"的平台上落地更新:\n * - 同步 spawn detached updater(等父进程退出后接管目录替换)。\n * - 状态文件维持 status=pending,restartStatus 由调用方决定。\n * - 返回带\"请手动重启\"文案的 result;spawn 失败时返回 success=false。\n */\nfunction applyManualRestart(\n logger: Logger,\n result: Awaited<ReturnType<typeof executeUpdate>>,\n targetDir: string,\n): Awaited<ReturnType<typeof executeUpdate>> {\n const version = result.version ?? \"目标版本\";\n try {\n if (result.preparedStatus) {\n startPreparedUpdater(result.preparedStatus);\n }\n markLastUpdateRestartStatus(targetDir, \"pending\", {\n suggestion: \"Windows 不支持自动重启 gateway,请手动重启后更新生效。\",\n nextActions: [\"手动重启 openclaw/gateway\", \"重启完成后插件会自动应用新版本\"],\n });\n return {\n ...result,\n restartScheduled: false,\n suggestion: \"Windows 不支持自动重启 gateway,请手动重启后更新生效。\",\n nextActions: [\"手动重启 openclaw/gateway\", \"重启完成后插件会自动应用新版本\"],\n message: `已准备更新到 ${version},请手动重启 openclaw/gateway 后生效`,\n };\n } catch (err) {\n logger.warn(`启动后台 updater 失败: ${String(err)}`);\n cleanupPendingDir(result.preparedStatus);\n const errorMessage = err instanceof Error ? err.message : String(err);\n const suggestion = \"后台安装进程启动失败,更新尚未应用。请稍后重试。\";\n const nextActions = [\"稍后重试更新\", \"如果持续失败,请复制错误信息反馈给维护者\"];\n markLastUpdateRestartStatus(targetDir, \"failed\", {\n error: errorMessage,\n suggestion,\n nextActions,\n });\n return {\n ...result,\n success: false,\n restartScheduled: false,\n error: errorMessage,\n suggestion,\n nextActions,\n message: `更新准备完成但后台安装进程启动失败:${errorMessage}`,\n };\n }\n}\n\nfunction finalizeUpdateResult(\n api: OpenClawPluginApi,\n logger: Logger,\n result: Awaited<ReturnType<typeof executeUpdate>>,\n targetDir: string,\n): Awaited<ReturnType<typeof executeUpdate>> {\n if (!result.success) {\n return result;\n }\n\n if (shouldSkipAutoRestart()) {\n return applyManualRestart(logger, result, targetDir);\n }\n\n const restartPlan = planGatewayRestart(logger, {\n loadConfig: () => {\n const configApi = (api.runtime as any).config;\n return configApi?.loadConfig?.();\n },\n });\n\n const version = result.version ?? \"目标版本\";\n if (!restartPlan.scheduled) {\n // 重启不可用 → updater 没启动,pending 目录就是孤儿,主动清理避免下次新更新还要清理。\n cleanupPendingDir(result.preparedStatus);\n markLastUpdateRestartStatus(targetDir, \"failed\", {\n error: restartPlan.reason,\n suggestion: restartPlan.suggestion ?? \"gateway 自动重启不可用,更新尚未应用。\",\n nextActions: restartPlan.nextActions ?? [\"启用 gateway 自动重启后重试更新\"],\n });\n return {\n ...result,\n success: false,\n restartScheduled: false,\n error: restartPlan.reason,\n suggestion: restartPlan.suggestion ?? \"gateway 自动重启不可用,更新尚未应用。\",\n nextActions: restartPlan.nextActions ?? [\"启用 gateway 自动重启后重试更新\"],\n message: `已准备更新到 ${version},但 gateway 自动重启不可用,更新尚未应用`,\n };\n }\n\n const applied = result.preparedStatus\n ? applyPreparedUpdate(result.preparedStatus, \"scheduled\")\n : undefined;\n if (applied && !applied.success) {\n return {\n ...result,\n success: false,\n restartScheduled: false,\n phase: applied.phase,\n error: applied.error,\n suggestion: applied.suggestion,\n nextActions: applied.nextActions,\n message: applied.message,\n };\n }\n\n restartPlan.commit?.();\n\n return {\n ...result,\n restartScheduled: true,\n error: result.error,\n suggestion: result.suggestion,\n nextActions: [\"等待 gateway 自动重启并加载新版本\"],\n message: `已应用更新到 ${version},正在重启 gateway`,\n };\n}\n\nasync function reconcileSucceededUpdateRecord(\n api: OpenClawPluginApi,\n logger: Logger,\n targetDir: string,\n): Promise<void> {\n const status = readLastUpdateStatus(targetDir);\n if (status?.status !== \"succeeded\" || !status.tgzUrl) return;\n // 已 reconcile 过:跳过,避免每次 register 都刷新 installedAt。\n if (status.reconciledAt) return;\n\n try {\n await updateConfigRecord(api, status.version, targetDir, status.tgzUrl);\n markLastUpdateReconciled(targetDir);\n } catch (err) {\n logger.warn(`更新已应用,但配置记录补写失败: ${String(err)}`);\n }\n}\n\n/**\n * 注册插件自动更新能力:\n * - 定时版本检查(UpdateChecker)\n * - 对话通道:before_prompt_build hook + plugin-update tool\n * - 网关通道:broadcast 推送 + plugin.update gateway method\n *\n * 返回 start/stop 供 registerService 管理生命周期。\n */\nexport function registerAutoUpdate(\n api: OpenClawPluginApi,\n logger: Logger,\n config: AutoUpdateConfig,\n getBroadcast: () => BroadcastFn | null,\n rememberBroadcast?: (broadcast: BroadcastFn | undefined) => void,\n externalUpdateNotifier?: ExternalUpdateNotifier,\n): {\n start: () => void;\n stop: () => void;\n notifyBroadcastReady: () => void;\n} {\n if (config.enabled === false) {\n logger.info(\"自动更新已禁用 (autoUpdate.enabled = false)\");\n return { start() {}, stop() {}, notifyBroadcastReady() {} };\n }\n\n let pendingUpdate: UpdateInfo | null = null;\n let pendingGatewayUpdate: UpdateInfo | null = null;\n const intervalMs = (config.checkIntervalHours ?? 4) * 3_600_000;\n const channel = config.channel ?? \"latest\";\n const baseUrl = config.baseUrl ?? PRODUCTION_UPDATE_BASE_URL;\n const suppressUpdateNotifications = shouldSuppressUpdateNotifications();\n void reconcileSucceededUpdateRecord(api, logger, resolveTargetDir(api));\n\n if (suppressUpdateNotifications) {\n logger.info(\"Windows 平台已关闭插件更新通知\");\n externalUpdateNotifier?.clearPendingUpdate();\n }\n\n function tryBroadcastUpdate(update: UpdateInfo): boolean {\n if (suppressUpdateNotifications) return false;\n const broadcast = getBroadcast();\n if (!broadcast) return false;\n\n broadcast(\"plugin.updateAvailable\", {\n pluginId: \"phone-notifications\",\n pluginName: \"消息通知\",\n current: update.current,\n latest: update.latest,\n });\n pendingGatewayUpdate = null;\n return true;\n }\n\n // ── 对话通道:hook 注入 system prompt ──\n\n api.on(\"before_prompt_build\", () => {\n if (suppressUpdateNotifications) return;\n if (!pendingUpdate) return;\n return {\n appendSystemContext:\n `[系统通知] phone-notifications 插件有新版本 ${pendingUpdate.latest} 可用` +\n `(当前版本 ${pendingUpdate.current})。\\n` +\n `请用自然语言在合适时机告知用户,若用户同意更新,` +\n `调用 plugin-update tool 并传入 version 参数。` +\n `若用户拒绝,不再重复提醒。`,\n };\n });\n\n // ── 对话通道:plugin-update tool ──\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n api.registerTool({\n name: \"plugin-update\",\n label: \"Plugin Update\",\n description:\n \"将 phone-notifications 插件更新到指定版本。\" +\n \"仅在用户明确同意更新后调用。更新完成后会自动尝试重启 gateway;如宿主不支持,则需手动重启。\",\n parameters: {\n type: \"object\",\n required: [\"version\"],\n additionalProperties: false,\n properties: {\n version: {\n type: \"string\",\n description: \"目标版本号,如 1.11.0\",\n },\n },\n },\n async execute(_toolCallId: string, params: unknown) {\n const { version } = params as { version: string };\n const targetDir = resolveTargetDir(api);\n const result = await executeUpdate(\n version,\n api.runtime.system.runCommandWithTimeout,\n logger,\n targetDir,\n baseUrl,\n );\n const finalResult = finalizeUpdateResult(api, logger, result, targetDir);\n if (finalResult.success) {\n pendingUpdate = null;\n externalUpdateNotifier?.clearPendingUpdate();\n }\n return {\n content: [{ type: \"text\" as const, text: finalResult.message }],\n details: finalResult,\n };\n },\n } as any);\n\n // ── 版本检查器 ──\n\n if (!suppressUpdateNotifications) {\n logger.info(\n `自动更新已启用: channel=${channel}, baseUrl=${baseUrl}, checkIntervalHours=${config.checkIntervalHours ?? 4}`,\n );\n }\n\n const checker = new UpdateChecker(\n logger,\n (update) => {\n if (suppressUpdateNotifications) return;\n pendingUpdate = update;\n\n const broadcasted = tryBroadcastUpdate(update);\n if (!broadcasted) pendingGatewayUpdate = update;\n if (!broadcasted) {\n externalUpdateNotifier?.notifyUpdateAvailable(update);\n }\n\n logger.info(\n `已通知更新 ${update.current} → ${update.latest}` +\n (broadcasted\n ? \"(对话 + 网关)\"\n : \"(对话通道已生效,等待下次 gateway 请求时补发客户端事件)\"),\n );\n },\n intervalMs,\n channel,\n baseUrl,\n );\n\n // ── 网关通道:plugin.update gateway method ──\n\n api.registerGatewayMethod(\"plugin.update\", async ({ params, respond, context }) => {\n rememberBroadcast?.(context?.broadcast);\n\n const version = (params as { version?: string }).version;\n if (!version) {\n respond(false, undefined, {\n code: \"MISSING_VERSION\",\n message: \"version is required\",\n });\n return;\n }\n const targetDir = resolveTargetDir(api);\n const result = await executeUpdate(\n version,\n api.runtime.system.runCommandWithTimeout,\n logger,\n targetDir,\n baseUrl,\n );\n\n // executeUpdate 失败:不涉及重启,直接 respond(false)\n if (!result.success) {\n respond(false, undefined, {\n code: \"UPDATE_FAILED\",\n message: result.message,\n details: {\n phase: result.phase,\n error: result.error,\n suggestion: result.suggestion,\n nextActions: result.nextActions,\n },\n });\n return;\n }\n\n // Windows:不依赖 SIGUSR1 自动重启,spawn updater 后请用户手动重启 gateway。\n // 避免 emit SIGUSR1 触发 gateway 退出导致 Windows IPC respond 字节未 flush。\n if (shouldSkipAutoRestart()) {\n const manualResult = applyManualRestart(logger, result, targetDir);\n if (manualResult.success) {\n pendingUpdate = null;\n externalUpdateNotifier?.clearPendingUpdate();\n respond(true, {\n message: manualResult.message,\n restartScheduled: false,\n updateId: manualResult.updateId,\n statusPath: manualResult.statusPath,\n suggestion: manualResult.suggestion,\n nextActions: manualResult.nextActions,\n });\n } else {\n respond(false, undefined, {\n code: \"UPDATE_FAILED\",\n message: manualResult.message,\n details: {\n phase: manualResult.phase,\n error: manualResult.error,\n suggestion: manualResult.suggestion,\n nextActions: manualResult.nextActions,\n },\n });\n }\n return;\n }\n\n // executeUpdate 成功:先同步做所有可知检查,但不立即注册 SIGUSR1 fire。\n // 这样 RPC respond() 能在 commit 之前完成,确保 app 一定先收到回复再发生 gateway 重启。\n const restartPlan = planGatewayRestart(logger, {\n loadConfig: () => {\n const configApi = (api.runtime as any).config;\n return configApi?.loadConfig?.();\n },\n });\n\n const ver = result.version ?? \"目标版本\";\n\n if (!restartPlan.scheduled) {\n // 重启不可用 → updater 没启动,pending 目录就是孤儿,主动清理。\n cleanupPendingDir(result.preparedStatus);\n const suggestion =\n restartPlan.suggestion ?? \"gateway 自动重启不可用,更新尚未应用。\";\n const nextActions =\n restartPlan.nextActions ?? [\"启用 gateway 自动重启后重试更新\"];\n markLastUpdateRestartStatus(targetDir, \"failed\", {\n error: restartPlan.reason,\n suggestion,\n nextActions,\n });\n respond(false, undefined, {\n code: \"UPDATE_FAILED\",\n message: `已准备更新到 ${ver},但 gateway 自动重启不可用,更新尚未应用`,\n details: {\n phase: result.phase,\n error: restartPlan.reason,\n suggestion,\n nextActions,\n },\n });\n return;\n }\n\n // 重启可用:先原子替换插件目录并把状态落盘,再 respond(true),最后 commit。\n const applied = result.preparedStatus\n ? applyPreparedUpdate(result.preparedStatus, \"scheduled\")\n : undefined;\n if (applied && !applied.success) {\n respond(false, undefined, {\n code: \"UPDATE_FAILED\",\n message: applied.message,\n details: {\n phase: applied.phase,\n error: applied.error,\n suggestion: applied.suggestion,\n nextActions: applied.nextActions,\n },\n });\n return;\n }\n\n pendingUpdate = null;\n externalUpdateNotifier?.clearPendingUpdate();\n\n respond(true, {\n message: `已应用更新到 ${ver},正在重启 gateway`,\n restartScheduled: true,\n updateId: result.updateId,\n statusPath: result.statusPath,\n suggestion: result.suggestion,\n nextActions: [\"等待 gateway 自动重启并加载新版本\"],\n });\n\n // 严格在 respond 之后才注册 SIGUSR1 fire:保证响应字节先离开当前 turn。\n restartPlan.commit!();\n });\n\n // ── 网关通道:plugin.checkUpdate gateway method ──\n // 客户端主动查询是否有新版本;Windows 平台直接静默返回无更新。\n api.registerGatewayMethod(\"plugin.checkUpdate\", async ({ respond, context }) => {\n rememberBroadcast?.(context?.broadcast);\n if (suppressUpdateNotifications) {\n pendingUpdate = null;\n pendingGatewayUpdate = null;\n externalUpdateNotifier?.clearPendingUpdate();\n respond(true, {\n pluginId: PLUGIN_ID,\n pluginName: \"消息通知\",\n current: PLUGIN_VERSION,\n latest: null,\n hasUpdate: false,\n });\n return;\n }\n\n try {\n const targetDir = resolveTargetDir(api);\n const info = await checker.check();\n const lastUpdateStatus = readLastUpdateStatus(targetDir);\n const lastUpdateNotice = lastUpdateStatus\n ? buildLastUpdateNotice(lastUpdateStatus)\n : undefined;\n respond(true, {\n pluginId: PLUGIN_ID,\n pluginName: \"消息通知\",\n current: PLUGIN_VERSION,\n latest: info?.latest ?? null,\n hasUpdate: !!info,\n ...(lastUpdateNotice ? { lastUpdateNotice } : {}),\n });\n } catch (err) {\n respond(false, undefined, {\n code: \"CHECK_FAILED\",\n message: err instanceof Error ? err.message : String(err),\n });\n }\n });\n\n return {\n start: () => {\n if (!suppressUpdateNotifications) checker.start();\n },\n stop: () => checker.stop(),\n notifyBroadcastReady() {\n if (suppressUpdateNotifications) return;\n const update = pendingGatewayUpdate;\n if (!update) return;\n if (!tryBroadcastUpdate(update)) return;\n logger.info(`已补发插件更新事件 ${update.current} → ${update.latest}`);\n },\n };\n}\n",
42
+ "import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport type { Logger } from \"../logger.js\";\nimport { resolvePluginStateDir } from \"../plugin/runtime-state.js\";\nimport { PLUGIN_VERSION } from \"../version.js\";\nimport { PRODUCTION_UPDATE_BASE_URL } from \"./channel.js\";\nimport { isNewerVersion } from \"./semver.js\";\nimport type {\n AutoUpdateConfig,\n BroadcastFn,\n ExternalUpdateNotifier,\n UpdateInfo,\n} from \"./types.js\";\nimport { UpdateChecker } from \"./checker.js\";\nimport {\n buildLastUpdateNotice,\n applyPreparedUpdate,\n cleanupPendingDir,\n executeUpdate,\n markLastUpdateReconciled,\n markLastUpdateRestartStatus,\n readLastUpdateStatus,\n startPreparedUpdater,\n} from \"./executor.js\";\nimport { planGatewayRestart } from \"./restart.js\";\n\nconst PLUGIN_ID = \"phone-notifications\";\nconst VERSION_PATTERN = /^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$/;\n\n/**\n * Windows 上:\n * - Node 进程 emit SIGUSR1 后宿主常会立刻退出(含 process.exit / spawn replacement),\n * 而 Windows IPC(named pipe / TCP loopback)的 socket flush 比 Unix domain socket\n * 慢得多,1.5s grace 也不足以保证 RPC 回复字节先离开当前进程。\n * - 实测:插件在 Windows 上目录替换成功了,但 app 收不到 plugin.update 的回复。\n * - 取舍:Windows 直接走\"手动重启\"路径——spawn detached updater 等待父进程退出,\n * 然后明确提示用户手动重启 openclaw/gateway。这样 respond 永远不会被 gateway\n * 退出打断;用户手动重启时 updater 自然接管目录替换。\n */\nfunction shouldSkipAutoRestart(): boolean {\n return process.platform === \"win32\";\n}\n\nfunction shouldSuppressUpdateNotifications(): boolean {\n return process.platform === \"win32\";\n}\n\nfunction resolveTargetDir(api: OpenClawPluginApi): string {\n try {\n const cfg = (api.runtime as any).config?.loadConfig?.();\n const installPath = cfg?.plugins?.installs?.[PLUGIN_ID]?.installPath;\n if (installPath) return installPath;\n } catch { /* ignore */ }\n return join(resolvePluginStateDir(api), \"extensions\", PLUGIN_ID);\n}\n\nasync function updateConfigRecord(\n api: OpenClawPluginApi,\n version: string,\n targetDir: string,\n tgzUrl: string,\n): Promise<void> {\n const configApi = (api.runtime as any).config;\n if (!configApi) return;\n const cfg = configApi.loadConfig();\n if (!cfg.plugins) cfg.plugins = {};\n if (!cfg.plugins.installs) cfg.plugins.installs = {};\n cfg.plugins.installs[PLUGIN_ID] = {\n ...cfg.plugins.installs[PLUGIN_ID],\n source: \"archive\" as const,\n sourcePath: tgzUrl,\n installPath: targetDir,\n version,\n installedAt: new Date().toISOString(),\n };\n await configApi.writeConfigFile(cfg);\n}\n\n/**\n * 在\"不依赖 gateway 自动重启\"的平台上落地更新:\n * - 同步 spawn detached updater(等父进程退出后接管目录替换)。\n * - 状态文件维持 status=pending,restartStatus 由调用方决定。\n * - 返回带\"请手动重启\"文案的 result;spawn 失败时返回 success=false。\n */\nfunction applyManualRestart(\n logger: Logger,\n result: Awaited<ReturnType<typeof executeUpdate>>,\n targetDir: string,\n): Awaited<ReturnType<typeof executeUpdate>> {\n const version = result.version ?? \"目标版本\";\n try {\n if (result.preparedStatus) {\n startPreparedUpdater(result.preparedStatus);\n }\n markLastUpdateRestartStatus(targetDir, \"pending\", {\n suggestion: \"Windows 不支持自动重启 gateway,请手动重启后更新生效。\",\n nextActions: [\"手动重启 openclaw/gateway\", \"重启完成后插件会自动应用新版本\"],\n });\n return {\n ...result,\n restartScheduled: false,\n suggestion: \"Windows 不支持自动重启 gateway,请手动重启后更新生效。\",\n nextActions: [\"手动重启 openclaw/gateway\", \"重启完成后插件会自动应用新版本\"],\n message: `已准备更新到 ${version},请手动重启 openclaw/gateway 后生效`,\n };\n } catch (err) {\n logger.warn(`启动后台 updater 失败: ${String(err)}`);\n cleanupPendingDir(result.preparedStatus);\n const errorMessage = err instanceof Error ? err.message : String(err);\n const suggestion = \"后台安装进程启动失败,更新尚未应用。请稍后重试。\";\n const nextActions = [\"稍后重试更新\", \"如果持续失败,请复制错误信息反馈给维护者\"];\n markLastUpdateRestartStatus(targetDir, \"failed\", {\n error: errorMessage,\n suggestion,\n nextActions,\n });\n return {\n ...result,\n success: false,\n restartScheduled: false,\n error: errorMessage,\n suggestion,\n nextActions,\n message: `更新准备完成但后台安装进程启动失败:${errorMessage}`,\n };\n }\n}\n\nfunction finalizeUpdateResult(\n api: OpenClawPluginApi,\n logger: Logger,\n result: Awaited<ReturnType<typeof executeUpdate>>,\n targetDir: string,\n): Awaited<ReturnType<typeof executeUpdate>> {\n if (!result.success) {\n return result;\n }\n\n if (shouldSkipAutoRestart()) {\n return applyManualRestart(logger, result, targetDir);\n }\n\n const restartPlan = planGatewayRestart(logger, {\n loadConfig: () => {\n const configApi = (api.runtime as any).config;\n return configApi?.loadConfig?.();\n },\n });\n\n const version = result.version ?? \"目标版本\";\n if (!restartPlan.scheduled) {\n // 重启不可用 → updater 没启动,pending 目录就是孤儿,主动清理避免下次新更新还要清理。\n cleanupPendingDir(result.preparedStatus);\n markLastUpdateRestartStatus(targetDir, \"failed\", {\n error: restartPlan.reason,\n suggestion: restartPlan.suggestion ?? \"gateway 自动重启不可用,更新尚未应用。\",\n nextActions: restartPlan.nextActions ?? [\"启用 gateway 自动重启后重试更新\"],\n });\n return {\n ...result,\n success: false,\n restartScheduled: false,\n error: restartPlan.reason,\n suggestion: restartPlan.suggestion ?? \"gateway 自动重启不可用,更新尚未应用。\",\n nextActions: restartPlan.nextActions ?? [\"启用 gateway 自动重启后重试更新\"],\n message: `已准备更新到 ${version},但 gateway 自动重启不可用,更新尚未应用`,\n };\n }\n\n const applied = result.preparedStatus\n ? applyPreparedUpdate(result.preparedStatus, \"scheduled\")\n : undefined;\n if (applied && !applied.success) {\n return {\n ...result,\n success: false,\n restartScheduled: false,\n phase: applied.phase,\n error: applied.error,\n suggestion: applied.suggestion,\n nextActions: applied.nextActions,\n message: applied.message,\n };\n }\n\n restartPlan.commit?.();\n\n return {\n ...result,\n restartScheduled: true,\n error: result.error,\n suggestion: result.suggestion,\n nextActions: [\"等待 gateway 自动重启并加载新版本\"],\n message: `已应用更新到 ${version},正在重启 gateway`,\n };\n}\n\nasync function reconcileSucceededUpdateRecord(\n api: OpenClawPluginApi,\n logger: Logger,\n targetDir: string,\n): Promise<void> {\n const status = readLastUpdateStatus(targetDir);\n if (status?.status !== \"succeeded\" || !status.tgzUrl) return;\n // 已 reconcile 过:跳过,避免每次 register 都刷新 installedAt。\n if (status.reconciledAt) return;\n\n try {\n await updateConfigRecord(api, status.version, targetDir, status.tgzUrl);\n markLastUpdateReconciled(targetDir);\n } catch (err) {\n logger.warn(`更新已应用,但配置记录补写失败: ${String(err)}`);\n }\n}\n\nfunction resolveEffectiveCurrentVersion(targetDir: string): string {\n const installedVersion = readInstalledPackageVersion(targetDir);\n if (\n installedVersion &&\n isNewerVersion(installedVersion, PLUGIN_VERSION)\n ) {\n return installedVersion;\n }\n\n const status = readLastUpdateStatus(targetDir);\n if (\n status?.status === \"succeeded\" &&\n status.version &&\n isNewerVersion(status.version, PLUGIN_VERSION)\n ) {\n return status.version;\n }\n return PLUGIN_VERSION;\n}\n\nfunction readInstalledPackageVersion(targetDir: string): string | undefined {\n try {\n const parsed = JSON.parse(\n readFileSync(join(targetDir, \"package.json\"), \"utf-8\"),\n ) as { version?: unknown };\n const version = typeof parsed.version === \"string\"\n ? parsed.version.trim()\n : \"\";\n return VERSION_PATTERN.test(version) ? version : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * 注册插件自动更新能力:\n * - 定时版本检查(UpdateChecker)\n * - 对话通道:before_prompt_build hook + plugin-update tool\n * - 网关通道:broadcast 推送 + plugin.update gateway method\n *\n * 返回 start/stop 供 registerService 管理生命周期。\n */\nexport function registerAutoUpdate(\n api: OpenClawPluginApi,\n logger: Logger,\n config: AutoUpdateConfig,\n getBroadcast: () => BroadcastFn | null,\n rememberBroadcast?: (broadcast: BroadcastFn | undefined) => void,\n externalUpdateNotifier?: ExternalUpdateNotifier,\n): {\n start: () => void;\n stop: () => void;\n notifyBroadcastReady: () => void;\n} {\n if (config.enabled === false) {\n logger.info(\"自动更新已禁用 (autoUpdate.enabled = false)\");\n return { start() {}, stop() {}, notifyBroadcastReady() {} };\n }\n\n let pendingUpdate: UpdateInfo | null = null;\n let pendingGatewayUpdate: UpdateInfo | null = null;\n const intervalMs = (config.checkIntervalHours ?? 4) * 3_600_000;\n const channel = config.channel ?? \"latest\";\n const baseUrl = config.baseUrl ?? PRODUCTION_UPDATE_BASE_URL;\n const suppressUpdateNotifications = shouldSuppressUpdateNotifications();\n void reconcileSucceededUpdateRecord(api, logger, resolveTargetDir(api));\n\n function clearPendingUpdateNotice(): void {\n pendingUpdate = null;\n pendingGatewayUpdate = null;\n externalUpdateNotifier?.clearPendingUpdate();\n }\n\n function suppressPendingClientUpdateNotice(): void {\n pendingGatewayUpdate = null;\n externalUpdateNotifier?.clearPendingUpdate();\n }\n\n if (suppressUpdateNotifications) {\n logger.info(\"Windows 平台已关闭插件更新通知\");\n clearPendingUpdateNotice();\n }\n\n function tryBroadcastUpdate(update: UpdateInfo): boolean {\n if (suppressUpdateNotifications) return false;\n const broadcast = getBroadcast();\n if (!broadcast) return false;\n\n broadcast(\"plugin.updateAvailable\", {\n pluginId: \"phone-notifications\",\n pluginName: \"消息通知\",\n current: update.current,\n latest: update.latest,\n });\n pendingGatewayUpdate = null;\n return true;\n }\n\n // ── 对话通道:hook 注入 system prompt ──\n\n api.on(\"before_prompt_build\", () => {\n if (suppressUpdateNotifications) return;\n if (!pendingUpdate) return;\n return {\n appendSystemContext:\n `[系统通知] phone-notifications 插件有新版本 ${pendingUpdate.latest} 可用` +\n `(当前版本 ${pendingUpdate.current})。\\n` +\n `请用自然语言在合适时机告知用户,若用户同意更新,` +\n `调用 plugin-update tool 并传入 version 参数。` +\n `若用户拒绝,不再重复提醒。`,\n };\n });\n\n // ── 对话通道:plugin-update tool ──\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n api.registerTool({\n name: \"plugin-update\",\n label: \"Plugin Update\",\n description:\n \"将 phone-notifications 插件更新到指定版本。\" +\n \"仅在用户明确同意更新后调用。更新完成后会自动尝试重启 gateway;如宿主不支持,则需手动重启。\",\n parameters: {\n type: \"object\",\n required: [\"version\"],\n additionalProperties: false,\n properties: {\n version: {\n type: \"string\",\n description: \"目标版本号,如 1.11.0\",\n },\n },\n },\n async execute(_toolCallId: string, params: unknown) {\n const { version } = params as { version: string };\n const targetDir = resolveTargetDir(api);\n const result = await executeUpdate(\n version,\n api.runtime.system.runCommandWithTimeout,\n logger,\n targetDir,\n baseUrl,\n );\n const finalResult = finalizeUpdateResult(api, logger, result, targetDir);\n if (finalResult.success) {\n clearPendingUpdateNotice();\n }\n return {\n content: [{ type: \"text\" as const, text: finalResult.message }],\n details: finalResult,\n };\n },\n } as any);\n\n // ── 版本检查器 ──\n\n if (!suppressUpdateNotifications) {\n logger.info(\n `自动更新已启用: channel=${channel}, baseUrl=${baseUrl}, checkIntervalHours=${config.checkIntervalHours ?? 4}`,\n );\n }\n\n const checker = new UpdateChecker(\n logger,\n (update) => {\n if (suppressUpdateNotifications) return;\n pendingUpdate = update;\n\n const broadcasted = tryBroadcastUpdate(update);\n if (!broadcasted) pendingGatewayUpdate = update;\n if (!broadcasted) {\n externalUpdateNotifier?.notifyUpdateAvailable(update);\n }\n\n logger.info(\n `已通知更新 ${update.current} → ${update.latest}` +\n (broadcasted\n ? \"(对话 + 网关)\"\n : \"(对话通道已生效,等待下次 gateway 请求时补发客户端事件)\"),\n );\n },\n intervalMs,\n channel,\n baseUrl,\n () => resolveEffectiveCurrentVersion(resolveTargetDir(api)),\n );\n\n // ── 网关通道:plugin.update gateway method ──\n\n api.registerGatewayMethod(\"plugin.update\", async ({ params, respond, context }) => {\n const version = (params as { version?: string }).version;\n if (!version) {\n respond(false, undefined, {\n code: \"MISSING_VERSION\",\n message: \"version is required\",\n });\n return;\n }\n suppressPendingClientUpdateNotice();\n rememberBroadcast?.(context?.broadcast);\n\n const targetDir = resolveTargetDir(api);\n const result = await executeUpdate(\n version,\n api.runtime.system.runCommandWithTimeout,\n logger,\n targetDir,\n baseUrl,\n );\n\n // executeUpdate 失败:不涉及重启,直接 respond(false)\n if (!result.success) {\n respond(false, undefined, {\n code: \"UPDATE_FAILED\",\n message: result.message,\n details: {\n phase: result.phase,\n error: result.error,\n suggestion: result.suggestion,\n nextActions: result.nextActions,\n },\n });\n return;\n }\n\n // Windows:不依赖 SIGUSR1 自动重启,spawn updater 后请用户手动重启 gateway。\n // 避免 emit SIGUSR1 触发 gateway 退出导致 Windows IPC respond 字节未 flush。\n if (shouldSkipAutoRestart()) {\n const manualResult = applyManualRestart(logger, result, targetDir);\n if (manualResult.success) {\n clearPendingUpdateNotice();\n respond(true, {\n message: manualResult.message,\n restartScheduled: false,\n updateId: manualResult.updateId,\n statusPath: manualResult.statusPath,\n suggestion: manualResult.suggestion,\n nextActions: manualResult.nextActions,\n });\n } else {\n respond(false, undefined, {\n code: \"UPDATE_FAILED\",\n message: manualResult.message,\n details: {\n phase: manualResult.phase,\n error: manualResult.error,\n suggestion: manualResult.suggestion,\n nextActions: manualResult.nextActions,\n },\n });\n }\n return;\n }\n\n // executeUpdate 成功:先同步做所有可知检查,但不立即注册 SIGUSR1 fire。\n // 这样 RPC respond() 能在 commit 之前完成,确保 app 一定先收到回复再发生 gateway 重启。\n const restartPlan = planGatewayRestart(logger, {\n loadConfig: () => {\n const configApi = (api.runtime as any).config;\n return configApi?.loadConfig?.();\n },\n });\n\n const ver = result.version ?? \"目标版本\";\n\n if (!restartPlan.scheduled) {\n // 重启不可用 → updater 没启动,pending 目录就是孤儿,主动清理。\n cleanupPendingDir(result.preparedStatus);\n const suggestion =\n restartPlan.suggestion ?? \"gateway 自动重启不可用,更新尚未应用。\";\n const nextActions =\n restartPlan.nextActions ?? [\"启用 gateway 自动重启后重试更新\"];\n markLastUpdateRestartStatus(targetDir, \"failed\", {\n error: restartPlan.reason,\n suggestion,\n nextActions,\n });\n respond(false, undefined, {\n code: \"UPDATE_FAILED\",\n message: `已准备更新到 ${ver},但 gateway 自动重启不可用,更新尚未应用`,\n details: {\n phase: result.phase,\n error: restartPlan.reason,\n suggestion,\n nextActions,\n },\n });\n return;\n }\n\n // 重启可用:先原子替换插件目录并把状态落盘,再 respond(true),最后 commit。\n const applied = result.preparedStatus\n ? applyPreparedUpdate(result.preparedStatus, \"scheduled\")\n : undefined;\n if (applied && !applied.success) {\n respond(false, undefined, {\n code: \"UPDATE_FAILED\",\n message: applied.message,\n details: {\n phase: applied.phase,\n error: applied.error,\n suggestion: applied.suggestion,\n nextActions: applied.nextActions,\n },\n });\n return;\n }\n\n clearPendingUpdateNotice();\n\n respond(true, {\n message: `已应用更新到 ${ver},正在重启 gateway`,\n restartScheduled: true,\n updateId: result.updateId,\n statusPath: result.statusPath,\n suggestion: result.suggestion,\n nextActions: [\"等待 gateway 自动重启并加载新版本\"],\n });\n\n // 严格在 respond 之后才注册 SIGUSR1 fire:保证响应字节先离开当前 turn。\n restartPlan.commit!();\n });\n\n // ── 网关通道:plugin.checkUpdate gateway method ──\n // 客户端主动查询是否有新版本;Windows 平台直接静默返回无更新。\n api.registerGatewayMethod(\"plugin.checkUpdate\", async ({ respond, context }) => {\n pendingGatewayUpdate = null;\n rememberBroadcast?.(context?.broadcast);\n if (suppressUpdateNotifications) {\n clearPendingUpdateNotice();\n respond(true, {\n pluginId: PLUGIN_ID,\n pluginName: \"消息通知\",\n current: PLUGIN_VERSION,\n latest: null,\n hasUpdate: false,\n });\n return;\n }\n\n try {\n const targetDir = resolveTargetDir(api);\n const info = await checker.check();\n const current = resolveEffectiveCurrentVersion(targetDir);\n const lastUpdateStatus = readLastUpdateStatus(targetDir);\n const lastUpdateNotice = lastUpdateStatus\n ? buildLastUpdateNotice(lastUpdateStatus)\n : undefined;\n if (!info) {\n clearPendingUpdateNotice();\n }\n respond(true, {\n pluginId: PLUGIN_ID,\n pluginName: \"消息通知\",\n current,\n latest: info?.latest ?? null,\n hasUpdate: !!info,\n ...(lastUpdateNotice ? { lastUpdateNotice } : {}),\n });\n } catch (err) {\n respond(false, undefined, {\n code: \"CHECK_FAILED\",\n message: err instanceof Error ? err.message : String(err),\n });\n }\n });\n\n return {\n start: () => {\n if (!suppressUpdateNotifications) checker.start();\n },\n stop: () => checker.stop(),\n notifyBroadcastReady() {\n if (suppressUpdateNotifications) return;\n const update = pendingGatewayUpdate;\n if (!update) return;\n if (!tryBroadcastUpdate(update)) return;\n logger.info(`已补发插件更新事件 ${update.current} → ${update.latest}`);\n },\n };\n}\n",
45
43
  "import type { IncomingMessage } from \"node:http\";\nimport type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\n\nexport type GatewayHandler = Parameters<OpenClawPluginApi[\"registerGatewayMethod\"]>[1];\n\nexport type GatewayMethodRegistrar = (\n method: string,\n handler: GatewayHandler,\n) => void;\n\nexport function readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString()));\n req.on(\"error\", reject);\n });\n}\n\nexport function trimToUndefined(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed || undefined;\n}\n",
46
44
  "import type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport { resolveStateDir } from \"../host.js\";\nimport { trimToUndefined } from \"./shared.js\";\n\nexport function tryResolveRuntimeStateDir(\n api: Pick<OpenClawPluginApi, \"runtime\">,\n): string | undefined {\n const runtimeState = (api as any)?.runtime?.state;\n const resolveStateDir = runtimeState?.resolveStateDir;\n if (typeof resolveStateDir !== \"function\") {\n return undefined;\n }\n\n try {\n return trimToUndefined(resolveStateDir.call(runtimeState));\n } catch {\n return undefined;\n }\n}\n\nexport function resolvePluginStateDir(\n api: Pick<OpenClawPluginApi, \"runtime\">,\n): string {\n return resolveStateDir(tryResolveRuntimeStateDir(api));\n}\n",
47
45
  "function parseSemver(v: string): { major: number; minor: number; patch: number; pre: string | null } {\n const [main, pre = null] = v.split(\"-\", 2) as [string, string | undefined];\n const [major = 0, minor = 0, patch = 0] = main.split(\".\").map(Number);\n return { major, minor, patch, pre: pre ?? null };\n}\n\nfunction comparePreRelease(a: string, b: string): number {\n const aParts = a.split(\".\");\n const bParts = b.split(\".\");\n for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {\n const ap = aParts[i] ?? \"\";\n const bp = bParts[i] ?? \"\";\n const an = Number(ap);\n const bn = Number(bp);\n let diff: number;\n if (!Number.isNaN(an) && !Number.isNaN(bn)) {\n diff = an - bn;\n } else if (ap < bp) {\n diff = -1;\n } else if (ap > bp) {\n diff = 1;\n } else {\n diff = 0;\n }\n if (diff !== 0) return diff;\n }\n return 0;\n}\n\nexport function compareVersions(candidate: string, current: string): number {\n const a = parseSemver(candidate);\n const b = parseSemver(current);\n\n if (a.major !== b.major) return a.major - b.major;\n if (a.minor !== b.minor) return a.minor - b.minor;\n if (a.patch !== b.patch) return a.patch - b.patch;\n\n // Same major.minor.patch: stable > pre-release\n if (a.pre === null) return b.pre === null ? 0 : 1;\n if (b.pre === null) return -1;\n\n return comparePreRelease(a.pre, b.pre);\n}\n\n/** Returns true if `candidate` is strictly newer than `current` per semver rules. */\nexport function isNewerVersion(candidate: string, current: string): boolean {\n return compareVersions(candidate, current) > 0;\n}\n\nexport function pickNewestVersion(\n versions: ReadonlyArray<string | null | undefined>,\n): string | null {\n let newest: string | null = null;\n for (const version of versions) {\n if (!version) continue;\n if (!newest || isNewerVersion(version, newest)) {\n newest = version;\n }\n }\n return newest;\n}\n",
48
- "import { PLUGIN_VERSION } from \"../version.js\";\nimport type { Logger } from \"../logger.js\";\nimport { PRODUCTION_UPDATE_BASE_URL, resolveUpdateTags } from \"./channel.js\";\nimport { isNewerVersion, pickNewestVersion } from \"./semver.js\";\nimport type { UpdateInfo } from \"./types.js\";\n\nconst NPM_BASE_URL =\n \"https://registry.npmjs.org/@yoooclaw/phone-notifications\";\nconst FETCH_TIMEOUT_MS = 5_000;\n\nexport class UpdateChecker {\n private timer: ReturnType<typeof setTimeout> | null = null;\n private notifiedVersion: string | null = null;\n private inflightCheck: Promise<UpdateInfo | null> | null = null;\n\n constructor(\n private readonly logger: Logger,\n private readonly onUpdateFound: (info: UpdateInfo) => void,\n private readonly intervalMs: number,\n private readonly channel: \"latest\" | \"beta\",\n private readonly baseUrl: string = PRODUCTION_UPDATE_BASE_URL,\n ) {}\n\n start(): void {\n // 首次延迟 1 分钟,避免影响插件启动\n this.timer = setTimeout(() => {\n void this.check();\n this.timer = setInterval(() => void this.check(), this.intervalMs);\n }, 60_000);\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n }\n\n /**\n * 拉取一次最新版本并按 channel 规则判断是否有更新。\n * 并发调用会共享同一个 in-flight 请求,避免重复打 CDN/npm。\n * 首次发现新版本时通过 onUpdateFound 回调推送,后续同版本不再重复回调。\n */\n async check(): Promise<UpdateInfo | null> {\n if (this.inflightCheck) return this.inflightCheck;\n this.inflightCheck = this.runCheck().finally(() => {\n this.inflightCheck = null;\n });\n return this.inflightCheck;\n }\n\n private async runCheck(): Promise<UpdateInfo | null> {\n const latest = await this.fetchLatestVersion();\n if (!latest || latest === PLUGIN_VERSION) return null;\n\n // latest 通道只能提示正式版,避免生产环境收到 prerelease 推送。\n if (this.channel !== \"beta\" && latest.includes(\"-\")) return null;\n\n // 只有 latest 严格大于当前版本才提示;同版本 stable 会被视为比 prerelease 新。\n if (!isNewerVersion(latest, PLUGIN_VERSION)) return null;\n\n const info: UpdateInfo = { current: PLUGIN_VERSION, latest };\n if (latest !== this.notifiedVersion) {\n this.notifiedVersion = latest;\n this.logger.info(`发现新版本: ${PLUGIN_VERSION} → ${latest}`);\n this.onUpdateFound(info);\n }\n return info;\n }\n\n private async fetchLatestVersion(): Promise<string | null> {\n const baseUrl = this.baseUrl.replace(/\\/+$/, \"\");\n const tags = resolveUpdateTags(this.channel);\n const candidates = await Promise.all(\n tags.map((tag) => this.fetchVersionTag(baseUrl, tag)),\n );\n const latest = pickNewestVersion(candidates);\n if (latest) return latest;\n\n if (baseUrl !== PRODUCTION_UPDATE_BASE_URL) {\n this.logger.info(\"版本检查失败(自定义/测试 OSS 不可达),跳过 npm 回退\");\n } else {\n this.logger.info(\"版本检查失败(CDN + npm 均不可达),跳过\");\n }\n return null;\n }\n\n private async fetchVersionTag(\n baseUrl: string,\n tag: \"latest\" | \"beta\",\n ): Promise<string | null> {\n // 优先 CDN(轻量 plain text)\n try {\n const res = await fetch(`${baseUrl}/${tag}`, {\n signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),\n });\n if (res.ok) {\n const text = (await res.text()).trim();\n if (text) return text;\n }\n } catch {\n // CDN/OSS 不可达时按下方规则决定是否回退 npm\n }\n\n if (baseUrl !== PRODUCTION_UPDATE_BASE_URL) {\n return null;\n }\n\n // 回退 npm registry\n try {\n const res = await fetch(`${NPM_BASE_URL}/${tag}`, {\n signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),\n });\n if (res.ok) {\n const data = (await res.json()) as { version?: string };\n return data.version ?? null;\n }\n } catch {}\n\n return null;\n }\n}\n",
46
+ "import { PLUGIN_VERSION } from \"../version.js\";\nimport type { Logger } from \"../logger.js\";\nimport { PRODUCTION_UPDATE_BASE_URL, resolveUpdateTags } from \"./channel.js\";\nimport { isNewerVersion, pickNewestVersion } from \"./semver.js\";\nimport type { UpdateInfo } from \"./types.js\";\n\nconst NPM_BASE_URL =\n \"https://registry.npmjs.org/@yoooclaw/phone-notifications\";\nconst FETCH_TIMEOUT_MS = 5_000;\n\nexport class UpdateChecker {\n private timer: ReturnType<typeof setTimeout> | null = null;\n private notifiedVersion: string | null = null;\n private inflightCheck: Promise<UpdateInfo | null> | null = null;\n\n constructor(\n private readonly logger: Logger,\n private readonly onUpdateFound: (info: UpdateInfo) => void,\n private readonly intervalMs: number,\n private readonly channel: \"latest\" | \"beta\",\n private readonly baseUrl: string = PRODUCTION_UPDATE_BASE_URL,\n private readonly getCurrentVersion: () => string = () => PLUGIN_VERSION,\n ) {}\n\n start(): void {\n // 首次延迟 1 分钟,避免影响插件启动\n this.timer = setTimeout(() => {\n void this.check();\n this.timer = setInterval(() => void this.check(), this.intervalMs);\n }, 60_000);\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n }\n\n /**\n * 拉取一次最新版本并按 channel 规则判断是否有更新。\n * 并发调用会共享同一个 in-flight 请求,避免重复打 CDN/npm。\n * 首次发现新版本时通过 onUpdateFound 回调推送,后续同版本不再重复回调。\n */\n async check(): Promise<UpdateInfo | null> {\n if (this.inflightCheck) return this.inflightCheck;\n this.inflightCheck = this.runCheck().finally(() => {\n this.inflightCheck = null;\n });\n return this.inflightCheck;\n }\n\n private async runCheck(): Promise<UpdateInfo | null> {\n const current = this.getCurrentVersion();\n const latest = await this.fetchLatestVersion();\n if (!latest || latest === current) return null;\n\n // latest 通道只能提示正式版,避免生产环境收到 prerelease 推送。\n if (this.channel !== \"beta\" && latest.includes(\"-\")) return null;\n\n // 只有 latest 严格大于当前版本才提示;同版本 stable 会被视为比 prerelease 新。\n if (!isNewerVersion(latest, current)) return null;\n\n const info: UpdateInfo = { current, latest };\n if (latest !== this.notifiedVersion) {\n this.notifiedVersion = latest;\n this.logger.info(`发现新版本: ${current} → ${latest}`);\n this.onUpdateFound(info);\n }\n return info;\n }\n\n private async fetchLatestVersion(): Promise<string | null> {\n const baseUrl = this.baseUrl.replace(/\\/+$/, \"\");\n const tags = resolveUpdateTags(this.channel);\n const candidates = await Promise.all(\n tags.map((tag) => this.fetchVersionTag(baseUrl, tag)),\n );\n const latest = pickNewestVersion(candidates);\n if (latest) return latest;\n\n if (baseUrl !== PRODUCTION_UPDATE_BASE_URL) {\n this.logger.info(\"版本检查失败(自定义/测试 OSS 不可达),跳过 npm 回退\");\n } else {\n this.logger.info(\"版本检查失败(CDN + npm 均不可达),跳过\");\n }\n return null;\n }\n\n private async fetchVersionTag(\n baseUrl: string,\n tag: \"latest\" | \"beta\",\n ): Promise<string | null> {\n // 优先 CDN(轻量 plain text)\n try {\n const res = await fetch(`${baseUrl}/${tag}`, {\n signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),\n });\n if (res.ok) {\n const text = (await res.text()).trim();\n if (text) return text;\n }\n } catch {\n // CDN/OSS 不可达时按下方规则决定是否回退 npm\n }\n\n if (baseUrl !== PRODUCTION_UPDATE_BASE_URL) {\n return null;\n }\n\n // 回退 npm registry\n try {\n const res = await fetch(`${NPM_BASE_URL}/${tag}`, {\n signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),\n });\n if (res.ok) {\n const data = (await res.json()) as { version?: string };\n return data.version ?? null;\n }\n } catch {}\n\n return null;\n }\n}\n",
49
47
  "import {\n cpSync,\n existsSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport { dirname, join } from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport type { Logger } from \"../logger.js\";\nimport { PRODUCTION_UPDATE_BASE_URL } from \"./channel.js\";\n\nconst VERSION_PATTERN = /^\\d+\\.\\d+\\.\\d+(-[\\w.]+)?$/;\nconst UPDATE_DIR_NAME = \".phone-notifications-update\";\nconst LAST_UPDATE_FILE = \"last-update.json\";\nconst ACTIVE_UPDATE_TTL_MS = 30 * 60_000;\n\nexport type UpdateStatus = \"pending\" | \"applying\" | \"succeeded\" | \"failed\";\nexport type UpdatePhase = \"prepare\" | \"restart\" | \"apply\";\nexport type RestartStatus = \"pending\" | \"scheduled\" | \"succeeded\" | \"failed\";\n\nexport interface LastUpdateStatus {\n updateId: string;\n version: string;\n status: UpdateStatus;\n phase: UpdatePhase;\n createdAt: string;\n updatedAt: string;\n targetDir: string;\n pendingDir: string;\n packageDir?: string;\n tgzUrl?: string;\n restartStatus?: RestartStatus;\n error?: string;\n suggestion?: string;\n nextActions?: string[];\n reconciledAt?: string;\n}\n\nexport interface UpdateNotice {\n level: \"info\" | \"warning\" | \"error\";\n title: string;\n message: string;\n updateId: string;\n version: string;\n status: UpdateStatus;\n phase: UpdatePhase;\n restartStatus?: RestartStatus;\n error?: string;\n nextActions: string[];\n}\n\nexport interface UpdateResult {\n success: boolean;\n message: string;\n version?: string;\n restartScheduled?: boolean;\n updateId?: string;\n statusPath?: string;\n phase?: UpdatePhase;\n error?: string;\n suggestion?: string;\n nextActions?: string[];\n preparedStatus?: LastUpdateStatus;\n}\n\ntype RunCommandFn = (\n argv: string[],\n opts: { timeoutMs: number },\n) => Promise<{ code: number | null; stdout: string; stderr: string }>;\n\nexport interface ExecuteUpdateDeps {\n now?: () => number;\n random?: () => number;\n}\n\nfunction normalizeBaseUrlAndDeps(\n baseUrlOrDeps: string | ExecuteUpdateDeps | undefined,\n deps: ExecuteUpdateDeps | undefined,\n): { baseUrl: string; deps: ExecuteUpdateDeps } {\n if (typeof baseUrlOrDeps === \"object\" && baseUrlOrDeps) {\n return { baseUrl: PRODUCTION_UPDATE_BASE_URL, deps: baseUrlOrDeps };\n }\n return {\n baseUrl: baseUrlOrDeps ?? PRODUCTION_UPDATE_BASE_URL,\n deps: deps ?? {},\n };\n}\n\nfunction updateRootForTarget(targetDir: string): string {\n return join(dirname(targetDir), UPDATE_DIR_NAME);\n}\n\nfunction lastUpdateStatusPath(targetDir: string): string {\n return join(updateRootForTarget(targetDir), LAST_UPDATE_FILE);\n}\n\nfunction writeJsonAtomic(path: string, value: unknown): void {\n mkdirSync(dirname(path), { recursive: true });\n const tmpPath = `${path}.tmp.${process.pid}.${Date.now()}`;\n writeFileSync(tmpPath, `${JSON.stringify(value, null, 2)}\\n`);\n renameSync(tmpPath, path);\n}\n\nfunction writeLastUpdateStatus(status: LastUpdateStatus): void {\n writeJsonAtomic(lastUpdateStatusPath(status.targetDir), status);\n}\n\nexport function readLastUpdateStatus(targetDir: string): LastUpdateStatus | undefined {\n const path = lastUpdateStatusPath(targetDir);\n if (!existsSync(path)) return undefined;\n try {\n return JSON.parse(readFileSync(path, \"utf8\")) as LastUpdateStatus;\n } catch {\n return undefined;\n }\n}\n\nfunction isActiveUpdate(status: LastUpdateStatus, now: number): boolean {\n if (status.status !== \"pending\" && status.status !== \"applying\") return false;\n const updatedAt = Date.parse(status.updatedAt);\n if (!Number.isFinite(updatedAt)) return false;\n return now - updatedAt < ACTIVE_UPDATE_TTL_MS;\n}\n\nfunction createUpdateId(now: number, random: number): string {\n const suffix = Math.floor(random * 0x1000000).toString(36);\n return `${now.toString(36)}-${suffix}`;\n}\n\nconst OCCUPIED_ERROR_PATTERN = /\\b(?:EPERM|EBUSY|EACCES|ENOTEMPTY)\\b/i;\nconst CROSS_DEVICE_ERROR_PATTERN = /\\bEXDEV\\b|cross-device link/i;\nconst RESTART_TIMEOUT_PATTERN = /did not exit before updater timeout/i;\n\nexport interface ErrorClassification {\n suggestion: string;\n nextActions: string[];\n}\n\n/**\n * 统一的错误分类:根据原始错误文本推导用户可读的建议和后续操作。\n * 主进程和 detached updater 共享这套规则,避免文案分叉。\n */\nexport function classifyError(error: string): ErrorClassification {\n if (RESTART_TIMEOUT_PATTERN.test(error)) {\n return {\n suggestion: \"gateway 未在预期时间内退出,更新尚未应用。请手动重启 openclaw/gateway 后重试。\",\n nextActions: [\"手动重启 openclaw/gateway\", \"重启后重新触发插件更新\"],\n };\n }\n if (CROSS_DEVICE_ERROR_PATTERN.test(error)) {\n return {\n suggestion: \"更新安装失败,插件安装目录和临时目录可能位于不同磁盘或挂载点。请重新触发更新;若仍失败,请用安装脚本重新安装到默认 extensions 目录。\",\n nextActions: [\n \"重新触发插件更新\",\n \"如果持续失败,请用安装脚本重新安装到默认 extensions 目录\",\n \"检查插件安装路径是否指向外置盘、网络盘、容器挂载或软链接目录\",\n ],\n };\n }\n if (OCCUPIED_ERROR_PATTERN.test(error)) {\n return {\n suggestion: \"更新安装失败,可能是插件目录正在被占用。请关闭 openclaw/gateway 后重试。\",\n nextActions: [\n \"关闭 openclaw/gateway 后重试\",\n \"检查插件目录权限或文件占用\",\n \"确认杀毒软件、终端或编辑器没有占用插件目录\",\n ],\n };\n }\n return {\n suggestion: \"更新安装失败,已尝试回滚。请根据错误信息处理后重试。\",\n nextActions: [\"稍后重试更新\", \"如果持续失败,请复制错误信息反馈给维护者\"],\n };\n}\n\nfunction isCrossDeviceError(err: unknown): boolean {\n const code = typeof err === \"object\" && err\n ? (err as NodeJS.ErrnoException).code\n : undefined;\n return code === \"EXDEV\" || CROSS_DEVICE_ERROR_PATTERN.test(String(err));\n}\n\nfunction movePathSync(source: string, target: string): void {\n try {\n renameSync(source, target);\n } catch (err) {\n if (!isCrossDeviceError(err)) throw err;\n cpSync(source, target, {\n errorOnExist: false,\n force: true,\n recursive: true,\n verbatimSymlinks: true,\n });\n rmSync(source, { recursive: true, force: true });\n }\n}\n\nexport function buildLastUpdateNotice(status: LastUpdateStatus): UpdateNotice | undefined {\n if (status.status === \"failed\") {\n const error = status.error ?? \"unknown error\";\n const fallback = classifyError(error);\n return {\n level: \"error\",\n title: \"插件更新失败\",\n message: status.suggestion ?? fallback.suggestion,\n updateId: status.updateId,\n version: status.version,\n status: status.status,\n phase: status.phase,\n restartStatus: status.restartStatus,\n error,\n nextActions: status.nextActions ?? fallback.nextActions,\n };\n }\n\n if (status.restartStatus === \"failed\") {\n return {\n level: \"warning\",\n title: status.status === \"succeeded\"\n ? \"插件已更新,但 gateway 自动重启失败\"\n : \"插件更新已准备,但 gateway 自动重启失败\",\n message: status.suggestion ?? \"gateway 自动重启失败,请手动重启 openclaw/gateway。\",\n updateId: status.updateId,\n version: status.version,\n status: status.status,\n phase: status.phase,\n restartStatus: status.restartStatus,\n error: status.error,\n nextActions: status.nextActions ?? [\"手动重启 openclaw/gateway\"],\n };\n }\n\n if (status.status === \"pending\" || status.status === \"applying\") {\n return {\n level: \"info\",\n title: \"插件更新正在进行\",\n message: status.status === \"pending\"\n ? \"插件更新包已准备完成,正在等待 gateway 重启后应用。\"\n : \"插件更新正在应用中,请稍候。\",\n updateId: status.updateId,\n version: status.version,\n status: status.status,\n phase: status.phase,\n restartStatus: status.restartStatus,\n error: status.error,\n nextActions: status.nextActions ?? [\"等待 gateway 重启完成\", \"如果长时间无变化,请手动重启 openclaw/gateway\"],\n };\n }\n\n return undefined;\n}\n\nexport function markLastUpdateRestartStatus(\n targetDir: string,\n restartStatus: RestartStatus,\n fields: Pick<LastUpdateStatus, \"error\" | \"suggestion\" | \"nextActions\"> = {},\n): void {\n const status = readLastUpdateStatus(targetDir);\n if (!status || status.status !== \"pending\") return;\n writeLastUpdateStatus({\n ...status,\n ...fields,\n status: restartStatus === \"failed\" ? \"failed\" : status.status,\n phase: restartStatus === \"failed\" ? \"restart\" : status.phase,\n restartStatus,\n updatedAt: new Date().toISOString(),\n });\n}\n\nexport function markLastUpdateReconciled(targetDir: string): void {\n const status = readLastUpdateStatus(targetDir);\n if (!status || status.status !== \"succeeded\") return;\n if (status.reconciledAt) return;\n writeLastUpdateStatus({\n ...status,\n reconciledAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n });\n}\n\nexport function cleanupPendingDir(status: LastUpdateStatus | undefined): void {\n if (!status?.pendingDir) return;\n try { rmSync(status.pendingDir, { recursive: true, force: true }); } catch { /* ignore */ }\n}\n\nexport function applyPreparedUpdate(\n status: LastUpdateStatus,\n restartStatus: RestartStatus = status.restartStatus ?? \"pending\",\n): UpdateResult {\n if (status.status !== \"pending\") {\n return {\n success: false,\n message: `更新 ${status.updateId} 状态不是 pending,无法应用`,\n version: status.version,\n updateId: status.updateId,\n phase: status.phase,\n error: `unexpected update status: ${status.status}`,\n };\n }\n if (!status.packageDir) {\n return {\n success: false,\n message: `更新 ${status.updateId} 缺少 packageDir,无法应用`,\n version: status.version,\n updateId: status.updateId,\n phase: status.phase,\n error: \"missing packageDir\",\n };\n }\n\n const backupDir = `${status.targetDir}.bak.${status.updateId}`;\n const applyingStatus: LastUpdateStatus = {\n ...status,\n status: \"applying\",\n phase: \"apply\",\n restartStatus,\n updatedAt: new Date().toISOString(),\n };\n writeLastUpdateStatus(applyingStatus);\n\n try {\n if (existsSync(status.targetDir)) {\n movePathSync(status.targetDir, backupDir);\n }\n movePathSync(status.packageDir, status.targetDir);\n rmSync(backupDir, { recursive: true, force: true });\n rmSync(status.pendingDir, { recursive: true, force: true });\n writeLastUpdateStatus({\n ...applyingStatus,\n status: \"succeeded\",\n phase: \"apply\",\n error: undefined,\n suggestion: undefined,\n nextActions: undefined,\n updatedAt: new Date().toISOString(),\n });\n return {\n success: true,\n message: `已应用更新到 ${status.version}`,\n version: status.version,\n updateId: status.updateId,\n statusPath: lastUpdateStatusPath(status.targetDir),\n phase: \"apply\",\n restartScheduled: restartStatus === \"scheduled\",\n };\n } catch (err) {\n const error = String(err instanceof Error ? err.stack ?? err.message : err);\n try {\n if (!existsSync(status.targetDir) && existsSync(backupDir)) {\n movePathSync(backupDir, status.targetDir);\n }\n } catch {\n // ignore rollback errors; surface the original failure below.\n }\n const fallback = classifyError(error);\n writeLastUpdateStatus({\n ...applyingStatus,\n status: \"failed\",\n phase: \"apply\",\n error,\n suggestion: fallback.suggestion,\n nextActions: fallback.nextActions,\n updatedAt: new Date().toISOString(),\n });\n return {\n success: false,\n message: `更新应用失败: ${error}`,\n version: status.version,\n updateId: status.updateId,\n statusPath: lastUpdateStatusPath(status.targetDir),\n phase: \"apply\",\n error,\n suggestion: fallback.suggestion,\n nextActions: fallback.nextActions,\n };\n }\n}\n\n/**\n * 在子进程中执行的 inline 脚本。\n *\n * 设计原则:\n * - 只能使用 Node 内置模块(fs / path / process)。\n * - 不依赖外部 npm 包,也不引入主进程的状态。\n * - 错误分类、用户提示等业务文案统一由主进程通过 `classifyError` + `buildLastUpdateNotice` 处理;\n * 这里只负责写回原始 error,分类在读取时再算。\n * - parentPid + parentStartedAtMs 双重判断,避免 pid 复用导致误判 gateway 仍在运行。\n */\nconst UPDATER_INLINE_SCRIPT = `\n\"use strict\";\nconst fs = require(\"node:fs\");\nconst path = require(\"node:path\");\nconst input = JSON.parse(process.argv[process.argv.length - 1]);\nconst statusPath = path.join(\n path.dirname(input.targetDir),\n \".phone-notifications-update\",\n \"last-update.json\",\n);\n\nfunction delay(ms) {\n return new Promise(function (resolve) { setTimeout(resolve, ms); });\n}\n\nfunction readStatus() {\n try { return JSON.parse(fs.readFileSync(statusPath, \"utf8\")); }\n catch (_err) { return input; }\n}\n\nfunction writePatch(patch) {\n const next = Object.assign({}, readStatus(), patch, {\n updatedAt: new Date().toISOString(),\n });\n fs.mkdirSync(path.dirname(statusPath), { recursive: true });\n const tmp = statusPath + \".tmp.\" + process.pid + \".\" + Date.now();\n fs.writeFileSync(tmp, JSON.stringify(next, null, 2) + \"\\\\n\");\n fs.renameSync(tmp, statusPath);\n}\n\nfunction isCrossDeviceError(err) {\n return (err && err.code === \"EXDEV\") || /\\\\bEXDEV\\\\b|cross-device link/i.test(String(err));\n}\n\nfunction movePath(source, target) {\n try {\n fs.renameSync(source, target);\n } catch (err) {\n if (!isCrossDeviceError(err)) throw err;\n fs.cpSync(source, target, {\n errorOnExist: false,\n force: true,\n recursive: true,\n verbatimSymlinks: true,\n });\n fs.rmSync(source, { recursive: true, force: true });\n }\n}\n\nasync function retry(action, timeoutMs) {\n const deadline = Date.now() + (timeoutMs || 60000);\n let lastError;\n while (Date.now() <= deadline) {\n try { return action(); }\n catch (err) { lastError = err; await delay(500); }\n }\n throw lastError;\n}\n\nfunction parentStillAlive() {\n if (!input.parentPid) return false;\n try { process.kill(input.parentPid, 0); }\n catch (_err) { return false; }\n // pid 仍可被 kill(0),但可能已被复用;用启动时间戳辅助识别。\n if (typeof input.parentStartedAtMs !== \"number\") return true;\n // 给系统时钟一定容差(10s),避免微小时钟回拨误判。\n return Date.now() - input.parentStartedAtMs > -10_000;\n}\n\nasync function waitForParentExit(timeoutMs) {\n if (!input.parentPid) return;\n const deadline = Date.now() + (timeoutMs || 300000);\n while (Date.now() <= deadline) {\n if (!parentStillAlive()) return;\n await delay(500);\n }\n throw new Error(\"gateway process did not exit before updater timeout\");\n}\n\n(async function main() {\n const backupDir = input.targetDir + \".bak.\" + input.updateId;\n try {\n await waitForParentExit();\n writePatch({ status: \"applying\", phase: \"apply\" });\n if (fs.existsSync(input.targetDir)) {\n await retry(function () { movePath(input.targetDir, backupDir); });\n }\n await retry(function () { movePath(input.packageDir, input.targetDir); });\n try { fs.rmSync(backupDir, { recursive: true, force: true }); } catch (_e1) {}\n try { fs.rmSync(input.pendingDir, { recursive: true, force: true }); } catch (_e2) {}\n writePatch({\n status: \"succeeded\",\n phase: \"apply\",\n error: undefined,\n suggestion: undefined,\n nextActions: undefined,\n });\n } catch (err) {\n const message = String(err && err.stack ? err.stack : err);\n try {\n if (!fs.existsSync(input.targetDir) && fs.existsSync(backupDir)) {\n movePath(backupDir, input.targetDir);\n }\n } catch (_rollbackErr) {}\n // 仅写回原始 error,分类逻辑由主进程在读取 status 时再算(classifyError)。\n writePatch({\n status: \"failed\",\n phase: \"apply\",\n error: message,\n suggestion: undefined,\n nextActions: undefined,\n });\n }\n})();\n`;\n\nfunction spawnDetachedUpdater(status: LastUpdateStatus): void {\n const payload = {\n ...status,\n parentPid: process.pid,\n // 用 wallclock 时间记录\"自更新被启动时父进程已经在运行\"。\n // 子进程探活时若启动时间晚于这个值,说明 pid 已被复用,应视为父进程已退出。\n parentStartedAtMs: Date.now() - Math.floor(process.uptime() * 1000),\n };\n const child = spawn(\n process.execPath,\n [\"-e\", UPDATER_INLINE_SCRIPT, JSON.stringify(payload)],\n {\n detached: true,\n stdio: \"ignore\",\n windowsHide: true,\n // 不要继承 gateway 的 cwd,避免 Windows 锁住相关目录导致 rename 失败。\n cwd: tmpdir(),\n },\n );\n child.unref();\n}\n\nexport function startPreparedUpdater(status: LastUpdateStatus): void {\n if (status.status !== \"pending\") {\n throw new Error(`update ${status.updateId} is not pending`);\n }\n if (!status.packageDir) {\n throw new Error(`update ${status.updateId} is missing packageDir`);\n }\n spawnDetachedUpdater(status);\n}\n\n/**\n * 执行插件更新:下载并准备 pending 更新包,实际目录替换交给独立 updater 在重启窗口完成。\n *\n * 注意:本函数只负责准备阶段(下载 + 解压 + 写 status)。配置记录写入推迟到 updater\n * 完成后由 `reconcileSucceededUpdateRecord` 在 gateway 重启加载新版本时补写。\n */\nexport async function executeUpdate(\n version: string,\n runCommand: RunCommandFn,\n logger: Logger,\n targetDir: string,\n baseUrlOrDeps: string | ExecuteUpdateDeps = PRODUCTION_UPDATE_BASE_URL,\n maybeDeps?: ExecuteUpdateDeps,\n): Promise<UpdateResult> {\n if (!VERSION_PATTERN.test(version)) {\n return { success: false, message: `非法版本号: ${version}` };\n }\n\n const { baseUrl, deps } = normalizeBaseUrlAndDeps(baseUrlOrDeps, maybeDeps);\n const normalizedBaseUrl = baseUrl.replace(/\\/+$/, \"\");\n const tgzUrl = `${normalizedBaseUrl}/v${version}/yoooclaw-phone-notifications-${version}.tgz`;\n logger.info(`执行更新: ${tgzUrl} → ${targetDir}`);\n\n const now = deps.now?.() ?? Date.now();\n const updateId = createUpdateId(now, deps.random?.() ?? Math.random());\n const updateRoot = updateRootForTarget(targetDir);\n const statusPath = lastUpdateStatusPath(targetDir);\n const pendingDir = join(updateRoot, updateId);\n const packageDir = join(pendingDir, \"package\");\n let workDir = \"\";\n\n try {\n mkdirSync(updateRoot, { recursive: true });\n workDir = mkdtempSync(join(updateRoot, \".work-\"));\n const tgzPath = join(workDir, \"plugin.tgz\");\n\n const existingStatus = readLastUpdateStatus(targetDir);\n if (existingStatus && isActiveUpdate(existingStatus, now)) {\n return {\n success: false,\n message: `已有更新正在进行(${existingStatus.version},${existingStatus.status}/${existingStatus.phase}),请稍后再试。`,\n version,\n phase: existingStatus.phase,\n updateId: existingStatus.updateId,\n statusPath,\n suggestion: \"等待当前更新完成,或重启 openclaw/gateway 后再试。\",\n nextActions: [\"等待当前更新完成\", \"如果长时间无变化,请重启 openclaw/gateway 后重试\"],\n };\n }\n cleanupPendingDir(existingStatus);\n\n logger.info(\"下载插件包...\");\n const response = await fetch(tgzUrl, { signal: AbortSignal.timeout(60_000) });\n if (!response.ok) {\n return {\n success: false,\n message: `下载失败 (HTTP ${response.status}): ${tgzUrl}`,\n version,\n phase: \"prepare\",\n error: `HTTP ${response.status}`,\n suggestion: \"插件包下载失败,请检查网络或稍后重试。\",\n nextActions: [\"检查网络连接\", \"稍后重试更新\"],\n };\n }\n const buffer = Buffer.from(await response.arrayBuffer());\n writeFileSync(tgzPath, buffer);\n logger.info(`下载完成 (${buffer.length} bytes)`);\n\n mkdirSync(packageDir, { recursive: true });\n const tarResult = await runCommand(\n [\"tar\", \"-xzf\", tgzPath, \"-C\", packageDir, \"--strip-components=1\"],\n { timeoutMs: 30_000 },\n );\n if (tarResult.code !== 0) {\n const err = tarResult.stderr || tarResult.stdout || \"unknown error\";\n return {\n success: false,\n message: `解压失败: ${err}`,\n version,\n phase: \"prepare\",\n error: err,\n suggestion: \"插件包解压失败,请确认系统 tar 可用后重试。\",\n nextActions: [\"确认系统 tar 命令可用\", \"稍后重试更新\"],\n };\n }\n\n const status: LastUpdateStatus = {\n updateId,\n version,\n status: \"pending\",\n phase: \"prepare\",\n createdAt: new Date(now).toISOString(),\n updatedAt: new Date(now).toISOString(),\n targetDir,\n pendingDir,\n packageDir,\n tgzUrl,\n restartStatus: \"pending\",\n };\n writeLastUpdateStatus(status);\n\n const msg = `已准备更新到 ${version}`;\n logger.info(msg);\n return {\n success: true,\n message: msg,\n version,\n updateId,\n statusPath,\n phase: \"prepare\",\n suggestion: \"更新包已准备完成,gateway 重启后会自动应用。\",\n nextActions: [\"等待 gateway 自动重启并应用更新\"],\n preparedStatus: status,\n };\n\n } catch (err) {\n const error = String(err);\n const fallback = classifyError(error);\n const status: LastUpdateStatus = {\n updateId,\n version,\n status: \"failed\",\n phase: \"prepare\",\n createdAt: new Date(now).toISOString(),\n updatedAt: new Date().toISOString(),\n targetDir,\n pendingDir,\n packageDir,\n tgzUrl,\n restartStatus: \"pending\",\n error,\n suggestion: fallback.suggestion,\n nextActions: fallback.nextActions,\n };\n try { writeLastUpdateStatus(status); } catch { /* ignore */ }\n const errMsg = `更新执行异常: ${error}`;\n logger.error(errMsg);\n return {\n success: false,\n message: errMsg,\n version,\n updateId,\n statusPath,\n phase: \"prepare\",\n error,\n suggestion: status.suggestion,\n nextActions: status.nextActions,\n };\n\n } finally {\n try {\n if (workDir) rmSync(workDir, { force: true, recursive: true });\n } catch { /* ignore */ }\n }\n}\n",
50
48
  "import type { Logger } from \"../logger.js\";\n\ntype CommandsConfigLike = {\n commands?: {\n restart?: boolean;\n };\n};\n\nconst DEFAULT_RESTART_GRACE_MS = 1_500;\n\nexport interface GatewayRestartScheduleDeps {\n loadConfig?: () => CommandsConfigLike | undefined;\n getListenerCount?: (signal: NodeJS.Signals) => number;\n emitSignal?: (signal: NodeJS.Signals) => boolean;\n schedule?: (task: () => void) => void;\n beforeSchedule?: () => void;\n}\n\nexport interface GatewayRestartScheduleResult {\n scheduled: boolean;\n reason?: string;\n suggestion?: string;\n nextActions?: string[];\n}\n\n/**\n * planGatewayRestart 的两阶段返回:\n * - scheduled=true 时 `commit` 必定存在;调用它才会真正注册 SIGUSR1 fire。\n * - scheduled=false 时返回失败原因与用户提示,commit 为 undefined。\n *\n * 拆出 commit 的目的:让网关方法可以在 RPC `respond()` 同步执行完毕后再触发重启,\n * 确保 app 一定先收到回复,再发生 gateway 重启,避免依赖 grace window 的概率保证。\n */\nexport interface GatewayRestartPlan {\n scheduled: boolean;\n reason?: string;\n suggestion?: string;\n nextActions?: string[];\n commit?: () => void;\n}\n\nexport function planGatewayRestart(\n logger: Logger,\n deps: GatewayRestartScheduleDeps = {},\n): GatewayRestartPlan {\n try {\n const cfg = deps.loadConfig?.();\n if (cfg?.commands?.restart === false) {\n logger.warn(\"更新后跳过 gateway 重启: commands.restart=false\");\n return {\n scheduled: false,\n reason: \"commands.restart=false\",\n suggestion: \"gateway 自动重启被配置禁用,请手动重启 openclaw/gateway 后生效。\",\n nextActions: [\"手动重启 openclaw/gateway\", \"如需自动重启,请启用 commands.restart\"],\n };\n }\n } catch (err) {\n logger.warn(`更新后检查 gateway 重启配置失败: ${String(err)}`);\n }\n\n const getListenerCount =\n deps.getListenerCount ?? ((signal: NodeJS.Signals) => process.listenerCount(signal));\n if (getListenerCount(\"SIGUSR1\") < 1) {\n logger.warn(\"更新后跳过 gateway 重启: 当前进程未注册 SIGUSR1 监听器\");\n return {\n scheduled: false,\n reason: \"SIGUSR1 listener unavailable\",\n suggestion: \"当前宿主不支持自动重启,请手动重启 openclaw/gateway 后生效。\",\n nextActions: [\"手动重启 openclaw/gateway\"],\n };\n }\n\n try {\n deps.beforeSchedule?.();\n } catch (err) {\n logger.warn(`更新后启动后台 updater 失败: ${String(err)}`);\n return {\n scheduled: false,\n reason: err instanceof Error ? err.message : String(err),\n suggestion: \"更新包已准备完成,但后台安装进程启动失败,更新尚未应用。请稍后重试。\",\n nextActions: [\"稍后重试更新\", \"如果持续失败,请复制错误信息反馈给维护者\"],\n };\n }\n\n const emitSignal =\n deps.emitSignal ?? ((signal: NodeJS.Signals) => process.emit(signal));\n const schedule =\n deps.schedule ?? ((task: () => void) => { setTimeout(task, DEFAULT_RESTART_GRACE_MS); });\n\n return {\n scheduled: true,\n commit: () => {\n schedule(() => {\n try {\n const accepted = emitSignal(\"SIGUSR1\");\n if (accepted) {\n logger.info(\"更新完成,已触发 gateway SIGUSR1 重启\");\n } else {\n logger.warn(\"更新完成,但 gateway SIGUSR1 信号未被处理\");\n }\n } catch (err) {\n logger.warn(`更新后触发 gateway 重启失败: ${String(err)}`);\n }\n });\n },\n };\n}\n\n/**\n * 兼容入口:等价于 `planGatewayRestart` + 立即 `commit()`。\n * 现存调用方(如对话通道 `plugin-update` tool 的 finalize 流程)继续走这个路径,\n * 保留原有\"一步式调度\"行为。\n *\n * 网关通道 `plugin.update` 已改为直接使用 `planGatewayRestart`,以便在 `respond()` 之后才触发 commit。\n */\nexport function scheduleGatewayRestart(\n logger: Logger,\n deps: GatewayRestartScheduleDeps = {},\n): GatewayRestartScheduleResult {\n const plan = planGatewayRestart(logger, deps);\n plan.commit?.();\n return {\n scheduled: plan.scheduled,\n reason: plan.reason,\n suggestion: plan.suggestion,\n nextActions: plan.nextActions,\n };\n}\n",
51
49
  "import type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport { loadEnvName } from \"../env.js\";\nimport type { Logger } from \"../logger.js\";\nimport { createTunnelService } from \"../tunnel/service.js\";\nimport type { PluginConfig } from \"../types.js\";\nimport { resolveUpdateBaseUrl, resolveUpdateChannel } from \"../update/channel.js\";\nimport { registerAutoUpdate } from \"../update/index.js\";\nimport type { BroadcastFn } from \"../update/types.js\";\nimport { PLUGIN_VERSION } from \"../version.js\";\n\ninterface AutoUpdateDeps {\n api: OpenClawPluginApi;\n config: PluginConfig;\n logger: Logger;\n getBroadcastFn: () => BroadcastFn | null;\n cacheBroadcast: (broadcast: BroadcastFn | undefined) => void;\n tunnelService: ReturnType<typeof createTunnelService> | null;\n}\n\nexport function registerAutoUpdateLifecycle(\n deps: AutoUpdateDeps,\n): ReturnType<typeof registerAutoUpdate> {\n const {\n api,\n config,\n logger,\n getBroadcastFn,\n cacheBroadcast,\n tunnelService,\n } = deps;\n\n const envName = loadEnvName();\n const autoUpdateConfig = {\n ...config.autoUpdate,\n channel: resolveUpdateChannel({\n configuredChannel: config.autoUpdate?.channel,\n envName,\n installedVersion: PLUGIN_VERSION,\n }),\n baseUrl: resolveUpdateBaseUrl({\n configuredBaseUrl: config.autoUpdate?.baseUrl,\n envName,\n }),\n };\n\n const autoUpdateLifecycle = registerAutoUpdate(\n api,\n logger,\n autoUpdateConfig,\n getBroadcastFn,\n cacheBroadcast,\n tunnelService\n ? {\n notifyUpdateAvailable: (update) => tunnelService.notifyUpdateAvailable(update),\n clearPendingUpdate: () => tunnelService.clearPendingUpdate(),\n }\n : undefined,\n );\n\n api.registerService({\n id: \"update-checker\",\n start() {\n autoUpdateLifecycle.start();\n },\n stop() {\n autoUpdateLifecycle.stop();\n },\n });\n\n logger.info(\"自动更新检查服务已注册\");\n return autoUpdateLifecycle;\n}\n",
52
50
  "import { basename, dirname } from \"node:path\";\nimport type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport { registerAllCli } from \"../cli/index.js\";\nimport { resolveStateDir } from \"../host.js\";\nimport type { Logger } from \"../logger.js\";\n\nfunction inferOpenClawRootDir(workspaceDir?: string): string | undefined {\n if (!workspaceDir) {\n return undefined;\n }\n\n if (basename(workspaceDir) !== \"workspace\") {\n return undefined;\n }\n\n return dirname(workspaceDir);\n}\n\nexport function registerPluginCli(\n api: OpenClawPluginApi,\n params: {\n logger: Logger;\n openclawDir?: string;\n },\n): void {\n const { logger, openclawDir } = params;\n\n const registerAlias = (command: \"ntf\" | \"phone-notifications\"): void => {\n api.registerCli(\n (ctx) => {\n const ctxStateDir = (ctx as { stateDir?: unknown }).stateDir;\n const effectiveStateDir = resolveStateDir(\n openclawDir ??\n (typeof ctxStateDir === \"string\" ? ctxStateDir : undefined) ??\n inferOpenClawRootDir(ctx.workspaceDir),\n );\n registerAllCli(\n ctx.program,\n {\n stateDir: effectiveStateDir,\n workspaceDir: ctx.workspaceDir,\n },\n command,\n );\n },\n { commands: [command] },\n );\n };\n\n registerAlias(\"ntf\");\n registerAlias(\"phone-notifications\");\n logger.info(\"CLI 命令已注册: ntf, phone-notifications\");\n}\n",
53
51
  "import { existsSync, rmSync } from \"node:fs\";\nimport type { CliCommand } from \"./helpers.js\";\nimport { output } from \"./helpers.js\";\nimport {\n credentialsPath,\n loadApiKey,\n readCredentials,\n writeSingleApiKey,\n writeCredentials,\n} from \"../auth/credentials.js\";\n\nexport function registerAuthCli(program: CliCommand): void {\n const auth = program\n .command(\"auth\")\n .description(\"用户认证管理\");\n\n auth\n .command(\"set-api-key <apiKey>\")\n .description(\"设置用户 API Key(持久化到本地配置)\")\n .action((apiKey: string) => {\n writeSingleApiKey(apiKey);\n output({\n ok: true,\n apiKey: apiKey.slice(0, 8) + \"…\",\n storedAt: credentialsPath(),\n });\n });\n\n // 兼容旧命令:set-token <token>,现在等价于 set-api-key\n auth\n .command(\"set-token <token>\")\n .description(\"(兼容)设置用户 API Key(旧命令名)\")\n .action((token: string) => {\n writeSingleApiKey(token);\n output({\n ok: true,\n apiKey: token.slice(0, 8) + \"…\",\n storedAt: credentialsPath(),\n });\n });\n\n auth\n .command(\"show\")\n .description(\"查看当前认证状态\")\n .action(() => {\n const apiKey = loadApiKey();\n if (apiKey) {\n output({\n ok: true,\n hasApiKey: true,\n apiKey: apiKey.slice(0, 8) + \"…\",\n storedAt: credentialsPath(),\n });\n } else {\n output({ ok: true, hasApiKey: false });\n }\n });\n\n auth\n .command(\"clear\")\n .description(\"清除已保存的认证信息\")\n .action(() => {\n const path = credentialsPath();\n if (existsSync(path)) {\n const creds = readCredentials();\n delete creds.apiKey;\n delete creds.apiKeys;\n delete creds.token;\n if (Object.keys(creds).length === 0) {\n rmSync(path, { force: true });\n } else {\n writeCredentials(creds);\n }\n }\n output({ ok: true, cleared: true });\n });\n}\n",
54
- "import type { StoredNotification } from \"../notification/storage.js\";\nimport {\n exitError,\n listDateKeysAsync,\n parseIsoTime,\n readDateFileAsync,\n sortNotificationsByTimestampDesc,\n matchesNotificationAppFilter,\n} from \"./helpers.js\";\n\nexport interface RawNotificationQueryOptions {\n from?: string;\n to?: string;\n app?: string;\n sender?: string;\n conversationType?: string;\n keyword?: string;\n limit?: string;\n client?: string;\n}\n\nexport interface NotificationQueryOptions {\n from?: string;\n to?: string;\n app?: string;\n sender?: string;\n conversationType?: string;\n keyword?: string;\n client?: string;\n limit: number;\n fromTs: number | null;\n toTs: number | null;\n fromDateKey: string | null;\n toDateKey: string | null;\n}\n\nexport function parsePositiveIntegerOption(\n rawValue: string | undefined,\n defaultValue: number,\n optionName: string,\n errorCode: string,\n): number {\n const value = rawValue && rawValue.length > 0 ? rawValue : String(defaultValue);\n if (!/^\\d+$/.test(value)) {\n exitError(errorCode, `${optionName} 必须是大于 0 的整数`);\n }\n\n const parsed = Number.parseInt(value, 10);\n if (parsed <= 0) {\n exitError(errorCode, `${optionName} 必须是大于 0 的整数`);\n }\n return parsed;\n}\n\nexport function parseNotificationQueryOptions(\n opts: RawNotificationQueryOptions,\n defaultLimit = 100,\n): NotificationQueryOptions {\n const limit = parsePositiveIntegerOption(\n opts.limit,\n defaultLimit,\n \"--limit\",\n \"INVALID_LIMIT\",\n );\n\n if (\n opts.conversationType\n && opts.conversationType !== \"group\"\n && opts.conversationType !== \"private\"\n ) {\n exitError(\n \"INVALID_CONVERSATION_TYPE\",\n \"--conversation-type 只能是 group 或 private\",\n );\n }\n\n const hasFrom = typeof opts.from === \"string\" && opts.from.length > 0;\n const hasTo = typeof opts.to === \"string\" && opts.to.length > 0;\n const fromTs = hasFrom ? parseIsoTime(opts.from!, \"--from\") : null;\n const toTs = hasTo ? parseIsoTime(opts.to!, \"--to\") : null;\n\n if (fromTs !== null && toTs !== null && fromTs > toTs) {\n exitError(\"INVALID_TIME_RANGE\", \"--from 不能晚于 --to\");\n }\n\n return {\n from: opts.from,\n to: opts.to,\n app: opts.app,\n sender: opts.sender,\n conversationType: opts.conversationType,\n keyword: opts.keyword,\n client: opts.client,\n limit,\n fromTs,\n toTs,\n fromDateKey: hasFrom ? opts.from!.slice(0, 10) : null,\n toDateKey: hasTo ? opts.to!.slice(0, 10) : null,\n };\n}\n\nexport function matchesNotificationQuery(\n item: StoredNotification,\n opts: NotificationQueryOptions,\n): boolean {\n if (opts.client && opts.client !== \"all\") {\n const label = item.clientLabel ?? \"legacy\";\n if (label !== opts.client) return false;\n }\n if (opts.app && !matchesNotificationAppFilter(item, opts.app)) return false;\n if (\n opts.conversationType\n && item.conversationType !== opts.conversationType\n ) {\n return false;\n }\n\n const senderHaystack = [item.senderName, item.title]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n .join(\"\\n\");\n if (opts.sender && !senderHaystack.includes(opts.sender)) return false;\n\n const keywordHaystack = [\n item.title,\n item.content,\n item.senderName,\n item.conversationName,\n ]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n .join(\"\\n\");\n if (opts.keyword && !keywordHaystack.includes(opts.keyword)) return false;\n\n const itemTs = Date.parse(item.timestamp);\n if (Number.isNaN(itemTs)) return false;\n if (opts.fromTs !== null && itemTs < opts.fromTs) return false;\n if (opts.toTs !== null && itemTs > opts.toTs) return false;\n\n return true;\n}\n\nexport async function collectMatchingNotifications(\n dir: string,\n opts: NotificationQueryOptions,\n): Promise<StoredNotification[]> {\n const keys = await listDateKeysAsync(dir);\n const results: StoredNotification[] = [];\n const canStopAfterLimit = opts.fromTs === null && opts.toTs === null;\n\n for (const dateKey of keys) {\n if (opts.fromDateKey && dateKey < opts.fromDateKey) continue;\n if (opts.toDateKey && dateKey > opts.toDateKey) continue;\n\n const items = sortNotificationsByTimestampDesc([\n ...(await readDateFileAsync(dir, dateKey)),\n ]);\n for (const item of items) {\n if (!matchesNotificationQuery(item, opts)) continue;\n results.push(item);\n if (canStopAfterLimit && results.length >= opts.limit) {\n return results;\n }\n }\n }\n\n return sortNotificationsByTimestampDesc(results).slice(0, opts.limit);\n}\n",
55
52
  "import {\n type CliCommand,\n type CliContext,\n resolveNotificationsDir,\n output,\n exitError,\n progress,\n} from \"./helpers.js\";\nimport {\n collectMatchingNotifications,\n parseNotificationQueryOptions,\n} from \"./ntf-query.js\";\n\nexport function registerNtfSearch(ntf: CliCommand, ctx: CliContext): void {\n ntf\n .command(\"search\")\n .description(\"查询通知(按时间/应用/发送人/关键词筛选)\")\n .option(\"--from <time>\", \"开始时间 ISO 8601,例如 2026-03-01T09:00:00+08:00\")\n .option(\"--to <time>\", \"结束时间 ISO 8601,例如 2026-03-01T18:00:00+08:00\")\n .option(\"--app <name>\", \"按应用名过滤\")\n .option(\"--sender <name>\", \"按发送人过滤\")\n .option(\n \"--conversation-type <type>\",\n \"按会话类型过滤(group/private)\",\n )\n .option(\"--keyword <text>\", \"在标题和内容中搜索关键词\")\n .option(\"--limit <n>\", \"最大返回条数\", \"100\")\n .action(\n async (opts: {\n from?: string;\n to?: string;\n app?: string;\n sender?: string;\n conversationType?: string;\n keyword?: string;\n limit: string;\n }) => {\n const dir = resolveNotificationsDir(ctx);\n if (!dir) exitError(\"STORAGE_UNAVAILABLE\", \"通知存储目录不可用\");\n\n progress(\"正在搜索通知...\");\n\n const query = parseNotificationQueryOptions(opts);\n const notifications = await collectMatchingNotifications(dir, query);\n\n output({\n ok: true,\n total: notifications.length,\n notifications,\n });\n },\n );\n}\n",
56
- "import type { StoredNotification } from \"../notification/storage.js\";\nimport {\n type CliCommand,\n type CliContext,\n exitError,\n output,\n progress,\n resolveNotificationsDir,\n} from \"./helpers.js\";\nimport {\n collectMatchingNotifications,\n parseNotificationQueryOptions,\n parsePositiveIntegerOption,\n} from \"./ntf-query.js\";\n\ntype CountRow<T extends Record<string, unknown>> = T & { count: number };\n\ninterface CompactNotification {\n appName: string;\n appDisplayName?: string;\n title: string;\n content: string;\n timestamp: string;\n senderName?: string;\n conversationType?: string;\n conversationName?: string;\n}\n\nfunction compactNotification(\n item: StoredNotification,\n maxContent: number,\n): CompactNotification {\n const result: CompactNotification = {\n appName: item.appName,\n title: truncate(item.title, maxContent),\n content: truncate(item.content, maxContent),\n timestamp: item.timestamp,\n };\n if (item.appDisplayName) result.appDisplayName = item.appDisplayName;\n if (item.senderName) result.senderName = item.senderName;\n if (item.conversationType) result.conversationType = item.conversationType;\n if (item.conversationName) result.conversationName = item.conversationName;\n return result;\n}\n\nfunction truncate(value: string, maxLength = 120): string {\n if (value.length <= maxLength) return value;\n return `${value.slice(0, maxLength - 1)}…`;\n}\n\nfunction increment<T extends Record<string, unknown>>(\n map: Map<string, CountRow<T>>,\n key: string,\n seed: T,\n): void {\n const existing = map.get(key);\n if (existing) {\n existing.count += 1;\n return;\n }\n map.set(key, { ...seed, count: 1 });\n}\n\nfunction topRows<T extends Record<string, unknown>>(\n map: Map<string, CountRow<T>>,\n limit: number,\n): CountRow<T>[] {\n return [...map.values()].sort((a, b) => b.count - a.count).slice(0, limit);\n}\n\nfunction hourBucket(timestamp: string): string | null {\n const match = /^(\\d{4}-\\d{2}-\\d{2})T(\\d{2}):/.exec(timestamp);\n if (!match) return null;\n return `${match[1]} ${match[2]}:00`;\n}\n\nfunction buildSamplesBySender(\n notifications: StoredNotification[],\n senderRows: CountRow<{ sender: string }>[],\n maxContent: number,\n): Array<{ sender: string; count: number; samples: string[] }> {\n return senderRows.map((row) => {\n const samples: string[] = [];\n for (const item of notifications) {\n const sender = item.senderName?.trim() || item.title?.trim() || \"(unknown)\";\n if (sender !== row.sender) continue;\n const content = truncate(item.content.trim(), maxContent);\n if (content && !samples.includes(content)) samples.push(content);\n if (samples.length >= 5) break;\n }\n return { sender: row.sender, count: row.count, samples };\n });\n}\n\nexport function registerNtfSummary(ntf: CliCommand, ctx: CliContext): void {\n ntf\n .command(\"summary\")\n .description(\"生成通知摘要输入(聚合统计 + 样例,供 Agent 快速总结)\")\n .option(\"--from <time>\", \"开始时间 ISO 8601,例如 2026-03-01T09:00:00+08:00\")\n .option(\"--to <time>\", \"结束时间 ISO 8601,例如 2026-03-01T18:00:00+08:00\")\n .option(\"--app <name>\", \"按应用名过滤\")\n .option(\"--sender <name>\", \"按发送人过滤\")\n .option(\n \"--conversation-type <type>\",\n \"按会话类型过滤(group/private)\",\n )\n .option(\"--keyword <text>\", \"在标题和内容中搜索关键词\")\n .option(\"--limit <n>\", \"纳入摘要的最大通知条数\", \"100\")\n .option(\"--sample <n>\", \"返回最近样例条数\", \"20\")\n .option(\"--top <n>\", \"返回聚合榜单条数\", \"10\")\n .option(\"--max-content <n>\", \"单条样例标题/正文最大字数(超出截断)\", \"80\")\n .action(\n async (opts: {\n from?: string;\n to?: string;\n app?: string;\n sender?: string;\n conversationType?: string;\n keyword?: string;\n limit: string;\n sample: string;\n top: string;\n maxContent: string;\n }) => {\n const dir = resolveNotificationsDir(ctx);\n if (!dir) exitError(\"STORAGE_UNAVAILABLE\", \"通知存储目录不可用\");\n\n progress(\"正在生成通知摘要输入...\");\n\n const query = parseNotificationQueryOptions(opts);\n const sampleLimit = parsePositiveIntegerOption(\n opts.sample,\n 30,\n \"--sample\",\n \"INVALID_SAMPLE\",\n );\n const topLimit = parsePositiveIntegerOption(\n opts.top,\n 10,\n \"--top\",\n \"INVALID_TOP\",\n );\n const maxContent = parsePositiveIntegerOption(\n opts.maxContent,\n 80,\n \"--max-content\",\n \"INVALID_MAX_CONTENT\",\n );\n\n const notifications = await collectMatchingNotifications(dir, query);\n const byApp = new Map<\n string,\n CountRow<{ appName: string; appDisplayName?: string }>\n >();\n const bySender = new Map<string, CountRow<{ sender: string }>>();\n const byConversation = new Map<\n string,\n CountRow<{ conversationName: string; conversationType?: string }>\n >();\n const byHour = new Map<string, CountRow<{ hour: string }>>();\n\n for (const item of notifications) {\n const appKey = `${item.appName}\\0${item.appDisplayName ?? \"\"}`;\n increment(byApp, appKey, {\n appName: item.appName,\n ...(item.appDisplayName ? { appDisplayName: item.appDisplayName } : {}),\n });\n\n const sender = item.senderName?.trim() || item.title?.trim() || \"(unknown)\";\n increment(bySender, sender, { sender });\n\n const conversationName =\n item.conversationName?.trim() || item.title?.trim() || \"(unknown)\";\n const conversationKey = `${conversationName}\\0${item.conversationType ?? \"\"}`;\n increment(byConversation, conversationKey, {\n conversationName,\n ...(item.conversationType\n ? { conversationType: item.conversationType }\n : {}),\n });\n\n const hour = hourBucket(item.timestamp);\n if (hour) increment(byHour, hour, { hour });\n }\n\n const senderRows = topRows(bySender, topLimit);\n output({\n ok: true,\n limit: query.limit,\n total: notifications.length,\n range: {\n newest: notifications[0]?.timestamp ?? null,\n oldest: notifications[notifications.length - 1]?.timestamp ?? null,\n },\n byApp: topRows(byApp, topLimit),\n bySender: senderRows,\n byConversation: topRows(byConversation, topLimit),\n byHour: topRows(byHour, topLimit),\n latest: notifications\n .slice(0, sampleLimit)\n .map((item) => compactNotification(item, maxContent)),\n samplesBySender: buildSamplesBySender(\n notifications,\n senderRows,\n maxContent,\n ),\n });\n },\n );\n}\n",
53
+ "import type { StoredNotification } from \"../notification/storage.js\";\nimport {\n type CliCommand,\n type CliContext,\n exitError,\n output,\n progress,\n resolveNotificationsDir,\n} from \"./helpers.js\";\nimport {\n collectMatchingNotificationsWithStats,\n parseNotificationQueryOptions,\n parsePositiveIntegerOption,\n} from \"./ntf-query.js\";\n\ntype CountRow<T extends Record<string, unknown>> = T & { count: number };\n\ninterface CompactNotification {\n appName: string;\n appDisplayName?: string;\n title: string;\n content: string;\n timestamp: string;\n senderName?: string;\n conversationType?: string;\n conversationName?: string;\n}\n\nfunction compactNotification(\n item: StoredNotification,\n maxContent: number,\n): CompactNotification {\n const result: CompactNotification = {\n appName: item.appName,\n title: truncate(item.title, maxContent),\n content: truncate(item.content, maxContent),\n timestamp: item.timestamp,\n };\n if (item.appDisplayName) result.appDisplayName = item.appDisplayName;\n if (item.senderName) result.senderName = item.senderName;\n if (item.conversationType) result.conversationType = item.conversationType;\n if (item.conversationName) result.conversationName = item.conversationName;\n return result;\n}\n\nfunction truncate(value: string, maxLength = 120): string {\n if (value.length <= maxLength) return value;\n return `${value.slice(0, maxLength - 1)}…`;\n}\n\nfunction increment<T extends Record<string, unknown>>(\n map: Map<string, CountRow<T>>,\n key: string,\n seed: T,\n): void {\n const existing = map.get(key);\n if (existing) {\n existing.count += 1;\n return;\n }\n map.set(key, { ...seed, count: 1 });\n}\n\nfunction topRows<T extends Record<string, unknown>>(\n map: Map<string, CountRow<T>>,\n limit: number,\n): CountRow<T>[] {\n return [...map.values()].sort((a, b) => b.count - a.count).slice(0, limit);\n}\n\nfunction hourBucket(timestamp: string): string | null {\n const match = /^(\\d{4}-\\d{2}-\\d{2})T(\\d{2}):/.exec(timestamp);\n if (!match) return null;\n return `${match[1]} ${match[2]}:00`;\n}\n\nfunction buildSamplesBySender(\n notifications: StoredNotification[],\n senderRows: CountRow<{ sender: string }>[],\n maxContent: number,\n): Array<{ sender: string; count: number; samples: string[] }> {\n return senderRows.map((row) => {\n const samples: string[] = [];\n for (const item of notifications) {\n const sender = item.senderName?.trim() || item.title?.trim() || \"(unknown)\";\n if (sender !== row.sender) continue;\n const content = truncate(item.content.trim(), maxContent);\n if (content && !samples.includes(content)) samples.push(content);\n if (samples.length >= 5) break;\n }\n return { sender: row.sender, count: row.count, samples };\n });\n}\n\nexport function registerNtfSummary(ntf: CliCommand, ctx: CliContext): void {\n ntf\n .command(\"summary\")\n .description(\"生成通知摘要输入(聚合统计 + 样例,供 Agent 快速总结)\")\n .option(\"--from <time>\", \"开始时间 ISO 8601,例如 2026-03-01T09:00:00+08:00\")\n .option(\"--to <time>\", \"结束时间 ISO 8601,例如 2026-03-01T18:00:00+08:00\")\n .option(\"--app <name>\", \"按应用名过滤\")\n .option(\"--sender <name>\", \"按发送人过滤\")\n .option(\n \"--conversation-type <type>\",\n \"按会话类型过滤(group/private)\",\n )\n .option(\"--keyword <text>\", \"在标题和内容中搜索关键词\")\n .option(\"--limit <n>\", \"纳入摘要的最大通知条数\", \"100\")\n .option(\"--sample <n>\", \"返回最近样例条数\", \"20\")\n .option(\"--top <n>\", \"返回聚合榜单条数\", \"10\")\n .option(\"--max-content <n>\", \"单条样例标题/正文最大字数(超出截断)\", \"80\")\n .action(\n async (opts: {\n from?: string;\n to?: string;\n app?: string;\n sender?: string;\n conversationType?: string;\n keyword?: string;\n limit: string;\n sample: string;\n top: string;\n maxContent: string;\n }) => {\n const dir = resolveNotificationsDir(ctx);\n if (!dir) exitError(\"STORAGE_UNAVAILABLE\", \"通知存储目录不可用\");\n\n progress(\"正在生成通知摘要输入...\");\n\n const query = parseNotificationQueryOptions(opts);\n const sampleLimit = parsePositiveIntegerOption(\n opts.sample,\n 30,\n \"--sample\",\n \"INVALID_SAMPLE\",\n );\n const topLimit = parsePositiveIntegerOption(\n opts.top,\n 10,\n \"--top\",\n \"INVALID_TOP\",\n );\n const maxContent = parsePositiveIntegerOption(\n opts.maxContent,\n 80,\n \"--max-content\",\n \"INVALID_MAX_CONTENT\",\n );\n\n const startedAtMs = Date.now();\n const queryResult = await collectMatchingNotificationsWithStats(dir, query);\n const elapsedMs = Date.now() - startedAtMs;\n const { notifications, stats } = queryResult;\n const byApp = new Map<\n string,\n CountRow<{ appName: string; appDisplayName?: string }>\n >();\n const bySender = new Map<string, CountRow<{ sender: string }>>();\n const byConversation = new Map<\n string,\n CountRow<{ conversationName: string; conversationType?: string }>\n >();\n const byHour = new Map<string, CountRow<{ hour: string }>>();\n\n for (const item of notifications) {\n const appKey = `${item.appName}\\0${item.appDisplayName ?? \"\"}`;\n increment(byApp, appKey, {\n appName: item.appName,\n ...(item.appDisplayName ? { appDisplayName: item.appDisplayName } : {}),\n });\n\n const sender = item.senderName?.trim() || item.title?.trim() || \"(unknown)\";\n increment(bySender, sender, { sender });\n\n const conversationName =\n item.conversationName?.trim() || item.title?.trim() || \"(unknown)\";\n const conversationKey = `${conversationName}\\0${item.conversationType ?? \"\"}`;\n increment(byConversation, conversationKey, {\n conversationName,\n ...(item.conversationType\n ? { conversationType: item.conversationType }\n : {}),\n });\n\n const hour = hourBucket(item.timestamp);\n if (hour) increment(byHour, hour, { hour });\n }\n\n const senderRows = topRows(bySender, topLimit);\n output({\n ok: true,\n limit: query.limit,\n total: notifications.length,\n range: {\n newest: notifications[0]?.timestamp ?? null,\n oldest: notifications[notifications.length - 1]?.timestamp ?? null,\n },\n scan: {\n daysScanned: stats.daysScanned,\n itemsScanned: stats.itemsScanned,\n matched: stats.matched,\n stoppedAfterLimit: stats.stoppedAfterLimit,\n elapsedMs,\n },\n byApp: topRows(byApp, topLimit),\n bySender: senderRows,\n byConversation: topRows(byConversation, topLimit),\n byHour: topRows(byHour, topLimit),\n latest: notifications\n .slice(0, sampleLimit)\n .map((item) => compactNotification(item, maxContent)),\n samplesBySender: buildSamplesBySender(\n notifications,\n senderRows,\n maxContent,\n ),\n });\n },\n );\n}\n",
54
+ "import { randomUUID } from \"node:crypto\";\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n} from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport type { StoredNotification } from \"../notification/storage.js\";\nimport {\n type CliCommand,\n type CliContext,\n exitError,\n output,\n progress,\n resolveNotificationsDir,\n} from \"./helpers.js\";\nimport {\n collectMatchingNotificationsWithStats,\n parseNotificationQueryOptions,\n parsePositiveIntegerOption,\n type RawNotificationQueryOptions,\n} from \"./ntf-query.js\";\n\ntype SummaryJobStatus =\n | \"pending\"\n | \"in_progress\"\n | \"ready\"\n | \"complete\"\n | \"cancelled\";\n\ninterface CompactNotification {\n appName: string;\n appDisplayName?: string;\n title: string;\n content: string;\n timestamp: string;\n senderName?: string;\n conversationType?: string;\n conversationName?: string;\n}\n\ninterface SummaryJobChunk {\n id: string;\n index: number;\n start: number;\n end: number;\n count: number;\n status: \"pending\" | \"in_progress\" | \"done\";\n range: {\n newest: string | null;\n oldest: string | null;\n };\n claimedAt?: string;\n completedAt?: string;\n summaryFile?: string;\n}\n\ninterface SummaryJobMeta {\n schemaVersion: 1;\n id: string;\n status: SummaryJobStatus;\n createdAt: string;\n updatedAt: string;\n query: {\n from?: string;\n to?: string;\n app?: string;\n sender?: string;\n conversationType?: string;\n keyword?: string;\n limit: number;\n };\n chunkSize: number;\n maxContent: number;\n total: number;\n range: {\n newest: string | null;\n oldest: string | null;\n };\n scan: {\n daysScanned: number;\n itemsScanned: number;\n matched: number;\n stoppedAfterLimit: boolean;\n elapsedMs: number;\n };\n chunks: SummaryJobChunk[];\n resultFile?: string;\n}\n\ninterface SummaryJobCreateOptions extends RawNotificationQueryOptions {\n chunkSize?: string;\n maxContent?: string;\n}\n\ninterface SummaryJobCommitOptions {\n chunkId: string;\n summary?: string;\n summaryFile?: string;\n}\n\ninterface SummaryJobRunOptions {\n maxChunks?: string;\n includeResult?: boolean;\n}\n\ntype CountRow<T extends Record<string, unknown>> = T & { count: number };\n\nconst SUMMARY_ROOT = \".summaries\";\nconst JOBS_DIR = \"jobs\";\nconst CHUNKS_DIR = \"chunks\";\nconst SUMMARIES_DIR = \"summaries\";\nconst RESULT_FILE = \"result.md\";\nconst DEFAULT_JOB_LIMIT = 1000;\nconst DEFAULT_CHUNK_SIZE = 150;\nconst DEFAULT_MAX_CONTENT = 120;\nconst DEFAULT_RUN_MAX_CHUNKS = 20;\n\nconst ATTENTION_KEYWORDS = [\n \"待办\",\n \"需要\",\n \"麻烦\",\n \"确认\",\n \"回复\",\n \"审批\",\n \"开会\",\n \"会议\",\n \"安排\",\n \"截止\",\n \"紧急\",\n \"异常\",\n \"失败\",\n \"风险\",\n \"todo\",\n \"deadline\",\n \"urgent\",\n \"error\",\n \"failed\",\n];\n\nfunction truncate(value: string, maxLength = 120): string {\n if (value.length <= maxLength) return value;\n return `${value.slice(0, maxLength - 1)}…`;\n}\n\nfunction compactNotification(\n item: StoredNotification,\n maxContent: number,\n): CompactNotification {\n const result: CompactNotification = {\n appName: item.appName,\n title: truncate(item.title, maxContent),\n content: truncate(item.content, maxContent),\n timestamp: item.timestamp,\n };\n if (item.appDisplayName) result.appDisplayName = item.appDisplayName;\n if (item.senderName) result.senderName = item.senderName;\n if (item.conversationType) result.conversationType = item.conversationType;\n if (item.conversationName) result.conversationName = item.conversationName;\n return result;\n}\n\nfunction notificationSender(item: CompactNotification): string {\n return item.senderName?.trim() || item.conversationName?.trim() || item.title.trim()\n || \"(unknown)\";\n}\n\nfunction notificationApp(item: CompactNotification): string {\n return item.appDisplayName?.trim() || item.appName.trim() || \"(unknown)\";\n}\n\nfunction increment<T extends Record<string, unknown>>(\n map: Map<string, CountRow<T>>,\n key: string,\n seed: T,\n): void {\n const existing = map.get(key);\n if (existing) {\n existing.count += 1;\n return;\n }\n map.set(key, { ...seed, count: 1 });\n}\n\nfunction topRows<T extends Record<string, unknown>>(\n map: Map<string, CountRow<T>>,\n limit: number,\n): CountRow<T>[] {\n return [...map.values()].sort((a, b) => b.count - a.count).slice(0, limit);\n}\n\nfunction formatTopRows<T extends Record<string, unknown>>(\n rows: CountRow<T>[],\n labelKey: keyof T,\n): string {\n if (rows.length === 0) return \"无\";\n return rows\n .map((row) => `${String(row[labelKey])} ${row.count}`)\n .join(\";\");\n}\n\nfunction compactLine(item: CompactNotification): string {\n const app = notificationApp(item);\n const sender = notificationSender(item);\n return `[${item.timestamp}] ${app} · ${sender}: ${item.content}`;\n}\n\nfunction isAttentionCandidate(item: CompactNotification): boolean {\n const text = `${item.title}\\n${item.content}`.toLowerCase();\n return ATTENTION_KEYWORDS.some((keyword) => text.includes(keyword.toLowerCase()));\n}\n\nfunction buildExtractiveChunkSummary(\n chunk: SummaryJobChunk,\n notifications: CompactNotification[],\n): string {\n const byApp = new Map<string, CountRow<{ app: string }>>();\n const bySender = new Map<string, CountRow<{ sender: string }>>();\n\n for (const item of notifications) {\n const app = notificationApp(item);\n const sender = notificationSender(item);\n increment(byApp, app, { app });\n increment(bySender, sender, { sender });\n }\n\n const latest = notifications.slice(0, 5).map(compactLine);\n const attention = notifications\n .filter(isAttentionCandidate)\n .slice(0, 5)\n .map(compactLine);\n\n const lines = [\n `## 分片 ${chunk.id}`,\n \"\",\n `- 数量: ${chunk.count}`,\n `- 时间范围: ${chunk.range.oldest ?? \"-\"} 至 ${chunk.range.newest ?? \"-\"}`,\n `- 主要 App: ${formatTopRows(topRows(byApp, 5), \"app\")}`,\n `- 主要发送人/会话: ${formatTopRows(topRows(bySender, 8), \"sender\")}`,\n \"\",\n \"### 可能需要关注\",\n ...(attention.length > 0\n ? attention.map((line) => `- ${line}`)\n : [\"- 无明显待办、风险或异常样例\"]),\n \"\",\n \"### 最近样例\",\n ...(latest.length > 0 ? latest.map((line) => `- ${line}`) : [\"- 无\"]),\n \"\",\n ];\n\n return lines.join(\"\\n\").trimEnd() + \"\\n\";\n}\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction createJobId(): string {\n const stamp = new Date()\n .toISOString()\n .replace(/[-:.TZ]/g, \"\")\n .slice(0, 14);\n return `${stamp}-${randomUUID().slice(0, 8)}`;\n}\n\nfunction assertJobId(id: string): void {\n if (!/^[A-Za-z0-9][A-Za-z0-9._-]{0,100}$/.test(id)) {\n exitError(\"INVALID_JOB_ID\", \"summary job id 不合法\");\n }\n}\n\nfunction summaryJobsDir(notificationsDir: string): string {\n return join(notificationsDir, SUMMARY_ROOT, JOBS_DIR);\n}\n\nfunction summaryJobDir(notificationsDir: string, id: string): string {\n assertJobId(id);\n return join(summaryJobsDir(notificationsDir), id);\n}\n\nfunction metaPath(jobDir: string): string {\n return join(jobDir, \"meta.json\");\n}\n\nfunction chunkPath(jobDir: string, chunkId: string): string {\n return join(jobDir, CHUNKS_DIR, `${chunkId}.json`);\n}\n\nfunction writeJson(path: string, value: unknown): void {\n writeFileSync(path, JSON.stringify(value, null, 2), \"utf-8\");\n}\n\nfunction readJson(path: string): unknown {\n try {\n return JSON.parse(readFileSync(path, \"utf-8\"));\n } catch {\n exitError(\"READ_FAILED\", `无法读取 JSON: ${path}`);\n }\n}\n\nfunction readMeta(notificationsDir: string, id: string): SummaryJobMeta {\n const dir = summaryJobDir(notificationsDir, id);\n const path = metaPath(dir);\n if (!existsSync(path)) {\n exitError(\"JOB_NOT_FOUND\", `summary job 不存在: ${id}`);\n }\n const meta = readJson(path);\n if (!isSummaryJobMeta(meta)) {\n exitError(\"INVALID_JOB\", `summary job 元数据损坏: ${id}`);\n }\n return meta;\n}\n\nfunction saveMeta(notificationsDir: string, meta: SummaryJobMeta): void {\n meta.updatedAt = nowIso();\n writeJson(metaPath(summaryJobDir(notificationsDir, meta.id)), meta);\n}\n\nfunction isSummaryJobMeta(value: unknown): value is SummaryJobMeta {\n if (!value || typeof value !== \"object\") return false;\n const obj = value as Record<string, unknown>;\n return (\n obj.schemaVersion === 1\n && typeof obj.id === \"string\"\n && Array.isArray(obj.chunks)\n && typeof obj.total === \"number\"\n );\n}\n\nfunction refreshStatus(meta: SummaryJobMeta): SummaryJobStatus {\n if (meta.status === \"cancelled\" || meta.status === \"complete\") {\n return meta.status;\n }\n if (meta.chunks.every((chunk) => chunk.status === \"done\")) {\n return \"ready\";\n }\n if (meta.chunks.some((chunk) => chunk.status === \"in_progress\")) {\n return \"in_progress\";\n }\n return \"pending\";\n}\n\nfunction progressFor(meta: SummaryJobMeta): {\n totalChunks: number;\n doneChunks: number;\n totalNotifications: number;\n doneNotifications: number;\n remainingChunks: number;\n} {\n const doneChunks = meta.chunks.filter((chunk) => chunk.status === \"done\");\n const doneNotifications = doneChunks.reduce(\n (sum, chunk) => sum + chunk.count,\n 0,\n );\n return {\n totalChunks: meta.chunks.length,\n doneChunks: doneChunks.length,\n totalNotifications: meta.total,\n doneNotifications,\n remainingChunks: meta.chunks.length - doneChunks.length,\n };\n}\n\nfunction toPublicStatus(meta: SummaryJobMeta): Record<string, unknown> {\n return {\n ok: true,\n id: meta.id,\n status: meta.status,\n createdAt: meta.createdAt,\n updatedAt: meta.updatedAt,\n query: meta.query,\n total: meta.total,\n chunkSize: meta.chunkSize,\n range: meta.range,\n scan: meta.scan,\n progress: progressFor(meta),\n resultFile: meta.resultFile ?? null,\n chunks: meta.chunks.map((chunk) => ({\n id: chunk.id,\n index: chunk.index,\n count: chunk.count,\n status: chunk.status,\n range: chunk.range,\n summaryFile: chunk.summaryFile ?? null,\n })),\n };\n}\n\nfunction readChunkNotifications(\n jobDir: string,\n chunkId: string,\n): CompactNotification[] {\n const chunk = readJson(chunkPath(jobDir, chunkId));\n if (\n !chunk\n || typeof chunk !== \"object\"\n || !Array.isArray((chunk as { notifications?: unknown }).notifications)\n ) {\n exitError(\"INVALID_CHUNK\", `summary job 分片损坏: ${chunkId}`);\n }\n return (chunk as { notifications: CompactNotification[] }).notifications;\n}\n\nfunction buildCommitCommand(jobId: string, chunkId: string): string {\n return `ntf summary-job commit ${jobId} --chunk-id ${chunkId} --summary-file <path>`;\n}\n\nfunction buildResultCommand(jobId: string): string {\n return `ntf summary-job result ${jobId}`;\n}\n\nfunction resolveSummaryText(opts: SummaryJobCommitOptions): string {\n const hasSummary = typeof opts.summary === \"string\" && opts.summary.length > 0;\n const hasSummaryFile =\n typeof opts.summaryFile === \"string\" && opts.summaryFile.length > 0;\n if (hasSummary && hasSummaryFile) {\n exitError(\"INVALID_COMMIT\", \"--summary 和 --summary-file 只能二选一\");\n }\n if (!hasSummary && !hasSummaryFile) {\n exitError(\"INVALID_COMMIT\", \"必须提供 --summary 或 --summary-file\");\n }\n\n const text = hasSummary\n ? opts.summary!\n : readFileSync(resolve(opts.summaryFile!), \"utf-8\");\n if (!text.trim()) {\n exitError(\"INVALID_COMMIT\", \"分片摘要不能为空\");\n }\n return text.trimEnd() + \"\\n\";\n}\n\nfunction buildResultMarkdown(meta: SummaryJobMeta, jobDir: string): string {\n const lines: string[] = [\n `# 通知总结任务 ${meta.id}`,\n \"\",\n `- 通知数: ${meta.total}`,\n `- 时间范围: ${meta.range.oldest ?? \"-\"} 至 ${meta.range.newest ?? \"-\"}`,\n `- 分片数: ${meta.chunks.length}`,\n \"\",\n \"## 分片摘要\",\n \"\",\n ];\n\n for (const chunk of meta.chunks) {\n lines.push(\n `### ${chunk.id} · ${chunk.count} 条 · ${chunk.range.oldest ?? \"-\"} 至 ${chunk.range.newest ?? \"-\"}`,\n \"\",\n );\n if (!chunk.summaryFile) {\n lines.push(\"(未提交摘要)\", \"\");\n continue;\n }\n lines.push(readFileSync(join(jobDir, chunk.summaryFile), \"utf-8\").trim(), \"\");\n }\n\n return lines.join(\"\\n\").trimEnd() + \"\\n\";\n}\n\nfunction writeChunkSummary(\n notificationsDir: string,\n meta: SummaryJobMeta,\n chunk: SummaryJobChunk,\n text: string,\n): void {\n const jobDir = summaryJobDir(notificationsDir, meta.id);\n const relativeSummaryFile = join(SUMMARIES_DIR, `${chunk.id}.md`);\n writeFileSync(join(jobDir, relativeSummaryFile), text, \"utf-8\");\n chunk.status = \"done\";\n chunk.completedAt = nowIso();\n chunk.summaryFile = relativeSummaryFile;\n}\n\nfunction finalizeResultIfReady(\n notificationsDir: string,\n meta: SummaryJobMeta,\n): string | null {\n meta.status = refreshStatus(meta);\n if (meta.status !== \"ready\" && meta.status !== \"complete\") {\n return null;\n }\n const jobDir = summaryJobDir(notificationsDir, meta.id);\n const markdown = buildResultMarkdown(meta, jobDir);\n writeFileSync(join(jobDir, RESULT_FILE), markdown, \"utf-8\");\n meta.status = \"complete\";\n meta.resultFile = RESULT_FILE;\n return markdown;\n}\n\nexport function registerNtfSummaryJob(ntf: CliCommand, ctx: CliContext): void {\n const summaryJob = ntf\n .command(\"summary-job\")\n .description(\"分片通知总结任务管理\");\n\n summaryJob\n .command(\"create\")\n .description(\"创建分片通知总结任务\")\n .option(\"--from <time>\", \"开始时间 ISO 8601\")\n .option(\"--to <time>\", \"结束时间 ISO 8601\")\n .option(\"--app <name>\", \"按应用名过滤\")\n .option(\"--sender <name>\", \"按发送人过滤\")\n .option(\"--conversation-type <type>\", \"按会话类型过滤(group/private)\")\n .option(\"--keyword <text>\", \"在标题和内容中搜索关键词\")\n .option(\"--limit <n>\", \"纳入任务的最大通知条数\", String(DEFAULT_JOB_LIMIT))\n .option(\"--chunk-size <n>\", \"每个分片的通知条数\", String(DEFAULT_CHUNK_SIZE))\n .option(\n \"--max-content <n>\",\n \"分片中单条通知标题/正文最大字数\",\n String(DEFAULT_MAX_CONTENT),\n )\n .action(async (opts: SummaryJobCreateOptions) => {\n const dir = resolveNotificationsDir(ctx);\n if (!dir) exitError(\"STORAGE_UNAVAILABLE\", \"通知存储目录不可用\");\n\n progress(\"正在创建分片通知总结任务...\");\n\n const query = parseNotificationQueryOptions(opts, DEFAULT_JOB_LIMIT);\n const chunkSize = parsePositiveIntegerOption(\n opts.chunkSize,\n DEFAULT_CHUNK_SIZE,\n \"--chunk-size\",\n \"INVALID_CHUNK_SIZE\",\n );\n const maxContent = parsePositiveIntegerOption(\n opts.maxContent,\n DEFAULT_MAX_CONTENT,\n \"--max-content\",\n \"INVALID_MAX_CONTENT\",\n );\n\n const startedAtMs = Date.now();\n const queryResult = await collectMatchingNotificationsWithStats(dir, query);\n const elapsedMs = Date.now() - startedAtMs;\n const notifications = queryResult.notifications;\n const id = createJobId();\n const createdAt = nowIso();\n const jobDir = summaryJobDir(dir, id);\n mkdirSync(join(jobDir, CHUNKS_DIR), { recursive: true });\n mkdirSync(join(jobDir, SUMMARIES_DIR), { recursive: true });\n\n const chunks: SummaryJobChunk[] = [];\n for (let start = 0; start < notifications.length; start += chunkSize) {\n const rawChunk = notifications.slice(start, start + chunkSize);\n const chunkNotifications = rawChunk.map((item) =>\n compactNotification(item, maxContent),\n );\n const index = chunks.length;\n const chunkId = String(index + 1).padStart(4, \"0\");\n const end = start + chunkNotifications.length - 1;\n writeJson(chunkPath(jobDir, chunkId), {\n id: chunkId,\n index,\n start,\n end,\n notifications: chunkNotifications,\n });\n chunks.push({\n id: chunkId,\n index,\n start,\n end,\n count: chunkNotifications.length,\n status: \"pending\",\n range: {\n newest: chunkNotifications[0]?.timestamp ?? null,\n oldest: chunkNotifications[chunkNotifications.length - 1]?.timestamp\n ?? null,\n },\n });\n }\n\n const meta: SummaryJobMeta = {\n schemaVersion: 1,\n id,\n status: chunks.length === 0 ? \"ready\" : \"pending\",\n createdAt,\n updatedAt: createdAt,\n query: {\n ...(query.from ? { from: query.from } : {}),\n ...(query.to ? { to: query.to } : {}),\n ...(query.app ? { app: query.app } : {}),\n ...(query.sender ? { sender: query.sender } : {}),\n ...(query.conversationType\n ? { conversationType: query.conversationType }\n : {}),\n ...(query.keyword ? { keyword: query.keyword } : {}),\n limit: query.limit,\n },\n chunkSize,\n maxContent,\n total: notifications.length,\n range: {\n newest: notifications[0]?.timestamp ?? null,\n oldest: notifications[notifications.length - 1]?.timestamp ?? null,\n },\n scan: {\n daysScanned: queryResult.stats.daysScanned,\n itemsScanned: queryResult.stats.itemsScanned,\n matched: queryResult.stats.matched,\n stoppedAfterLimit: queryResult.stats.stoppedAfterLimit,\n elapsedMs,\n },\n chunks,\n };\n writeJson(metaPath(jobDir), meta);\n\n output({\n ...toPublicStatus(meta),\n nextCommand: `ntf summary-job next ${id}`,\n resultCommand: buildResultCommand(id),\n });\n });\n\n summaryJob\n .command(\"status <id>\")\n .description(\"查看分片通知总结任务状态\")\n .action((id: string) => {\n const dir = resolveNotificationsDir(ctx);\n if (!dir) exitError(\"STORAGE_UNAVAILABLE\", \"通知存储目录不可用\");\n\n const meta = readMeta(dir, id);\n meta.status = refreshStatus(meta);\n saveMeta(dir, meta);\n output(toPublicStatus(meta));\n });\n\n summaryJob\n .command(\"next <id>\")\n .description(\"领取或重试下一个待总结分片\")\n .action((id: string) => {\n const dir = resolveNotificationsDir(ctx);\n if (!dir) exitError(\"STORAGE_UNAVAILABLE\", \"通知存储目录不可用\");\n\n const meta = readMeta(dir, id);\n if (meta.status === \"cancelled\") {\n exitError(\"JOB_CANCELLED\", `summary job 已取消: ${id}`);\n }\n const jobDir = summaryJobDir(dir, id);\n let chunk = meta.chunks.find((item) => item.status === \"in_progress\");\n if (!chunk) {\n chunk = meta.chunks.find((item) => item.status === \"pending\");\n if (chunk) {\n chunk.status = \"in_progress\";\n chunk.claimedAt = nowIso();\n }\n }\n\n if (!chunk) {\n meta.status = refreshStatus(meta);\n saveMeta(dir, meta);\n output({\n ok: true,\n id,\n done: true,\n status: meta.status,\n progress: progressFor(meta),\n resultCommand: buildResultCommand(id),\n });\n return;\n }\n\n meta.status = refreshStatus(meta);\n saveMeta(dir, meta);\n output({\n ok: true,\n id,\n done: false,\n status: meta.status,\n chunk: {\n id: chunk.id,\n index: chunk.index,\n start: chunk.start,\n end: chunk.end,\n count: chunk.count,\n range: chunk.range,\n },\n progress: progressFor(meta),\n commitCommand: buildCommitCommand(id, chunk.id),\n notifications: readChunkNotifications(jobDir, chunk.id),\n });\n });\n\n summaryJob\n .command(\"commit <id>\")\n .description(\"提交分片摘要并标记分片完成\")\n .requiredOption(\"--chunk-id <id>\", \"next 返回的分片 id\")\n .option(\"--summary <text>\", \"直接传入分片摘要文本\")\n .option(\"--summary-file <path>\", \"读取文件内容作为分片摘要\")\n .action((id: string, opts: SummaryJobCommitOptions) => {\n const dir = resolveNotificationsDir(ctx);\n if (!dir) exitError(\"STORAGE_UNAVAILABLE\", \"通知存储目录不可用\");\n\n const meta = readMeta(dir, id);\n if (meta.status === \"cancelled\") {\n exitError(\"JOB_CANCELLED\", `summary job 已取消: ${id}`);\n }\n const chunk = meta.chunks.find((item) => item.id === opts.chunkId);\n if (!chunk) {\n exitError(\"CHUNK_NOT_FOUND\", `summary job 分片不存在: ${opts.chunkId}`);\n }\n\n const text = resolveSummaryText(opts);\n writeChunkSummary(dir, meta, chunk, text);\n meta.status = refreshStatus(meta);\n saveMeta(dir, meta);\n\n output({\n ok: true,\n id,\n chunkId: chunk.id,\n status: meta.status,\n progress: progressFor(meta),\n nextCommand:\n meta.status === \"ready\" ? null : `ntf summary-job next ${id}`,\n resultCommand:\n meta.status === \"ready\" ? buildResultCommand(id) : null,\n });\n });\n\n summaryJob\n .command(\"run <id>\")\n .description(\"自动处理待总结分片并在完成后生成结果\")\n .option(\n \"--max-chunks <n>\",\n \"本次最多自动处理的分片数\",\n String(DEFAULT_RUN_MAX_CHUNKS),\n )\n .option(\"--include-result\", \"完成时在输出中包含 markdown 结果\")\n .action((id: string, opts: SummaryJobRunOptions) => {\n const dir = resolveNotificationsDir(ctx);\n if (!dir) exitError(\"STORAGE_UNAVAILABLE\", \"通知存储目录不可用\");\n\n const meta = readMeta(dir, id);\n if (meta.status === \"cancelled\") {\n exitError(\"JOB_CANCELLED\", `summary job 已取消: ${id}`);\n }\n\n const maxChunks = parsePositiveIntegerOption(\n opts.maxChunks,\n DEFAULT_RUN_MAX_CHUNKS,\n \"--max-chunks\",\n \"INVALID_MAX_CHUNKS\",\n );\n const jobDir = summaryJobDir(dir, id);\n const processed: Array<{ chunkId: string; count: number }> = [];\n\n for (const chunk of meta.chunks) {\n if (processed.length >= maxChunks) break;\n if (chunk.status === \"done\") continue;\n\n chunk.status = \"in_progress\";\n chunk.claimedAt = nowIso();\n const notifications = readChunkNotifications(jobDir, chunk.id);\n const summary = buildExtractiveChunkSummary(chunk, notifications);\n writeChunkSummary(dir, meta, chunk, summary);\n processed.push({ chunkId: chunk.id, count: chunk.count });\n }\n\n const markdown = finalizeResultIfReady(dir, meta);\n if (!markdown) {\n meta.status = refreshStatus(meta);\n }\n saveMeta(dir, meta);\n\n output({\n ok: true,\n id,\n status: meta.status,\n processed,\n progress: progressFor(meta),\n nextCommand:\n meta.status === \"complete\" ? null : `ntf summary-job run ${id}`,\n resultCommand:\n meta.status === \"complete\" ? buildResultCommand(id) : null,\n resultFile: meta.resultFile ?? null,\n ...(opts.includeResult && markdown ? { markdown } : {}),\n });\n });\n\n summaryJob\n .command(\"result <id>\")\n .description(\"合并已提交的分片摘要并返回结果\")\n .action((id: string) => {\n const dir = resolveNotificationsDir(ctx);\n if (!dir) exitError(\"STORAGE_UNAVAILABLE\", \"通知存储目录不可用\");\n\n const meta = readMeta(dir, id);\n meta.status = refreshStatus(meta);\n if (meta.status !== \"ready\" && meta.status !== \"complete\") {\n saveMeta(dir, meta);\n output({\n ok: true,\n id,\n done: false,\n status: meta.status,\n progress: progressFor(meta),\n nextCommand: `ntf summary-job next ${id}`,\n });\n return;\n }\n\n const jobDir = summaryJobDir(dir, id);\n const markdown = finalizeResultIfReady(dir, meta)\n ?? buildResultMarkdown(meta, jobDir);\n saveMeta(dir, meta);\n output({\n ok: true,\n id,\n done: true,\n status: meta.status,\n resultFile: RESULT_FILE,\n markdown,\n });\n });\n\n summaryJob\n .command(\"cancel <id>\")\n .description(\"取消分片通知总结任务\")\n .action((id: string) => {\n const dir = resolveNotificationsDir(ctx);\n if (!dir) exitError(\"STORAGE_UNAVAILABLE\", \"通知存储目录不可用\");\n\n const meta = readMeta(dir, id);\n meta.status = \"cancelled\";\n saveMeta(dir, meta);\n output({\n ok: true,\n id,\n status: meta.status,\n progress: progressFor(meta),\n });\n });\n}\n",
57
55
  "import {\n type CliCommand,\n type CliContext,\n resolveNotificationsDir,\n listDateKeys,\n readDateFile,\n filterDateRange,\n matchesNotificationAppFilter,\n today,\n daysAgo,\n output,\n exitError,\n} from \"./helpers.js\";\n\ntype Dimension = \"date\" | \"app\" | \"sender\" | \"hour\" | \"all\";\n\nexport function registerNtfStats(ntf: CliCommand, ctx: CliContext): void {\n ntf\n .command(\"stats\")\n .description(\"通知统计分析(按日期/应用/发送人/时段聚合)\")\n .option(\"--from <date>\", \"开始日期 YYYY-MM-DD\", daysAgo(7))\n .option(\"--to <date>\", \"结束日期 YYYY-MM-DD\", today())\n .option(\"--app <name>\", \"只统计指定应用\")\n .option(\"--dim <dimension>\", \"统计维度:date/app/sender/hour/all\", \"all\")\n .action(\n (opts: { from: string; to: string; app?: string; dim: string }) => {\n const dir = resolveNotificationsDir(ctx);\n if (!dir) exitError(\"STORAGE_UNAVAILABLE\", \"通知存储目录不可用\");\n\n const dim = opts.dim as Dimension;\n const keys = filterDateRange(listDateKeys(dir), opts.from, opts.to);\n\n const byDate: Record<string, number> = {};\n const byApp: Record<string, number> = {};\n const bySender: Record<string, number> = {};\n const byHour: Record<string, number> = {};\n let total = 0;\n\n for (const dateKey of keys) {\n const items = readDateFile(dir, dateKey);\n let dateCount = 0;\n for (const item of items) {\n if (opts.app && !matchesNotificationAppFilter(item, opts.app)) continue;\n total++;\n dateCount++;\n\n byApp[item.appName] = (byApp[item.appName] || 0) + 1;\n\n const sender = item.senderName?.trim() || item.title?.trim();\n if (sender) {\n bySender[sender] = (bySender[sender] || 0) + 1;\n }\n\n const hourMatch = /T(\\d{2}):/.exec(item.timestamp);\n if (hourMatch) {\n const h = hourMatch[1];\n byHour[h] = (byHour[h] || 0) + 1;\n }\n }\n byDate[dateKey] = dateCount;\n }\n\n const result: Record<string, unknown> = {\n ok: true,\n range: { from: opts.from, to: opts.to },\n total,\n };\n\n if (dim === \"date\" || dim === \"all\") {\n result.byDate = byDate;\n }\n if (dim === \"app\" || dim === \"all\") {\n result.byApp = byApp;\n }\n if (dim === \"sender\" || dim === \"all\") {\n // Sort by count descending, return top 20\n const sorted = Object.entries(bySender)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 20)\n .map(([sender, count]) => ({ sender, count }));\n result.bySender = sorted;\n }\n if (dim === \"hour\" || dim === \"all\") {\n result.byHour = byHour;\n }\n\n output(result);\n },\n );\n}\n",
58
- "import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport {\n type CliCommand,\n type CliContext,\n resolveNotificationsDir,\n listDateKeys,\n readDateFile,\n today,\n output,\n exitError,\n} from \"./helpers.js\";\n\ninterface CheckpointData {\n [dateKey: string]: { lastIndex: number };\n}\n\n// 单批同步上限。刻意调小到 100,使每个批次(模型阅读+总结+写记忆)能在数十秒内完成,\n// 让前台/后台都能频繁提交 checkpoint 并快速给用户进度反馈,避免单回合塞太多导致超时卡死。\nconst SYNC_FETCH_LIMIT = 100;\n\ninterface SyncScanOptions {\n all?: boolean;\n date?: string;\n fromDate?: string;\n toDate?: string;\n}\n\ntype SyncScanScope =\n | { mode: \"all\" }\n | {\n mode: \"today\" | \"date\" | \"range\";\n fromDate?: string;\n toDate?: string;\n };\n\nfunction checkpointPath(dir: string): string {\n return join(dir, \".checkpoint.json\");\n}\n\nfunction readCheckpoint(dir: string): CheckpointData {\n const p = checkpointPath(dir);\n if (!existsSync(p)) return {};\n try {\n return JSON.parse(readFileSync(p, \"utf-8\"));\n } catch {\n return {};\n }\n}\n\nfunction writeCheckpoint(dir: string, data: CheckpointData): void {\n writeFileSync(checkpointPath(dir), JSON.stringify(data, null, 2), \"utf-8\");\n}\n\nfunction validateDateKey(value: string, optionName: string): void {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value);\n if (!match) {\n exitError(\"INVALID_DATE\", `${optionName} 必须是 YYYY-MM-DD 格式`);\n }\n\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = Number(match[3]);\n const parsed = new Date(Date.UTC(year, month - 1, day));\n if (\n parsed.getUTCFullYear() !== year ||\n parsed.getUTCMonth() !== month - 1 ||\n parsed.getUTCDate() !== day\n ) {\n exitError(\"INVALID_DATE\", `${optionName} 不是合法日期`);\n }\n}\n\nfunction resolveScanScope(opts: SyncScanOptions): SyncScanScope {\n const hasRange = Boolean(opts.fromDate || opts.toDate);\n if (opts.all && (opts.date || hasRange)) {\n exitError(\"INVALID_SCOPE\", \"--all 不能与日期范围参数同时使用\");\n }\n if (opts.date && hasRange) {\n exitError(\"INVALID_SCOPE\", \"--date 不能与日期范围参数同时使用\");\n }\n\n if (opts.all) return { mode: \"all\" };\n\n if (opts.date) {\n validateDateKey(opts.date, \"--date\");\n return { mode: \"date\", fromDate: opts.date, toDate: opts.date };\n }\n\n if (hasRange) {\n if (opts.fromDate) validateDateKey(opts.fromDate, \"--from-date\");\n if (opts.toDate) validateDateKey(opts.toDate, \"--to-date\");\n if (opts.fromDate && opts.toDate && opts.fromDate > opts.toDate) {\n exitError(\"INVALID_SCOPE\", \"--from-date 不能晚于 --to-date\");\n }\n return { mode: \"range\", fromDate: opts.fromDate, toDate: opts.toDate };\n }\n\n const currentDate = today();\n return { mode: \"today\", fromDate: currentDate, toDate: currentDate };\n}\n\nfunction isDateInScope(dateKey: string, scope: SyncScanScope): boolean {\n if (scope.mode === \"all\") return true;\n if (scope.fromDate && dateKey < scope.fromDate) return false;\n if (scope.toDate && dateKey > scope.toDate) return false;\n return true;\n}\n\nexport function registerNtfSync(ntf: CliCommand, ctx: CliContext): void {\n const sync = ntf.command(\"sync\").description(\"同步通知到记忆系统\");\n\n sync\n .command(\"scan\")\n .description(\"扫描未处理的通知,默认只返回本地当天的待同步摘要\")\n .option(\"--all\", \"扫描 checkpoint 之后所有日期的未处理通知\")\n .option(\"--date <date>\", \"只扫描指定日期 YYYY-MM-DD\")\n .option(\"--from-date <date>\", \"只扫描该日期及之后的数据 YYYY-MM-DD\")\n .option(\"--to-date <date>\", \"只扫描该日期及之前的数据 YYYY-MM-DD\")\n .action((opts: SyncScanOptions) => {\n const dir = resolveNotificationsDir(ctx);\n if (!dir) exitError(\"STORAGE_UNAVAILABLE\", \"通知存储目录不可用\");\n\n const scope = resolveScanScope(opts);\n const checkpoint = readCheckpoint(dir);\n const keys = listDateKeys(dir); // descending\n const pending: { date: string; count: number; startIndex: number }[] = [];\n let totalPending = 0;\n let outsideScopePending = 0;\n\n for (const dateKey of keys) {\n const items = readDateFile(dir, dateKey);\n const lastIndex = checkpoint[dateKey]?.lastIndex ?? -1;\n const unprocessed = items.length - (lastIndex + 1);\n if (unprocessed > 0 && isDateInScope(dateKey, scope)) {\n pending.push({\n date: dateKey,\n count: unprocessed,\n startIndex: lastIndex + 1,\n });\n totalPending += unprocessed;\n } else if (unprocessed > 0) {\n outsideScopePending += unprocessed;\n }\n }\n\n output({\n ok: true,\n scope,\n pending,\n totalPending,\n outsideScopePending,\n allDatesTotalPending: totalPending + outsideScopePending,\n });\n });\n\n sync\n .command(\"fetch\")\n .description(\"获取指定日期的未处理通知详情\")\n .requiredOption(\"--date <date>\", \"目标日期 YYYY-MM-DD\")\n .option(\"--max-end-index <index>\", \"本次同步快照允许读取的最大 endIndex\")\n .action((opts: { date: string; maxEndIndex?: string }) => {\n const dir = resolveNotificationsDir(ctx);\n if (!dir) exitError(\"STORAGE_UNAVAILABLE\", \"通知存储目录不可用\");\n\n const items = readDateFile(dir, opts.date);\n if (items.length === 0) {\n exitError(\"NO_DATA\", `日期 ${opts.date} 无通知数据`);\n }\n\n const checkpoint = readCheckpoint(dir);\n const lastIndex = checkpoint[opts.date]?.lastIndex ?? -1;\n const startIndex = lastIndex + 1;\n let maxEndIndex = items.length - 1;\n if (typeof opts.maxEndIndex === \"string\" && opts.maxEndIndex.length > 0) {\n maxEndIndex = Number.parseInt(opts.maxEndIndex, 10);\n if (!Number.isInteger(maxEndIndex) || String(maxEndIndex) !== opts.maxEndIndex) {\n exitError(\"INVALID_MAX_END_INDEX\", \"--max-end-index 必须是非负整数\");\n }\n if (maxEndIndex < 0) {\n exitError(\"INVALID_MAX_END_INDEX\", \"--max-end-index 必须是非负整数\");\n }\n maxEndIndex = Math.min(maxEndIndex, items.length - 1);\n }\n const snapshotEndExclusive = Math.max(startIndex, maxEndIndex + 1);\n const unprocessed = items.slice(startIndex, snapshotEndExclusive);\n const notifications = unprocessed.slice(0, SYNC_FETCH_LIMIT);\n const endIndex =\n notifications.length > 0 ? startIndex + notifications.length - 1 : lastIndex;\n const hasMore = unprocessed.length > notifications.length;\n\n if (unprocessed.length === 0) {\n output({\n ok: true,\n date: opts.date,\n startIndex,\n endIndex,\n nextStartIndex: null,\n limit: SYNC_FETCH_LIMIT,\n maxEndIndex,\n returned: 0,\n totalUnprocessed: 0,\n hasMore: false,\n notifications: [],\n });\n return;\n }\n\n output({\n ok: true,\n date: opts.date,\n startIndex,\n endIndex,\n nextStartIndex: hasMore ? endIndex + 1 : null,\n limit: SYNC_FETCH_LIMIT,\n maxEndIndex,\n returned: notifications.length,\n totalUnprocessed: unprocessed.length,\n hasMore,\n notifications,\n });\n });\n\n sync\n .command(\"commit\")\n .description(\"标记指定日期当前批次处理完成,更新 checkpoint\")\n .requiredOption(\"--date <date>\", \"目标日期 YYYY-MM-DD\")\n .option(\"--end-index <index>\", \"本批次 fetch 返回的 endIndex\")\n .action((opts: { date: string; endIndex?: string }) => {\n const dir = resolveNotificationsDir(ctx);\n if (!dir) exitError(\"STORAGE_UNAVAILABLE\", \"通知存储目录不可用\");\n\n const items = readDateFile(dir, opts.date);\n if (items.length === 0) {\n exitError(\"NO_DATA\", `日期 ${opts.date} 无通知数据`);\n }\n\n const checkpoint = readCheckpoint(dir);\n const lastIndex = checkpoint[opts.date]?.lastIndex ?? -1;\n let committedIndex: number;\n if (typeof opts.endIndex === \"string\" && opts.endIndex.length > 0) {\n committedIndex = Number.parseInt(opts.endIndex, 10);\n if (!Number.isInteger(committedIndex) || String(committedIndex) !== opts.endIndex) {\n exitError(\"INVALID_END_INDEX\", \"--end-index 必须是非负整数\");\n }\n if (committedIndex < 0 || committedIndex >= items.length) {\n exitError(\n \"INVALID_END_INDEX\",\n \"--end-index 必须落在当前日期通知文件范围内\",\n );\n }\n if (committedIndex < lastIndex) {\n exitError(\n \"STALE_END_INDEX\",\n \"--end-index 早于当前 checkpoint,不能回退消费进度\",\n );\n }\n if (committedIndex > lastIndex + SYNC_FETCH_LIMIT) {\n exitError(\n \"INVALID_END_INDEX\",\n \"--end-index 超出单批 fetch 上限,不能跳过未处理通知\",\n );\n }\n } else {\n committedIndex = Math.min(items.length - 1, lastIndex + SYNC_FETCH_LIMIT);\n }\n const hasMore = committedIndex < items.length - 1;\n checkpoint[opts.date] = { lastIndex: committedIndex };\n writeCheckpoint(dir, checkpoint);\n\n output({\n ok: true,\n date: opts.date,\n committedIndex,\n commitMode:\n typeof opts.endIndex === \"string\" && opts.endIndex.length > 0\n ? \"exact-end-index\"\n : \"legacy-batch-limit\",\n limit: SYNC_FETCH_LIMIT,\n hasMore,\n nextStartIndex: hasMore ? committedIndex + 1 : null,\n });\n });\n}\n",
56
+ "import { execFileSync } from \"node:child_process\";\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport {\n type CliCommand,\n type CliContext,\n resolveNotificationsDir,\n listDateKeys,\n readDateFile,\n today,\n output,\n exitError,\n} from \"./helpers.js\";\n\ninterface CheckpointData {\n [dateKey: string]: { lastIndex: number };\n}\n\n// 单批同步上限。刻意调小到 100,使每个批次(模型阅读+总结+写记忆)能在数十秒内完成,\n// 让前台/后台都能频繁提交 checkpoint 并快速给用户进度反馈,避免单回合塞太多导致超时卡死。\nconst SYNC_FETCH_LIMIT = 100;\n\ninterface SyncScanOptions {\n all?: boolean;\n date?: string;\n fromDate?: string;\n toDate?: string;\n}\n\ntype SyncScanScope =\n | { mode: \"all\" }\n | {\n mode: \"today\" | \"date\" | \"range\";\n fromDate?: string;\n toDate?: string;\n };\n\nfunction checkpointPath(dir: string): string {\n return join(dir, \".checkpoint.json\");\n}\n\nfunction readCheckpoint(dir: string): CheckpointData {\n const p = checkpointPath(dir);\n if (!existsSync(p)) return {};\n try {\n return JSON.parse(readFileSync(p, \"utf-8\"));\n } catch {\n return {};\n }\n}\n\nfunction writeCheckpoint(dir: string, data: CheckpointData): void {\n writeFileSync(checkpointPath(dir), JSON.stringify(data, null, 2), \"utf-8\");\n}\n\nfunction validateDateKey(value: string, optionName: string): void {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value);\n if (!match) {\n exitError(\"INVALID_DATE\", `${optionName} 必须是 YYYY-MM-DD 格式`);\n }\n\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = Number(match[3]);\n const parsed = new Date(Date.UTC(year, month - 1, day));\n if (\n parsed.getUTCFullYear() !== year ||\n parsed.getUTCMonth() !== month - 1 ||\n parsed.getUTCDate() !== day\n ) {\n exitError(\"INVALID_DATE\", `${optionName} 不是合法日期`);\n }\n}\n\nfunction resolveScanScope(opts: SyncScanOptions): SyncScanScope {\n const hasRange = Boolean(opts.fromDate || opts.toDate);\n if (opts.all && (opts.date || hasRange)) {\n exitError(\"INVALID_SCOPE\", \"--all 不能与日期范围参数同时使用\");\n }\n if (opts.date && hasRange) {\n exitError(\"INVALID_SCOPE\", \"--date 不能与日期范围参数同时使用\");\n }\n\n if (opts.all) return { mode: \"all\" };\n\n if (opts.date) {\n validateDateKey(opts.date, \"--date\");\n return { mode: \"date\", fromDate: opts.date, toDate: opts.date };\n }\n\n if (hasRange) {\n if (opts.fromDate) validateDateKey(opts.fromDate, \"--from-date\");\n if (opts.toDate) validateDateKey(opts.toDate, \"--to-date\");\n if (opts.fromDate && opts.toDate && opts.fromDate > opts.toDate) {\n exitError(\"INVALID_SCOPE\", \"--from-date 不能晚于 --to-date\");\n }\n return { mode: \"range\", fromDate: opts.fromDate, toDate: opts.toDate };\n }\n\n const currentDate = today();\n return { mode: \"today\", fromDate: currentDate, toDate: currentDate };\n}\n\nfunction isDateInScope(dateKey: string, scope: SyncScanScope): boolean {\n if (scope.mode === \"all\") return true;\n if (scope.fromDate && dateKey < scope.fromDate) return false;\n if (scope.toDate && dateKey > scope.toDate) return false;\n return true;\n}\n\nconst MEMORY_PLUGIN_KEYWORD = \"memory-lancedb-ultra\";\n\ninterface MemoryBackendInfo {\n backend: \"lancedb-plugin\" | \"openclaw-native\";\n promptFile: string;\n}\n\n// 与 scripts/select-memory-prompt.sh 同语义:lancedb 插件存在且未 disabled 时\n// 使用插件提示词,否则(包括 openclaw 不可用)回退到原生记忆提示词。\nfunction detectMemoryBackend(): MemoryBackendInfo {\n try {\n const out = execFileSync(\"openclaw\", [\"plugins\", \"list\"], {\n encoding: \"utf-8\",\n timeout: 15000,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n const matched = out\n .split(\"\\n\")\n .filter((line) => line.toLowerCase().includes(MEMORY_PLUGIN_KEYWORD));\n if (matched.length > 0 && !matched.some((line) => /disabled/i.test(line))) {\n return {\n backend: \"lancedb-plugin\",\n promptFile:\n \"skills/notification-to-memory/references/write-memory-lancedb-plugin.md\",\n };\n }\n } catch {\n // openclaw CLI 不可用时按原生记忆处理\n }\n return {\n backend: \"openclaw-native\",\n promptFile:\n \"skills/notification-to-memory/references/write-memory-openclaw-native.md\",\n };\n}\n\nexport function registerNtfSync(ntf: CliCommand, ctx: CliContext): void {\n const sync = ntf.command(\"sync\").description(\"同步通知到记忆系统\");\n\n sync\n .command(\"scan\")\n .description(\"扫描未处理的通知,默认只返回本地当天的待同步摘要\")\n .option(\"--all\", \"扫描 checkpoint 之后所有日期的未处理通知\")\n .option(\"--date <date>\", \"只扫描指定日期 YYYY-MM-DD\")\n .option(\"--from-date <date>\", \"只扫描该日期及之后的数据 YYYY-MM-DD\")\n .option(\"--to-date <date>\", \"只扫描该日期及之前的数据 YYYY-MM-DD\")\n .action((opts: SyncScanOptions) => {\n const dir = resolveNotificationsDir(ctx);\n if (!dir) exitError(\"STORAGE_UNAVAILABLE\", \"通知存储目录不可用\");\n\n const scope = resolveScanScope(opts);\n const checkpoint = readCheckpoint(dir);\n const keys = listDateKeys(dir); // descending\n const pending: { date: string; count: number; startIndex: number }[] = [];\n let totalPending = 0;\n let outsideScopePending = 0;\n\n for (const dateKey of keys) {\n const items = readDateFile(dir, dateKey);\n const lastIndex = checkpoint[dateKey]?.lastIndex ?? -1;\n const unprocessed = items.length - (lastIndex + 1);\n if (unprocessed > 0 && isDateInScope(dateKey, scope)) {\n pending.push({\n date: dateKey,\n count: unprocessed,\n startIndex: lastIndex + 1,\n });\n totalPending += unprocessed;\n } else if (unprocessed > 0) {\n outsideScopePending += unprocessed;\n }\n }\n\n output({\n ok: true,\n scope,\n pending,\n totalPending,\n outsideScopePending,\n allDatesTotalPending: totalPending + outsideScopePending,\n });\n });\n\n sync\n .command(\"next\")\n .description(\n \"返回范围内下一批待同步通知(≤100 条)及记忆写入提示词路径;全部处理完时返回 done=true\",\n )\n .option(\"--all\", \"处理 checkpoint 之后所有日期的未处理通知\")\n .option(\"--date <date>\", \"只处理指定日期 YYYY-MM-DD\")\n .option(\"--from-date <date>\", \"只处理该日期及之后的数据 YYYY-MM-DD\")\n .option(\"--to-date <date>\", \"只处理该日期及之前的数据 YYYY-MM-DD\")\n .action((opts: SyncScanOptions) => {\n const dir = resolveNotificationsDir(ctx);\n if (!dir) exitError(\"STORAGE_UNAVAILABLE\", \"通知存储目录不可用\");\n\n const scope = resolveScanScope(opts);\n const checkpoint = readCheckpoint(dir);\n const keys = listDateKeys(dir); // descending: 从最新日期开始处理\n\n let totalPending = 0;\n let outsideScopePending = 0;\n let nextDate: string | null = null;\n let nextItems: ReturnType<typeof readDateFile> = [];\n let nextStartIndex = 0;\n\n for (const dateKey of keys) {\n const items = readDateFile(dir, dateKey);\n const lastIndex = checkpoint[dateKey]?.lastIndex ?? -1;\n const unprocessed = items.length - (lastIndex + 1);\n if (unprocessed <= 0) continue;\n if (!isDateInScope(dateKey, scope)) {\n outsideScopePending += unprocessed;\n continue;\n }\n totalPending += unprocessed;\n if (!nextDate) {\n nextDate = dateKey;\n nextItems = items;\n nextStartIndex = lastIndex + 1;\n }\n }\n\n if (!nextDate) {\n output({\n ok: true,\n done: true,\n scope,\n totalPending: 0,\n outsideScopePending,\n allDatesTotalPending: outsideScopePending,\n });\n return;\n }\n\n const notifications = nextItems.slice(\n nextStartIndex,\n nextStartIndex + SYNC_FETCH_LIMIT,\n );\n const endIndex = nextStartIndex + notifications.length - 1;\n const unprocessedInDate = nextItems.length - nextStartIndex;\n const memory = detectMemoryBackend();\n\n output({\n ok: true,\n done: false,\n scope,\n date: nextDate,\n startIndex: nextStartIndex,\n endIndex,\n returned: notifications.length,\n hasMoreInDate: unprocessedInDate > notifications.length,\n remainingInScope: totalPending - notifications.length,\n outsideScopePending,\n memoryBackend: memory.backend,\n memoryPromptFile: memory.promptFile,\n commitCommand: `ntf sync commit --date ${nextDate} --end-index ${endIndex}`,\n notifications,\n });\n });\n\n sync\n .command(\"fetch\")\n .description(\"获取指定日期的未处理通知详情\")\n .requiredOption(\"--date <date>\", \"目标日期 YYYY-MM-DD\")\n .option(\"--max-end-index <index>\", \"本次同步快照允许读取的最大 endIndex\")\n .action((opts: { date: string; maxEndIndex?: string }) => {\n const dir = resolveNotificationsDir(ctx);\n if (!dir) exitError(\"STORAGE_UNAVAILABLE\", \"通知存储目录不可用\");\n\n const items = readDateFile(dir, opts.date);\n if (items.length === 0) {\n exitError(\"NO_DATA\", `日期 ${opts.date} 无通知数据`);\n }\n\n const checkpoint = readCheckpoint(dir);\n const lastIndex = checkpoint[opts.date]?.lastIndex ?? -1;\n const startIndex = lastIndex + 1;\n let maxEndIndex = items.length - 1;\n if (typeof opts.maxEndIndex === \"string\" && opts.maxEndIndex.length > 0) {\n maxEndIndex = Number.parseInt(opts.maxEndIndex, 10);\n if (!Number.isInteger(maxEndIndex) || String(maxEndIndex) !== opts.maxEndIndex) {\n exitError(\"INVALID_MAX_END_INDEX\", \"--max-end-index 必须是非负整数\");\n }\n if (maxEndIndex < 0) {\n exitError(\"INVALID_MAX_END_INDEX\", \"--max-end-index 必须是非负整数\");\n }\n maxEndIndex = Math.min(maxEndIndex, items.length - 1);\n }\n const snapshotEndExclusive = Math.max(startIndex, maxEndIndex + 1);\n const unprocessed = items.slice(startIndex, snapshotEndExclusive);\n const notifications = unprocessed.slice(0, SYNC_FETCH_LIMIT);\n const endIndex =\n notifications.length > 0 ? startIndex + notifications.length - 1 : lastIndex;\n const hasMore = unprocessed.length > notifications.length;\n\n if (unprocessed.length === 0) {\n output({\n ok: true,\n date: opts.date,\n startIndex,\n endIndex,\n nextStartIndex: null,\n limit: SYNC_FETCH_LIMIT,\n maxEndIndex,\n returned: 0,\n totalUnprocessed: 0,\n hasMore: false,\n notifications: [],\n });\n return;\n }\n\n output({\n ok: true,\n date: opts.date,\n startIndex,\n endIndex,\n nextStartIndex: hasMore ? endIndex + 1 : null,\n limit: SYNC_FETCH_LIMIT,\n maxEndIndex,\n returned: notifications.length,\n totalUnprocessed: unprocessed.length,\n hasMore,\n notifications,\n });\n });\n\n sync\n .command(\"commit\")\n .description(\"标记指定日期当前批次处理完成,更新 checkpoint\")\n .requiredOption(\"--date <date>\", \"目标日期 YYYY-MM-DD\")\n .option(\"--end-index <index>\", \"本批次 fetch 返回的 endIndex\")\n .action((opts: { date: string; endIndex?: string }) => {\n const dir = resolveNotificationsDir(ctx);\n if (!dir) exitError(\"STORAGE_UNAVAILABLE\", \"通知存储目录不可用\");\n\n const items = readDateFile(dir, opts.date);\n if (items.length === 0) {\n exitError(\"NO_DATA\", `日期 ${opts.date} 无通知数据`);\n }\n\n const checkpoint = readCheckpoint(dir);\n const lastIndex = checkpoint[opts.date]?.lastIndex ?? -1;\n let committedIndex: number;\n if (typeof opts.endIndex === \"string\" && opts.endIndex.length > 0) {\n committedIndex = Number.parseInt(opts.endIndex, 10);\n if (!Number.isInteger(committedIndex) || String(committedIndex) !== opts.endIndex) {\n exitError(\"INVALID_END_INDEX\", \"--end-index 必须是非负整数\");\n }\n if (committedIndex < 0 || committedIndex >= items.length) {\n exitError(\n \"INVALID_END_INDEX\",\n \"--end-index 必须落在当前日期通知文件范围内\",\n );\n }\n if (committedIndex < lastIndex) {\n exitError(\n \"STALE_END_INDEX\",\n \"--end-index 早于当前 checkpoint,不能回退消费进度\",\n );\n }\n if (committedIndex > lastIndex + SYNC_FETCH_LIMIT) {\n exitError(\n \"INVALID_END_INDEX\",\n \"--end-index 超出单批 fetch 上限,不能跳过未处理通知\",\n );\n }\n } else {\n committedIndex = Math.min(items.length - 1, lastIndex + SYNC_FETCH_LIMIT);\n }\n const hasMore = committedIndex < items.length - 1;\n checkpoint[opts.date] = { lastIndex: committedIndex };\n writeCheckpoint(dir, checkpoint);\n\n output({\n ok: true,\n date: opts.date,\n committedIndex,\n commitMode:\n typeof opts.endIndex === \"string\" && opts.endIndex.length > 0\n ? \"exact-end-index\"\n : \"legacy-batch-limit\",\n limit: SYNC_FETCH_LIMIT,\n hasMore,\n nextStartIndex: hasMore ? committedIndex + 1 : null,\n });\n });\n}\n",
59
57
  "import {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n rmSync,\n readdirSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport { type CliCommand, type CliContext, output, exitError } from \"./helpers.js\";\nimport { generateFetchPy } from \"../monitor/fetch-gen.js\";\n\ninterface MonitorMeta {\n name: string;\n type?: \"monitor\" | \"light-rule\";\n description: string;\n matchRules: Record<string, unknown>;\n cronSchedule: string;\n enabled: boolean;\n createdAt: string;\n updatedAt?: string;\n}\n\nfunction tasksDir(ctx: CliContext): string {\n const base = ctx.workspaceDir || ctx.stateDir;\n if (!base) throw new Error(\"workspaceDir and stateDir both unavailable\");\n return join(base, \"tasks\");\n}\n\nfunction readMeta(taskDir: string): MonitorMeta | null {\n const metaPath = join(taskDir, \"meta.json\");\n if (!existsSync(metaPath)) return null;\n try {\n return JSON.parse(readFileSync(metaPath, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nfunction writeMeta(taskDir: string, meta: MonitorMeta): void {\n writeFileSync(join(taskDir, \"meta.json\"), JSON.stringify(meta, null, 2), \"utf-8\");\n}\n\nfunction generateReadme(name: string, description: string): string {\n return `# Monitor Task: ${name}\n\n## 描述\n${description}\n\n## 处理指南\n当 fetch.py 输出匹配的通知时,请:\n1. 阅读匹配到的通知内容\n2. 根据任务描述判断是否需要通知用户\n3. 如需通知用户,使用 message 工具发送摘要\n`;\n}\n\nexport function registerNtfMonitor(ntf: CliCommand, ctx: CliContext): void {\n const monitor = ntf.command(\"monitor\").description(\"通知监控任务管理\");\n\n monitor\n .command(\"list\")\n .description(\"列出所有监控任务\")\n .action(() => {\n const dir = tasksDir(ctx);\n if (!existsSync(dir)) {\n output({ ok: true, tasks: [] });\n return;\n }\n\n const tasks: MonitorMeta[] = [];\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const meta = readMeta(join(dir, entry.name));\n if (meta) tasks.push(meta);\n }\n\n output({ ok: true, tasks });\n });\n\n monitor\n .command(\"show <name>\")\n .description(\"查看监控任务详情\")\n .action((name: string) => {\n const taskDir = join(tasksDir(ctx), name);\n const meta = readMeta(taskDir);\n if (!meta) exitError(\"NOT_FOUND\", `监控任务 '${name}' 不存在`);\n\n const checkpointPath = join(taskDir, \"checkpoint.json\");\n let checkpoint = {};\n if (existsSync(checkpointPath)) {\n try {\n checkpoint = JSON.parse(readFileSync(checkpointPath, \"utf-8\"));\n } catch {\n // ignore\n }\n }\n\n output({\n ok: true,\n ...meta,\n matchScript: `tasks/${name}/fetch.py`,\n readme: `tasks/${name}/README.md`,\n checkpoint,\n });\n });\n\n monitor\n .command(\"create <name>\")\n .description(\"创建监控任务\")\n .requiredOption(\"--description <text>\", \"任务描述\")\n .requiredOption(\"--match-rules <json>\", \"匹配规则 JSON\")\n .requiredOption(\"--schedule <cron>\", \"cron 表达式\")\n .action(\n (\n name: string,\n opts: {\n description: string;\n matchRules: string;\n schedule: string;\n },\n ) => {\n const dir = tasksDir(ctx);\n const taskDir = join(dir, name);\n\n if (existsSync(taskDir)) {\n exitError(\"ALREADY_EXISTS\", `监控任务 '${name}' 已存在`);\n }\n\n let matchRules: Record<string, unknown>;\n try {\n matchRules = JSON.parse(opts.matchRules);\n } catch {\n exitError(\n \"VALIDATION_FAILED\",\n \"match-rules 必须是合法的 JSON\",\n );\n }\n\n mkdirSync(taskDir, { recursive: true });\n\n const meta: MonitorMeta = {\n name,\n description: opts.description,\n matchRules,\n cronSchedule: opts.schedule,\n enabled: true,\n createdAt: new Date().toISOString(),\n };\n writeMeta(taskDir, meta);\n writeFileSync(\n join(taskDir, \"fetch.py\"),\n generateFetchPy(name, matchRules),\n \"utf-8\",\n );\n writeFileSync(\n join(taskDir, \"README.md\"),\n generateReadme(name, opts.description),\n \"utf-8\",\n );\n\n output({\n ok: true,\n name,\n created: {\n script: `tasks/${name}/fetch.py`,\n readme: `tasks/${name}/README.md`,\n cronJob: `notif-${name}`,\n },\n cronHint: {\n action: \"add\",\n job: {\n name: `notif-${name}`,\n schedule: opts.schedule,\n sessionTarget: \"isolated\",\n message: `手机通知已由独立服务实时捕获到 notifications/ 目录的 JSON 文件中。\\n执行:python3 tasks/${name}/fetch.py --notifications-dir notifications\\n- NO_CHANGE 或 NO_MATCH → 不回复,直接结束。\\n- 有输出 → 读 tasks/${name}/README.md 了解如何处理数据并通知用户。`,\n },\n },\n });\n },\n );\n\n monitor\n .command(\"delete <name>\")\n .description(\"删除监控任务\")\n .option(\"--yes\", \"跳过确认\")\n .action((name: string, opts: { yes?: boolean }) => {\n const taskDir = join(tasksDir(ctx), name);\n if (!existsSync(taskDir)) {\n exitError(\"NOT_FOUND\", `监控任务 '${name}' 不存在`);\n }\n\n if (!opts.yes) {\n output({\n ok: false,\n error: {\n code: \"CONFIRMATION_REQUIRED\",\n message: `确认删除监控任务 '${name}'?添加 --yes 跳过确认`,\n },\n });\n process.exit(1);\n }\n\n rmSync(taskDir, { recursive: true, force: true });\n output({\n ok: true,\n name,\n deleted: true,\n cronHint: {\n action: \"remove\",\n name: `notif-${name}`,\n },\n });\n });\n\n monitor\n .command(\"enable <name>\")\n .description(\"启用监控任务\")\n .action((name: string) => {\n const taskDir = join(tasksDir(ctx), name);\n const meta = readMeta(taskDir);\n if (!meta) exitError(\"NOT_FOUND\", `监控任务 '${name}' 不存在`);\n\n meta.enabled = true;\n writeMeta(taskDir, meta);\n output({ ok: true, name, enabled: true });\n });\n\n monitor\n .command(\"disable <name>\")\n .description(\"暂停监控任务\")\n .action((name: string) => {\n const taskDir = join(tasksDir(ctx), name);\n const meta = readMeta(taskDir);\n if (!meta) exitError(\"NOT_FOUND\", `监控任务 '${name}' 不存在`);\n\n meta.enabled = false;\n writeMeta(taskDir, meta);\n output({ ok: true, name, enabled: false });\n });\n}\n",
60
58
  "/**\n * 共享的 fetch.py 生成逻辑,供 ntf-monitor CLI 和 light-rules gateway 复用。\n */\nexport function generateFetchPy(\n name: string,\n matchRules: Record<string, unknown>,\n): string {\n const appName = typeof matchRules.appName === \"string\" ? matchRules.appName : \"\";\n const senderKeywords = stringArray(matchRules.senderKeywords);\n const contentKeywords = stringArray(matchRules.contentKeywords);\n\n return `#!/usr/bin/env python3\n\"\"\"Auto-generated fetch script for monitor task: ${name}\"\"\"\nimport json, sys, os\nfrom pathlib import Path\n\ndef matches(notification: dict) -> bool:\n app = str(notification.get(\"appName\", \"\") or \"\")\n title = str(notification.get(\"title\", \"\") or \"\")\n content = str(notification.get(\"content\", \"\") or \"\")\n body = str(notification.get(\"body\", \"\") or \"\")\n\n app_name = ${pyLiteral(appName)}\n if app_name and app != app_name:\n return False\n\n sender_keywords = ${pyLiteral(senderKeywords)}\n sender_haystack = f\"{title}\\\\n{content}\\\\n{body}\"\n if sender_keywords and not any(keyword in sender_haystack for keyword in sender_keywords):\n return False\n\n content_keywords = ${pyLiteral(contentKeywords)}\n content_haystack = f\"{content}\\\\n{body}\"\n if content_keywords and not any(keyword in content_haystack for keyword in content_keywords):\n return False\n\n return True\n\ndef main():\n import argparse\n parser = argparse.ArgumentParser()\n parser.add_argument(\"--notifications-dir\", required=True)\n args = parser.parse_args()\n\n checkpoint_path = Path(__file__).parent / \"checkpoint.json\"\n checkpoint = {}\n if checkpoint_path.exists():\n checkpoint = json.loads(checkpoint_path.read_text())\n\n ntf_dir = Path(args.notifications_dir)\n matched = []\n new_checkpoint = dict(checkpoint)\n\n for f in sorted(ntf_dir.glob(\"*.json\")):\n date_key = f.stem\n items = json.loads(f.read_text())\n last_idx = checkpoint.get(date_key, {}).get(\"lastIndex\", -1)\n for i, item in enumerate(items):\n if i <= last_idx:\n continue\n if matches(item):\n matched.append(item)\n new_checkpoint[date_key] = {\"lastIndex\": len(items) - 1}\n\n checkpoint_path.write_text(json.dumps(new_checkpoint, indent=2))\n\n if not matched:\n print(\"NO_MATCH\")\n return\n\n for m in matched:\n print(json.dumps(m, ensure_ascii=False))\n\nif __name__ == \"__main__\":\n main()\n`;\n}\n\nfunction stringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.filter((item): item is string => typeof item === \"string\" && item.length > 0);\n}\n\nfunction pyLiteral(value: string | string[]): string {\n return JSON.stringify(value);\n}\n",
59
+ "import { randomUUID } from \"node:crypto\";\nimport { buildLightEffectApnsBody } from \"./protocol.js\";\nimport { getEnvUrls } from \"../env.js\";\nimport type { LightSegment } from \"../types.js\";\nimport type { RepeatArgument } from \"./repeat.js\";\n\nexport interface SendLightResult {\n ok: boolean;\n bizUniqueId?: string;\n response?: unknown;\n status?: number;\n error?: string;\n}\n\nexport async function sendLightEffect(\n apiKey: string,\n segments: LightSegment[],\n logger?: { info: (msg: string) => void; warn: (msg: string) => void },\n repeatInput?: RepeatArgument,\n reason?: string,\n title?: string,\n): Promise<SendLightResult> {\n const apiUrl = getEnvUrls().lightApiUrl;\n const appKey = \"phone-notifications\";\n const templateId = process.env.LIGHT_TEMPLATE_ID;\n const resolvedTitle = resolveLightTitle(title, reason, segments);\n\n logger?.info(\n `Light sender: apiUrl=${apiUrl ?? \"UNSET\"}, appKey=${appKey ? appKey.substring(0, 8) + \"…\" : \"UNSET\"}, templateId=${templateId ?? \"UNSET\"}, apiKey=${apiKey ? apiKey.substring(0, 20) + \"…\" : \"EMPTY\"}, title=${resolvedTitle}, reason=${reason ?? \"\"}, segments=${JSON.stringify(segments)}`,\n );\n\n if (!apiUrl || !appKey || !templateId) {\n return {\n ok: false,\n error:\n \"灯效 API 未配置,请确认构建时已封装 OPENCLAW_HOST_* / LIGHT_APP_KEY / LIGHT_TEMPLATE_ID\",\n };\n }\n\n let bizContent: string;\n try {\n bizContent = buildLightEffectApnsBody(segments, repeatInput, reason);\n } catch (error: any) {\n return { ok: false, error: error?.message ?? String(error) };\n }\n const bizUniqueId = randomUUID();\n\n const requestBody = {\n appKey,\n bizMap: { noticeType: \"APP_NOTIFICATION_IMPORTANT\", title: resolvedTitle, reason },\n bizUniqueId,\n paramsMap: { bizContent },\n pushType: \"SPECIFY_PUSH\",\n templateId,\n };\n\n logger?.info(\n `Light sender: POST ${apiUrl}, bizUniqueId=${bizUniqueId}, body=${JSON.stringify(requestBody).substring(0, 500)}`,\n );\n\n const res = await fetch(apiUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Api-Key-Id\": apiKey.startsWith(\"Bearer \")\n ? apiKey.slice(\"Bearer \".length)\n : apiKey,\n },\n body: JSON.stringify(requestBody),\n });\n\n const resBody = await res.text();\n if (!res.ok) {\n logger?.warn(\n `Light sender: FAILED ${res.status}, url=${apiUrl}, resBody=${resBody.substring(0, 500)}`,\n );\n return { ok: false, status: res.status, error: resBody };\n }\n\n logger?.info(`Light sender: OK bizUniqueId=${bizUniqueId}, resBody=${resBody.substring(0, 200)}`);\n return { ok: true, bizUniqueId, response: JSON.parse(resBody) };\n}\n\nfunction resolveLightTitle(\n title: string | undefined,\n reason: string | undefined,\n segments: LightSegment[],\n): string {\n const trimmedTitle = title?.trim();\n if (trimmedTitle) return trimmedTitle;\n\n const trimmedReason = reason?.trim();\n if (trimmedReason) return trimmedReason;\n\n const modeDesc = segments.map((segment) => segment.mode).join(\"+\");\n return `Effect: ${modeDesc || \"custom\"}`;\n}\n",
61
60
  "import { type CliCommand, output, exitError } from \"./helpers.js\";\nimport { requireApiKey } from \"../auth/credentials.js\";\nimport { sendLightEffect } from \"../light/sender.js\";\nimport { parseAndValidateSegments } from \"../light/validators.js\";\nimport { assertAncsRepeatTimes, normalizeRepeatTimes } from \"../light/repeat.js\";\n\nexport function registerLightSend(light: CliCommand): void {\n light\n .command(\"send\")\n .description(\"发送灯效指令到硬件设备\")\n .requiredOption(\"--segments <json>\", \"灯效参数 JSON\")\n .option(\"--repeat\", \"无限循环播放(默认仅播放一轮)\")\n .option(\"--repeat-times <n>\", \"整条组合重复次数:0=无限,1=一轮;当前 ANCS 路径不支持 >=2\")\n .action(async (opts: { segments: string; repeat?: boolean; repeatTimes?: string }) => {\n let apiKey: string;\n try {\n apiKey = requireApiKey();\n } catch (e: any) {\n exitError(\"AUTH_REQUIRED\", e.message);\n }\n\n const segments = parseAndValidateSegments(opts.segments);\n let repeatTimes: number;\n try {\n repeatTimes = normalizeRepeatTimes({\n repeat: opts.repeat,\n repeat_times: opts.repeatTimes === undefined ? undefined : Number(opts.repeatTimes),\n });\n assertAncsRepeatTimes(repeatTimes);\n } catch (e: any) {\n exitError(\"VALIDATION_FAILED\", e.message);\n }\n\n const result = await sendLightEffect(\n apiKey,\n segments,\n undefined,\n { repeat_times: repeatTimes },\n );\n\n if (!result.ok) {\n exitError(\"HTTP_ERROR\", `请求失败: ${result.status} ${result.error}`);\n }\n\n output({ ok: true, bizUniqueId: result.bizUniqueId, response: result.response });\n });\n}\n",
62
- "import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { LIGHT_RULE_TOOL_NAME_LIST } from \"../light-rules/names.js\";\nimport { resolveConfigPath as resolveHostConfigPath } from \"../host.js\";\nimport { type CliCommand, output, exitError } from \"./helpers.js\";\n\ntype JsonObject = Record<string, unknown>;\n\nfunction isObject(value: unknown): value is JsonObject {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction ensureArray(obj: JsonObject, key: string): unknown[] {\n const current = obj[key];\n if (Array.isArray(current)) return current;\n const next: unknown[] = [];\n obj[key] = next;\n return next;\n}\n\nfunction hasOwnProperty(obj: JsonObject, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nfunction appendUniqueValues(target: unknown[], values: readonly string[]): boolean {\n let changed = false;\n for (const value of values) {\n if (!target.includes(value)) {\n target.push(value);\n changed = true;\n }\n }\n return changed;\n}\n\nfunction upsertToolsForPolicy(policy: JsonObject, tools: readonly string[]): boolean {\n if (Array.isArray(policy.allow)) {\n let changed = false;\n if (Array.isArray(policy.alsoAllow)) {\n changed = appendUniqueValues(\n policy.allow,\n policy.alsoAllow.filter((value): value is string => typeof value === \"string\"),\n );\n }\n changed = appendUniqueValues(policy.allow, tools) || changed;\n if (hasOwnProperty(policy, \"alsoAllow\")) {\n delete policy.alsoAllow;\n changed = true;\n }\n return changed;\n }\n\n if (hasOwnProperty(policy, \"allow\")) return false;\n\n const alsoAllow = ensureArray(policy, \"alsoAllow\");\n return appendUniqueValues(alsoAllow, tools);\n}\n\nfunction resolveConfigPath(): string {\n return resolveHostConfigPath();\n}\n\nconst LIGHT_TOOLS = [\"light_control\", ...LIGHT_RULE_TOOL_NAME_LIST] as const;\n\nfunction upsertLightControlAlsoAllow(cfg: JsonObject): {\n globalChanged: boolean;\n mainAgentChanged: boolean;\n} {\n if (!isObject(cfg.tools)) cfg.tools = {};\n const globalChanged = upsertToolsForPolicy(cfg.tools as JsonObject, LIGHT_TOOLS);\n\n if (!isObject(cfg.agents)) cfg.agents = {};\n const agents = cfg.agents as JsonObject;\n const list = ensureArray(agents, \"list\");\n let mainAgent = list.find(\n (item) => isObject(item) && item.id === \"main\",\n ) as JsonObject | undefined;\n if (!mainAgent) {\n mainAgent = { id: \"main\" };\n list.push(mainAgent);\n }\n if (!isObject(mainAgent.tools)) mainAgent.tools = {};\n const mainAgentChanged = upsertToolsForPolicy(mainAgent.tools as JsonObject, LIGHT_TOOLS);\n\n return { globalChanged, mainAgentChanged };\n}\n\nexport function registerLightSetupTools(light: CliCommand): void {\n light\n .command(\"setup\")\n .description(\"自动放行 light_control(兼容 tools.allow / tools.alsoAllow)\")\n .action(() => {\n const configPath = resolveConfigPath();\n if (!existsSync(configPath)) {\n exitError(\"CONFIG_NOT_FOUND\", `未找到配置文件: ${configPath}`);\n }\n\n let cfg: JsonObject = {};\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const parsed = JSON.parse(raw);\n if (isObject(parsed)) cfg = parsed;\n } catch (err: any) {\n exitError(\"CONFIG_INVALID\", `读取/解析配置失败: ${err?.message ?? String(err)}`);\n }\n\n const result = upsertLightControlAlsoAllow(cfg);\n try {\n mkdirSync(dirname(configPath), { recursive: true });\n writeFileSync(configPath, JSON.stringify(cfg, null, 2) + \"\\n\", \"utf-8\");\n } catch (err: any) {\n exitError(\"WRITE_FAILED\", `写入配置失败: ${err?.message ?? String(err)}`);\n }\n\n output({\n ok: true,\n configPath,\n changed: result.globalChanged || result.mainAgentChanged,\n updates: {\n toolsAlsoAllow: result.globalChanged ? \"added\" : \"already_exists\",\n mainAgentAlsoAllow: result.mainAgentChanged ? \"added\" : \"already_exists\",\n },\n next: \"请执行: openclaw gateway restart\",\n });\n });\n}\n",
61
+ "import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { LIGHT_RULE_TOOL_NAME_LIST } from \"../light-rules/names.js\";\nimport { resolveConfigPath as resolveHostConfigPath } from \"../host.js\";\nimport { type CliCommand, output, exitError } from \"./helpers.js\";\n\ntype JsonObject = Record<string, unknown>;\n\nfunction isObject(value: unknown): value is JsonObject {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction ensureArray(obj: JsonObject, key: string): unknown[] {\n const current = obj[key];\n if (Array.isArray(current)) return current;\n const next: unknown[] = [];\n obj[key] = next;\n return next;\n}\n\nfunction hasOwnProperty(obj: JsonObject, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nfunction appendUniqueValues(target: unknown[], values: readonly string[]): boolean {\n let changed = false;\n for (const value of values) {\n if (!target.includes(value)) {\n target.push(value);\n changed = true;\n }\n }\n return changed;\n}\n\nfunction upsertToolsForPolicy(policy: JsonObject, tools: readonly string[]): boolean {\n if (Array.isArray(policy.allow)) {\n let changed = false;\n if (Array.isArray(policy.alsoAllow)) {\n changed = appendUniqueValues(\n policy.allow,\n policy.alsoAllow.filter((value): value is string => typeof value === \"string\"),\n );\n }\n changed = appendUniqueValues(policy.allow, tools) || changed;\n if (hasOwnProperty(policy, \"alsoAllow\")) {\n delete policy.alsoAllow;\n changed = true;\n }\n return changed;\n }\n\n if (hasOwnProperty(policy, \"allow\")) return false;\n\n const alsoAllow = ensureArray(policy, \"alsoAllow\");\n return appendUniqueValues(alsoAllow, tools);\n}\n\nfunction resolveConfigPath(): string {\n return resolveHostConfigPath();\n}\n\nconst LIGHT_TOOLS = [...LIGHT_RULE_TOOL_NAME_LIST] as const;\n\nfunction upsertLightRuleToolsAlsoAllow(cfg: JsonObject): {\n globalChanged: boolean;\n mainAgentChanged: boolean;\n} {\n if (!isObject(cfg.tools)) cfg.tools = {};\n const globalChanged = upsertToolsForPolicy(cfg.tools as JsonObject, LIGHT_TOOLS);\n\n if (!isObject(cfg.agents)) cfg.agents = {};\n const agents = cfg.agents as JsonObject;\n const list = ensureArray(agents, \"list\");\n let mainAgent = list.find(\n (item) => isObject(item) && item.id === \"main\",\n ) as JsonObject | undefined;\n if (!mainAgent) {\n mainAgent = { id: \"main\" };\n list.push(mainAgent);\n }\n if (!isObject(mainAgent.tools)) mainAgent.tools = {};\n const mainAgentChanged = upsertToolsForPolicy(mainAgent.tools as JsonObject, LIGHT_TOOLS);\n\n return { globalChanged, mainAgentChanged };\n}\n\nexport function registerLightSetupTools(light: CliCommand): void {\n light\n .command(\"setup\")\n .description(\"自动放行云端灯效规则工具(兼容 tools.allow / tools.alsoAllow)\")\n .action(() => {\n const configPath = resolveConfigPath();\n if (!existsSync(configPath)) {\n exitError(\"CONFIG_NOT_FOUND\", `未找到配置文件: ${configPath}`);\n }\n\n let cfg: JsonObject = {};\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const parsed = JSON.parse(raw);\n if (isObject(parsed)) cfg = parsed;\n } catch (err: any) {\n exitError(\"CONFIG_INVALID\", `读取/解析配置失败: ${err?.message ?? String(err)}`);\n }\n\n const result = upsertLightRuleToolsAlsoAllow(cfg);\n try {\n mkdirSync(dirname(configPath), { recursive: true });\n writeFileSync(configPath, JSON.stringify(cfg, null, 2) + \"\\n\", \"utf-8\");\n } catch (err: any) {\n exitError(\"WRITE_FAILED\", `写入配置失败: ${err?.message ?? String(err)}`);\n }\n\n output({\n ok: true,\n configPath,\n changed: result.globalChanged || result.mainAgentChanged,\n updates: {\n toolsAlsoAllow: result.globalChanged ? \"added\" : \"already_exists\",\n mainAgentAlsoAllow: result.mainAgentChanged ? \"added\" : \"already_exists\",\n },\n next: \"请执行: openclaw gateway restart\",\n });\n });\n}\n",
63
62
  "import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { TunnelStatusInfo } from \"./relay-client.js\";\n\nexport const TUNNEL_STATUS_REL_PATH = join(\n \"plugins\",\n \"phone-notifications\",\n \"tunnel-status.json\",\n);\nexport const TUNNEL_LOCK_REL_PATH = join(\n \"plugins\",\n \"phone-notifications\",\n \"relay-tunnel.lock\",\n);\n\ntype TunnelState = TunnelStatusInfo[\"state\"];\n\ninterface TunnelLockInfo {\n pid: number;\n startedAt: string;\n}\n\nexport interface TunnelStatusAssessment {\n status: TunnelStatusInfo | null;\n issueCode: \"STATUS_NOT_FOUND\" | \"STATUS_INVALID\" | \"STATUS_STALE\" | null;\n issueMessage: string | null;\n statusFilePath: string;\n lockFilePath: string;\n lock: {\n exists: boolean;\n pid: number | null;\n startedAt: string | null;\n active: boolean | null;\n };\n}\n\nfunction isTunnelState(value: unknown): value is TunnelState {\n return (\n value === \"connected\" ||\n value === \"connecting\" ||\n value === \"disconnected\" ||\n value === \"stopped\"\n );\n}\n\nfunction isTunnelStatusInfo(value: unknown): value is TunnelStatusInfo {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const obj = value as Record<string, unknown>;\n return (\n isTunnelState(obj.state) &&\n typeof obj.since === \"string\" &&\n typeof obj.reconnectAttempt === \"number\" &&\n (obj.lastDisconnectReason === undefined ||\n typeof obj.lastDisconnectReason === \"string\")\n );\n}\n\nfunction parseTunnelLockInfo(value: unknown): TunnelLockInfo | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const obj = value as Record<string, unknown>;\n return typeof obj.pid === \"number\" && typeof obj.startedAt === \"string\"\n ? { pid: obj.pid, startedAt: obj.startedAt }\n : null;\n}\n\nfunction isProcessAlive(pid: number): boolean {\n if (!Number.isInteger(pid) || pid <= 0) return false;\n if (pid === process.pid) return true;\n try {\n process.kill(pid, 0);\n return true;\n } catch (err: any) {\n return err?.code === \"EPERM\";\n }\n}\n\nfunction isStatusOlderThanLock(\n statusSince: string,\n lockStartedAt: string,\n): boolean {\n const statusTs = Date.parse(statusSince);\n const lockTs = Date.parse(lockStartedAt);\n if (Number.isNaN(statusTs) || Number.isNaN(lockTs)) return false;\n return statusTs + 1000 < lockTs;\n}\n\nfunction staleStatusMessage(\n status: TunnelStatusInfo,\n lock: TunnelStatusAssessment[\"lock\"],\n): string {\n const prefix = `隧道状态文件显示已连接(自 ${status.since})`;\n\n if (!lock.exists) {\n return `${prefix},但未找到本地运行锁,状态可能已过期。请重启 openclaw 主进程。`;\n }\n\n if (lock.pid === null || lock.startedAt === null) {\n return `${prefix},但本地运行锁内容不完整,无法确认当前连接是否仍然有效。请重启 openclaw 主进程。`;\n }\n\n if (lock.active === false) {\n return `${prefix},但本地运行锁仍指向已退出的进程 pid=${lock.pid},状态可能已过期。请重启 openclaw 主进程。`;\n }\n\n return `${prefix},但当前运行锁启动于 ${lock.startedAt},晚于状态时间,说明状态未随新进程刷新。请重启 openclaw 主进程。`;\n}\n\nexport function assessTunnelStatus(stateDir: string): TunnelStatusAssessment {\n const statusFilePath = join(stateDir, TUNNEL_STATUS_REL_PATH);\n const lockFilePath = join(stateDir, TUNNEL_LOCK_REL_PATH);\n\n if (!existsSync(statusFilePath)) {\n return {\n status: null,\n issueCode: \"STATUS_NOT_FOUND\",\n issueMessage:\n \"未找到隧道状态文件,隧道服务可能尚未启动过。请确认 openclaw 主进程正在运行。\",\n statusFilePath,\n lockFilePath,\n lock: {\n exists: existsSync(lockFilePath),\n pid: null,\n startedAt: null,\n active: null,\n },\n };\n }\n\n let rawStatus: unknown;\n try {\n rawStatus = JSON.parse(readFileSync(statusFilePath, \"utf-8\"));\n } catch {\n return {\n status: null,\n issueCode: \"STATUS_INVALID\",\n issueMessage: \"隧道状态文件解析失败,文件内容损坏或格式不正确。请重启 openclaw 主进程。\",\n statusFilePath,\n lockFilePath,\n lock: {\n exists: existsSync(lockFilePath),\n pid: null,\n startedAt: null,\n active: null,\n },\n };\n }\n\n if (!isTunnelStatusInfo(rawStatus)) {\n return {\n status: null,\n issueCode: \"STATUS_INVALID\",\n issueMessage: \"隧道状态文件缺少必要字段或字段类型不正确。请重启 openclaw 主进程。\",\n statusFilePath,\n lockFilePath,\n lock: {\n exists: existsSync(lockFilePath),\n pid: null,\n startedAt: null,\n active: null,\n },\n };\n }\n\n const status = rawStatus;\n const lockExists = existsSync(lockFilePath);\n let lockInfo: TunnelLockInfo | null = null;\n\n if (lockExists) {\n try {\n lockInfo = parseTunnelLockInfo(JSON.parse(readFileSync(lockFilePath, \"utf-8\")));\n } catch {\n lockInfo = null;\n }\n }\n\n const lock = {\n exists: lockExists,\n pid: lockInfo?.pid ?? null,\n startedAt: lockInfo?.startedAt ?? null,\n active: lockInfo ? isProcessAlive(lockInfo.pid) : null,\n };\n\n if (status.state === \"connected\") {\n const isStale =\n !lock.exists ||\n lock.pid === null ||\n lock.startedAt === null ||\n lock.active === false ||\n isStatusOlderThanLock(status.since, lock.startedAt);\n\n if (isStale) {\n return {\n status,\n issueCode: \"STATUS_STALE\",\n issueMessage: staleStatusMessage(status, lock),\n statusFilePath,\n lockFilePath,\n lock,\n };\n }\n }\n\n return {\n status,\n issueCode: null,\n issueMessage: null,\n statusFilePath,\n lockFilePath,\n lock,\n };\n}\n",
64
63
  "import { loadApiKey } from \"../auth/credentials.js\";\nimport { getEnvUrls } from \"../env.js\";\nimport { output, exitError } from \"./helpers.js\";\nimport type { CliCommand, CliContext } from \"./helpers.js\";\nimport type { TunnelStatusInfo } from \"../tunnel/relay-client.js\";\nimport { assessTunnelStatus } from \"../tunnel/status.js\";\n\nfunction formatMessage(status: TunnelStatusInfo): string {\n switch (status.state) {\n case \"connected\":\n return `隧道已连接(自 ${status.since})`;\n case \"connecting\":\n return `隧道正在连接(自 ${status.since},第 ${status.reconnectAttempt} 次重连)`;\n case \"disconnected\":\n return `隧道已断开(自 ${status.since})${status.lastDisconnectReason ? `,原因: ${status.lastDisconnectReason}` : \"\"},等待重连(第 ${status.reconnectAttempt} 次)`;\n case \"stopped\":\n return `隧道服务已停止(自 ${status.since})`;\n default:\n return `未知状态: ${status.state}`;\n }\n}\n\nexport function registerTunnelStatus(ntf: CliCommand, ctx: CliContext): void {\n ntf\n .command(\"tunnel-status\")\n .description(\"检查 Relay Tunnel 隧道连接状态(读取运行中服务的状态文件,不影响已有连接)\")\n .action(async () => {\n const tunnelUrl = getEnvUrls().relayTunnelUrl;\n const apiKey = loadApiKey();\n\n if (!tunnelUrl) {\n exitError(\n \"TUNNEL_NOT_CONFIGURED\",\n \"RELAY_TUNNEL_URL 未配置,隧道功能未启用。请在构建时设置 RELAY_TUNNEL_URL 环境变量。\",\n );\n }\n\n if (!apiKey) {\n exitError(\n \"TOKEN_MISSING\",\n \"API Key 未设置,隧道无法连接。请执行 ntf auth set-api-key <apiKey>\",\n );\n }\n\n if (!ctx.stateDir) {\n exitError(\n \"STATE_DIR_UNAVAILABLE\",\n \"无法确定状态目录,无法检查隧道状态。请在 openclaw 主环境中执行该命令。\",\n );\n }\n\n const assessment = assessTunnelStatus(ctx.stateDir);\n const status = assessment.status;\n\n if (!status) {\n exitError(\n assessment.issueCode ?? \"STATUS_NOT_FOUND\",\n assessment.issueMessage ??\n \"未找到隧道状态文件,隧道服务可能尚未启动过。请确认 openclaw 主进程正在运行。\",\n );\n }\n\n if (assessment.issueCode) {\n exitError(assessment.issueCode, assessment.issueMessage ?? formatMessage(status));\n }\n\n const ok = status.state === \"connected\";\n output({\n ok,\n tunnelUrl,\n connection: {\n state: status.state,\n since: status.since,\n reconnectAttempt: status.reconnectAttempt,\n lastDisconnectReason: status.lastDisconnectReason,\n },\n runtime: {\n lockOwnerPid: assessment.lock.pid,\n lockOwnerStartedAt: assessment.lock.startedAt,\n lockOwnerActive: assessment.lock.active,\n },\n message: formatMessage(status),\n });\n\n if (!ok) process.exit(1);\n });\n}\n",
65
64
  "import {\n type CliCommand,\n type CliContext,\n resolveNotificationsDir,\n output,\n exitError,\n} from \"./helpers.js\";\n\nexport function registerNtfStoragePath(ntf: CliCommand, ctx: CliContext): void {\n ntf\n .command(\"storage-path\")\n .description(\"查询通知存储路径\")\n .action(() => {\n const dir = resolveNotificationsDir(ctx);\n if (!dir) exitError(\"STORAGE_UNAVAILABLE\", \"通知存储目录不可用\");\n output({ ok: true, path: dir });\n });\n}\n",
@@ -79,41 +78,47 @@
79
78
  "import {\n type CliCommand,\n type CliContext,\n resolveRecordingsDir,\n readRecordingIndex,\n output,\n exitError,\n} from \"./helpers.js\";\n\nexport function registerRecStatus(rec: CliCommand, ctx: CliContext): void {\n rec\n .command(\"status <id>\")\n .description(\"查看单条录音详情\")\n .action((id: string) => {\n const dir = resolveRecordingsDir(ctx);\n if (!dir) exitError(\"STORAGE_UNAVAILABLE\", \"录音存储目录不可用\");\n\n const recordings = readRecordingIndex(dir);\n const entry = recordings.find((r) => r.id === id);\n\n if (!entry) {\n exitError(\"NOT_FOUND\", `录音不存在: ${id}`);\n }\n\n output({\n ok: true,\n recording: {\n id: entry.id,\n name: entry.metadata.name,\n duration_sec: entry.metadata.duration_sec,\n file_size_bytes: entry.metadata.file_size_bytes,\n status: entry.status,\n created_at: entry.metadata.created_at,\n location: entry.metadata.location ?? null,\n markers: entry.metadata.markers ?? [],\n audioFile: entry.audioFile ?? null,\n srtFile: entry.srtFile ?? null,\n transcriptDataFile: entry.transcriptDataFile ?? null,\n transcriptFile: entry.transcriptFile ?? null,\n summaryFile: entry.summaryFile ?? null,\n title: entry.title ?? null,\n error: entry.lastError ?? null,\n ingestedAt: entry.ingestedAt,\n updatedAt: entry.updatedAt,\n },\n });\n });\n}\n",
80
79
  "import {\n type CliCommand,\n type CliContext,\n resolveRecordingsDir,\n output,\n exitError,\n} from \"./helpers.js\";\n\nexport function registerRecStoragePath(\n rec: CliCommand,\n ctx: CliContext,\n): void {\n rec\n .command(\"storage-path\")\n .description(\"查询录音存储路径\")\n .action(() => {\n const dir = resolveRecordingsDir(ctx);\n if (!dir) exitError(\"STORAGE_UNAVAILABLE\", \"录音存储目录不可用\");\n output({ ok: true, path: dir });\n });\n}\n",
81
80
  "import { createInterface } from \"node:readline\";\nimport { writeFileSync, existsSync, readFileSync } from \"node:fs\";\nimport type { CliCommand, CliContext } from \"./helpers.js\";\nimport { resolveAsrConfigPath, output } from \"./helpers.js\";\nimport type { AsrConfig, WhisperModelSize, WhisperBackend, WhisperModelSource } from \"../types.js\";\n\n// ─── Prompt helpers ───\n\ntype Rl = ReturnType<typeof createInterface>;\n\nfunction ask(rl: Rl, question: string): Promise<string> {\n return new Promise((resolve) => rl.question(question, resolve));\n}\n\n/**\n * Ask for a single choice from a numbered list.\n * Writes the list and prompt to stderr; returns the 0-based index of the chosen item.\n */\nasync function askChoice(\n rl: Rl,\n prompt: string,\n choices: readonly string[],\n defaultIdx = 0,\n): Promise<number> {\n choices.forEach((c, i) => {\n const marker = i === defaultIdx ? \"●\" : \"○\";\n process.stderr.write(` ${marker} ${i + 1}. ${c}\\n`);\n });\n while (true) {\n const ans = (await ask(rl, `${prompt} [1-${choices.length},默认 ${defaultIdx + 1}]: `)).trim();\n if (!ans) return defaultIdx;\n const n = parseInt(ans, 10);\n if (!isNaN(n) && n >= 1 && n <= choices.length) return n - 1;\n process.stderr.write(` 请输入 1-${choices.length} 之间的数字\\n`);\n }\n}\n\n/** Ask for a value; returns undefined if user presses Enter with no input. */\nasync function askOptional(rl: Rl, prompt: string): Promise<string | undefined> {\n const ans = (await ask(rl, `${prompt} [可选,直接回车跳过]: `)).trim();\n return ans || undefined;\n}\n\n// ─── Mode-specific setup flows ───\n\nasync function setupApi(rl: Rl): Promise<AsrConfig> {\n process.stderr.write(\"\\n─── 云端 ASR(model-proxy)配置 ───\\n\\n\");\n process.stderr.write(\"说明:不再填写第三方 API Key,插件会复用当前账号的 API Key 调用 model-proxy 长录音接口。\\n\\n\");\n\n const endpoint = await askOptional(rl, \"自定义 model-proxy submit-task 端点 URL\");\n const language = await askOptional(rl, \"语言提示(如 zh / en)\");\n const enableNormalizationInput = await askOptional(rl, \"启用文本规范化 ITN?(y/N)\");\n const normalized = enableNormalizationInput?.trim().toLowerCase();\n const enableNormalization =\n normalized === \"y\" || normalized === \"yes\" || normalized === \"true\";\n\n return {\n mode: \"api\",\n api: {\n ...(endpoint ? { endpoint } : {}),\n ...(language ? { language } : {}),\n ...(enableNormalizationInput ? { enableNormalization } : {}),\n },\n };\n}\n\nasync function setupLocal(rl: Rl): Promise<AsrConfig> {\n process.stderr.write(\"\\n─── 本地 Whisper 转写配置 ───\\n\\n\");\n\n process.stderr.write(\"模型大小:\\n\");\n const modelChoices = [\n \"自动选择(根据可用内存推荐)\",\n \"tiny\",\n \"base\",\n \"small\",\n \"medium\",\n \"large-v3\",\n ] as const;\n const modelIdx = await askChoice(rl, \"选择模型\", modelChoices);\n const model: WhisperModelSize | undefined =\n modelIdx === 0 ? undefined : (modelChoices[modelIdx] as WhisperModelSize);\n\n const language = await askOptional(rl, \"语言提示(如 zh / en,留空自动检测)\");\n\n process.stderr.write(\"\\n推理后端:\\n\");\n const backendChoices = [\n \"自动选择(根据运行环境推荐)\",\n \"coreml(Apple Silicon 推荐)\",\n \"cuda(NVIDIA GPU)\",\n \"cpu\",\n ] as const;\n const backendIdx = await askChoice(rl, \"选择后端\", backendChoices);\n const backend: WhisperBackend | undefined =\n backendIdx === 0 ? undefined : ([\"coreml\", \"cuda\", \"cpu\"] as const)[backendIdx - 1];\n\n process.stderr.write(\"\\n模型下载源:\\n\");\n const sourceChoices = [\n \"auto(自动探测,优先 HuggingFace,失败回退国内镜像)\",\n \"huggingface(海外直连)\",\n \"domestic(国内镜像)\",\n ] as const;\n const sourceIdx = await askChoice(rl, \"选择下载源\", sourceChoices);\n const modelSource: WhisperModelSource = ([\"auto\", \"huggingface\", \"domestic\"] as const)[sourceIdx];\n\n const modelMirrorUrl = await askOptional(rl, \"自定义模型下载地址(覆盖下载源)\");\n\n return {\n mode: \"local\",\n local: {\n ...(model ? { model } : {}),\n ...(language ? { language } : {}),\n ...(backend ? { backend } : {}),\n modelSource,\n ...(modelMirrorUrl ? { modelMirrorUrl } : {}),\n },\n };\n}\n\n// ─── Command registration ───\n\nexport function registerRecSetup(rec: CliCommand, ctx: CliContext): void {\n rec\n .command(\"setup\")\n .description(\"交互式配置 ASR 转写参数,保存到本地配置文件\")\n .action(async () => {\n const configPath = resolveAsrConfigPath(ctx);\n\n // Show existing config hint if present\n if (existsSync(configPath)) {\n try {\n const existing = JSON.parse(readFileSync(configPath, \"utf-8\")) as AsrConfig & { updatedAt?: string };\n process.stderr.write(`当前已有配置:mode = ${existing.mode}`);\n if (existing.updatedAt) process.stderr.write(`,更新于 ${existing.updatedAt}`);\n process.stderr.write(\"\\n\");\n } catch {\n // ignore parse errors\n }\n }\n\n const rl = createInterface({ input: process.stdin, output: process.stderr, terminal: true });\n\n try {\n process.stderr.write(\"\\n转写模式:\\n\");\n const modeIdx = await askChoice(rl, \"选择模式\", [\"api(云端 model-proxy 长录音)\", \"local(本地 Whisper)\"]);\n\n const config: AsrConfig = modeIdx === 0 ? await setupApi(rl) : await setupLocal(rl);\n const stored = { ...config, updatedAt: new Date().toISOString() };\n\n writeFileSync(configPath, JSON.stringify(stored, null, 2), \"utf-8\");\n process.stderr.write(`\\n✓ 配置已保存到 ${configPath}\\n\\n`);\n\n output({ ok: true, ...stored });\n } finally {\n rl.close();\n }\n });\n}\n",
81
+ "import {\n type CliCommand,\n type CliContext,\n resolveImagesDir,\n readImageIndex,\n output,\n exitError,\n} from \"./helpers.js\";\n\nexport function registerImageList(image: CliCommand, ctx: CliContext): void {\n image\n .command(\"list\")\n .description(\"列出所有图片(可按状态/来源应用过滤)\")\n .option(\"--status <status>\", \"按状态过滤(syncing|synced|sync_failed)\")\n .option(\"--app <app>\", \"按来源应用过滤\")\n .action((opts: { status?: string; app?: string }) => {\n const dir = resolveImagesDir(ctx);\n if (!dir) exitError(\"STORAGE_UNAVAILABLE\", \"图片存储目录不可用\");\n\n let images = readImageIndex(dir);\n\n if (opts.status) {\n images = images.filter((e) => e.status === opts.status);\n }\n if (opts.app) {\n images = images.filter((e) => e.metadata.source_app === opts.app);\n }\n\n const items = images.map((e) => ({\n imageId: e.imageId,\n status: e.status,\n source_app: e.metadata.source_app ?? null,\n caption: e.metadata.caption ?? null,\n mime_type: e.metadata.mime_type ?? null,\n size_bytes: e.metadata.size_bytes ?? null,\n created_at: e.metadata.created_at,\n has_file: !!e.localFile,\n localFile: e.localFile ?? null,\n syncedAt: e.syncedAt ?? null,\n error: e.lastError ?? null,\n }));\n\n output({ ok: true, total: items.length, images: items });\n });\n}\n",
82
+ "import {\n type CliCommand,\n type CliContext,\n resolveImagesDir,\n readImageIndex,\n output,\n exitError,\n} from \"./helpers.js\";\n\nexport function registerImageStatus(image: CliCommand, ctx: CliContext): void {\n image\n .command(\"status <id>\")\n .description(\"查看单张图片详情\")\n .action((id: string) => {\n const dir = resolveImagesDir(ctx);\n if (!dir) exitError(\"STORAGE_UNAVAILABLE\", \"图片存储目录不可用\");\n\n const entry = readImageIndex(dir).find((e) => e.imageId === id);\n if (!entry) {\n exitError(\"NOT_FOUND\", `图片不存在: ${id}`);\n }\n\n output({\n ok: true,\n image: {\n imageId: entry.imageId,\n clientLabel: entry.clientLabel ?? null,\n status: entry.status,\n metadata: entry.metadata,\n localFile: entry.localFile ?? null,\n thumbnail: entry.thumbnail ?? null,\n syncedAt: entry.syncedAt ?? null,\n error: entry.lastError ?? null,\n },\n });\n });\n}\n",
83
+ "import {\n type CliCommand,\n type CliContext,\n resolveImagesDir,\n readImageIndex,\n resolveImageFile,\n output,\n exitError,\n} from \"./helpers.js\";\n\nexport function registerImagePath(image: CliCommand, ctx: CliContext): void {\n image\n .command(\"path <id>\")\n .description(\"打印图片本地文件绝对路径\")\n .action((id: string) => {\n const dir = resolveImagesDir(ctx);\n if (!dir) exitError(\"STORAGE_UNAVAILABLE\", \"图片存储目录不可用\");\n\n const entry = readImageIndex(dir).find((e) => e.imageId === id);\n if (!entry) {\n exitError(\"NOT_FOUND\", `图片不存在: ${id}`);\n }\n\n if (entry.status !== \"synced\" || !entry.localFile) {\n exitError(\n \"IMAGE_NOT_READY\",\n `图片 ${id} 尚未下载完成(status=${entry.status}${entry.lastError ? `, error=${entry.lastError}` : \"\"})`,\n );\n }\n\n output({ ok: true, path: resolveImageFile(dir, entry.localFile) });\n });\n}\n",
84
+ "import {\n type CliCommand,\n type CliContext,\n resolveImagesDir,\n output,\n exitError,\n} from \"./helpers.js\";\n\nexport function registerImageStoragePath(\n image: CliCommand,\n ctx: CliContext,\n): void {\n image\n .command(\"storage-path\")\n .description(\"查询图片存储路径\")\n .action(() => {\n const dir = resolveImagesDir(ctx);\n if (!dir) exitError(\"STORAGE_UNAVAILABLE\", \"图片存储目录不可用\");\n output({ ok: true, path: dir });\n });\n}\n",
82
85
  "import { spawnSync } from \"node:child_process\";\nimport { writeFileSync, unlinkSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport os from \"node:os\";\nimport { loadEnvName } from \"../env.js\";\nimport { resolveStateDir } from \"../host.js\";\nimport {\n resolveUpdateBaseUrl,\n resolveUpdateChannel,\n resolveUpdateTags,\n} from \"../update/channel.js\";\nimport { isNewerVersion, pickNewestVersion } from \"../update/semver.js\";\nimport { PLUGIN_VERSION } from \"../version.js\";\nimport { output } from \"./helpers.js\";\nimport type { CliCommand, CliContext } from \"./helpers.js\";\n\nasync function fetchText(url: string): Promise<string> {\n const res = await fetch(url, { signal: AbortSignal.timeout(30_000) });\n if (!res.ok) {\n throw new Error(`请求失败: ${url} (HTTP ${res.status})`);\n }\n return res.text();\n}\n\nasync function fetchLatestVersion(\n baseUrl: string,\n tags: ReadonlyArray<\"latest\" | \"beta\">,\n): Promise<string> {\n const results = await Promise.allSettled(\n tags.map(async (tag) => {\n return (await fetchText(`${baseUrl}/${tag}`)).trim();\n }),\n );\n const latest = pickNewestVersion(\n results.map((result) => result.status === \"fulfilled\" ? result.value : null),\n );\n if (latest) return latest;\n\n const rejected = results.find((result) => result.status === \"rejected\");\n if (rejected?.status === \"rejected\") throw rejected.reason;\n throw new Error(`版本标记为空: ${baseUrl}`);\n}\n\nasync function runUpdate(\n ctx: CliContext,\n opts: { json?: boolean; force?: boolean; beta?: boolean },\n): Promise<void> {\n const json = opts.json === true;\n const force = opts.force === true;\n const beta = opts.beta === true;\n const envName = loadEnvName();\n const channel = beta\n ? \"beta\"\n : resolveUpdateChannel({ envName, installedVersion: PLUGIN_VERSION });\n const checkingBeta = channel === \"beta\";\n const baseUrl = resolveUpdateBaseUrl({ envName });\n const log = (msg: string) => {\n if (!json) process.stderr.write(`${msg}\\n`);\n };\n\n log(`检查${checkingBeta ? \" beta\" : \"\"}最新版本 ...`);\n\n let latest: string;\n try {\n latest = await fetchLatestVersion(\n baseUrl,\n beta ? [\"beta\"] : resolveUpdateTags(channel),\n );\n } catch (err: any) {\n const msg = `无法获取最新版本: ${err?.message ?? String(err)}`;\n if (json) {\n output({ ok: false, error: { code: \"FETCH_FAILED\", message: msg } });\n process.exit(1);\n }\n process.stderr.write(`\\x1b[31m[update] ERROR:\\x1b[0m ${msg}\\n`);\n process.exit(1);\n }\n\n const current = PLUGIN_VERSION;\n\n if (!force && !isNewerVersion(latest, current)) {\n log(`\\x1b[32m已是最新${checkingBeta ? \" beta\" : \"\"}版本 v${current}\\x1b[0m`);\n output({ ok: true, current, latest, channel, updated: false });\n return;\n }\n\n if (force) {\n log(`\\x1b[36m强制更新: v${current} → v${latest}\\x1b[0m`);\n } else {\n log(`\\x1b[36m发现新版本: v${current} → v${latest},开始更新 ...\\x1b[0m`);\n }\n\n // 下载 install-core.mjs\n log(\"下载安装脚本 ...\");\n let installScript: string;\n try {\n installScript = await fetchText(`${baseUrl}/install-core.mjs`);\n } catch (err: any) {\n const msg = `下载安装脚本失败: ${err?.message ?? String(err)}`;\n if (json) {\n output({ ok: false, error: { code: \"DOWNLOAD_FAILED\", message: msg } });\n process.exit(1);\n }\n process.stderr.write(`\\x1b[31m[update] ERROR:\\x1b[0m ${msg}\\n`);\n process.exit(1);\n }\n\n // 写入临时文件\n const tmpScript = join(os.tmpdir(), `openclaw-install-${Date.now()}.mjs`);\n try {\n writeFileSync(tmpScript, installScript, \"utf-8\");\n } catch (err: any) {\n const msg = `写入临时文件失败: ${err?.message ?? String(err)}`;\n if (json) {\n output({ ok: false, error: { code: \"WRITE_FAILED\", message: msg } });\n process.exit(1);\n }\n process.stderr.write(`\\x1b[31m[update] ERROR:\\x1b[0m ${msg}\\n`);\n process.exit(1);\n }\n\n const stateDir = resolveStateDir(ctx.stateDir);\n\n // 执行安装脚本(同步,保证日志有序输出)\n const result = spawnSync(\n process.execPath,\n [tmpScript, \"--version\", latest, \"--state-dir\", stateDir],\n { stdio: \"inherit\" },\n );\n\n try {\n unlinkSync(tmpScript);\n } catch {\n // 清理失败不影响结果\n }\n\n if (result.error) {\n const msg = `安装脚本执行失败: ${result.error.message}`;\n if (json) {\n output({ ok: false, error: { code: \"SPAWN_FAILED\", message: msg } });\n } else {\n process.stderr.write(`\\x1b[31m[update] ERROR:\\x1b[0m ${msg}\\n`);\n }\n process.exit(1);\n }\n\n if (result.status !== 0) {\n if (json) {\n output({\n ok: false,\n error: {\n code: \"INSTALL_FAILED\",\n message: `安装脚本退出码: ${result.status}`,\n },\n });\n }\n process.exit(result.status ?? 1);\n }\n\n if (json) {\n output({ ok: true, current, latest, channel, updated: true });\n }\n}\n\nexport function registerUpdate(ntf: CliCommand, ctx: CliContext): void {\n ntf\n .command(\"update\")\n .description(\"检查并更新插件到最新版本,更新后自动重启\")\n .option(\"--json\", \"以 JSON 格式输出结果(供脚本调用)\")\n .option(\"--force\", \"强制重新安装当前最新版本,即使版本号相同\")\n .option(\"--beta\", \"安装最新 beta 版本\")\n .action((opts: { json?: boolean; force?: boolean; beta?: boolean }) => {\n return runUpdate(ctx, opts);\n });\n}\n",
83
- "import type { CliCommand, CliContext } from \"./helpers.js\";\nimport { resolveStateDir } from \"../host.js\";\nimport { registerAuthCli } from \"./auth.js\";\nimport { registerNtfSearch } from \"./ntf-search.js\";\nimport { registerNtfSummary } from \"./ntf-summary.js\";\nimport { registerNtfStats } from \"./ntf-stats.js\";\nimport { registerNtfSync } from \"./ntf-sync.js\";\nimport { registerNtfMonitor } from \"./ntf-monitor.js\";\nimport { registerLightSend } from \"./light-send.js\";\nimport { registerLightSetupTools } from \"./light-setup-tools.js\";\nimport { registerTunnelStatus } from \"./tunnel-status.js\";\nimport { registerNtfStoragePath } from \"./ntf-storage-path.js\";\nimport { registerLogSearch } from \"./log-search.js\";\nimport { registerEnvCli } from \"./env.js\";\nimport { registerDoctor } from \"./doctor.js\";\nimport { registerRecList } from \"./rec-list.js\";\nimport { registerRecStatus } from \"./rec-status.js\";\nimport { registerRecStoragePath } from \"./rec-storage-path.js\";\nimport { registerRecSetup } from \"./rec-setup.js\";\nimport { registerUpdate } from \"./update.js\";\nimport { PLUGIN_VERSION } from \"../version.js\";\n\nexport function registerAllCli(\n program: CliCommand,\n ctx: CliContext,\n rootCommandName: string | null = \"ntf\",\n): void {\n const normalizedCtx: CliContext = {\n ...ctx,\n stateDir: ctx.stateDir ? resolveStateDir(ctx.stateDir) : undefined,\n };\n\n // rootCommandName=null 表示 program 自身就是 ntf 根(独立 bin 入口),\n // 直接把子命令挂在 program 上,避免 `ntf ntf <sub>` 的双层嵌套。\n const ntf =\n rootCommandName === null\n ? program.version(PLUGIN_VERSION, \"-v, --version\", \"显示插件版本\")\n : program\n .command(rootCommandName)\n .description(\"手机通知数据管理\")\n .version(PLUGIN_VERSION, \"-v, --version\", \"显示插件版本\");\n\n // ntf auth ...\n registerAuthCli(ntf);\n\n // ntf search / summary / stats / sync / monitor ...\n registerNtfSearch(ntf, normalizedCtx);\n registerNtfSummary(ntf, normalizedCtx);\n registerNtfStats(ntf, normalizedCtx);\n registerNtfSync(ntf, normalizedCtx);\n registerNtfMonitor(ntf, normalizedCtx);\n\n // ntf light send / setup-tools ...\n const light = ntf.command(\"light\").description(\"灯效管理\");\n registerLightSend(light);\n registerLightSetupTools(light);\n\n // ntf storage-path\n registerNtfStoragePath(ntf, normalizedCtx);\n\n // ntf log <keyword>\n registerLogSearch(ntf, normalizedCtx);\n\n // ntf tunnel-status\n registerTunnelStatus(ntf, normalizedCtx);\n\n // ntf env show / switch\n registerEnvCli(ntf);\n\n // ntf doctor\n registerDoctor(ntf, normalizedCtx);\n\n // ntf rec list / status / storage-path / setup\n const rec = ntf.command(\"rec\").description(\"录音管理\");\n registerRecList(rec, normalizedCtx);\n registerRecStatus(rec, normalizedCtx);\n registerRecStoragePath(rec, normalizedCtx);\n registerRecSetup(rec, normalizedCtx);\n\n // ntf update\n registerUpdate(ntf, normalizedCtx);\n}\n",
86
+ "import type { CliCommand, CliContext } from \"./helpers.js\";\nimport { resolveStateDir } from \"../host.js\";\nimport { registerAuthCli } from \"./auth.js\";\nimport { registerNtfSearch } from \"./ntf-search.js\";\nimport { registerNtfSummary } from \"./ntf-summary.js\";\nimport { registerNtfSummaryJob } from \"./ntf-summary-job.js\";\nimport { registerNtfStats } from \"./ntf-stats.js\";\nimport { registerNtfSync } from \"./ntf-sync.js\";\nimport { registerNtfMonitor } from \"./ntf-monitor.js\";\nimport { registerLightSend } from \"./light-send.js\";\nimport { registerLightSetupTools } from \"./light-setup-tools.js\";\nimport { registerTunnelStatus } from \"./tunnel-status.js\";\nimport { registerNtfStoragePath } from \"./ntf-storage-path.js\";\nimport { registerLogSearch } from \"./log-search.js\";\nimport { registerEnvCli } from \"./env.js\";\nimport { registerDoctor } from \"./doctor.js\";\nimport { registerRecList } from \"./rec-list.js\";\nimport { registerRecStatus } from \"./rec-status.js\";\nimport { registerRecStoragePath } from \"./rec-storage-path.js\";\nimport { registerRecSetup } from \"./rec-setup.js\";\nimport { registerImageList } from \"./image-list.js\";\nimport { registerImageStatus } from \"./image-status.js\";\nimport { registerImagePath } from \"./image-path.js\";\nimport { registerImageStoragePath } from \"./image-storage-path.js\";\nimport { registerUpdate } from \"./update.js\";\nimport { PLUGIN_VERSION } from \"../version.js\";\n\nexport function registerAllCli(\n program: CliCommand,\n ctx: CliContext,\n rootCommandName: string | null = \"ntf\",\n): void {\n const normalizedCtx: CliContext = {\n ...ctx,\n stateDir: ctx.stateDir ? resolveStateDir(ctx.stateDir) : undefined,\n };\n\n // rootCommandName=null 表示 program 自身就是 ntf 根(独立 bin 入口),\n // 直接把子命令挂在 program 上,避免 `ntf ntf <sub>` 的双层嵌套。\n const ntf =\n rootCommandName === null\n ? program.version(PLUGIN_VERSION, \"-v, --version\", \"显示插件版本\")\n : program\n .command(rootCommandName)\n .description(\"手机通知数据管理\")\n .version(PLUGIN_VERSION, \"-v, --version\", \"显示插件版本\");\n\n // ntf auth ...\n registerAuthCli(ntf);\n\n // ntf search / summary / stats / sync / monitor ...\n registerNtfSearch(ntf, normalizedCtx);\n registerNtfSummary(ntf, normalizedCtx);\n registerNtfSummaryJob(ntf, normalizedCtx);\n registerNtfStats(ntf, normalizedCtx);\n registerNtfSync(ntf, normalizedCtx);\n registerNtfMonitor(ntf, normalizedCtx);\n\n // ntf light send / setup-tools ...\n const light = ntf.command(\"light\").description(\"灯效管理\");\n registerLightSend(light);\n registerLightSetupTools(light);\n\n // ntf storage-path\n registerNtfStoragePath(ntf, normalizedCtx);\n\n // ntf log <keyword>\n registerLogSearch(ntf, normalizedCtx);\n\n // ntf tunnel-status\n registerTunnelStatus(ntf, normalizedCtx);\n\n // ntf env show / switch\n registerEnvCli(ntf);\n\n // ntf doctor\n registerDoctor(ntf, normalizedCtx);\n\n // ntf rec list / status / storage-path / setup\n const rec = ntf.command(\"rec\").description(\"录音管理\");\n registerRecList(rec, normalizedCtx);\n registerRecStatus(rec, normalizedCtx);\n registerRecStoragePath(rec, normalizedCtx);\n registerRecSetup(rec, normalizedCtx);\n\n // ntf image list / status / path / storage-path\n const image = ntf.command(\"image\").description(\"图片管理\");\n registerImageList(image, normalizedCtx);\n registerImageStatus(image, normalizedCtx);\n registerImagePath(image, normalizedCtx);\n registerImageStoragePath(image, normalizedCtx);\n\n // ntf update\n registerUpdate(ntf, normalizedCtx);\n}\n",
84
87
  "import {\n chmodSync,\n existsSync,\n lstatSync,\n mkdirSync,\n readFileSync,\n realpathSync,\n symlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { delimiter, dirname, isAbsolute, join } from \"node:path\";\nimport process from \"node:process\";\nimport type { Logger } from \"../logger.js\";\n\n/**\n * 把 dist/bin/ntf.cjs 暴露成全局可执行的 `ntf` 命令。\n *\n * 策略链(依次尝试,首个成功即返回):\n * 1. `dirname(process.execPath)` —— node 所在目录通常在 PATH,写进去当前 shell 立即可见。\n * 2. 宿主 CLI / PATH 目录 —— jvsclaw 直解 tgz 不跑安装脚本时,优先落到用户实际\n * 执行 `openclaw` 的同级目录或其它已在 PATH 的可写目录。\n * 3. `<stateDir>/bin/ntf` —— 容器/系统 PATH 均不可写时兜底;目录在 PATH 上的概率低,\n * 首次落盘时 logger 给出一行 `export PATH=` 提示。\n *\n * 幂等:若目标已存在且 wrapper 指向相同 target,直接跳过。\n * 安全:若目标命令已被其它工具占用,不覆盖,继续尝试下一个候选目录。\n * 失败:所有策略都不阻断 plugin 加载,只 logger.warn 报告原因。\n */\nexport function ensureNtfBinInstalled(opts: {\n ntfCjsPath: string;\n stateDir?: string;\n logger: Logger;\n /**\n * 测试/特殊宿主可显式覆盖候选目录;生产路径不传。\n * 目录按顺序尝试,首个成功即返回。\n */\n installDirs?: NtfBinInstallDir[];\n}): void {\n const { ntfCjsPath, stateDir, logger } = opts;\n\n if (!existsSync(ntfCjsPath)) {\n logger.warn(`ntf wrapper: 目标不存在 ${ntfCjsPath},跳过`);\n return;\n }\n\n const installDirs =\n opts.installDirs ?? resolveNtfBinInstallDirs({ stateDir, argv: process.argv });\n const failures: string[] = [];\n\n for (const candidate of installDirs) {\n const result = tryInstallWrapper(candidate.dir, ntfCjsPath);\n if (!result.ok) {\n failures.push(`${candidate.label}: ${result.reason ?? \"unknown\"}`);\n continue;\n }\n\n if (result.created) {\n const visibility = candidate.onPath ? \"立即生效\" : \"需要加入 PATH\";\n logger.info(\n `独立 ntf 已注册: ${result.path} -> ${ntfCjsPath}(${candidate.label},${visibility})`,\n );\n if (!candidate.onPath) {\n logger.info(\n `若 ntf 命令未立即生效,请把目录加入 PATH: export PATH=\"${candidate.dir}:$PATH\"`,\n );\n }\n }\n return;\n }\n\n logger.warn(`独立 ntf 注册失败: ${failures.join(\";\") || \"无可用安装目录\"}`);\n}\n\ninterface InstallResult {\n ok: boolean;\n /** wrapper 绝对路径(成功时) */\n path?: string;\n /** 本次是否真的新建/更新(用于幂等情况避免重复日志) */\n created?: boolean;\n reason?: string;\n}\n\nexport interface NtfBinInstallDir {\n dir: string;\n label: string;\n onPath: boolean;\n}\n\nexport function resolveNtfBinInstallDirs(opts: {\n stateDir?: string;\n argv?: string[];\n envPath?: string;\n}): NtfBinInstallDir[] {\n const argv = opts.argv ?? process.argv;\n const envPath = opts.envPath ?? process.env.PATH ?? \"\";\n const pathDirs = splitPathDirs(envPath);\n const candidates: NtfBinInstallDir[] = [];\n\n pushCandidate(candidates, dirname(process.execPath), \"node 同目录\", true);\n\n for (const cliName of inferHostCliNames(argv)) {\n const cliPath = findCommandOnPath(cliName, pathDirs);\n if (cliPath) {\n pushCandidate(candidates, dirname(cliPath), `宿主 CLI (${cliName}) 同目录`, true);\n }\n }\n\n for (const dir of pathDirs) {\n pushCandidate(candidates, dir, \"PATH 目录\", true);\n }\n\n if (opts.stateDir) {\n pushCandidate(candidates, join(opts.stateDir, \"bin\"), \"stateDir/bin 兜底\", false);\n }\n\n return candidates;\n}\n\nfunction tryInstallWrapper(dir: string, target: string): InstallResult {\n try {\n mkdirSync(dir, { recursive: true });\n } catch (err) {\n return { ok: false, reason: `mkdir ${dir} 失败: ${describeError(err)}` };\n }\n\n const wrapperName = process.platform === \"win32\" ? \"ntf.cmd\" : \"ntf\";\n const wrapperPath = join(dir, wrapperName);\n\n if (pathExists(wrapperPath)) {\n if (isExistingWrapperForTarget(wrapperPath, target)) {\n return { ok: true, path: wrapperPath, created: false };\n }\n return { ok: false, reason: `已有 ${wrapperPath},跳过覆盖` };\n }\n\n try {\n if (process.platform === \"win32\") {\n // Windows: 写 .cmd wrapper(symlink 需要管理员权限或 developer mode)\n writeFileSync(wrapperPath, `@echo off\\r\\nnode \"${target}\" %*\\r\\n`, \"utf-8\");\n } else {\n symlinkSync(target, wrapperPath);\n try {\n chmodSync(target, 0o755);\n } catch {\n // target 已经在 dist 里 chmod 过;这里失败不致命\n }\n }\n return { ok: true, path: wrapperPath, created: true };\n } catch (err) {\n return { ok: false, reason: `写入 ${wrapperPath} 失败: ${describeError(err)}` };\n }\n}\n\nfunction pathExists(path: string): boolean {\n try {\n lstatSync(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isExistingWrapperForTarget(wrapperPath: string, target: string): boolean {\n if (process.platform === \"win32\") {\n try {\n return readFileSync(wrapperPath, \"utf-8\").includes(`\"${target}\"`);\n } catch {\n return false;\n }\n }\n\n try {\n if (!lstatSync(wrapperPath).isSymbolicLink()) {\n return false;\n }\n return realpathSync(wrapperPath) === realpathSync(target);\n } catch {\n return false;\n }\n}\n\nfunction describeError(err: unknown): string {\n if (err instanceof Error) return err.message;\n return String(err);\n}\n\nfunction splitPathDirs(envPath: string): string[] {\n return envPath\n .split(delimiter)\n .map((entry) => entry.trim())\n .filter((entry) => entry && isAbsolute(entry));\n}\n\nfunction inferHostCliNames(argv: string[]): string[] {\n const names = [\"openclaw\", \"jvsclaw\", \"qclaw\"];\n const invoked = argv[1]?.split(/[\\\\/]/).pop()?.trim();\n if (invoked && !invoked.startsWith(\"node\") && !names.includes(invoked)) {\n names.unshift(invoked);\n }\n return names;\n}\n\nfunction findCommandOnPath(command: string, pathDirs: string[]): string | undefined {\n const names =\n process.platform === \"win32\" && !command.toLowerCase().endsWith(\".cmd\")\n ? [command, `${command}.cmd`, `${command}.exe`]\n : [command];\n\n for (const dir of pathDirs) {\n for (const name of names) {\n const candidate = join(dir, name);\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n }\n return undefined;\n}\n\nfunction pushCandidate(\n candidates: NtfBinInstallDir[],\n dir: string,\n label: string,\n onPath: boolean,\n): void {\n if (!dir || candidates.some((candidate) => candidate.dir === dir)) {\n return;\n }\n candidates.push({ dir, label, onPath });\n}\n",
85
- "import type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport { requireApiKey } from \"../auth/credentials.js\";\nimport { LIGHT_RULE_TOOL_NAMES } from \"../light-rules/names.js\";\nimport type { Logger } from \"../logger.js\";\nimport { MAX_LIGHT_SEGMENTS } from \"../light/protocol.js\";\nimport { assertAncsRepeatTimes, normalizeRepeatTimes } from \"../light/repeat.js\";\nimport { sendLightEffect } from \"../light/sender.js\";\nimport { validateSegments } from \"../light/validators.js\";\nimport type { LightControlInput } from \"../types.js\";\n\nconst lightControlParameters = {\n type: \"object\",\n required: [\"segments\", \"reason\"],\n additionalProperties: false,\n properties: {\n segments: {\n type: \"array\",\n description: \"灯效段序列,1–12 段,按顺序播放\",\n minItems: 1,\n maxItems: MAX_LIGHT_SEGMENTS,\n items: {\n type: \"object\",\n required: [\"mode\", \"duration_s\"],\n additionalProperties: false,\n properties: {\n mode: {\n type: \"string\",\n enum: [\"wave\", \"breath\", \"strobe\", \"steady\", \"color_flow\", \"pixel_frame\"],\n description:\n \"灯效模式:wave 波浪(单色跑马,前景色+可选底色)/ breath 呼吸 / strobe 频闪 / steady 常亮 / \" +\n \"color_flow 流光(调色板沿圆周流动,1~2 个颜色锚点插值;**不是彩虹**,无法生成 7 色彩虹波浪)/ \" +\n \"pixel_frame 逐组像素帧。\" +\n \"易错对照:用户说\\\"红色/蓝色波浪\\\"等单一颜色波浪 必须用 wave,不要用 color_flow;\" +\n \"用户说\\\"彩虹/七彩/rainbow\\\" 固件不支持真正的 7 色彩虹,需告知限制并给出近似方案(双锚点 color_flow 或多段 wave 轮播),\" +\n \"禁止静默用 color_flow 单锚点冒充彩虹。\",\n },\n duration_s: {\n type: \"number\",\n minimum: 0,\n description:\n \"本段持续时长(秒),0 表示无限时长。推荐离散值:0.5/1/2/3/5/6/8/16/24/32/48,建议单段 ≤8s 省电\",\n },\n brightness: {\n type: \"number\",\n minimum: 0,\n maximum: 255,\n description:\n \"前景亮度 0–255。非 pixel_frame 模式必填;brightness=0 仅 steady 模式有效(显式灭灯)\",\n },\n color: {\n type: \"object\",\n required: [\"r\", \"g\", \"b\"],\n additionalProperties: false,\n properties: {\n r: { type: \"number\", minimum: 0, maximum: 255 },\n g: { type: \"number\", minimum: 0, maximum: 255 },\n b: { type: \"number\", minimum: 0, maximum: 255 },\n },\n description:\n \"前景色 RGB。非 pixel_frame 模式必填;color_flow 下作为第一颜色锚点,至少 color/background 其一非零\",\n },\n interval_ms: {\n type: \"number\",\n minimum: 0,\n description:\n \"步进间隔(ms),wave/strobe/color_flow 有效,默认 200。量化档位:50/100/200/300/500/600/800/1600/2400/3200/4800\",\n },\n direction: {\n type: \"string\",\n enum: [\"ltr\", \"rtl\"],\n description: \"波浪/流光方向,wave/color_flow 有效,默认 ltr\",\n },\n window: {\n type: \"number\",\n enum: [1, 2, 3],\n description:\n \"wave:窗口灯数,默认 2;color_flow:调色板平移步幅(速度)\",\n },\n breath_timing: {\n type: \"object\",\n additionalProperties: false,\n properties: {\n rise_ms: {\n type: \"number\",\n minimum: 0,\n description:\n \"上升时间(ms),量化到 1040/1560/2080/2600/3100/4160\",\n },\n hold_ms: {\n type: \"number\",\n minimum: 0,\n description: \"保持最高亮度时间(ms),支持 0ms\",\n },\n fall_ms: {\n type: \"number\",\n minimum: 0,\n description:\n \"下降时间(ms),量化到 1040/1560/2080/2600/3100/4160\",\n },\n off_ms: {\n type: \"number\",\n minimum: 0,\n description: \"熄灭时间(ms),支持 0ms\",\n },\n },\n description:\n \"呼吸四段时间,仅 breath 有效;rise/fall 量化档位:1040/1560/2080/2600/3100/4160,hold/off 额外支持 0ms\",\n },\n background: {\n type: \"object\",\n required: [\"r\", \"g\", \"b\", \"brightness\"],\n additionalProperties: false,\n properties: {\n r: { type: \"number\", minimum: 0, maximum: 255 },\n g: { type: \"number\", minimum: 0, maximum: 255 },\n b: { type: \"number\", minimum: 0, maximum: 255 },\n brightness: {\n type: \"number\",\n minimum: 0,\n maximum: 255,\n description: \"底色亮度,量化档位:0/32/64/96/128/192/255\",\n },\n },\n description:\n \"底色 RGB + 亮度,wave 有效为底色层;color_flow 有效为第二颜色锚点(与前景色插值生成多色调色板)\",\n },\n pixels: {\n type: \"array\",\n minItems: 1,\n maxItems: 7,\n items: {\n type: \"object\",\n required: [\"index\", \"color\", \"brightness\"],\n additionalProperties: false,\n properties: {\n index: {\n type: \"number\",\n minimum: 0,\n maximum: 6,\n description: \"LED 组索引,0–6\",\n },\n color: {\n type: \"object\",\n required: [\"r\", \"g\", \"b\"],\n additionalProperties: false,\n properties: {\n r: { type: \"number\", minimum: 0, maximum: 255 },\n g: { type: \"number\", minimum: 0, maximum: 255 },\n b: { type: \"number\", minimum: 0, maximum: 255 },\n },\n description: \"该像素的 RGB\",\n },\n brightness: {\n type: \"number\",\n minimum: 0,\n maximum: 255,\n description: \"该像素亮度 0–255;0 会编码为像素熄灭\",\n },\n },\n },\n description:\n \"仅 pixel_frame 有效:播放前先清 7 组,再按此列表写入 (Idx,R,G,B,Br)\",\n },\n },\n },\n },\n reason: {\n type: \"string\",\n description:\n \"结合对话上下文,简要说明为什么要亮灯(例如:用户心情低落想要温暖氛围、庆祝生日、提醒喝水等)。\" +\n \"这个字段帮助记录每次亮灯的意图和动机。\",\n },\n title: {\n type: \"string\",\n description:\n \"对本次亮灯的简短标题/摘要(例如:温暖氛围、生日庆祝、喝水提醒)。不填时默认回退到 reason。\",\n },\n repeat: {\n type: \"boolean\",\n description:\n \"兼容旧参数。true = 无限循环,false/不填 = 一轮;若同时提供 repeat_times,则以后者为准\",\n },\n repeat_times: {\n type: \"number\",\n minimum: 0,\n description:\n \"整条组合重复次数:0 = 无限循环,1 = 播放一轮。当前 ANCS 路径不支持 N>=2\",\n },\n },\n} as const;\n\nexport function registerLightControlTool(\n api: OpenClawPluginApi,\n logger: Logger,\n): void {\n api.registerTool({\n name: \"light_control\",\n label: \"Light Control\",\n description:\n \"立即控制硬件灯效(一次性执行,不会创建或保存通知触发规则),支持 1–12 段顺序灯效,每段独立参数(6 种模式:波浪/呼吸/频闪/常亮/流光/逐组像素帧)。\" +\n \"Tool 内部自动量化为嵌入式协议定义的离散档位,并按模式精简为变长 ANCS 控制序列,通过 HTTP 接口下发灯效指令。\" +\n '当用户说\"开灯\"、\"换个灯效\"、\"把灯调成红色\"、\"营造氛围\"、\"测试/预览灯效\"等与当前即时灯光控制相关的表达时调用。' +\n `如果用户说\"收到某类通知/消息时亮灯/闪灯/变灯效\",那是持久灯效规则,改用 ${LIGHT_RULE_TOOL_NAMES.create} 或 ${LIGHT_RULE_TOOL_NAMES.update}。`,\n parameters: lightControlParameters,\n async execute(_toolCallId: string, params: unknown) {\n let apiKey: string;\n try {\n apiKey = requireApiKey();\n } catch (e: any) {\n return {\n content: [{ type: \"text\" as const, text: e.message }],\n details: { ok: false, error: { code: \"AUTH_REQUIRED\", message: e.message } },\n };\n }\n\n const { segments, title, reason, repeat, repeat_times } = params as LightControlInput;\n const validation = validateSegments(segments);\n if (!validation.valid) {\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(validation.errors) }],\n details: {\n ok: false,\n error: { code: \"VALIDATION_FAILED\", details: validation.errors },\n },\n };\n }\n\n let repeatTimes: number;\n try {\n repeatTimes = normalizeRepeatTimes({ repeat, repeat_times });\n assertAncsRepeatTimes(repeatTimes);\n } catch (error: any) {\n return {\n content: [{ type: \"text\" as const, text: error?.message ?? String(error) }],\n details: {\n ok: false,\n error: { code: \"VALIDATION_FAILED\", message: error?.message ?? String(error) },\n },\n };\n }\n\n logger.info(`Light control title: ${title ?? \"\"}, reason: ${reason}`);\n for (const warning of validation.warnings) {\n logger.warn(\n `Light control validation warning [${warning.code}] ${warning.field}: ${warning.message}`,\n );\n }\n const result = await sendLightEffect(\n apiKey,\n validation.segments,\n logger,\n { repeat_times: repeatTimes },\n reason,\n title,\n );\n\n if (!result.ok) {\n logger.warn(\n `Light control HTTP request failed: ${result.status} ${result.error}`,\n );\n } else {\n logger.info(`Light control sent, bizUniqueId=${result.bizUniqueId}`);\n }\n\n const details =\n validation.warnings.length > 0 ? { ...result, warnings: validation.warnings } : result;\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(details) }],\n details,\n };\n },\n } as any);\n}\n",
86
- "import { readFileSync } from \"node:fs\";\nimport type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport { resolveConfigPath, resolveStateDir } from \"../host.js\";\nimport type { Logger } from \"../logger.js\";\nimport { createAppNameMapProvider } from \"../notification/app-name-map.js\";\nimport {\n NotificationStorage,\n resolveNotificationStorageDir,\n} from \"../notification/storage.js\";\nimport {\n RecordingStorage,\n resolveRecordingStorageDir,\n} from \"../recording/index.js\";\nimport {\n createTunnelService,\n type RelayTunnelService,\n} from \"../tunnel/service.js\";\nimport type { PluginConfig } from \"../types.js\";\nimport { getEnvUrls, loadEnvName } from \"../env.js\";\nimport { resolveAuthProvider } from \"../profile/auth/index.js\";\nimport { trimToUndefined } from \"./shared.js\";\n\ninterface LightRuleContext {\n workspaceDir?: string;\n stateDir?: string;\n}\n\ninterface StorageLifecycleDeps {\n api: OpenClawPluginApi;\n logger: Logger;\n lightRuleCtx: LightRuleContext;\n setStorage: (storage: NotificationStorage | null) => void;\n setRecordingStorage: (storage: RecordingStorage | null) => void;\n /**\n * 在 storage service 完成 start 之后触发,此时 lightRuleCtx 已被回填。\n * 用于让 LightRuleRegistry 等下游组件在拿到真实 workspaceDir 后重新加载状态。\n */\n onStorageReady?: () => void;\n}\n\nexport function registerStorageLifecycle(\n deps: StorageLifecycleDeps,\n): void {\n const {\n api,\n logger,\n lightRuleCtx,\n setStorage,\n setRecordingStorage,\n onStorageReady,\n } = deps;\n\n let storage: NotificationStorage | null = null;\n let recordingStorage: RecordingStorage | null = null;\n let appNameMapProvider: ReturnType<typeof createAppNameMapProvider> | null = null;\n\n api.registerService({\n id: \"notification-storage\",\n async start(ctx) {\n const stateDir = resolveStateDir(ctx.stateDir);\n const storageCtx = { ...ctx, stateDir };\n const storageDir = resolveNotificationStorageDir(storageCtx, logger);\n\n appNameMapProvider = createAppNameMapProvider({\n stateDir,\n logger,\n });\n await appNameMapProvider.start();\n\n const resolveDisplayName = appNameMapProvider.resolveDisplayName.bind(appNameMapProvider);\n storage = new NotificationStorage(storageDir, logger, resolveDisplayName);\n await storage.init();\n setStorage(storage);\n logger.info(`通知存储服务已启动: ${storageDir}`);\n\n const recDir = resolveRecordingStorageDir(storageCtx, logger);\n recordingStorage = new RecordingStorage(recDir, logger);\n await recordingStorage.init();\n setRecordingStorage(recordingStorage);\n logger.info(`录音存储服务已启动: ${recDir}`);\n\n lightRuleCtx.workspaceDir = ctx.workspaceDir;\n lightRuleCtx.stateDir = stateDir;\n\n onStorageReady?.();\n },\n async stop() {\n await storage?.close();\n storage = null;\n setStorage(null);\n\n await recordingStorage?.close();\n recordingStorage = null;\n setRecordingStorage(null);\n\n appNameMapProvider?.stop();\n appNameMapProvider = null;\n logger.info(\"通知/录音存储服务已停止\");\n },\n });\n}\n\nfunction readHostGatewayConfig(params: {\n stateDir?: string;\n logger: Pick<Logger, \"warn\">;\n}) {\n const configPath = params.stateDir\n ? resolveConfigPath(params.stateDir)\n : undefined;\n\n let configData: any;\n\n if (configPath) {\n try {\n configData = JSON.parse(readFileSync(configPath, \"utf-8\"));\n } catch (err: any) {\n if (err?.code !== \"ENOENT\") {\n params.logger.warn(\n `Relay tunnel: 无法读取 gateway 鉴权配置 (${configPath})`,\n );\n }\n }\n }\n\n return configData;\n}\n\nfunction resolveLocalGatewayAuth(params: {\n stateDir?: string;\n logger: Pick<Logger, \"warn\">;\n}): {\n gatewayAuthMode?: \"token\" | \"password\";\n gatewayToken?: string;\n gatewayPassword?: string;\n} {\n const envGatewayToken =\n trimToUndefined(process.env.OPENCLAW_GATEWAY_TOKEN) ??\n trimToUndefined(process.env.QCLAW_GATEWAY_TOKEN);\n const envGatewayPassword =\n trimToUndefined(process.env.OPENCLAW_GATEWAY_PASSWORD) ??\n trimToUndefined(process.env.QCLAW_GATEWAY_PASSWORD);\n\n const configData = readHostGatewayConfig(params);\n let configGatewayAuthMode: \"token\" | \"password\" | undefined;\n const rawGatewayAuthMode = trimToUndefined(configData?.gateway?.auth?.mode);\n if (rawGatewayAuthMode === \"token\" || rawGatewayAuthMode === \"password\") {\n configGatewayAuthMode = rawGatewayAuthMode;\n }\n const configGatewayToken = trimToUndefined(configData?.gateway?.auth?.token);\n const configGatewayPassword = trimToUndefined(configData?.gateway?.auth?.password);\n\n return {\n gatewayAuthMode: configGatewayAuthMode,\n gatewayToken: envGatewayToken ?? configGatewayToken,\n gatewayPassword: envGatewayPassword ?? configGatewayPassword,\n };\n}\n\nconst DISABLED_TAILSCALE_MODES = new Set([\n \"off\",\n \"disabled\",\n \"disable\",\n \"none\",\n \"false\",\n \"no\",\n]);\n\nfunction resolveExclusiveTunnelHint(params: {\n stateDir?: string;\n logger: Pick<Logger, \"warn\">;\n}): string | undefined {\n const configData = readHostGatewayConfig(params);\n const tailscaleMode = trimToUndefined(configData?.gateway?.tailscale?.mode);\n if (\n tailscaleMode &&\n !DISABLED_TAILSCALE_MODES.has(tailscaleMode.toLowerCase())\n ) {\n return `gateway.tailscale.mode=${tailscaleMode}`;\n }\n\n const remoteUrl = trimToUndefined(configData?.gateway?.remote?.url);\n if (remoteUrl && isExternalGatewayRemoteUrl(remoteUrl)) {\n return `gateway.remote.url=${remoteUrl}`;\n }\n\n return undefined;\n}\n\nfunction isExternalGatewayRemoteUrl(rawUrl: string): boolean {\n let host: string;\n try {\n host = new URL(rawUrl).hostname.toLowerCase();\n } catch {\n return false;\n }\n\n if (host === \"localhost\" || host === \"::1\" || host === \"[::1]\") {\n return false;\n }\n\n return !/^127(?:\\.\\d{1,3}){0,3}$/.test(host);\n}\n\ninterface RelayTunnelDeps {\n api: OpenClawPluginApi;\n config: PluginConfig;\n logger: Logger;\n openclawDir?: string;\n}\n\nexport function registerRelayTunnelLifecycle(\n deps: RelayTunnelDeps,\n): RelayTunnelService | null {\n const {\n api,\n config,\n logger,\n openclawDir,\n } = deps;\n\n const envName = loadEnvName();\n const envUrls = getEnvUrls();\n logger.info(\n `phone-notifications env=${envName} relayTunnelUrl=${envUrls.relayTunnelUrl} lightApiUrl=${envUrls.lightApiUrl} clawManagerInstanceReadyUrl=${envUrls.clawManagerInstanceReadyUrl}`,\n );\n\n const tunnelUrl = envUrls.relayTunnelUrl;\n if (!tunnelUrl) {\n return null;\n }\n\n const exclusiveTunnelHint = resolveExclusiveTunnelHint({\n stateDir: openclawDir,\n logger,\n });\n if (exclusiveTunnelHint) {\n logger.info(\n `Relay tunnel: detected ${exclusiveTunnelHint} in host gateway config, skipping relay startup to keep ingress mutually exclusive`,\n );\n return null;\n }\n\n const gatewayPort =\n process.env.OPENCLAW_GATEWAY_PORT ??\n process.env.QCLAW_GATEWAY_PORT ??\n \"18789\";\n const { gatewayAuthMode, gatewayToken, gatewayPassword } =\n resolveLocalGatewayAuth({\n stateDir: openclawDir,\n logger,\n });\n\n const authProvider = resolveAuthProvider({ logger, pluginConfig: config });\n\n const tunnelService = createTunnelService({\n tunnelUrl,\n authProvider,\n heartbeatSec: config.relay?.heartbeatSec,\n reconnectBackoffMs: config.relay?.reconnectBackoffMs,\n gatewayBaseUrl: `http://localhost:${gatewayPort}`,\n gatewayAuthMode,\n gatewayToken,\n gatewayPassword,\n logger,\n });\n\n api.registerService(tunnelService);\n logger.info(\"Relay tunnel 服务已注册\");\n return tunnelService;\n}\n",
88
+ "import { readFileSync } from \"node:fs\";\nimport type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport { resolveConfigPath, resolveStateDir } from \"../host.js\";\nimport type { Logger } from \"../logger.js\";\nimport { createAppNameMapProvider } from \"../notification/app-name-map.js\";\nimport {\n NotificationStorage,\n resolveNotificationStorageDir,\n} from \"../notification/storage.js\";\nimport {\n RecordingStorage,\n resolveRecordingStorageDir,\n} from \"../recording/index.js\";\nimport {\n ImageStorage,\n resolveImageStorageDir,\n} from \"../image/index.js\";\nimport {\n createTunnelService,\n type RelayTunnelService,\n} from \"../tunnel/service.js\";\nimport type { PluginConfig } from \"../types.js\";\nimport { getEnvUrls, loadEnvName } from \"../env.js\";\nimport { resolveAuthProvider } from \"../profile/auth/index.js\";\nimport { trimToUndefined } from \"./shared.js\";\n\ninterface LightRuleContext {\n workspaceDir?: string;\n stateDir?: string;\n}\n\ninterface StorageLifecycleDeps {\n api: OpenClawPluginApi;\n logger: Logger;\n lightRuleCtx: LightRuleContext;\n setStorage: (storage: NotificationStorage | null) => void;\n setRecordingStorage: (storage: RecordingStorage | null) => void;\n setImageStorage: (storage: ImageStorage | null) => void;\n /**\n * storage service 完成 start 之后触发,此时 lightRuleCtx 已被回填。\n * 用于让 LightRuleRegistry 等下游组件在拿到真实 workspaceDir 后重新加载状态。\n */\n onStorageReady?: () => void;\n}\n\nexport function registerStorageLifecycle(\n deps: StorageLifecycleDeps,\n): void {\n const {\n api,\n logger,\n lightRuleCtx,\n setStorage,\n setRecordingStorage,\n setImageStorage,\n onStorageReady,\n } = deps;\n\n let storage: NotificationStorage | null = null;\n let recordingStorage: RecordingStorage | null = null;\n let imageStorage: ImageStorage | null = null;\n let appNameMapProvider: ReturnType<typeof createAppNameMapProvider> | null = null;\n\n api.registerService({\n id: \"notification-storage\",\n async start(ctx) {\n const stateDir = resolveStateDir(ctx.stateDir);\n const storageCtx = { ...ctx, stateDir };\n const storageDir = resolveNotificationStorageDir(storageCtx, logger);\n\n appNameMapProvider = createAppNameMapProvider({\n stateDir,\n logger,\n });\n await appNameMapProvider.start();\n\n const resolveDisplayName = appNameMapProvider.resolveDisplayName.bind(appNameMapProvider);\n storage = new NotificationStorage(storageDir, logger, resolveDisplayName);\n await storage.init();\n setStorage(storage);\n logger.info(`通知存储服务已启动: ${storageDir}`);\n\n const recDir = resolveRecordingStorageDir(storageCtx, logger);\n recordingStorage = new RecordingStorage(recDir, logger);\n await recordingStorage.init();\n setRecordingStorage(recordingStorage);\n logger.info(`录音存储服务已启动: ${recDir}`);\n\n const imageDir = resolveImageStorageDir(storageCtx, logger);\n imageStorage = new ImageStorage(imageDir, logger);\n await imageStorage.init();\n setImageStorage(imageStorage);\n logger.info(`图片存储服务已启动: ${imageDir}`);\n\n // storage service start 完成后,把真实的 workspaceDir/stateDir 回填到\n // lightRuleCtx,再触发 onStorageReady 让 LightRuleRegistry 重新扫盘。\n lightRuleCtx.workspaceDir = ctx.workspaceDir;\n lightRuleCtx.stateDir = stateDir;\n onStorageReady?.();\n },\n async stop() {\n await storage?.close();\n storage = null;\n setStorage(null);\n\n await recordingStorage?.close();\n recordingStorage = null;\n setRecordingStorage(null);\n\n await imageStorage?.close();\n imageStorage = null;\n setImageStorage(null);\n\n appNameMapProvider?.stop();\n appNameMapProvider = null;\n logger.info(\"通知/录音/图片存储服务已停止\");\n },\n });\n}\n\nfunction readHostGatewayConfig(params: {\n stateDir?: string;\n logger: Pick<Logger, \"warn\">;\n}) {\n const configPath = params.stateDir\n ? resolveConfigPath(params.stateDir)\n : undefined;\n\n let configData: any;\n\n if (configPath) {\n try {\n configData = JSON.parse(readFileSync(configPath, \"utf-8\"));\n } catch (err: any) {\n if (err?.code !== \"ENOENT\") {\n params.logger.warn(\n `Relay tunnel: 无法读取 gateway 鉴权配置 (${configPath})`,\n );\n }\n }\n }\n\n return configData;\n}\n\nfunction resolveLocalGatewayAuth(params: {\n stateDir?: string;\n logger: Pick<Logger, \"warn\">;\n}): {\n gatewayAuthMode?: \"token\" | \"password\";\n gatewayToken?: string;\n gatewayPassword?: string;\n} {\n const envGatewayToken =\n trimToUndefined(process.env.OPENCLAW_GATEWAY_TOKEN) ??\n trimToUndefined(process.env.QCLAW_GATEWAY_TOKEN);\n const envGatewayPassword =\n trimToUndefined(process.env.OPENCLAW_GATEWAY_PASSWORD) ??\n trimToUndefined(process.env.QCLAW_GATEWAY_PASSWORD);\n\n const configData = readHostGatewayConfig(params);\n let configGatewayAuthMode: \"token\" | \"password\" | undefined;\n const rawGatewayAuthMode = trimToUndefined(configData?.gateway?.auth?.mode);\n if (rawGatewayAuthMode === \"token\" || rawGatewayAuthMode === \"password\") {\n configGatewayAuthMode = rawGatewayAuthMode;\n }\n const configGatewayToken = trimToUndefined(configData?.gateway?.auth?.token);\n const configGatewayPassword = trimToUndefined(configData?.gateway?.auth?.password);\n\n return {\n gatewayAuthMode: configGatewayAuthMode,\n gatewayToken: envGatewayToken ?? configGatewayToken,\n gatewayPassword: envGatewayPassword ?? configGatewayPassword,\n };\n}\n\nconst DISABLED_TAILSCALE_MODES = new Set([\n \"off\",\n \"disabled\",\n \"disable\",\n \"none\",\n \"false\",\n \"no\",\n]);\n\nfunction resolveExclusiveTunnelHint(params: {\n stateDir?: string;\n logger: Pick<Logger, \"warn\">;\n}): string | undefined {\n const configData = readHostGatewayConfig(params);\n const tailscaleMode = trimToUndefined(configData?.gateway?.tailscale?.mode);\n if (\n tailscaleMode &&\n !DISABLED_TAILSCALE_MODES.has(tailscaleMode.toLowerCase())\n ) {\n return `gateway.tailscale.mode=${tailscaleMode}`;\n }\n\n const remoteUrl = trimToUndefined(configData?.gateway?.remote?.url);\n if (remoteUrl && isExternalGatewayRemoteUrl(remoteUrl)) {\n return `gateway.remote.url=${remoteUrl}`;\n }\n\n return undefined;\n}\n\nfunction isExternalGatewayRemoteUrl(rawUrl: string): boolean {\n let host: string;\n try {\n host = new URL(rawUrl).hostname.toLowerCase();\n } catch {\n return false;\n }\n\n if (host === \"localhost\" || host === \"::1\" || host === \"[::1]\") {\n return false;\n }\n\n return !/^127(?:\\.\\d{1,3}){0,3}$/.test(host);\n}\n\ninterface RelayTunnelDeps {\n api: OpenClawPluginApi;\n config: PluginConfig;\n logger: Logger;\n openclawDir?: string;\n}\n\nexport function registerRelayTunnelLifecycle(\n deps: RelayTunnelDeps,\n): RelayTunnelService | null {\n const {\n api,\n config,\n logger,\n openclawDir,\n } = deps;\n\n const envName = loadEnvName();\n const envUrls = getEnvUrls();\n logger.info(\n `phone-notifications env=${envName} relayTunnelUrl=${envUrls.relayTunnelUrl} lightApiUrl=${envUrls.lightApiUrl} lightRulesUrl=${envUrls.notificationIntelligenceLightRulesPluginUrl} clawManagerInstanceReadyUrl=${envUrls.clawManagerInstanceReadyUrl}`,\n );\n\n const tunnelUrl = envUrls.relayTunnelUrl;\n if (!tunnelUrl) {\n return null;\n }\n\n const exclusiveTunnelHint = resolveExclusiveTunnelHint({\n stateDir: openclawDir,\n logger,\n });\n if (exclusiveTunnelHint) {\n logger.info(\n `Relay tunnel: detected ${exclusiveTunnelHint} in host gateway config, skipping relay startup to keep ingress mutually exclusive`,\n );\n return null;\n }\n\n const gatewayPort =\n process.env.OPENCLAW_GATEWAY_PORT ??\n process.env.QCLAW_GATEWAY_PORT ??\n \"18789\";\n const { gatewayAuthMode, gatewayToken, gatewayPassword } =\n resolveLocalGatewayAuth({\n stateDir: openclawDir,\n logger,\n });\n\n const authProvider = resolveAuthProvider({ logger, pluginConfig: config });\n\n const tunnelService = createTunnelService({\n tunnelUrl,\n authProvider,\n heartbeatSec: config.relay?.heartbeatSec,\n reconnectBackoffMs: config.relay?.reconnectBackoffMs,\n gatewayBaseUrl: `http://localhost:${gatewayPort}`,\n gatewayAuthMode,\n gatewayToken,\n gatewayPassword,\n logger,\n });\n\n api.registerService(tunnelService);\n logger.info(\"Relay tunnel 服务已注册\");\n return tunnelService;\n}\n",
87
89
  "import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { loadApiKey, watchCredentials } from \"../auth/credentials.js\";\nimport { getEnvUrls } from \"../env.js\";\n\nconst PLUGIN_STATE_DIR = \"phone-notifications\";\nconst CACHE_FILE = \"app-name-map.json\";\n\n/** 包名→应用名映射 API 地址(默认随环境变化;可用 APP_NAME_MAP_URL 覆盖;需鉴权) */\nconst BUILTIN_APP_NAME_MAP_URL = getEnvUrls().appNameMapUrl;\nconst APP_NAME_MAP_URL =\n (typeof process.env.APP_NAME_MAP_URL === \"string\" && process.env.APP_NAME_MAP_URL.trim()\n ? process.env.APP_NAME_MAP_URL.trim()\n : undefined) ?? BUILTIN_APP_NAME_MAP_URL;\n/** 映射刷新间隔(小时) */\nconst APP_NAME_MAP_REFRESH_HOURS = 12;\n\ninterface Logger {\n info: (message: string) => void;\n warn: (message: string) => void;\n}\n\nfunction isRecordOfStrings(v: unknown): v is Record<string, string> {\n if (v === null || typeof v !== \"object\") return false;\n for (const val of Object.values(v)) if (typeof val !== \"string\") return false;\n return true;\n}\n\n/** API 返回的单项 */\ninterface AppPackageItem {\n appName: string;\n packageName: string;\n iconUrl?: string | null;\n platform?: string | null;\n jumpUrl?: string | null;\n urlParams?: string | null;\n description?: string | null;\n}\n\n/** API 响应格式 */\ninterface AppNameMapApiResponse {\n success?: boolean;\n code?: string;\n message?: string;\n data?: AppPackageItem[];\n}\n\nfunction isAppNameMapApiResponse(v: unknown): v is AppNameMapApiResponse {\n if (v === null || typeof v !== \"object\") return false;\n const o = v as Record<string, unknown>;\n return Array.isArray(o.data) && o.data.every(\n (item: unknown) =>\n item !== null &&\n typeof item === \"object\" &&\n typeof (item as AppPackageItem).packageName === \"string\" &&\n typeof (item as AppPackageItem).appName === \"string\"\n );\n}\n\nfunction getCachePath(stateDir: string): string {\n return join(stateDir, \"plugins\", PLUGIN_STATE_DIR, CACHE_FILE);\n}\n\nexport interface AppNameMapProvider {\n /** 解析包名为显示名(未命中时拉取一次再返回,保证当前落库即有值) */\n resolveDisplayName(packageName: string): Promise<string>;\n start(): Promise<void>;\n stop(): void;\n}\n\nexport function createAppNameMapProvider(opts: {\n stateDir: string;\n logger: Logger;\n}): AppNameMapProvider {\n const { stateDir, logger } = opts;\n const url = APP_NAME_MAP_URL;\n const refreshHours = APP_NAME_MAP_REFRESH_HOURS;\n\n const map = new Map<string, string>();\n let refreshTimer: ReturnType<typeof setInterval> | null = null;\n let stopWatching: (() => void) | null = null;\n let inFlightFetch: Promise<void> | null = null;\n\n function loadFromDisk(): void {\n const path = getCachePath(stateDir);\n if (!existsSync(path)) return;\n try {\n const raw = JSON.parse(readFileSync(path, \"utf-8\"));\n if (!isRecordOfStrings(raw)) return;\n map.clear();\n for (const [k, v] of Object.entries(raw)) map.set(k, v);\n logger.info(`[app-name-map] loaded ${map.size} entries from cache: ${path}`);\n } catch {\n /* ignore */\n }\n }\n\n async function fetchFromServer(): Promise<void> {\n const apiKey = loadApiKey();\n if (!url) {\n logger.warn(\"[app-name-map] APP_NAME_MAP_URL is empty, skip refresh\");\n return;\n }\n if (!apiKey) {\n logger.info(\"[app-name-map] api key missing, skip refresh\");\n return;\n }\n\n const rawApiKey = apiKey.startsWith(\"Bearer \")\n ? apiKey.slice(\"Bearer \".length)\n : apiKey;\n try {\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-Api-Key-Id\": rawApiKey },\n body: JSON.stringify({\n platform: \"\"\n })\n });\n if (!res.ok) {\n logger.warn(`[app-name-map] refresh failed: HTTP ${res.status} ${res.statusText}`);\n return;\n }\n const body = await res.json() as unknown;\n if (!isAppNameMapApiResponse(body) || !body.success || !body.data?.length) {\n logger.warn(\"[app-name-map] refresh failed: unexpected response shape or empty data\");\n return;\n }\n map.clear();\n for (const item of body.data) {\n if (item.packageName && item.appName) map.set(item.packageName, item.appName);\n }\n if (map.size === 0) {\n logger.warn(\"[app-name-map] refresh succeeded but got 0 entries\");\n return;\n }\n const dir = join(stateDir, \"plugins\", PLUGIN_STATE_DIR);\n\n mkdirSync(dir, { recursive: true });\n const cachePath = getCachePath(stateDir);\n writeFileSync(cachePath, JSON.stringify(Object.fromEntries(map), null, 2), \"utf-8\");\n logger.info(`[app-name-map] refreshed ${map.size} entries from server and saved: ${cachePath}`);\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n logger.warn(`[app-name-map] refresh error: ${message}`);\n }\n }\n\n async function ensureOneFetch(): Promise<void> {\n if (inFlightFetch) return inFlightFetch;\n inFlightFetch = fetchFromServer().finally(() => {\n inFlightFetch = null;\n });\n return inFlightFetch;\n }\n\n function refreshInBackground(): void {\n void ensureOneFetch().catch((e) => {\n const message = e instanceof Error ? e.message : String(e);\n logger.warn(`[app-name-map] background refresh error: ${message}`);\n });\n }\n\n return {\n async resolveDisplayName(packageName: string): Promise<string> {\n // 临时策略:仅使用内存/磁盘中已有的映射,缺少时不主动触发拉取\n if (map.has(packageName)) return map.get(packageName)!;\n return packageName;\n // 如需在缺少应用名时触发一次拉取再返回,可恢复为:\n // if (!url || !loadApiKey()) return packageName;\n // await ensureOneFetch();\n // return map.get(packageName) ?? packageName;\n },\n\n async start(): Promise<void> {\n loadFromDisk();\n refreshInBackground();\n\n if (!url) return;\n\n if (refreshHours > 0) {\n const ms = refreshHours * 60 * 60 * 1000;\n refreshTimer = setInterval(refreshInBackground, ms);\n }\n stopWatching = watchCredentials(refreshInBackground);\n },\n\n stop(): void {\n stopWatching?.();\n stopWatching = null;\n if (refreshTimer) {\n clearInterval(refreshTimer);\n refreshTimer = null;\n }\n map.clear();\n },\n };\n}\n",
88
- "import {\n accessSync,\n mkdirSync,\n appendFileSync,\n readFileSync,\n writeFileSync,\n existsSync,\n rmSync,\n constants,\n} from \"node:fs\";\nimport { createHash } from \"node:crypto\";\nimport { join } from \"node:path\";\nimport type { RawNotification } from \"../types.js\";\nimport { normalizeFeishuFields } from \"./feishu-normalize.js\";\nimport { currentClientLabel } from \"../ingest-context.js\";\n\ninterface Logger {\n info: (message: string) => void;\n warn: (message: string) => void;\n}\n\nexport type NotificationConversationType = \"private\" | \"group\";\n\nexport interface StorageContext {\n stateDir: string;\n workspaceDir?: string;\n}\n\n/** Stored notification entry (JSON format, append-only) */\nexport interface StoredNotification {\n /** 来源客户端 label;旧数据无该字段,查询时视为 legacy */\n clientLabel?: string;\n /** 包名 */\n appName: string;\n /** 应用显示名(由映射补全),缺省时与 appName 一致 */\n appDisplayName?: string;\n title: string;\n content: string;\n /** ISO 8601 with timezone, e.g. \"2026-03-02T08:30:00+08:00\" */\n timestamp: string;\n /**\n * 结构化发送人。当前主要用于飞书消息:\n * iOS 通知里 title 通常是发送人,subtitle 用来区分群聊名。\n */\n senderName?: string;\n /** 结构化会话类型。当前主要用于飞书消息区分群聊/私聊。 */\n conversationType?: NotificationConversationType;\n /** 结构化会话名。当前主要用于飞书群聊名(通常来自 subtitle)。 */\n conversationName?: string;\n}\n\nconst NOTIFICATION_DIR_NAME = \"notifications\";\nconst ID_INDEX_DIR_NAME = \".ids\";\nconst CONTENT_KEY_INDEX_DIR_NAME = \".keys\";\n\nexport interface NotificationIngestResult {\n received: number;\n ingested: number;\n dedupedById: number;\n dedupedByContent: number;\n invalid: number;\n /**\n * 本次 ingest 实际新写入的条目(去重 / 非法之后的产物)。\n * 用于后续事件驱动链路(如 light-rule agent 评估)拿到本次新增的通知列表,\n * 不需要重新读盘。\n */\n inserted: StoredNotification[];\n}\n\ntype WriteOutcome =\n | { kind: \"ingested\"; entry: StoredNotification }\n | { kind: \"dedupedById\" }\n | { kind: \"dedupedByContent\" }\n | { kind: \"invalid\" };\n\nexport function getStateFallbackNotificationDir(stateDir: string): string {\n return join(stateDir, \"plugins\", \"phone-notifications\", NOTIFICATION_DIR_NAME);\n}\n\nfunction computeLagMs(timestamp: string | undefined): number | null {\n if (!timestamp) return null;\n const t = new Date(timestamp).getTime();\n if (Number.isNaN(t)) return null;\n return Date.now() - t;\n}\n\nfunction buildFallbackContent(n: RawNotification): string {\n const body = n.body?.trim();\n if (body) {\n return body;\n }\n\n const fallback: string[] = [];\n if (n.category) {\n fallback.push(`category:${n.category}`);\n }\n if (n.metadata && Object.keys(n.metadata).length > 0) {\n fallback.push(`metadata:${JSON.stringify(n.metadata)}`);\n }\n return fallback.join(\" ; \") || \"-\";\n}\n\nfunction ensureWritableDirectory(dir: string): boolean {\n try {\n mkdirSync(dir, { recursive: true });\n accessSync(dir, constants.R_OK | constants.W_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function resolveNotificationStorageDir(\n ctx: StorageContext,\n logger: Pick<Logger, \"info\" | \"warn\">,\n): string {\n // 优先使用 stateDir(插件私有稳定路径),避免通知随 workspace 切换而分散\n const stateNotifDir = getStateFallbackNotificationDir(ctx.stateDir);\n\n if (ensureWritableDirectory(stateNotifDir)) {\n logger.info(`通知将写入 stateDir 路径: ${stateNotifDir}`);\n return stateNotifDir;\n }\n\n // stateDir 不可用时回退到 workspaceDir\n if (ctx.workspaceDir) {\n const workspaceDir = join(ctx.workspaceDir, NOTIFICATION_DIR_NAME);\n if (ensureWritableDirectory(workspaceDir)) {\n logger.warn(\n `stateDir 不可用,通知已回退到 workspace 路径: ${workspaceDir}`,\n );\n return workspaceDir;\n }\n }\n\n throw new Error(`通知存储目录不可用: ${stateNotifDir}`);\n}\n\n/** 包名 → 应用显示名(异步,未命中时内部可拉取后返回);不提供则落库仅用 appName */\nexport type ResolveDisplayName = (packageName: string) => Promise<string>;\n\nexport class NotificationStorage {\n private dir: string;\n private idIndexDir: string;\n private contentKeyIndexDir: string;\n private idCache = new Map<string, Set<string>>();\n private contentKeyCache = new Map<string, Set<string>>();\n private dateWriteChains = new Map<string, Promise<void>>();\n private resolveDisplayName: ResolveDisplayName | undefined;\n\n constructor(\n dir: string,\n private logger: Logger,\n resolveDisplayName?: ResolveDisplayName,\n ) {\n this.dir = dir;\n this.idIndexDir = join(dir, ID_INDEX_DIR_NAME);\n this.contentKeyIndexDir = join(dir, CONTENT_KEY_INDEX_DIR_NAME);\n this.resolveDisplayName = resolveDisplayName;\n }\n\n async init() {\n mkdirSync(this.dir, { recursive: true });\n mkdirSync(this.idIndexDir, { recursive: true });\n rmSync(this.contentKeyIndexDir, { recursive: true, force: true });\n mkdirSync(this.contentKeyIndexDir, { recursive: true });\n }\n\n async ingest(\n items: RawNotification[],\n ingestId?: string,\n ): Promise<NotificationIngestResult> {\n const result: NotificationIngestResult = {\n received: items.length,\n ingested: 0,\n dedupedById: 0,\n dedupedByContent: 0,\n invalid: 0,\n inserted: [],\n };\n\n const traceTag = ingestId ? `[${ingestId}]` : \"\";\n for (const n of items) {\n const outcome = await this.writeNotification(n);\n const lagMs = computeLagMs(n.timestamp);\n const lagPart = lagMs === null ? \"lag=?\" : `lag=${lagMs}ms`;\n this.logger.info(\n `ingest${traceTag}: app=${n.app ?? \"Unknown\"} id=${n.id ?? \"-\"} ts=${n.timestamp} ${lagPart} outcome=${outcome.kind}`,\n );\n switch (outcome.kind) {\n case \"ingested\":\n result.ingested += 1;\n result.inserted.push(outcome.entry);\n break;\n case \"dedupedById\":\n result.dedupedById += 1;\n break;\n case \"dedupedByContent\":\n result.dedupedByContent += 1;\n break;\n case \"invalid\":\n result.invalid += 1;\n break;\n }\n }\n return result;\n }\n\n private async writeNotification(n: RawNotification): Promise<WriteOutcome> {\n const ts = new Date(n.timestamp);\n if (Number.isNaN(ts.getTime())) {\n this.logger.warn(`忽略非法 timestamp 的通知: ${n.id}`);\n return { kind: \"invalid\" };\n }\n\n const dateKey = this.formatDate(ts);\n const filePath = join(this.dir, `${dateKey}.json`);\n const normalizedId = typeof n.id === \"string\" ? n.id.trim() : \"\";\n const entry = this.buildStoredNotification(n);\n\n return this.withDateWriteLock(dateKey, async () => {\n if (normalizedId && this.hasNotificationId(dateKey, entry.clientLabel ?? \"legacy\", normalizedId)) {\n return { kind: \"dedupedById\" };\n }\n\n if (this.hasNotificationContentKey(dateKey, filePath, entry)) {\n return { kind: \"dedupedByContent\" };\n }\n\n const appDisplayName = this.resolveDisplayName\n ? await this.resolveDisplayName(entry.appName)\n : entry.appName;\n\n const storedEntry: StoredNotification = {\n ...entry,\n appDisplayName,\n };\n\n const arr = this.readStoredNotifications(filePath);\n arr.push(storedEntry);\n writeFileSync(filePath, JSON.stringify(arr, null, 2), \"utf-8\");\n\n if (normalizedId) {\n this.recordNotificationId(dateKey, storedEntry.clientLabel ?? \"legacy\", normalizedId);\n }\n this.recordNotificationContentKey(dateKey, filePath, storedEntry);\n return { kind: \"ingested\", entry: storedEntry };\n });\n }\n\n private buildStoredNotification(n: RawNotification): StoredNotification {\n const appName = typeof n.app === \"string\" && n.app ? n.app : \"Unknown\";\n const clientLabel = currentClientLabel(\"default\");\n const feishu = normalizeFeishuFields(n);\n if (feishu) {\n return {\n clientLabel,\n appName,\n title: feishu.title,\n content: feishu.content || buildFallbackContent(n),\n timestamp: n.timestamp,\n ...feishu.structured,\n };\n }\n return {\n clientLabel,\n appName,\n title: typeof n.title === \"string\" ? n.title : \"\",\n content: buildFallbackContent(n),\n timestamp: n.timestamp,\n };\n }\n\n private formatDate(d: Date): string {\n const year = d.getFullYear();\n const month = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n }\n\n private getIdIndexPath(dateKey: string): string {\n return join(this.idIndexDir, `${dateKey}.ids`);\n }\n\n private getIdSet(dateKey: string): Set<string> {\n const cached = this.idCache.get(dateKey);\n if (cached) {\n return cached;\n }\n\n const idPath = this.getIdIndexPath(dateKey);\n const ids = new Set<string>();\n if (existsSync(idPath)) {\n const lines = readFileSync(idPath, \"utf-8\").split(/\\r?\\n/);\n for (const line of lines) {\n const id = line.trim();\n if (id) {\n ids.add(id);\n }\n }\n }\n\n this.idCache.set(dateKey, ids);\n return ids;\n }\n\n private buildNotificationIdKey(clientLabel: string, id: string): string {\n if (this.usesLegacyIdKey(clientLabel)) {\n return id;\n }\n return `${clientLabel}\\x1f${id}`;\n }\n\n private usesLegacyIdKey(clientLabel: string): boolean {\n return clientLabel === \"legacy\" || clientLabel === \"default\";\n }\n\n private hasNotificationId(dateKey: string, clientLabel: string, id: string): boolean {\n const ids = this.getIdSet(dateKey);\n return ids.has(this.buildNotificationIdKey(clientLabel, id))\n || (this.usesLegacyIdKey(clientLabel) && ids.has(id));\n }\n\n private getContentKeyIndexPath(dateKey: string): string {\n return join(this.contentKeyIndexDir, `${dateKey}.keys`);\n }\n\n private getContentKeySet(dateKey: string, filePath: string): Set<string> {\n const cached = this.contentKeyCache.get(dateKey);\n if (cached) {\n return cached;\n }\n\n const keyPath = this.getContentKeyIndexPath(dateKey);\n const keys = new Set<string>();\n\n if (existsSync(filePath)) {\n for (const item of this.readStoredNotifications(filePath)) {\n keys.add(this.buildNotificationContentKey(item));\n }\n }\n\n if (keys.size > 0) {\n writeFileSync(keyPath, `${Array.from(keys).join(\"\\n\")}\\n`, \"utf-8\");\n } else if (existsSync(keyPath)) {\n rmSync(keyPath, { force: true });\n }\n\n this.contentKeyCache.set(dateKey, keys);\n return keys;\n }\n\n private hasNotificationContentKey(\n dateKey: string,\n filePath: string,\n entry: Pick<StoredNotification, \"appName\" | \"title\" | \"content\" | \"timestamp\" | \"clientLabel\">,\n ): boolean {\n const keys = this.getContentKeySet(dateKey, filePath);\n return this.contentKeyLabels(entry.clientLabel).some((clientLabel) =>\n keys.has(this.buildNotificationContentKey({ ...entry, clientLabel })),\n );\n }\n\n private recordNotificationId(dateKey: string, clientLabel: string, id: string) {\n const ids = this.getIdSet(dateKey);\n const key = this.buildNotificationIdKey(clientLabel, id);\n if (ids.has(key)) {\n return;\n }\n\n appendFileSync(this.getIdIndexPath(dateKey), `${key}\\n`, \"utf-8\");\n ids.add(key);\n }\n\n private recordNotificationContentKey(\n dateKey: string,\n filePath: string,\n entry: Pick<StoredNotification, \"appName\" | \"title\" | \"content\" | \"timestamp\" | \"clientLabel\">,\n ) {\n const keys = this.getContentKeySet(dateKey, filePath);\n const key = this.buildNotificationContentKey(entry);\n\n if (keys.has(key)) {\n return;\n }\n\n appendFileSync(this.getContentKeyIndexPath(dateKey), `${key}\\n`, \"utf-8\");\n keys.add(key);\n }\n\n private buildNotificationContentKey(\n entry: Pick<StoredNotification, \"appName\" | \"title\" | \"content\" | \"timestamp\" | \"clientLabel\">,\n ): string {\n return createHash(\"sha256\")\n .update(entry.clientLabel ?? \"legacy\")\n .update(\"\\x1f\")\n .update(entry.appName)\n .update(\"\\x1f\")\n .update(entry.title)\n .update(\"\\x1f\")\n .update(entry.content)\n .update(\"\\x1f\")\n .update(entry.timestamp)\n .digest(\"hex\");\n }\n\n private contentKeyLabels(clientLabel: string | undefined): string[] {\n const label = clientLabel ?? \"legacy\";\n return label === \"default\" ? [\"default\", \"legacy\"] : [label];\n }\n\n private readStoredNotifications(filePath: string): StoredNotification[] {\n if (!existsSync(filePath)) {\n return [];\n }\n\n try {\n const parsed = JSON.parse(readFileSync(filePath, \"utf-8\"));\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n }\n\n private async withDateWriteLock<T>(\n dateKey: string,\n task: () => Promise<T>,\n ): Promise<T> {\n const previous = this.dateWriteChains.get(dateKey) ?? Promise.resolve();\n let release!: () => void;\n const current = new Promise<void>((resolve) => {\n release = resolve;\n });\n const chain = previous.then(() => current);\n this.dateWriteChains.set(dateKey, chain);\n\n await previous;\n try {\n return await task();\n } finally {\n release();\n if (this.dateWriteChains.get(dateKey) === chain) {\n this.dateWriteChains.delete(dateKey);\n }\n }\n }\n\n async close() {\n this.idCache.clear();\n this.contentKeyCache.clear();\n this.dateWriteChains.clear();\n }\n}\n",
89
- "import type { RawNotification } from \"../types.js\";\nimport type { NotificationConversationType } from \"./storage.js\";\n\nexport interface FeishuStructuredFields {\n senderName?: string;\n conversationType?: NotificationConversationType;\n conversationName?: string;\n}\n\nexport interface FeishuNormalizedNotification {\n title: string;\n content: string;\n structured: FeishuStructuredFields;\n}\n\nfunction normalizeOptionalText(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction isFeishuApp(appName: string): boolean {\n const normalized = appName.trim().toLowerCase();\n if (!normalized) {\n return false;\n }\n return (\n normalized === \"飞书\"\n || normalized === \"feishu\"\n || normalized === \"lark\"\n || normalized === \"com.ss.android.lark\"\n || normalized === \"com.bytedance.ee.lark\"\n || normalized === \"com.larksuite.suite\"\n || normalized.includes(\"feishu\")\n || normalized.includes(\"lark\")\n || normalized.includes(\"飞书\")\n );\n}\n\nfunction isFeishuAppLabel(text: string): boolean {\n const t = text.trim().toLowerCase();\n return t === \"飞书\" || t === \"lark\" || t === \"feishu\";\n}\n\nfunction extractColonSender(body: string): string | undefined {\n if (!body) return undefined;\n const candidates = [body.indexOf(\":\"), body.indexOf(\":\")].filter((i) => i > 0);\n if (candidates.length === 0) return undefined;\n const idx = Math.min(...candidates);\n const senderName = body.slice(0, idx).trim();\n return senderName || undefined;\n}\n\nfunction findMetadataTextByKey(\n value: unknown,\n targetKey: string,\n depth = 0,\n): { found: boolean; value?: string } {\n if (!value || typeof value !== \"object\" || depth > 4) {\n return { found: false };\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n const match = findMetadataTextByKey(item, targetKey, depth + 1);\n if (match.found) {\n return match;\n }\n }\n return { found: false };\n }\n\n for (const [key, child] of Object.entries(value as Record<string, unknown>)) {\n if (key.trim().toLowerCase() === targetKey) {\n return { found: true, value: normalizeOptionalText(child) };\n }\n }\n\n for (const child of Object.values(value as Record<string, unknown>)) {\n const match = findMetadataTextByKey(child, targetKey, depth + 1);\n if (match.found) {\n return match;\n }\n }\n\n return { found: false };\n}\n\nfunction deriveStructured(n: RawNotification): FeishuStructuredFields {\n const subtitle = findMetadataTextByKey(n.metadata, \"subtitle\");\n\n // iOS 路径:通知元数据带 subtitle key(群聊为群名,私聊为空)。\n if (subtitle.found) {\n const senderName = normalizeOptionalText(n.title);\n const structured: FeishuStructuredFields = {\n conversationType: subtitle.value ? \"group\" : \"private\",\n };\n if (senderName) {\n structured.senderName = senderName;\n }\n if (subtitle.value) {\n structured.conversationName = subtitle.value;\n }\n return structured;\n }\n\n // Android 路径:title 退化为 app 名(如 \"飞书\"),实际发送人在 body 里以 \"name: content\" 形式出现。\n const rawTitle = typeof n.title === \"string\" ? n.title : \"\";\n if (isFeishuAppLabel(rawTitle)) {\n const senderName = extractColonSender(n.body ?? \"\");\n if (senderName) {\n return {\n senderName,\n conversationType: \"private\",\n };\n }\n }\n\n return {};\n}\n\nfunction buildTitle(n: RawNotification, structured: FeishuStructuredFields): string {\n if (structured.conversationType === \"group\" && structured.conversationName) {\n return structured.conversationName;\n }\n // Android 私聊 title 是 app 名,用 body 解析出的 senderName 顶上去,跟 iOS 对齐。\n if (structured.conversationType === \"private\" && structured.senderName) {\n return structured.senderName;\n }\n return typeof n.title === \"string\" ? n.title : \"\";\n}\n\nfunction buildContent(n: RawNotification, structured: FeishuStructuredFields): string {\n const body = n.body?.trim();\n\n if (structured.conversationType === \"group\" && structured.senderName && body) {\n const half = `${structured.senderName}:`;\n const full = `${structured.senderName}:`;\n return body.startsWith(half) || body.startsWith(full)\n ? body\n : `${structured.senderName}: ${body}`;\n }\n\n if (structured.conversationType === \"private\" && structured.senderName && body) {\n const half = `${structured.senderName}:`;\n const full = `${structured.senderName}:`;\n if (body.startsWith(half)) return body.slice(half.length).trimStart();\n if (body.startsWith(full)) return body.slice(full.length).trimStart();\n return body;\n }\n\n return body ?? \"\";\n}\n\nexport function normalizeFeishuFields(\n n: RawNotification,\n): FeishuNormalizedNotification | undefined {\n const appName = typeof n.app === \"string\" ? n.app : \"\";\n if (!isFeishuApp(appName)) {\n return undefined;\n }\n\n const structured = deriveStructured(n);\n\n // Feishu 通知但任何规则都没命中:让 caller 走默认归一化路径,避免与非 Feishu 通知行为分裂。\n if (\n structured.senderName === undefined\n && structured.conversationType === undefined\n && structured.conversationName === undefined\n ) {\n return undefined;\n }\n\n return {\n title: buildTitle(n, structured),\n content: buildContent(n, structured),\n structured,\n };\n}\n",
90
- "import { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport interface IngestContext {\n clientLabel?: string;\n authKind?: \"relay-api-key\" | \"http-api-key\" | \"gateway-token\" | \"local\" | string;\n}\n\nconst storage = new AsyncLocalStorage<IngestContext>();\n\nexport function runWithIngestContext<T>(context: IngestContext | undefined, fn: () => T): T {\n return storage.run(context ?? {}, fn);\n}\n\nexport function getIngestContext(): IngestContext {\n return storage.getStore() ?? {};\n}\n\nexport function currentClientLabel(fallback = \"legacy\"): string {\n return getIngestContext().clientLabel?.trim() || fallback;\n}\n",
91
- "/**\n * 录音本地存储管理(§5.2)\n *\n * 目录结构:\n * <storageDir>/recordings/\n * ├── audio/ # 原始音频 + 打点文件\n * │ ├── 2026-03-23_14-32.ogg\n * │ └── 2026-03-23_14-32.srt\n * ├── transcript-data/ # 转写 JSON(主存储)\n * │ └── 2026-03-23_14-32.json\n * ├── transcripts/ # 转写文本\n * │ └── 2026-03-23_14-32_与王总沟通产品方向.md\n * ├── summaries/ # 转写摘要\n * │ └── 2026-03-23_14-32.md\n * └── index.json # 元数据索引\n */\n\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n rmSync,\n readdirSync,\n statSync,\n} from \"node:fs\";\nimport { join, basename } from \"node:path\";\nimport type {\n RecordingMetadata,\n RecordingTransferStatus,\n} from \"../types.js\";\nimport { transition } from \"./state-machine.js\";\nimport type { Logger } from \"../logger.js\";\nimport { currentClientLabel } from \"../ingest-context.js\";\nimport {\n buildTranscriptDataFilename as buildTranscriptDataJsonFilename,\n buildTranscriptDocument,\n extractTranscriptSummaryFromDocument,\n extractTranscriptTextFromDocument,\n extractTranscriptTitleFromDocument,\n parseTranscriptDocument,\n} from \"./transcript-document.js\";\n\n/**\n * 从 OSS URL 中提取音频文件扩展名(含点号,如 \".ogg\")\n * 默认返回 \".ogg\"(小硬件录音为 Opus/OGG 格式)\n */\nfunction extractAudioExt(ossUrl: string): string {\n try {\n const pathname = new URL(ossUrl).pathname;\n const m = pathname.match(/(\\.[a-z0-9]+)(?:\\?|$)/i);\n if (m) return m[1].toLowerCase();\n } catch {\n const m = ossUrl.match(/(\\.[a-z0-9]+)(?:\\?|$)/i);\n if (m) return m[1].toLowerCase();\n }\n return \".ogg\"; // 硬件默认录音格式(Opus/OGG)\n}\n\n// ─── Types ───\n\n/** 持久化到 index.json 的单条录音记录 */\nexport interface RecordingIndexEntry {\n /** 录音 ID,基于文件名(如 \"2026-03-23_14-32\") */\n id: string;\n /** 原始元数据 */\n metadata: RecordingMetadata;\n /** 来源客户端 label;旧数据无该字段,查询时视为 legacy */\n clientLabel?: string;\n /** 当前插件侧状态 */\n status: RecordingTransferStatus;\n /** 本地音频文件相对路径 */\n audioFile?: string;\n /** 本地打点文件相对路径 */\n srtFile?: string;\n /** 本地转写文件相对路径 */\n transcriptFile?: string;\n /** 本地转写 JSON 文件相对路径 */\n transcriptDataFile?: string;\n /** 本地摘要文件相对路径 */\n summaryFile?: string;\n /** 转写标题 */\n title?: string;\n /** 最近一次失败原因(同步失败 / 转写失败) */\n lastError?: string;\n /** 入库时间 ISO 8601 */\n ingestedAt: string;\n /** 最后更新时间 ISO 8601 */\n updatedAt: string;\n}\n\n/** 录音存储索引(整个 index.json) */\ninterface RecordingIndex {\n recordings: RecordingIndexEntry[];\n}\n\nexport interface RecordingStorageContext {\n stateDir: string;\n workspaceDir?: string;\n}\n\n// ─── Constants ───\n\nconst RECORDINGS_DIR = \"recordings\";\nconst AUDIO_DIR = \"audio\";\nconst TRANSCRIPT_DATA_DIR = \"transcript-data\";\nconst TRANSCRIPTS_DIR = \"transcripts\";\nconst SUMMARIES_DIR = \"summaries\";\nconst INDEX_FILE = \"index.json\";\n\nfunction stripMarkdownFence(markdown: string): string {\n return markdown.replace(/\\r\\n/g, \"\\n\");\n}\n\nfunction deriveTitleFromTranscriptPath(\n transcriptFile: string | undefined,\n recordingId: string,\n): string | undefined {\n if (!transcriptFile) return undefined;\n const name = basename(transcriptFile, \".md\");\n const prefix = `${recordingId}_`;\n if (name.startsWith(prefix)) {\n const derived = name.slice(prefix.length).trim();\n return derived || undefined;\n }\n return undefined;\n}\n\nfunction extractTranscriptContent(markdown: string): string {\n const normalized = stripMarkdownFence(markdown);\n const firstDivider = normalized.indexOf(\"\\n---\\n\");\n let body = firstDivider >= 0\n ? normalized.slice(firstDivider + \"\\n---\\n\".length)\n : normalized;\n\n if (body.startsWith(\"\\n\")) {\n body = body.slice(1);\n }\n\n if (body.startsWith(\"### 关键点\")) {\n const secondDivider = body.indexOf(\"\\n---\\n\");\n if (secondDivider >= 0) {\n body = body.slice(secondDivider + \"\\n---\\n\".length);\n if (body.startsWith(\"\\n\")) {\n body = body.slice(1);\n }\n }\n }\n\n const lines = body\n .split(\"\\n\")\n .filter((line) => !/^\\*\\*\\[关键点 .+\\]\\*\\*$/.test(line.trim()))\n .filter((line) => !/^- \\*\\*\\[关键点 .+\\]\\*\\*$/.test(line.trim()));\n\n return lines.join(\"\\n\").replace(/\\n{3,}/g, \"\\n\\n\").trim();\n}\n\n// ─── Public Functions ───\n\n/**\n * 解析录音存储根目录(复用通知同级的 stateDir 路径)\n */\nexport function resolveRecordingStorageDir(\n ctx: RecordingStorageContext,\n logger: Pick<Logger, \"info\" | \"warn\">,\n): string {\n const stateRecDir = join(\n ctx.stateDir,\n \"plugins\",\n \"phone-notifications\",\n RECORDINGS_DIR,\n );\n\n try {\n mkdirSync(stateRecDir, { recursive: true });\n logger.info(`录音将写入 stateDir 路径: ${stateRecDir}`);\n return stateRecDir;\n } catch {\n // fallback\n }\n\n if (ctx.workspaceDir) {\n const wsRecDir = join(ctx.workspaceDir, RECORDINGS_DIR);\n try {\n mkdirSync(wsRecDir, { recursive: true });\n logger.warn(`stateDir 不可用,录音已回退到 workspace 路径: ${wsRecDir}`);\n return wsRecDir;\n } catch {\n // fallthrough\n }\n }\n\n throw new Error(`录音存储目录不可用: ${stateRecDir}`);\n}\n\n// ─── RecordingStorage Class ───\n\nexport class RecordingStorage {\n private readonly dir: string;\n private readonly audioDir: string;\n private readonly transcriptDataDir: string;\n private readonly transcriptsDir: string;\n private readonly summariesDir: string;\n private readonly indexPath: string;\n private index: RecordingIndex = { recordings: [] };\n\n constructor(\n dir: string,\n private readonly logger: Logger,\n ) {\n this.dir = dir;\n this.audioDir = join(dir, AUDIO_DIR);\n this.transcriptDataDir = join(dir, TRANSCRIPT_DATA_DIR);\n this.transcriptsDir = join(dir, TRANSCRIPTS_DIR);\n this.summariesDir = join(dir, SUMMARIES_DIR);\n this.indexPath = join(dir, INDEX_FILE);\n }\n\n /** 初始化目录结构并加载索引 */\n async init(): Promise<void> {\n mkdirSync(this.audioDir, { recursive: true });\n mkdirSync(this.transcriptDataDir, { recursive: true });\n mkdirSync(this.transcriptsDir, { recursive: true });\n mkdirSync(this.summariesDir, { recursive: true });\n this.loadIndex();\n this.logger.info(\n `录音存储已初始化: ${this.dir}(共 ${this.index.recordings.length} 条记录)`,\n );\n }\n\n /** 获取音频目录路径 */\n getAudioDir(): string {\n return this.audioDir;\n }\n\n /** 获取转写 JSON 目录路径 */\n getTranscriptDataDir(): string {\n return this.transcriptDataDir;\n }\n\n /** 获取转写目录路径 */\n getTranscriptsDir(): string {\n return this.transcriptsDir;\n }\n\n /** 获取摘要目录路径 */\n getSummariesDir(): string {\n return this.summariesDir;\n }\n\n // ─── 录音入库 ───\n\n /**\n * 收到 recordings.sync 后,将元数据写入索引。\n * 如果同 ID 录音已存在则更新,否则新建。\n * 返回录音 ID。\n */\n ingest(recordingId: string, metadata: RecordingMetadata): string {\n const id = recordingId;\n const clientLabel = currentClientLabel(\"default\");\n const existing = this.findById(id);\n\n if (existing) {\n const sameAudioUrl = existing.metadata.oss_audio_url === metadata.oss_audio_url;\n const canPreserveSyncState =\n sameAudioUrl\n && !!existing.audioFile\n && existing.status !== \"syncing_openclaw\"\n && existing.status !== \"sync_failed\";\n\n if (canPreserveSyncState) {\n existing.metadata = metadata;\n existing.clientLabel = clientLabel;\n existing.updatedAt = new Date().toISOString();\n this.saveIndex();\n this.logger.info(\n `录音元数据已更新: ${id}(同音频,保留状态 ${existing.status})`,\n );\n return id;\n }\n\n // 更新已有记录(覆盖上传/本地文件缺失场景)\n if (existing.transcriptDataFile) {\n rmSync(join(this.dir, existing.transcriptDataFile), { force: true });\n }\n if (existing.transcriptFile) {\n rmSync(join(this.dir, existing.transcriptFile), { force: true });\n }\n if (existing.summaryFile) {\n rmSync(join(this.dir, existing.summaryFile), { force: true });\n }\n existing.metadata = metadata;\n existing.clientLabel = clientLabel;\n existing.status = \"syncing_openclaw\";\n existing.transcriptDataFile = undefined;\n existing.transcriptFile = undefined;\n existing.summaryFile = undefined;\n existing.title = undefined;\n existing.lastError = undefined;\n existing.updatedAt = new Date().toISOString();\n this.logger.info(`录音元数据已更新: ${id}`);\n } else {\n const entry: RecordingIndexEntry = {\n id,\n metadata,\n clientLabel,\n status: \"syncing_openclaw\",\n ingestedAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n this.index.recordings.push(entry);\n this.logger.info(`录音元数据已入库: ${id}`);\n }\n\n this.saveIndex();\n return id;\n }\n\n // ─── 状态管理 ───\n\n /**\n * 更新录音传输状态(严格状态机校验)\n */\n updateStatus(\n recordingId: string,\n newStatus: RecordingTransferStatus,\n ): RecordingIndexEntry {\n const entry = this.findById(recordingId);\n if (!entry) {\n throw new Error(`录音不存在: ${recordingId}`);\n }\n\n const validatedStatus = transition(entry.status, newStatus);\n entry.status = validatedStatus;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n this.logger.info(`录音状态更新: ${recordingId} → ${newStatus}`);\n return entry;\n }\n\n /**\n * 记录本地音频文件已下载\n */\n setAudioFile(recordingId: string, filename: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n entry.audioFile = `${AUDIO_DIR}/${filename}`;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 记录本地打点文件已下载\n */\n setSrtFile(recordingId: string, filename: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n entry.srtFile = `${AUDIO_DIR}/${filename}`;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 记录转写 JSON 文件路径\n */\n setTranscriptDataFile(recordingId: string, filename: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n const nextTranscriptDataFile = `${TRANSCRIPT_DATA_DIR}/${filename}`;\n if (entry.transcriptDataFile && entry.transcriptDataFile !== nextTranscriptDataFile) {\n rmSync(join(this.dir, entry.transcriptDataFile), { force: true });\n }\n entry.transcriptDataFile = nextTranscriptDataFile;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 记录转写文件路径\n */\n setTranscriptFile(recordingId: string, filename: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n const nextTranscriptFile = `${TRANSCRIPTS_DIR}/${filename}`;\n if (entry.transcriptFile && entry.transcriptFile !== nextTranscriptFile) {\n rmSync(join(this.dir, entry.transcriptFile), { force: true });\n }\n entry.transcriptFile = nextTranscriptFile;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 记录摘要文件路径\n */\n setSummaryFile(recordingId: string, filename: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n const nextSummaryFile = `${SUMMARIES_DIR}/${filename}`;\n if (entry.summaryFile && entry.summaryFile !== nextSummaryFile) {\n rmSync(join(this.dir, entry.summaryFile), { force: true });\n }\n entry.summaryFile = nextSummaryFile;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 记录转写标题\n */\n setTitle(recordingId: string, title?: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n entry.title = title?.trim() || undefined;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 记录最近一次失败原因;传 undefined 表示清除错误\n */\n setLastError(recordingId: string, error?: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n entry.lastError = error?.trim() || undefined;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 读取摘要文本\n */\n readSummary(recordingId: string): string | undefined {\n const entry = this.findById(recordingId);\n if (!entry) return undefined;\n\n if (entry.summaryFile) {\n const summary = this.readRelativeTextFile(entry.summaryFile);\n if (summary?.trim()) {\n return summary.trim();\n }\n }\n\n const transcriptDoc = entry.transcriptDataFile\n ? this.readRelativeTranscriptDocument(entry.transcriptDataFile)\n : undefined;\n return extractTranscriptSummaryFromDocument(transcriptDoc);\n }\n\n /**\n * 优先从 transcript JSON 中读取正文,旧数据回退读取 Markdown。\n */\n readTranscript(recordingId: string): string | undefined {\n const entry = this.findById(recordingId);\n if (!entry) return undefined;\n\n if (entry.transcriptDataFile) {\n const transcriptDoc = this.readRelativeTranscriptDocument(entry.transcriptDataFile);\n const transcriptFromJson = extractTranscriptTextFromDocument(transcriptDoc);\n if (transcriptFromJson !== undefined) {\n return transcriptFromJson;\n }\n }\n\n if (!entry.transcriptFile) return undefined;\n const markdown = this.readRelativeTextFile(entry.transcriptFile);\n if (!markdown) return undefined;\n const transcript = extractTranscriptContent(markdown);\n return transcript || undefined;\n }\n\n /**\n * 读取结构化 transcript JSON。\n */\n readTranscriptDocument(recordingId: string) {\n const entry = this.findById(recordingId);\n if (!entry?.transcriptDataFile) {\n return undefined;\n }\n return this.readRelativeTranscriptDocument(entry.transcriptDataFile);\n }\n\n // ─── 查询 ───\n\n findById(id: string): RecordingIndexEntry | undefined {\n return this.index.recordings.find((r) => r.id === id);\n }\n\n listAll(): RecordingIndexEntry[] {\n return [...this.index.recordings].sort(\n (a, b) => b.metadata.created_at.localeCompare(a.metadata.created_at),\n );\n }\n\n listByStatus(status: RecordingTransferStatus): RecordingIndexEntry[] {\n return this.listAll().filter((r) => r.status === status);\n }\n\n rename(recordingId: string, name: string): RecordingIndexEntry {\n const entry = this.findById(recordingId);\n if (!entry) {\n throw new Error(`录音不存在: ${recordingId}`);\n }\n\n entry.metadata = {\n ...entry.metadata,\n name,\n };\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n this.logger.info(`录音名称已更新: ${recordingId} → ${name}`);\n return entry;\n }\n\n // ─── 删除 ───\n\n /**\n * 删除录音及其本地文件(约束 R-4 安全删除)\n *\n * @param opts.localOnly 仅删除本地文件(音频/打点/转写),保留索引条目。\n * App 端\"仅删除本地\"时使用此模式,插件侧保留元数据记录。\n * 默认 false — 完整删除(文件 + 索引)。\n */\n delete(\n recordingId: string,\n opts?: { localOnly?: boolean },\n ): boolean {\n const entry = this.findById(recordingId);\n if (!entry) return false;\n\n // 删除本地文件\n if (entry.audioFile) {\n const audioPath = join(this.dir, entry.audioFile);\n rmSync(audioPath, { force: true });\n }\n if (entry.srtFile) {\n const srtPath = join(this.dir, entry.srtFile);\n rmSync(srtPath, { force: true });\n }\n if (entry.transcriptDataFile) {\n const transcriptDataPath = join(this.dir, entry.transcriptDataFile);\n rmSync(transcriptDataPath, { force: true });\n }\n if (entry.transcriptFile) {\n const transcriptPath = join(this.dir, entry.transcriptFile);\n rmSync(transcriptPath, { force: true });\n }\n if (entry.summaryFile) {\n const summaryPath = join(this.dir, entry.summaryFile);\n rmSync(summaryPath, { force: true });\n }\n\n if (opts?.localOnly) {\n // 保留索引条目,清除文件引用\n entry.audioFile = undefined;\n entry.srtFile = undefined;\n entry.transcriptDataFile = undefined;\n entry.transcriptFile = undefined;\n entry.summaryFile = undefined;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n this.logger.info(`录音本地文件已删除(保留索引): ${recordingId}`);\n } else {\n // 从索引中移除\n this.index.recordings = this.index.recordings.filter(\n (r) => r.id !== recordingId,\n );\n this.saveIndex();\n this.logger.info(`录音已完整删除: ${recordingId}`);\n }\n return true;\n }\n\n // ─── Helpers ───\n\n /**\n * 生成音频文件名。扩展名从 OSS URL 中提取,未提供时默认 .ogg(硬件录音格式)\n */\n buildAudioFilename(recordingId: string, ossUrl?: string): string {\n const ext = ossUrl ? extractAudioExt(ossUrl) : \".ogg\";\n return `${recordingId}${ext}`;\n }\n\n /**\n * 生成打点文件名\n */\n buildSrtFilename(recordingId: string): string {\n return `${recordingId}.srt`;\n }\n\n /**\n * 生成转写 JSON 文件名\n */\n buildTranscriptDataFilename(recordingId: string): string {\n return buildTranscriptDataJsonFilename(recordingId);\n }\n\n /**\n * 生成转写文件名\n * @param summary 摘要标题(≤ 10 字)\n */\n buildTranscriptFilename(recordingId: string, summary: string): string {\n // 清理文件名中的非法字符\n const safeSummary = summary\n .replace(/[/\\\\:*?\"<>|]/g, \"\")\n .trim()\n .slice(0, 20);\n return safeSummary\n ? `${recordingId}_${safeSummary}.md`\n : `${recordingId}.md`;\n }\n\n /**\n * 生成摘要文件名\n */\n buildSummaryFilename(recordingId: string): string {\n return `${recordingId}.md`;\n }\n\n /**\n * 获取音频文件的绝对路径。ossUrl 用于推断文件扩展名\n */\n getAudioFilePath(recordingId: string, ossUrl?: string): string {\n return join(this.audioDir, this.buildAudioFilename(recordingId, ossUrl));\n }\n\n /**\n * 获取打点文件的绝对路径\n */\n getSrtFilePath(recordingId: string): string {\n return join(this.audioDir, this.buildSrtFilename(recordingId));\n }\n\n /**\n * 获取转写 JSON 文件的绝对路径\n */\n getTranscriptDataFilePath(recordingId: string): string {\n return join(this.transcriptDataDir, this.buildTranscriptDataFilename(recordingId));\n }\n\n /**\n * 获取摘要文件的绝对路径\n */\n getSummaryFilePath(recordingId: string): string {\n return join(this.summariesDir, this.buildSummaryFilename(recordingId));\n }\n\n // ─── Persistence ───\n\n private loadIndex(): void {\n if (!existsSync(this.indexPath)) {\n this.index = { recordings: [] };\n return;\n }\n try {\n const raw = JSON.parse(readFileSync(this.indexPath, \"utf-8\"));\n if (raw && Array.isArray(raw.recordings)) {\n let needsRewrite = false;\n const normalized = raw.recordings\n .filter((entry: unknown) => entry && typeof entry === \"object\")\n .map((entry: any) => {\n const compacted: RecordingIndexEntry = {\n id: entry.id,\n metadata: entry.metadata,\n status: entry.status,\n ingestedAt: entry.ingestedAt,\n updatedAt: entry.updatedAt,\n };\n if (typeof entry.audioFile === \"string\") compacted.audioFile = entry.audioFile;\n if (typeof entry.srtFile === \"string\") compacted.srtFile = entry.srtFile;\n if (typeof entry.transcriptFile === \"string\") {\n compacted.transcriptFile = entry.transcriptFile;\n }\n let transcriptDoc = typeof entry.transcriptDataFile === \"string\"\n ? this.readRelativeTranscriptDocument(entry.transcriptDataFile)\n : undefined;\n if (typeof entry.transcriptDataFile === \"string\" && transcriptDoc) {\n compacted.transcriptDataFile = entry.transcriptDataFile;\n } else {\n const legacyTranscriptText = typeof entry.transcript === \"string\" && entry.transcript.trim()\n ? entry.transcript.trim()\n : compacted.transcriptFile\n ? extractTranscriptContent(\n this.readRelativeTextFile(compacted.transcriptFile) ?? \"\",\n ) || undefined\n : undefined;\n const legacyTitle = typeof entry.title === \"string\" && entry.title.trim()\n ? entry.title.trim()\n : deriveTitleFromTranscriptPath(compacted.transcriptFile, compacted.id);\n const legacySummary = typeof entry.summary === \"string\" && entry.summary.trim()\n ? entry.summary.trim()\n : undefined;\n\n if (legacyTranscriptText) {\n transcriptDoc = buildTranscriptDocument({\n recordingId: compacted.id,\n generatedAt: compacted.updatedAt,\n source: {\n provider: \"legacy-markdown\",\n },\n title: legacyTitle,\n summary: legacySummary,\n text: legacyTranscriptText,\n segments: [],\n });\n const transcriptDataFilename = this.buildTranscriptDataFilename(compacted.id);\n writeFileSync(\n join(this.transcriptDataDir, transcriptDataFilename),\n JSON.stringify(transcriptDoc, null, 2),\n \"utf-8\",\n );\n compacted.transcriptDataFile = `${TRANSCRIPT_DATA_DIR}/${transcriptDataFilename}`;\n needsRewrite = true;\n }\n }\n\n if (typeof entry.summaryFile === \"string\") {\n compacted.summaryFile = entry.summaryFile;\n } else if (typeof entry.summary === \"string\" && entry.summary.trim()) {\n const summaryFilename = this.buildSummaryFilename(entry.id);\n writeFileSync(\n join(this.summariesDir, summaryFilename),\n entry.summary.trim(),\n \"utf-8\",\n );\n compacted.summaryFile = `${SUMMARIES_DIR}/${summaryFilename}`;\n needsRewrite = true;\n } else {\n const summaryFromDocument = extractTranscriptSummaryFromDocument(transcriptDoc);\n if (summaryFromDocument) {\n const summaryFilename = this.buildSummaryFilename(entry.id);\n writeFileSync(\n join(this.summariesDir, summaryFilename),\n summaryFromDocument,\n \"utf-8\",\n );\n compacted.summaryFile = `${SUMMARIES_DIR}/${summaryFilename}`;\n needsRewrite = true;\n }\n }\n if (typeof entry.title === \"string\" && entry.title.trim()) {\n compacted.title = entry.title.trim();\n } else {\n const titleFromDocument = extractTranscriptTitleFromDocument(transcriptDoc);\n const derivedTitle = titleFromDocument ?? deriveTitleFromTranscriptPath(\n compacted.transcriptFile,\n compacted.id,\n );\n if (derivedTitle) {\n compacted.title = derivedTitle;\n needsRewrite = true;\n }\n }\n if (typeof entry.lastError === \"string\" && entry.lastError.trim()) {\n compacted.lastError = entry.lastError.trim();\n }\n if (compacted.status === \"transcribing\") {\n compacted.status = \"transcribe_failed\";\n compacted.lastError = compacted.lastError\n ?? \"转写任务已中断,请重新发起转写\";\n compacted.updatedAt = new Date().toISOString();\n needsRewrite = true;\n }\n return compacted;\n });\n const hadLargeFields = raw.recordings.some(\n (entry: any) => entry && typeof entry === \"object\" && (\"transcript\" in entry || \"summary\" in entry),\n );\n this.index = { recordings: normalized };\n if (hadLargeFields || needsRewrite) {\n this.saveIndex();\n }\n } else {\n this.index = { recordings: [] };\n }\n } catch {\n this.logger.warn(`录音索引文件损坏,已重建: ${this.indexPath}`);\n this.index = { recordings: [] };\n }\n }\n\n private readRelativeTextFile(relativePath: string): string | undefined {\n try {\n return readFileSync(join(this.dir, relativePath), \"utf-8\");\n } catch {\n return undefined;\n }\n }\n\n private readRelativeTranscriptDocument(relativePath: string) {\n const raw = this.readRelativeTextFile(relativePath);\n if (!raw) {\n return undefined;\n }\n return parseTranscriptDocument(raw);\n }\n\n private saveIndex(): void {\n writeFileSync(\n this.indexPath,\n JSON.stringify(this.index, null, 2),\n \"utf-8\",\n );\n }\n\n async close(): Promise<void> {\n // 当前无需额外清理\n }\n}\n",
90
+ "/**\n * 录音本地存储管理(§5.2)\n *\n * 目录结构:\n * <storageDir>/recordings/\n * ├── audio/ # 原始音频 + 打点文件\n * │ ├── 2026-03-23_14-32.ogg\n * │ └── 2026-03-23_14-32.srt\n * ├── transcript-data/ # 转写 JSON(主存储)\n * │ └── 2026-03-23_14-32.json\n * ├── transcripts/ # 转写文本\n * │ └── 2026-03-23_14-32_与王总沟通产品方向.md\n * ├── summaries/ # 转写摘要\n * │ └── 2026-03-23_14-32.md\n * └── index.json # 元数据索引\n */\n\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n rmSync,\n readdirSync,\n statSync,\n} from \"node:fs\";\nimport { join, basename } from \"node:path\";\nimport type {\n RecordingMetadata,\n RecordingTransferStatus,\n} from \"../types.js\";\nimport { transition } from \"./state-machine.js\";\nimport type { Logger } from \"../logger.js\";\nimport { currentClientLabel } from \"../ingest-context.js\";\nimport {\n buildTranscriptDataFilename as buildTranscriptDataJsonFilename,\n buildTranscriptDocument,\n extractTranscriptSummaryFromDocument,\n extractTranscriptTextFromDocument,\n extractTranscriptTitleFromDocument,\n parseTranscriptDocument,\n} from \"./transcript-document.js\";\n\n/**\n * 从 OSS URL 中提取音频文件扩展名(含点号,如 \".ogg\")\n * 默认返回 \".ogg\"(小硬件录音为 Opus/OGG 格式)\n */\nfunction extractAudioExt(ossUrl: string): string {\n try {\n const pathname = new URL(ossUrl).pathname;\n const m = pathname.match(/(\\.[a-z0-9]+)(?:\\?|$)/i);\n if (m) return m[1].toLowerCase();\n } catch {\n const m = ossUrl.match(/(\\.[a-z0-9]+)(?:\\?|$)/i);\n if (m) return m[1].toLowerCase();\n }\n return \".ogg\"; // 硬件默认录音格式(Opus/OGG)\n}\n\n// ─── Types ───\n\n/** 持久化到 index.json 的单条录音记录 */\nexport interface RecordingIndexEntry {\n /** 录音 ID,基于文件名(如 \"2026-03-23_14-32\") */\n id: string;\n /** 原始元数据 */\n metadata: RecordingMetadata;\n /** 来源客户端 label;旧数据无该字段,查询时视为 legacy */\n clientLabel?: string;\n /** 当前插件侧状态 */\n status: RecordingTransferStatus;\n /** 本地音频文件相对路径 */\n audioFile?: string;\n /** 本地打点文件相对路径 */\n srtFile?: string;\n /** 本地转写文件相对路径 */\n transcriptFile?: string;\n /** 本地转写 JSON 文件相对路径 */\n transcriptDataFile?: string;\n /** 本地摘要文件相对路径 */\n summaryFile?: string;\n /** 转写标题 */\n title?: string;\n /** 最近一次失败原因(同步失败 / 转写失败) */\n lastError?: string;\n /** 入库时间 ISO 8601 */\n ingestedAt: string;\n /** 最后更新时间 ISO 8601 */\n updatedAt: string;\n}\n\n/** 录音存储索引(整个 index.json) */\ninterface RecordingIndex {\n recordings: RecordingIndexEntry[];\n}\n\nexport interface RecordingStorageContext {\n stateDir: string;\n workspaceDir?: string;\n}\n\n// ─── Constants ───\n\nconst RECORDINGS_DIR = \"recordings\";\nconst AUDIO_DIR = \"audio\";\nconst TRANSCRIPT_DATA_DIR = \"transcript-data\";\nconst TRANSCRIPTS_DIR = \"transcripts\";\nconst SUMMARIES_DIR = \"summaries\";\nconst INDEX_FILE = \"index.json\";\n\nfunction stripMarkdownFence(markdown: string): string {\n return markdown.replace(/\\r\\n/g, \"\\n\");\n}\n\nfunction deriveTitleFromTranscriptPath(\n transcriptFile: string | undefined,\n recordingId: string,\n): string | undefined {\n if (!transcriptFile) return undefined;\n const name = basename(transcriptFile, \".md\");\n const prefix = `${recordingId}_`;\n if (name.startsWith(prefix)) {\n const derived = name.slice(prefix.length).trim();\n return derived || undefined;\n }\n return undefined;\n}\n\nfunction extractTranscriptContent(markdown: string): string {\n const normalized = stripMarkdownFence(markdown);\n const firstDivider = normalized.indexOf(\"\\n---\\n\");\n let body = firstDivider >= 0\n ? normalized.slice(firstDivider + \"\\n---\\n\".length)\n : normalized;\n\n if (body.startsWith(\"\\n\")) {\n body = body.slice(1);\n }\n\n if (body.startsWith(\"### 关键点\")) {\n const secondDivider = body.indexOf(\"\\n---\\n\");\n if (secondDivider >= 0) {\n body = body.slice(secondDivider + \"\\n---\\n\".length);\n if (body.startsWith(\"\\n\")) {\n body = body.slice(1);\n }\n }\n }\n\n const lines = body\n .split(\"\\n\")\n .filter((line) => !/^\\*\\*\\[关键点 .+\\]\\*\\*$/.test(line.trim()))\n .filter((line) => !/^- \\*\\*\\[关键点 .+\\]\\*\\*$/.test(line.trim()));\n\n return lines.join(\"\\n\").replace(/\\n{3,}/g, \"\\n\\n\").trim();\n}\n\n// ─── Public Functions ───\n\n/**\n * 解析录音存储根目录(复用通知同级的 stateDir 路径)\n */\nexport function resolveRecordingStorageDir(\n ctx: RecordingStorageContext,\n logger: Pick<Logger, \"info\" | \"warn\">,\n): string {\n const stateRecDir = join(\n ctx.stateDir,\n \"plugins\",\n \"phone-notifications\",\n RECORDINGS_DIR,\n );\n\n try {\n mkdirSync(stateRecDir, { recursive: true });\n logger.info(`录音将写入 stateDir 路径: ${stateRecDir}`);\n return stateRecDir;\n } catch {\n // fallback\n }\n\n if (ctx.workspaceDir) {\n const wsRecDir = join(ctx.workspaceDir, RECORDINGS_DIR);\n try {\n mkdirSync(wsRecDir, { recursive: true });\n logger.warn(`stateDir 不可用,录音已回退到 workspace 路径: ${wsRecDir}`);\n return wsRecDir;\n } catch {\n // fallthrough\n }\n }\n\n throw new Error(`录音存储目录不可用: ${stateRecDir}`);\n}\n\n// ─── RecordingStorage Class ───\n\nexport class RecordingStorage {\n private readonly dir: string;\n private readonly audioDir: string;\n private readonly transcriptDataDir: string;\n private readonly transcriptsDir: string;\n private readonly summariesDir: string;\n private readonly indexPath: string;\n private index: RecordingIndex = { recordings: [] };\n\n constructor(\n dir: string,\n private readonly logger: Logger,\n ) {\n this.dir = dir;\n this.audioDir = join(dir, AUDIO_DIR);\n this.transcriptDataDir = join(dir, TRANSCRIPT_DATA_DIR);\n this.transcriptsDir = join(dir, TRANSCRIPTS_DIR);\n this.summariesDir = join(dir, SUMMARIES_DIR);\n this.indexPath = join(dir, INDEX_FILE);\n }\n\n /** 初始化目录结构并加载索引 */\n async init(): Promise<void> {\n mkdirSync(this.audioDir, { recursive: true });\n mkdirSync(this.transcriptDataDir, { recursive: true });\n mkdirSync(this.transcriptsDir, { recursive: true });\n mkdirSync(this.summariesDir, { recursive: true });\n this.loadIndex();\n this.logger.info(\n `录音存储已初始化: ${this.dir}(共 ${this.index.recordings.length} 条记录)`,\n );\n }\n\n /** 获取音频目录路径 */\n getAudioDir(): string {\n return this.audioDir;\n }\n\n /** 获取转写 JSON 目录路径 */\n getTranscriptDataDir(): string {\n return this.transcriptDataDir;\n }\n\n /** 获取转写目录路径 */\n getTranscriptsDir(): string {\n return this.transcriptsDir;\n }\n\n /** 获取摘要目录路径 */\n getSummariesDir(): string {\n return this.summariesDir;\n }\n\n // ─── 录音入库 ───\n\n /**\n * 收到 recordings.sync 后,将元数据写入索引。\n * 如果同 ID 录音已存在则更新,否则新建。\n * 返回录音 ID。\n */\n ingest(recordingId: string, metadata: RecordingMetadata): string {\n const id = recordingId;\n const clientLabel = currentClientLabel(\"default\");\n const existing = this.findById(id);\n\n if (existing) {\n const sameAudioUrl = existing.metadata.oss_audio_url === metadata.oss_audio_url;\n const canPreserveSyncState =\n sameAudioUrl\n && !!existing.audioFile\n && existing.status !== \"syncing_openclaw\"\n && existing.status !== \"sync_failed\";\n\n if (canPreserveSyncState) {\n existing.metadata = metadata;\n existing.clientLabel = clientLabel;\n existing.updatedAt = new Date().toISOString();\n this.saveIndex();\n this.logger.info(\n `录音元数据已更新: ${id}(同音频,保留状态 ${existing.status})`,\n );\n return id;\n }\n\n // 更新已有记录(覆盖上传/本地文件缺失场景)\n if (existing.transcriptDataFile) {\n rmSync(join(this.dir, existing.transcriptDataFile), { force: true });\n }\n if (existing.transcriptFile) {\n rmSync(join(this.dir, existing.transcriptFile), { force: true });\n }\n if (existing.summaryFile) {\n rmSync(join(this.dir, existing.summaryFile), { force: true });\n }\n existing.metadata = metadata;\n existing.clientLabel = clientLabel;\n existing.status = \"syncing_openclaw\";\n existing.transcriptDataFile = undefined;\n existing.transcriptFile = undefined;\n existing.summaryFile = undefined;\n existing.title = undefined;\n existing.lastError = undefined;\n existing.updatedAt = new Date().toISOString();\n this.logger.info(`录音元数据已更新: ${id}`);\n } else {\n const entry: RecordingIndexEntry = {\n id,\n metadata,\n clientLabel,\n status: \"syncing_openclaw\",\n ingestedAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n this.index.recordings.push(entry);\n this.logger.info(`录音元数据已入库: ${id}`);\n }\n\n this.saveIndex();\n return id;\n }\n\n // ─── 状态管理 ───\n\n /**\n * 更新录音传输状态(严格状态机校验)\n */\n updateStatus(\n recordingId: string,\n newStatus: RecordingTransferStatus,\n ): RecordingIndexEntry {\n const entry = this.findById(recordingId);\n if (!entry) {\n throw new Error(`录音不存在: ${recordingId}`);\n }\n\n const validatedStatus = transition(entry.status, newStatus);\n entry.status = validatedStatus;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n this.logger.info(`录音状态更新: ${recordingId} → ${newStatus}`);\n return entry;\n }\n\n /** 外部结果写入后,直接标记为已转写。 */\n markResultWritten(recordingId: string): RecordingIndexEntry {\n const entry = this.findById(recordingId);\n if (!entry) {\n throw new Error(`录音不存在: ${recordingId}`);\n }\n entry.status = \"transcribed\";\n entry.lastError = undefined;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n this.logger.info(`录音结果已写入: ${recordingId}`);\n return entry;\n }\n\n /**\n * 记录本地音频文件已下载\n */\n setAudioFile(recordingId: string, filename: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n const nextAudioFile = `${AUDIO_DIR}/${filename}`;\n if (entry.audioFile && entry.audioFile !== nextAudioFile) {\n rmSync(join(this.dir, entry.audioFile), { force: true });\n }\n entry.audioFile = nextAudioFile;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 记录本地打点文件已下载\n */\n setSrtFile(recordingId: string, filename: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n entry.srtFile = `${AUDIO_DIR}/${filename}`;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 记录转写 JSON 文件路径\n */\n setTranscriptDataFile(recordingId: string, filename: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n const nextTranscriptDataFile = `${TRANSCRIPT_DATA_DIR}/${filename}`;\n if (entry.transcriptDataFile && entry.transcriptDataFile !== nextTranscriptDataFile) {\n rmSync(join(this.dir, entry.transcriptDataFile), { force: true });\n }\n entry.transcriptDataFile = nextTranscriptDataFile;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 记录转写文件路径\n */\n setTranscriptFile(recordingId: string, filename: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n const nextTranscriptFile = `${TRANSCRIPTS_DIR}/${filename}`;\n if (entry.transcriptFile && entry.transcriptFile !== nextTranscriptFile) {\n rmSync(join(this.dir, entry.transcriptFile), { force: true });\n }\n entry.transcriptFile = nextTranscriptFile;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 记录摘要文件路径\n */\n setSummaryFile(recordingId: string, filename: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n const nextSummaryFile = `${SUMMARIES_DIR}/${filename}`;\n if (entry.summaryFile && entry.summaryFile !== nextSummaryFile) {\n rmSync(join(this.dir, entry.summaryFile), { force: true });\n }\n entry.summaryFile = nextSummaryFile;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 记录转写标题\n */\n setTitle(recordingId: string, title?: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n entry.title = title?.trim() || undefined;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 记录最近一次失败原因;传 undefined 表示清除错误\n */\n setLastError(recordingId: string, error?: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n entry.lastError = error?.trim() || undefined;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 读取摘要文本\n */\n readSummary(recordingId: string): string | undefined {\n const entry = this.findById(recordingId);\n if (!entry) return undefined;\n\n if (entry.summaryFile) {\n const summary = this.readRelativeTextFile(entry.summaryFile);\n if (summary?.trim()) {\n return summary.trim();\n }\n }\n\n const transcriptDoc = entry.transcriptDataFile\n ? this.readRelativeTranscriptDocument(entry.transcriptDataFile)\n : undefined;\n return extractTranscriptSummaryFromDocument(transcriptDoc);\n }\n\n /**\n * 优先从 transcript JSON 中读取正文,旧数据回退读取 Markdown。\n */\n readTranscript(recordingId: string): string | undefined {\n const entry = this.findById(recordingId);\n if (!entry) return undefined;\n\n if (entry.transcriptDataFile) {\n const transcriptDoc = this.readRelativeTranscriptDocument(entry.transcriptDataFile);\n const transcriptFromJson = extractTranscriptTextFromDocument(transcriptDoc);\n if (transcriptFromJson !== undefined) {\n return transcriptFromJson;\n }\n }\n\n if (!entry.transcriptFile) return undefined;\n const markdown = this.readRelativeTextFile(entry.transcriptFile);\n if (!markdown) return undefined;\n const transcript = extractTranscriptContent(markdown);\n return transcript || undefined;\n }\n\n /**\n * 读取结构化 transcript JSON。\n */\n readTranscriptDocument(recordingId: string) {\n const entry = this.findById(recordingId);\n if (!entry?.transcriptDataFile) {\n return undefined;\n }\n return this.readRelativeTranscriptDocument(entry.transcriptDataFile);\n }\n\n // ─── 查询 ───\n\n findById(id: string): RecordingIndexEntry | undefined {\n return this.index.recordings.find((r) => r.id === id);\n }\n\n listAll(): RecordingIndexEntry[] {\n return [...this.index.recordings].sort(\n (a, b) => b.metadata.created_at.localeCompare(a.metadata.created_at),\n );\n }\n\n listByStatus(status: RecordingTransferStatus): RecordingIndexEntry[] {\n return this.listAll().filter((r) => r.status === status);\n }\n\n rename(recordingId: string, name: string): RecordingIndexEntry {\n const entry = this.findById(recordingId);\n if (!entry) {\n throw new Error(`录音不存在: ${recordingId}`);\n }\n\n entry.metadata = {\n ...entry.metadata,\n name,\n };\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n this.logger.info(`录音名称已更新: ${recordingId} → ${name}`);\n return entry;\n }\n\n // ─── 删除 ───\n\n /**\n * 删除录音及其本地文件(约束 R-4 安全删除)\n *\n * @param opts.localOnly 仅删除本地文件(音频/打点/转写),保留索引条目。\n * App 端\"仅删除本地\"时使用此模式,插件侧保留元数据记录。\n * 默认 false — 完整删除(文件 + 索引)。\n */\n delete(\n recordingId: string,\n opts?: { localOnly?: boolean },\n ): boolean {\n const entry = this.findById(recordingId);\n if (!entry) return false;\n\n // 删除本地文件\n if (entry.audioFile) {\n const audioPath = join(this.dir, entry.audioFile);\n rmSync(audioPath, { force: true });\n }\n if (entry.srtFile) {\n const srtPath = join(this.dir, entry.srtFile);\n rmSync(srtPath, { force: true });\n }\n if (entry.transcriptDataFile) {\n const transcriptDataPath = join(this.dir, entry.transcriptDataFile);\n rmSync(transcriptDataPath, { force: true });\n }\n if (entry.transcriptFile) {\n const transcriptPath = join(this.dir, entry.transcriptFile);\n rmSync(transcriptPath, { force: true });\n }\n if (entry.summaryFile) {\n const summaryPath = join(this.dir, entry.summaryFile);\n rmSync(summaryPath, { force: true });\n }\n\n if (opts?.localOnly) {\n // 保留索引条目,清除文件引用\n entry.audioFile = undefined;\n entry.srtFile = undefined;\n entry.transcriptDataFile = undefined;\n entry.transcriptFile = undefined;\n entry.summaryFile = undefined;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n this.logger.info(`录音本地文件已删除(保留索引): ${recordingId}`);\n } else {\n // 从索引中移除\n this.index.recordings = this.index.recordings.filter(\n (r) => r.id !== recordingId,\n );\n this.saveIndex();\n this.logger.info(`录音已完整删除: ${recordingId}`);\n }\n return true;\n }\n\n // ─── Helpers ───\n\n /**\n * 生成音频文件名。扩展名从 OSS URL 中提取,未提供时默认 .ogg(硬件录音格式)\n */\n buildAudioFilename(recordingId: string, ossUrl?: string): string {\n const ext = ossUrl ? extractAudioExt(ossUrl) : \".ogg\";\n return `${recordingId}${ext}`;\n }\n\n /**\n * 生成打点文件名\n */\n buildSrtFilename(recordingId: string): string {\n return `${recordingId}.srt`;\n }\n\n /**\n * 生成转写 JSON 文件名\n */\n buildTranscriptDataFilename(recordingId: string): string {\n return buildTranscriptDataJsonFilename(recordingId);\n }\n\n /**\n * 生成转写文件名\n * @param summary 摘要标题(≤ 10 字)\n */\n buildTranscriptFilename(recordingId: string, summary: string): string {\n // 清理文件名中的非法字符\n const safeSummary = summary\n .replace(/[/\\\\:*?\"<>|]/g, \"\")\n .trim()\n .slice(0, 20);\n return safeSummary\n ? `${recordingId}_${safeSummary}.md`\n : `${recordingId}.md`;\n }\n\n /**\n * 生成摘要文件名\n */\n buildSummaryFilename(recordingId: string): string {\n return `${recordingId}.md`;\n }\n\n /**\n * 获取音频文件的绝对路径。ossUrl 用于推断文件扩展名\n */\n getAudioFilePath(recordingId: string, ossUrl?: string): string {\n return join(this.audioDir, this.buildAudioFilename(recordingId, ossUrl));\n }\n\n /**\n * 获取打点文件的绝对路径\n */\n getSrtFilePath(recordingId: string): string {\n return join(this.audioDir, this.buildSrtFilename(recordingId));\n }\n\n /**\n * 获取转写 JSON 文件的绝对路径\n */\n getTranscriptDataFilePath(recordingId: string): string {\n return join(this.transcriptDataDir, this.buildTranscriptDataFilename(recordingId));\n }\n\n /**\n * 获取摘要文件的绝对路径\n */\n getSummaryFilePath(recordingId: string): string {\n return join(this.summariesDir, this.buildSummaryFilename(recordingId));\n }\n\n // ─── Persistence ───\n\n private loadIndex(): void {\n if (!existsSync(this.indexPath)) {\n this.index = { recordings: [] };\n return;\n }\n try {\n const raw = JSON.parse(readFileSync(this.indexPath, \"utf-8\"));\n if (raw && Array.isArray(raw.recordings)) {\n let needsRewrite = false;\n const normalized = raw.recordings\n .filter((entry: unknown) => entry && typeof entry === \"object\")\n .map((entry: any) => {\n const compacted: RecordingIndexEntry = {\n id: entry.id,\n metadata: entry.metadata,\n status: entry.status,\n ingestedAt: entry.ingestedAt,\n updatedAt: entry.updatedAt,\n };\n if (typeof entry.clientLabel === \"string\" && entry.clientLabel.trim()) {\n compacted.clientLabel = entry.clientLabel.trim();\n }\n if (typeof entry.audioFile === \"string\") compacted.audioFile = entry.audioFile;\n if (typeof entry.srtFile === \"string\") compacted.srtFile = entry.srtFile;\n if (typeof entry.transcriptFile === \"string\") {\n compacted.transcriptFile = entry.transcriptFile;\n }\n let transcriptDoc = typeof entry.transcriptDataFile === \"string\"\n ? this.readRelativeTranscriptDocument(entry.transcriptDataFile)\n : undefined;\n if (typeof entry.transcriptDataFile === \"string\" && transcriptDoc) {\n compacted.transcriptDataFile = entry.transcriptDataFile;\n } else {\n const legacyTranscriptText = typeof entry.transcript === \"string\" && entry.transcript.trim()\n ? entry.transcript.trim()\n : compacted.transcriptFile\n ? extractTranscriptContent(\n this.readRelativeTextFile(compacted.transcriptFile) ?? \"\",\n ) || undefined\n : undefined;\n const legacyTitle = typeof entry.title === \"string\" && entry.title.trim()\n ? entry.title.trim()\n : deriveTitleFromTranscriptPath(compacted.transcriptFile, compacted.id);\n const legacySummary = typeof entry.summary === \"string\" && entry.summary.trim()\n ? entry.summary.trim()\n : undefined;\n\n if (legacyTranscriptText) {\n transcriptDoc = buildTranscriptDocument({\n recordingId: compacted.id,\n generatedAt: compacted.updatedAt,\n source: {\n provider: \"legacy-markdown\",\n },\n title: legacyTitle,\n summary: legacySummary,\n text: legacyTranscriptText,\n segments: [],\n });\n const transcriptDataFilename = this.buildTranscriptDataFilename(compacted.id);\n writeFileSync(\n join(this.transcriptDataDir, transcriptDataFilename),\n JSON.stringify(transcriptDoc, null, 2),\n \"utf-8\",\n );\n compacted.transcriptDataFile = `${TRANSCRIPT_DATA_DIR}/${transcriptDataFilename}`;\n needsRewrite = true;\n }\n }\n\n if (typeof entry.summaryFile === \"string\") {\n compacted.summaryFile = entry.summaryFile;\n } else if (typeof entry.summary === \"string\" && entry.summary.trim()) {\n const summaryFilename = this.buildSummaryFilename(entry.id);\n writeFileSync(\n join(this.summariesDir, summaryFilename),\n entry.summary.trim(),\n \"utf-8\",\n );\n compacted.summaryFile = `${SUMMARIES_DIR}/${summaryFilename}`;\n needsRewrite = true;\n } else {\n const summaryFromDocument = extractTranscriptSummaryFromDocument(transcriptDoc);\n if (summaryFromDocument) {\n const summaryFilename = this.buildSummaryFilename(entry.id);\n writeFileSync(\n join(this.summariesDir, summaryFilename),\n summaryFromDocument,\n \"utf-8\",\n );\n compacted.summaryFile = `${SUMMARIES_DIR}/${summaryFilename}`;\n needsRewrite = true;\n }\n }\n if (typeof entry.title === \"string\" && entry.title.trim()) {\n compacted.title = entry.title.trim();\n } else {\n const titleFromDocument = extractTranscriptTitleFromDocument(transcriptDoc);\n const derivedTitle = titleFromDocument ?? deriveTitleFromTranscriptPath(\n compacted.transcriptFile,\n compacted.id,\n );\n if (derivedTitle) {\n compacted.title = derivedTitle;\n needsRewrite = true;\n }\n }\n if (typeof entry.lastError === \"string\" && entry.lastError.trim()) {\n compacted.lastError = entry.lastError.trim();\n }\n if (compacted.status === \"transcribing\") {\n compacted.status = \"transcribe_failed\";\n compacted.lastError = compacted.lastError\n ?? \"转写任务已中断,请重新发起转写\";\n compacted.updatedAt = new Date().toISOString();\n needsRewrite = true;\n }\n return compacted;\n });\n const hadLargeFields = raw.recordings.some(\n (entry: any) => entry && typeof entry === \"object\" && (\"transcript\" in entry || \"summary\" in entry),\n );\n this.index = { recordings: normalized };\n if (hadLargeFields || needsRewrite) {\n this.saveIndex();\n }\n } else {\n this.index = { recordings: [] };\n }\n } catch {\n this.logger.warn(`录音索引文件损坏,已重建: ${this.indexPath}`);\n this.index = { recordings: [] };\n }\n }\n\n private readRelativeTextFile(relativePath: string): string | undefined {\n try {\n return readFileSync(join(this.dir, relativePath), \"utf-8\");\n } catch {\n return undefined;\n }\n }\n\n private readRelativeTranscriptDocument(relativePath: string) {\n const raw = this.readRelativeTextFile(relativePath);\n if (!raw) {\n return undefined;\n }\n return parseTranscriptDocument(raw);\n }\n\n private saveIndex(): void {\n writeFileSync(\n this.indexPath,\n JSON.stringify(this.index, null, 2),\n \"utf-8\",\n );\n }\n\n async close(): Promise<void> {\n // 当前无需额外清理\n }\n}\n",
92
91
  "/**\n * 录音传输状态机(约束 R-3)\n *\n * 状态流转严格不可跳跃:\n * receiving_failed → receiving\n * receiving → pending_oss_upload\n * pending_oss_upload → uploading_oss\n * uploading_oss → oss_uploaded\n * oss_uploaded → syncing_openclaw\n * syncing_openclaw → synced | sync_failed\n * sync_failed → syncing_openclaw\n * synced → transcribing(仅当已配置 ASR)\n * transcribing → transcribed | transcribe_failed\n * transcribe_failed → transcribing\n * transcribed → transcribing(手动强制重新转写)\n */\n\nimport type { RecordingTransferStatus } from \"../types.js\";\n\n/** 合法的状态转换表:from → Set<to> */\nconst VALID_TRANSITIONS: ReadonlyMap<\n RecordingTransferStatus,\n ReadonlySet<RecordingTransferStatus>\n> = new Map<RecordingTransferStatus, ReadonlySet<RecordingTransferStatus>>([\n [\"receiving_failed\", new Set([\"receiving\"])],\n [\"receiving\", new Set([\"pending_oss_upload\"])],\n [\"pending_oss_upload\", new Set([\"uploading_oss\"])],\n [\"uploading_oss\", new Set([\"oss_uploaded\"])],\n [\"oss_uploaded\", new Set([\"syncing_openclaw\"])],\n [\"syncing_openclaw\", new Set([\"synced\", \"sync_failed\"])],\n [\"sync_failed\", new Set([\"syncing_openclaw\"])],\n [\"synced\", new Set([\"transcribing\"])],\n [\"transcribing\", new Set([\"transcribed\", \"transcribe_failed\"])],\n [\"transcribe_failed\", new Set([\"transcribing\"])],\n [\"transcribed\", new Set([\"transcribing\"])],\n]);\n\n/** 插件侧关注的状态:从 syncing_openclaw 开始 */\nexport type PluginSideStatus = Extract<\n RecordingTransferStatus,\n | \"syncing_openclaw\"\n | \"sync_failed\"\n | \"synced\"\n | \"transcribing\"\n | \"transcribe_failed\"\n | \"transcribed\"\n>;\n\n/**\n * 校验状态转换是否合法\n */\nexport function isValidTransition(\n from: RecordingTransferStatus,\n to: RecordingTransferStatus,\n): boolean {\n const allowed = VALID_TRANSITIONS.get(from);\n return allowed ? allowed.has(to) : false;\n}\n\n/**\n * 尝试执行状态转换,非法转换抛出 Error\n */\nexport function transition(\n from: RecordingTransferStatus,\n to: RecordingTransferStatus,\n): RecordingTransferStatus {\n if (!isValidTransition(from, to)) {\n throw new TransitionError(from, to);\n }\n return to;\n}\n\n/**\n * 状态是否为终态(没有后续合法转换)\n */\nexport function isTerminalStatus(status: RecordingTransferStatus): boolean {\n const allowed = VALID_TRANSITIONS.get(status);\n return !allowed || allowed.size === 0;\n}\n\n/**\n * 状态是否允许触发 ASR 转写\n */\nexport function canStartTranscription(status: RecordingTransferStatus): boolean {\n return (\n status === \"synced\"\n || status === \"transcribe_failed\"\n || status === \"transcribed\"\n );\n}\n\n/**\n * 获取当前状态的所有合法后续状态\n */\nexport function getNextStatuses(\n status: RecordingTransferStatus,\n): RecordingTransferStatus[] {\n const allowed = VALID_TRANSITIONS.get(status);\n return allowed ? [...allowed] : [];\n}\n\nexport class TransitionError extends Error {\n constructor(\n public readonly from: RecordingTransferStatus,\n public readonly to: RecordingTransferStatus,\n ) {\n super(`非法状态转换: ${from} → ${to}`);\n this.name = \"TransitionError\";\n }\n}\n",
93
- "export const TRANSCRIPT_DOCUMENT_SCHEMA_VERSION = 1;\n\nexport interface TranscriptDocumentSource {\n provider: string;\n taskId?: string;\n requestId?: string;\n status?: string;\n}\n\nexport interface TranscriptDocumentSegment {\n text: string;\n startMs?: number;\n endMs?: number;\n speakerId?: number;\n}\n\nexport interface TranscriptDocumentContentItem {\n content: string;\n speakerId?: number;\n startTime?: number;\n endTime?: number;\n}\n\nexport interface TranscriptDocumentNormalized {\n title?: string;\n category?: string;\n summary?: string;\n text: string;\n segments: TranscriptDocumentSegment[];\n}\n\nexport interface TranscriptDocument {\n schemaVersion: number;\n recordingId: string;\n generatedAt: string;\n source: TranscriptDocumentSource;\n normalized: TranscriptDocumentNormalized;\n raw?: unknown;\n}\n\nexport function buildTranscriptDataFilename(recordingId: string): string {\n return `${recordingId}.json`;\n}\n\nexport function buildTranscriptDocument(params: {\n recordingId: string;\n generatedAt?: string;\n source: TranscriptDocumentSource;\n title?: string;\n category?: string;\n summary?: string;\n text?: string;\n segments?: TranscriptDocumentSegment[];\n raw?: unknown;\n}): TranscriptDocument {\n const segments = normalizeSegments(params.segments);\n const text = normalizePossiblyEmptyText(params.text) ?? joinSegmentsText(segments) ?? \"\";\n\n return {\n schemaVersion: TRANSCRIPT_DOCUMENT_SCHEMA_VERSION,\n recordingId: params.recordingId,\n generatedAt: params.generatedAt ?? new Date().toISOString(),\n source: {\n provider: params.source.provider,\n taskId: normalizeOptionalText(params.source.taskId),\n requestId: normalizeOptionalText(params.source.requestId),\n status: normalizeOptionalText(params.source.status),\n },\n normalized: {\n title: normalizeOptionalText(params.title),\n category: normalizeOptionalText(params.category),\n summary: normalizePossiblyEmptyText(params.summary),\n text,\n segments,\n },\n raw: params.raw,\n };\n}\n\nexport function parseTranscriptDocument(\n value: string | unknown,\n): TranscriptDocument | undefined {\n const parsed = typeof value === \"string\"\n ? parseJson(value)\n : value;\n\n if (!parsed || typeof parsed !== \"object\") {\n return undefined;\n }\n\n const doc = parsed as Record<string, unknown>;\n const recordingId = normalizeOptionalText(doc.recordingId);\n const generatedAt = normalizeOptionalText(doc.generatedAt);\n const source = normalizeSource(doc.source);\n const normalized = normalizeDocumentBody(doc.normalized);\n\n if (!recordingId || !generatedAt || !source || !normalized) {\n return undefined;\n }\n\n return {\n schemaVersion:\n typeof doc.schemaVersion === \"number\"\n ? doc.schemaVersion\n : TRANSCRIPT_DOCUMENT_SCHEMA_VERSION,\n recordingId,\n generatedAt,\n source,\n normalized,\n raw: doc.raw,\n };\n}\n\nexport function extractTranscriptTextFromDocument(\n doc: TranscriptDocument | undefined,\n): string | undefined {\n if (!doc) return undefined;\n return normalizePossiblyEmptyText(doc.normalized.text)\n ?? joinSegmentsText(doc.normalized.segments);\n}\n\nexport function extractTranscriptSummaryFromDocument(\n doc: TranscriptDocument | undefined,\n): string | undefined {\n if (!doc) return undefined;\n return normalizePossiblyEmptyText(doc.normalized.summary);\n}\n\nexport function extractTranscriptTitleFromDocument(\n doc: TranscriptDocument | undefined,\n): string | undefined {\n if (!doc) return undefined;\n return normalizeOptionalText(doc.normalized.title);\n}\n\nexport function extractSourceTextListFromDocument(\n doc: TranscriptDocument | undefined,\n): TranscriptDocumentContentItem[] | undefined {\n if (!doc) return undefined;\n\n const fromNormalized = doc.normalized.segments\n .map((segment) => ({\n content: segment.text,\n speakerId: segment.speakerId,\n startTime: segment.startMs,\n endTime: segment.endMs,\n }))\n .filter((segment) => normalizeOptionalText(segment.content));\n\n if (fromNormalized.length > 0) {\n return fromNormalized;\n }\n\n const rawList = extractRawSourceTextList(doc.raw);\n if (rawList.length > 0) {\n return rawList;\n }\n\n const normalizedText = normalizeOptionalText(doc.normalized.text);\n return normalizedText\n ? [{ content: normalizedText }]\n : undefined;\n}\n\nfunction parseJson(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeSource(value: unknown): TranscriptDocumentSource | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const source = value as Record<string, unknown>;\n const provider = normalizeOptionalText(source.provider);\n if (!provider) {\n return undefined;\n }\n\n return {\n provider,\n taskId: normalizeOptionalText(source.taskId),\n requestId: normalizeOptionalText(source.requestId),\n status: normalizeOptionalText(source.status),\n };\n}\n\nfunction normalizeDocumentBody(\n value: unknown,\n): TranscriptDocumentNormalized | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const normalized = value as Record<string, unknown>;\n const segments = normalizeSegments(normalized.segments);\n const text = normalizePossiblyEmptyText(normalized.text) ?? joinSegmentsText(segments);\n if (text === undefined) {\n return undefined;\n }\n\n return {\n title: normalizeOptionalText(normalized.title),\n category: normalizeOptionalText(normalized.category),\n summary: normalizePossiblyEmptyText(normalized.summary),\n text,\n segments,\n };\n}\n\nfunction normalizeSegments(value: unknown): TranscriptDocumentSegment[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value\n .map((item) => normalizeSegment(item))\n .filter((item): item is TranscriptDocumentSegment => !!item);\n}\n\nfunction normalizeSegment(value: unknown): TranscriptDocumentSegment | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const segment = value as Record<string, unknown>;\n const text = normalizeOptionalText(segment.text);\n if (!text) {\n return undefined;\n }\n\n return {\n text,\n startMs: normalizeOptionalNumber(segment.startMs),\n endMs: normalizeOptionalNumber(segment.endMs),\n speakerId: normalizeOptionalInteger(segment.speakerId),\n };\n}\n\nfunction joinSegmentsText(\n segments: TranscriptDocumentSegment[],\n): string | undefined {\n const parts = segments\n .map((segment) => normalizeOptionalText(segment.text))\n .filter((segment): segment is string => !!segment);\n\n if (parts.length === 0) {\n return undefined;\n }\n\n return parts.join(\"\\n\\n\");\n}\n\nfunction extractRawSourceTextList(raw: unknown): TranscriptDocumentContentItem[] {\n if (!raw || typeof raw !== \"object\") {\n return [];\n }\n\n const recordResult = (raw as { recordResult?: unknown }).recordResult;\n if (!recordResult || typeof recordResult !== \"object\") {\n return [];\n }\n\n const sourceTextList = (recordResult as { sourceTextList?: unknown }).sourceTextList;\n if (!Array.isArray(sourceTextList)) {\n return [];\n }\n\n return sourceTextList\n .flatMap((item) => {\n if (!item || typeof item !== \"object\") {\n return [];\n }\n\n const value = item as Record<string, unknown>;\n const content = normalizeOptionalText(value.content);\n if (!content) {\n return [];\n }\n\n return [{\n content,\n speakerId: normalizeOptionalInteger(value.speakerId),\n startTime: normalizeOptionalNumber(value.startTime),\n endTime: normalizeOptionalNumber(value.endTime),\n }];\n });\n}\n\nfunction normalizeOptionalText(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim()\n ? value.trim()\n : undefined;\n}\n\nfunction normalizePossiblyEmptyText(value: unknown): string | undefined {\n return typeof value === \"string\"\n ? value.trim()\n : undefined;\n}\n\nfunction normalizeOptionalNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction normalizeOptionalInteger(value: unknown): number | undefined {\n return Number.isInteger(value)\n ? Number(value)\n : undefined;\n}\n",
92
+ "export const TRANSCRIPT_DOCUMENT_SCHEMA_VERSION = 1;\n\nexport interface TranscriptDocumentSource {\n provider: string;\n taskId?: string;\n requestId?: string;\n status?: string;\n delivery?: string;\n}\n\nexport interface TranscriptDocumentSegment {\n text: string;\n startMs?: number;\n endMs?: number;\n speakerId?: number;\n}\n\nexport interface TranscriptDocumentContentItem {\n content: string;\n speakerId?: number;\n startTime?: number;\n endTime?: number;\n}\n\nexport interface TranscriptDocumentNormalized {\n title?: string;\n category?: string;\n summary?: string;\n text: string;\n segments: TranscriptDocumentSegment[];\n}\n\nexport interface TranscriptDocument {\n schemaVersion: number;\n recordingId: string;\n generatedAt: string;\n source: TranscriptDocumentSource;\n normalized: TranscriptDocumentNormalized;\n raw?: unknown;\n}\n\nexport function buildTranscriptDataFilename(recordingId: string): string {\n return `${recordingId}.json`;\n}\n\nexport function buildTranscriptDocument(params: {\n recordingId: string;\n generatedAt?: string;\n source: TranscriptDocumentSource;\n title?: string;\n category?: string;\n summary?: string;\n text?: string;\n segments?: TranscriptDocumentSegment[];\n raw?: unknown;\n}): TranscriptDocument {\n const segments = normalizeSegments(params.segments);\n const text = normalizePossiblyEmptyText(params.text) ?? joinSegmentsText(segments) ?? \"\";\n\n return {\n schemaVersion: TRANSCRIPT_DOCUMENT_SCHEMA_VERSION,\n recordingId: params.recordingId,\n generatedAt: params.generatedAt ?? new Date().toISOString(),\n source: {\n provider: params.source.provider,\n taskId: normalizeOptionalText(params.source.taskId),\n requestId: normalizeOptionalText(params.source.requestId),\n status: normalizeOptionalText(params.source.status),\n delivery: normalizeOptionalText(params.source.delivery),\n },\n normalized: {\n title: normalizeOptionalText(params.title),\n category: normalizeOptionalText(params.category),\n summary: normalizePossiblyEmptyText(params.summary),\n text,\n segments,\n },\n raw: params.raw,\n };\n}\n\nexport function parseTranscriptDocument(\n value: string | unknown,\n): TranscriptDocument | undefined {\n const parsed = typeof value === \"string\"\n ? parseJson(value)\n : value;\n\n if (!parsed || typeof parsed !== \"object\") {\n return undefined;\n }\n\n const doc = parsed as Record<string, unknown>;\n const recordingId = normalizeOptionalText(doc.recordingId);\n const generatedAt = normalizeOptionalText(doc.generatedAt);\n const source = normalizeSource(doc.source);\n const normalized = normalizeDocumentBody(doc.normalized);\n\n if (!recordingId || !generatedAt || !source || !normalized) {\n return undefined;\n }\n\n return {\n schemaVersion:\n typeof doc.schemaVersion === \"number\"\n ? doc.schemaVersion\n : TRANSCRIPT_DOCUMENT_SCHEMA_VERSION,\n recordingId,\n generatedAt,\n source,\n normalized,\n raw: doc.raw,\n };\n}\n\nexport function extractTranscriptTextFromDocument(\n doc: TranscriptDocument | undefined,\n): string | undefined {\n if (!doc) return undefined;\n return normalizePossiblyEmptyText(doc.normalized.text)\n ?? joinSegmentsText(doc.normalized.segments);\n}\n\nexport function extractTranscriptSummaryFromDocument(\n doc: TranscriptDocument | undefined,\n): string | undefined {\n if (!doc) return undefined;\n return normalizePossiblyEmptyText(doc.normalized.summary);\n}\n\nexport function extractTranscriptTitleFromDocument(\n doc: TranscriptDocument | undefined,\n): string | undefined {\n if (!doc) return undefined;\n return normalizeOptionalText(doc.normalized.title);\n}\n\nexport function extractSourceTextListFromDocument(\n doc: TranscriptDocument | undefined,\n): TranscriptDocumentContentItem[] | undefined {\n if (!doc) return undefined;\n\n const fromNormalized = doc.normalized.segments\n .map((segment) => ({\n content: segment.text,\n speakerId: segment.speakerId,\n startTime: segment.startMs,\n endTime: segment.endMs,\n }))\n .filter((segment) => normalizeOptionalText(segment.content));\n\n if (fromNormalized.length > 0) {\n return fromNormalized;\n }\n\n const rawList = extractRawSourceTextList(doc.raw);\n if (rawList.length > 0) {\n return rawList;\n }\n\n const normalizedText = normalizeOptionalText(doc.normalized.text);\n return normalizedText\n ? [{ content: normalizedText }]\n : undefined;\n}\n\nfunction parseJson(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeSource(value: unknown): TranscriptDocumentSource | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const source = value as Record<string, unknown>;\n const provider = normalizeOptionalText(source.provider);\n if (!provider) {\n return undefined;\n }\n\n return {\n provider,\n taskId: normalizeOptionalText(source.taskId),\n requestId: normalizeOptionalText(source.requestId),\n status: normalizeOptionalText(source.status),\n delivery: normalizeOptionalText(source.delivery),\n };\n}\n\nfunction normalizeDocumentBody(\n value: unknown,\n): TranscriptDocumentNormalized | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const normalized = value as Record<string, unknown>;\n const segments = normalizeSegments(normalized.segments);\n const text = normalizePossiblyEmptyText(normalized.text) ?? joinSegmentsText(segments);\n if (text === undefined) {\n return undefined;\n }\n\n return {\n title: normalizeOptionalText(normalized.title),\n category: normalizeOptionalText(normalized.category),\n summary: normalizePossiblyEmptyText(normalized.summary),\n text,\n segments,\n };\n}\n\nfunction normalizeSegments(value: unknown): TranscriptDocumentSegment[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value\n .map((item) => normalizeSegment(item))\n .filter((item): item is TranscriptDocumentSegment => !!item);\n}\n\nfunction normalizeSegment(value: unknown): TranscriptDocumentSegment | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const segment = value as Record<string, unknown>;\n const text = normalizeOptionalText(segment.text);\n if (!text) {\n return undefined;\n }\n\n return {\n text,\n startMs: normalizeOptionalNumber(segment.startMs),\n endMs: normalizeOptionalNumber(segment.endMs),\n speakerId: normalizeOptionalInteger(segment.speakerId),\n };\n}\n\nfunction joinSegmentsText(\n segments: TranscriptDocumentSegment[],\n): string | undefined {\n const parts = segments\n .map((segment) => normalizeOptionalText(segment.text))\n .filter((segment): segment is string => !!segment);\n\n if (parts.length === 0) {\n return undefined;\n }\n\n return parts.join(\"\\n\\n\");\n}\n\nfunction extractRawSourceTextList(raw: unknown): TranscriptDocumentContentItem[] {\n if (!raw || typeof raw !== \"object\") {\n return [];\n }\n\n const recordResult = (raw as { recordResult?: unknown }).recordResult;\n if (!recordResult || typeof recordResult !== \"object\") {\n return [];\n }\n\n const sourceTextList = (recordResult as { sourceTextList?: unknown }).sourceTextList;\n if (!Array.isArray(sourceTextList)) {\n return [];\n }\n\n return sourceTextList\n .flatMap((item) => {\n if (!item || typeof item !== \"object\") {\n return [];\n }\n\n const value = item as Record<string, unknown>;\n const content = normalizeOptionalText(value.content);\n if (!content) {\n return [];\n }\n\n return [{\n content,\n speakerId: normalizeOptionalInteger(value.speakerId),\n startTime: normalizeOptionalNumber(value.startTime),\n endTime: normalizeOptionalNumber(value.endTime),\n }];\n });\n}\n\nfunction normalizeOptionalText(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim()\n ? value.trim()\n : undefined;\n}\n\nfunction normalizePossiblyEmptyText(value: unknown): string | undefined {\n return typeof value === \"string\"\n ? value.trim()\n : undefined;\n}\n\nfunction normalizeOptionalNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction normalizeOptionalInteger(value: unknown): number | undefined {\n return Number.isInteger(value)\n ? Number(value)\n : undefined;\n}\n",
94
93
  "/**\n * OSS 文件下载器(约束 R-6)\n *\n * 从 OSS URL 下载原始音频(mp3)和打点文件(srt)到本地。\n * 支持重试、超时控制、下载进度日志。\n */\n\nimport { createWriteStream, existsSync, mkdirSync, statSync, unlinkSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { pipeline } from \"node:stream/promises\";\nimport { Readable } from \"node:stream\";\nimport type { Logger } from \"../logger.js\";\n\n// ─── Types ───\n\nexport interface DownloadOptions {\n /** 下载超时(毫秒),默认 5 分钟 */\n timeoutMs?: number;\n /** 最大重试次数,默认 3 */\n maxRetries?: number;\n /** 重试间隔基数(毫秒),默认 2000 */\n retryBackoffMs?: number;\n}\n\nexport interface DownloadResult {\n ok: boolean;\n /** 下载的文件大小(字节) */\n sizeBytes?: number;\n /** 耗时(毫秒) */\n elapsedMs?: number;\n /** 错误信息 */\n error?: string;\n}\n\nconst DEFAULT_TIMEOUT_MS = 5 * 60 * 1000; // 5 分钟(最大 ~56MB 文件)\nconst DEFAULT_MAX_RETRIES = 3;\nconst DEFAULT_RETRY_BACKOFF_MS = 2000;\n\n// ─── Public API ───\n\n/**\n * 从 URL 下载文件到本地路径\n */\nexport async function downloadFile(\n url: string,\n destPath: string,\n logger: Logger,\n options?: DownloadOptions,\n): Promise<DownloadResult> {\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const maxRetries = options?.maxRetries ?? DEFAULT_MAX_RETRIES;\n const retryBackoffMs = options?.retryBackoffMs ?? DEFAULT_RETRY_BACKOFF_MS;\n\n mkdirSync(dirname(destPath), { recursive: true });\n\n let lastError: string | undefined;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n const startMs = Date.now();\n try {\n logger.info(\n `[downloader] 开始下载 (attempt ${attempt}/${maxRetries}): ${url}`,\n );\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const res = await fetch(url, { signal: controller.signal });\n\n if (!res.ok) {\n throw new Error(`HTTP ${res.status} ${res.statusText}`);\n }\n\n if (!res.body) {\n throw new Error(\"响应体为空\");\n }\n\n // 写入文件\n const writeStream = createWriteStream(destPath);\n const readable = Readable.fromWeb(res.body as any);\n await pipeline(readable, writeStream);\n\n const elapsed = Date.now() - startMs;\n const fileSize = existsSync(destPath)\n ? statSync(destPath).size\n : 0;\n\n logger.info(\n `[downloader] 下载完成: ${destPath} (${formatBytes(fileSize)}, ${elapsed}ms)`,\n );\n\n return { ok: true, sizeBytes: fileSize, elapsedMs: elapsed };\n } finally {\n clearTimeout(timer);\n }\n } catch (err: any) {\n lastError = err?.message ?? String(err);\n\n // 清理可能写了一半的文件\n try {\n if (existsSync(destPath)) unlinkSync(destPath);\n } catch {\n // ignore\n }\n\n const isAbort = err?.name === \"AbortError\";\n logger.warn(\n `[downloader] 下载失败 (attempt ${attempt}/${maxRetries}): ${isAbort ? \"超时\" : lastError}`,\n );\n\n if (attempt < maxRetries) {\n const delay = retryBackoffMs * Math.pow(2, attempt - 1);\n logger.info(`[downloader] ${delay}ms 后重试...`);\n await sleep(delay);\n }\n }\n }\n\n return { ok: false, error: lastError ?? \"下载失败\" };\n}\n\n/**\n * 下载录音的音频文件和打点文件\n */\nexport async function downloadRecordingFiles(\n ossAudioUrl: string,\n ossSrtUrl: string | undefined,\n audioDestPath: string,\n srtDestPath: string,\n logger: Logger,\n options?: DownloadOptions,\n): Promise<{\n audio: DownloadResult;\n srt: DownloadResult | null;\n}> {\n // 下载音频(必须)\n const audio = await downloadFile(ossAudioUrl, audioDestPath, logger, options);\n\n // 下载打点文件(可选)\n let srt: DownloadResult | null = null;\n if (ossSrtUrl) {\n srt = await downloadFile(ossSrtUrl, srtDestPath, logger, options);\n if (!srt.ok) {\n // 打点文件下载失败不阻断主流程,仅警告\n logger.warn(`[downloader] 打点文件下载失败(非致命): ${srt.error}`);\n }\n }\n\n return { audio, srt };\n}\n\n// ─── Helpers ───\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n",
95
94
  "/**\n * ASR 转写调度器(§6 / §7)\n *\n * 按 arc-long-recording §6.2 定义的两层配置结构调度 ASR:\n * - mode = \"api\":YoooClaw 托管云端 ASR(经 model-proxy 长录音接口调用)\n * - mode = \"local\":已停用(保留枚举值用于兼容旧客户端,调用时直接返回错误)\n * - mode = \"yoooclaw\":YoooClaw 自建 ASR(P2,预留接口)\n *\n * 转写流程:\n * 1. 读取录音 OSS URL 与本地文件\n * 2. 调用云端 model-proxy 获取转写文本\n * 3. 将关键点以 [关键点 MM:SS] 内嵌转写文本\n * 4. 自动生成摘要标题(≤ 10 字)\n * 5. 写入 /recordings/transcripts/日期_时间_摘要.md\n */\n\nimport { existsSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type {\n AsrConfig,\n AsrApiConfig,\n RecordingMarker,\n RecordingAsrInitResult,\n RecordingTranscriptItem,\n} from \"../types.js\";\nimport type { Logger } from \"../logger.js\";\nimport { requireApiKey, loadApiKey } from \"../auth/credentials.js\";\nimport { getEnvUrls } from \"../env.js\";\nimport {\n buildTranscriptDataFilename,\n buildTranscriptDocument,\n extractSourceTextListFromDocument,\n} from \"./transcript-document.js\";\n\nconst DEFAULT_LONG_RECORDING_POLL_INTERVAL_MS = 2000;\nconst DEFAULT_LONG_RECORDING_MAX_POLL_ATTEMPTS = 3600;\nconst LONG_RECORDING_RUNNING_STATUSES = new Set([\"PENDING\", \"RUNNING\", \"SUSPENDED\"]);\nconst LONG_RECORDING_TERMINAL_FAILURE_STATUSES = new Set([\"FAILED\", \"CANCELED\", \"UNKNOWN\"]);\n\nconst DEFAULT_HTTP_MAX_ATTEMPTS = 3;\nconst DEFAULT_HTTP_RETRY_BACKOFF_MS = 2000;\n\n// ─── Types ───\n\nexport interface TranscriptionResult {\n ok: boolean;\n /** 转写全文 */\n text?: string;\n /** 带时间戳的分段(如 ASR 支持) */\n segments?: TranscriptSegment[];\n /** 自动生成的摘要标题 */\n summary?: string;\n /** 给客户端展示的摘要文本 */\n summaryText?: string;\n /** 分类信息(如会议纪要、采访) */\n category?: string;\n /** 转写来源信息 */\n sourceInfo?: {\n provider: string;\n taskId?: string;\n requestId?: string;\n status?: string;\n };\n /** Provider 原始响应,供后续兼容字段演进 */\n rawResponse?: unknown;\n /** 错误信息 */\n error?: string;\n}\n\nexport interface TranscriptSegment {\n /** 开始时间(毫秒) */\n start_ms: number;\n /** 结束时间(毫秒) */\n end_ms: number;\n /** 文本内容 */\n text: string;\n /** 说话人 ID(如云端 ASR 返回) */\n speaker_id?: number;\n}\n\ninterface ModelProxyLongRecordingSubmitRequest {\n audioOssUrl: string;\n language?: string;\n enableNormalization?: boolean;\n}\n\ninterface ModelProxyLongRecordingResult {\n sourceText?: string | null;\n sourceTextList?: ModelProxyLongRecordingSourceTextItem[] | null;\n summaryResult?: string | null;\n category?: string | null;\n title?: string | null;\n}\n\ninterface ModelProxyLongRecordingSourceTextItem {\n content?: string | null;\n speakerId?: number | null;\n startTime?: number | null;\n endTime?: number | null;\n}\n\ninterface ModelProxyLongRecordingStatusResponse {\n taskId?: string;\n status?: string;\n requestId?: string;\n errorMessage?: string | null;\n recordResult?: ModelProxyLongRecordingResult | null;\n}\n\ninterface ResponseEnvelope<T> {\n success?: boolean;\n code?: number | string;\n message?: string | null;\n e?: unknown;\n data?: T | null;\n}\n\n// ─── Public API ───\n\n/**\n * 判断 ASR 是否已配置\n */\nexport function isAsrConfigured(config?: AsrConfig): boolean {\n return !!config && !validateAsrConfig(config);\n}\n\n/**\n * 校验客户端下发的 ASR 配置。\n * 返回 undefined 表示配置可用;返回字符串表示错误原因。\n */\nexport function validateAsrConfig(config?: AsrConfig): string | undefined {\n if (!config?.mode) {\n return \"asr.mode is required\";\n }\n\n switch (config.mode) {\n case \"api\":\n return undefined;\n case \"local\":\n return \"本地 Whisper 模式已停用,请改用 asr.mode = \\\"api\\\"\";\n case \"yoooclaw\":\n return \"YoooClaw ASR 尚未实现(P2)\";\n default:\n return `未知的 ASR mode: ${(config as { mode: string }).mode}`;\n }\n}\n\n/**\n * 显式初始化 ASR 能力。\n * - mode=api:校验插件本地 API Key 是否存在,并返回最终使用的 model-proxy submit-task endpoint\n * - mode=local:按配置预下载模型,并返回本地环境状态\n */\nexport async function initializeAsr(\n config: AsrConfig,\n dataDir: string,\n logger: Logger,\n): Promise<RecordingAsrInitResult> {\n const validationError = validateAsrConfig(config);\n if (validationError) {\n return {\n ok: false,\n mode: config.mode,\n error: validationError,\n };\n }\n\n switch (config.mode) {\n case \"api\": {\n const endpoint = resolveModelProxyLongRecordingSubmitEndpoint(config.api);\n const keyConfigured = hasText(config.api?.apiKey) || hasText(loadApiKey());\n\n if (!keyConfigured) {\n return {\n ok: false,\n mode: \"api\",\n provider: \"model-proxy\",\n endpoint,\n language: config.api?.language ?? \"auto\",\n keyConfigured: false,\n error:\n \"API Key 未设置,请在本次 asr.api.apiKey 中传入,或先写入 credentials.json / 执行 ntf auth set-api-key <apiKey>\",\n };\n }\n\n return {\n ok: true,\n mode: \"api\",\n provider: \"model-proxy\",\n endpoint,\n language: config.api?.language ?? \"auto\",\n keyConfigured: true,\n };\n }\n case \"local\":\n return {\n ok: false,\n mode: \"local\",\n error: \"本地 Whisper 模式已停用,请改用 asr.mode = \\\"api\\\"\",\n };\n case \"yoooclaw\":\n return {\n ok: false,\n mode: \"yoooclaw\",\n error: \"YoooClaw ASR 尚未实现(P2)\",\n };\n default:\n return {\n ok: false,\n mode: config.mode,\n error: `未知的 ASR mode: ${config.mode}`,\n };\n }\n}\n\n/**\n * 执行 ASR 转写\n *\n * @param audioFilePath 本地音频文件绝对路径\n * @param config ASR 配置(两层结构:mode + api/local)\n * @param logger 日志\n * @param options 额外上下文(云端 ASR 需要 OSS URL)\n */\nexport async function transcribeAudio(\n audioFilePath: string,\n config: AsrConfig,\n logger: Logger,\n options: {\n audioOssUrl?: string;\n audioDurationMs?: number;\n } = {},\n): Promise<TranscriptionResult> {\n if (!existsSync(audioFilePath)) {\n return { ok: false, error: `音频文件不存在: ${audioFilePath}` };\n }\n\n logger.info(\n `[asr] 开始转写: mode=${config.mode}, file=${audioFilePath}`,\n );\n\n try {\n switch (config.mode) {\n case \"api\":\n return await transcribeWithModelProxy(\n options.audioOssUrl,\n options.audioDurationMs,\n config.api,\n logger,\n );\n case \"local\":\n return {\n ok: false,\n error: \"本地 Whisper 模式已停用,请改用 asr.mode = \\\"api\\\"\",\n };\n case \"yoooclaw\":\n return { ok: false, error: \"YoooClaw ASR 尚未实现(P2)\" };\n default:\n return {\n ok: false,\n error: `未知的 ASR mode: ${config.mode}`,\n };\n }\n } catch (err: any) {\n const msg = err?.message ?? String(err);\n logger.error(`[asr] 转写异常: ${msg}`);\n return { ok: false, error: msg };\n }\n}\n\n/**\n * 将转写结果与关键点标记合并,生成最终 Markdown 转写文本\n *\n * @param result 转写结果\n * @param markers 关键点列表\n * @param recordingName 录音名称\n * @param durationSec 录音总时长(秒)\n * @param createdAt 录音创建时间\n */\nexport function buildTranscriptMarkdown(\n result: TranscriptionResult,\n markers: RecordingMarker[],\n recordingName: string,\n durationSec: number,\n createdAt: string,\n): string { \n const summary = result.summary ?? recordingName.slice(0, 10);\n const lines: string[] = [];\n\n // 元数据头\n lines.push(`# ${summary}`);\n lines.push(\"\");\n lines.push(`> 录音名称:${recordingName}`);\n lines.push(`> 时长:${formatDuration(durationSec)}`);\n lines.push(`> 创建时间:${createdAt}`);\n if (markers.length > 0) {\n lines.push(`> 关键点数:${markers.length}`);\n }\n lines.push(\"\");\n lines.push(\"---\");\n lines.push(\"\");\n\n if (result.segments && result.segments.length > 0) {\n // 有分段的转写文本:在合适的位置插入关键点标记\n const sortedMarkers = [...markers].sort(\n (a, b) => a.timestamp_ms - b.timestamp_ms,\n );\n let markerIdx = 0;\n\n for (const seg of result.segments) {\n // 在当前段之前插入所有对应的关键点\n while (\n markerIdx < sortedMarkers.length &&\n sortedMarkers[markerIdx].timestamp_ms <= seg.start_ms\n ) {\n const m = sortedMarkers[markerIdx];\n lines.push(\n `**[关键点 ${formatTimestamp(m.timestamp_ms)}]**`,\n );\n lines.push(\"\");\n markerIdx++;\n }\n\n const segmentText = formatTranscriptSegmentText(seg);\n if (segmentText) {\n lines.push(segmentText);\n lines.push(\"\");\n }\n }\n\n // 追加剩余关键点\n while (markerIdx < sortedMarkers.length) {\n const m = sortedMarkers[markerIdx];\n lines.push(\n `**[关键点 ${formatTimestamp(m.timestamp_ms)}]**`,\n );\n lines.push(\"\");\n markerIdx++;\n }\n } else if (result.text) {\n // 纯文本转写:在文本头部集中列出关键点\n if (markers.length > 0) {\n lines.push(\"### 关键点\");\n lines.push(\"\");\n for (const m of markers) {\n lines.push(`- **[关键点 ${formatTimestamp(m.timestamp_ms)}]**`);\n }\n lines.push(\"\");\n lines.push(\"---\");\n lines.push(\"\");\n }\n lines.push(result.text);\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * 从转写文本中提取摘要标题(≤ 10 字)\n */\nexport function extractSummary(text: string): string {\n // 取第一句话,截断到 10 字\n const firstLine = text.split(/[。!?\\n]/).find((s) => s.trim().length > 0);\n if (!firstLine) return \"录音转写\";\n const trimmed = firstLine.trim();\n return trimmed.length <= 10 ? trimmed : trimmed.slice(0, 10);\n}\n\n/**\n * 完整的转写工作流:转写 → 生成 Markdown → 写入文件\n */\nexport async function runTranscriptionWorkflow(params: {\n audioFilePath: string;\n audioOssUrl?: string;\n config: AsrConfig;\n markers: RecordingMarker[];\n recordingName: string;\n durationSec: number;\n createdAt: string;\n transcriptsDir: string;\n transcriptDataDir: string;\n summariesDir: string;\n recordingId: string;\n logger: Logger;\n}): Promise<{\n ok: boolean;\n transcriptFilename?: string;\n transcriptDataFilename?: string;\n summaryFilename?: string;\n transcript?: RecordingTranscriptItem[];\n summary?: string;\n title?: string;\n error?: string;\n}> {\n const {\n audioFilePath,\n audioOssUrl,\n config,\n markers,\n recordingName,\n durationSec,\n createdAt,\n transcriptsDir,\n transcriptDataDir,\n summariesDir,\n recordingId,\n logger,\n } = params;\n\n // 1. ASR 转写\n const result = await transcribeAudio(audioFilePath, config, logger, {\n audioOssUrl,\n audioDurationMs: Math.max(0, Math.round(durationSec * 1000)),\n });\n if (!result.ok) {\n return { ok: false, error: result.error };\n }\n\n // 2. 提取摘要\n const title = normalizeOptionalText(result.summary)\n ? normalizeOptionalText(result.summary)!\n : extractSummary(result.text ?? \"\");\n const summary = result.summaryText ?? \"\";\n result.summary = title;\n const transcriptData = buildTranscriptDocument({\n recordingId,\n generatedAt: new Date().toISOString(),\n source: result.sourceInfo ?? {\n provider: config.mode === \"api\" ? \"model-proxy\" : config.mode,\n },\n title,\n category: result.category,\n summary,\n text: result.text,\n segments: (result.segments ?? []).map((segment) => ({\n text: segment.text,\n startMs: segment.start_ms,\n endMs: segment.end_ms,\n speakerId: segment.speaker_id,\n })),\n raw: result.rawResponse,\n });\n\n // 3. 生成 Markdown\n const markdown = buildTranscriptMarkdown(\n result,\n markers,\n recordingName,\n durationSec,\n createdAt,\n );\n\n // 4. 写入文件\n const transcriptDataFilename = buildTranscriptDataFilename(recordingId);\n const transcriptDataPath = join(transcriptDataDir, transcriptDataFilename);\n writeFileSync(\n transcriptDataPath,\n JSON.stringify(transcriptData, null, 2),\n \"utf-8\",\n );\n logger.info(`[asr] 转写 JSON 已写入: ${transcriptDataPath}`);\n\n const safeSummary = title\n .replace(/[/\\\\:*?\"<>|]/g, \"\")\n .trim()\n .slice(0, 20);\n const filename = safeSummary\n ? `${recordingId}_${safeSummary}.md`\n : `${recordingId}.md`;\n const filePath = join(transcriptsDir, filename);\n writeFileSync(filePath, markdown, \"utf-8\");\n logger.info(`[asr] 转写文本已写入: ${filePath}`);\n\n let summaryFilename: string | undefined;\n if (summary) {\n summaryFilename = `${recordingId}.md`;\n const summaryFilePath = join(summariesDir, summaryFilename);\n writeFileSync(summaryFilePath, summary, \"utf-8\");\n logger.info(`[asr] 摘要文本已写入: ${summaryFilePath}`);\n }\n\n return {\n ok: true,\n transcriptFilename: filename,\n transcriptDataFilename,\n summaryFilename,\n transcript: extractSourceTextListFromDocument(transcriptData),\n summary,\n title,\n };\n}\n\n// ─── ASR Provider Implementations ───\n\n/**\n * 通过 model-proxy 的长录音接口执行云端转写。\n */\nasync function transcribeWithModelProxy(\n audioOssUrl: string | undefined,\n audioDurationMs: number | undefined,\n apiConfig: AsrApiConfig | undefined,\n logger: Logger,\n): Promise<TranscriptionResult> {\n const normalizedAudioOssUrl = normalizeOptionalText(audioOssUrl);\n if (!normalizedAudioOssUrl) {\n return { ok: false, error: \"API 模式缺少 audioOssUrl,无法调用 model-proxy\" };\n }\n\n const apiKey = resolveModelProxyApiKey(apiConfig);\n const submitEndpoint = resolveModelProxyLongRecordingSubmitEndpoint(apiConfig);\n const submitBody = buildLongRecordingSubmitRequest(normalizedAudioOssUrl, apiConfig);\n\n logger.info(\n `[asr-submit] 提交长录音任务: endpoint=${submitEndpoint}, body=${stringifyForLog(submitBody) ?? \"{}\"}`,\n );\n\n let res: Response;\n try {\n res = await fetchWithRetry(\n submitEndpoint,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Api-Key-Id\": apiKey,\n },\n body: JSON.stringify(submitBody),\n },\n { logger, context: \"asr-submit\" },\n );\n } catch (err: any) {\n const msg = err?.message ?? String(err);\n logger.error(`[asr-submit] 提交长录音任务网络异常 (已重试): ${msg}`);\n return {\n ok: false,\n error: `Model Proxy ASR submit network error: ${msg}`,\n };\n }\n\n if (!res.ok) {\n const errText = await res.text();\n logger.error(\n `[asr-submit-response] 提交长录音任务失败: status=${res.status}, body=${errText.slice(0, 500)}`,\n );\n return {\n ok: false,\n error: `Model Proxy ASR error: ${res.status} ${errText.slice(0, 200)}`,\n };\n }\n\n const raw = (await res.json()) as\n | ModelProxyLongRecordingStatusResponse\n | ResponseEnvelope<ModelProxyLongRecordingStatusResponse>;\n logger.info(\n `[asr-submit-response] 提交长录音任务响应: ${stringifyForLog(raw) ?? \"{}\"}`,\n );\n const submitEnvelopeError = buildModelProxyEnvelopeError(raw);\n if (submitEnvelopeError) {\n logger.error(\n `[asr-submit-response] 提交长录音任务失败: ${submitEnvelopeError}`,\n );\n return {\n ok: false,\n error: `Model Proxy ASR 提交失败: ${submitEnvelopeError}`,\n };\n }\n\n const data = unwrapResponse(raw);\n const taskId = normalizeOptionalText(data?.taskId);\n const requestId = normalizeOptionalText(data?.requestId);\n const status = normalizeLongRecordingStatus(data?.status);\n\n if (!taskId) {\n return {\n ok: false,\n error: \"Model Proxy ASR 响应缺少 taskId\",\n };\n }\n\n logger.info(\n `[asr] Model Proxy 长录音任务已提交: taskId=${taskId}, status=${status ?? \"UNKNOWN\"}, requestId=${requestId ?? \"n/a\"}`,\n );\n\n if (status && LONG_RECORDING_TERMINAL_FAILURE_STATUSES.has(status)) {\n return {\n ok: false,\n error: buildLongRecordingStatusError(data, status),\n };\n }\n\n return await pollLongRecordingTaskResult({\n apiKey,\n taskId,\n initialRequestId: requestId,\n audioDurationMs,\n apiConfig,\n logger,\n });\n}\n\n// ─── Helpers ───\n\nfunction resolveModelProxyLongRecordingSubmitEndpoint(apiConfig?: AsrApiConfig): string {\n return apiConfig?.endpoint?.trim() || getEnvUrls().modelProxyLongRecordingSubmitTaskUrl;\n}\n\nfunction resolveModelProxyApiKey(apiConfig?: AsrApiConfig): string {\n const requestApiKey = normalizeOptionalText(apiConfig?.apiKey);\n return normalizeApiKeyHeaderValue(requestApiKey ?? requireApiKey());\n}\n\nfunction resolveModelProxyLongRecordingQueryTaskResultBaseUrl(\n apiConfig?: AsrApiConfig,\n): string {\n const customEndpoint = apiConfig?.endpoint?.trim();\n if (customEndpoint) {\n return deriveLongRecordingQueryTaskResultBaseUrl(customEndpoint);\n }\n return getEnvUrls().modelProxyLongRecordingQueryTaskResultBaseUrl;\n}\n\nfunction deriveLongRecordingQueryTaskResultBaseUrl(endpoint: string): string {\n const trimmed = endpoint.replace(/\\/+$/, \"\");\n if (trimmed.endsWith(\"/submit-task\")) {\n return `${trimmed.slice(0, -\"/submit-task\".length)}/query-task-result`;\n }\n return trimmed;\n}\n\nfunction buildLongRecordingSubmitRequest(\n audioOssUrl: string,\n apiConfig?: AsrApiConfig,\n): ModelProxyLongRecordingSubmitRequest {\n const body: ModelProxyLongRecordingSubmitRequest = {\n audioOssUrl,\n };\n\n if (apiConfig?.language?.trim()) {\n body.language = apiConfig.language.trim();\n }\n if (typeof apiConfig?.enableNormalization === \"boolean\") {\n body.enableNormalization = apiConfig.enableNormalization;\n }\n\n return body;\n}\n\nasync function pollLongRecordingTaskResult(params: {\n apiKey: string;\n taskId: string;\n initialRequestId?: string;\n audioDurationMs?: number;\n apiConfig?: AsrApiConfig;\n logger: Logger;\n}): Promise<TranscriptionResult> {\n const {\n apiKey,\n taskId,\n initialRequestId,\n audioDurationMs,\n apiConfig,\n logger,\n } = params;\n const queryBaseUrl = resolveModelProxyLongRecordingQueryTaskResultBaseUrl(apiConfig);\n let lastStatus: string | undefined;\n\n const pollIntervalMs = getPollIntervalMs();\n\n for (let attempt = 1; attempt <= DEFAULT_LONG_RECORDING_MAX_POLL_ATTEMPTS; attempt++) {\n const queryUrl = `${queryBaseUrl}/${encodeURIComponent(taskId)}`;\n let res: Response;\n try {\n res = await fetch(queryUrl, {\n method: \"GET\",\n headers: {\n \"X-Api-Key-Id\": apiKey,\n },\n });\n } catch (err: any) {\n const msg = err?.message ?? String(err);\n logger.warn(\n `[asr-query] 长录音任务查询网络异常: taskId=${taskId}, attempt=${attempt}, error=${msg} — 等待下次轮询`,\n );\n if (attempt < DEFAULT_LONG_RECORDING_MAX_POLL_ATTEMPTS) {\n await sleep(pollIntervalMs);\n continue;\n }\n return {\n ok: false,\n error: `Model Proxy ASR query network error: ${msg}`,\n };\n }\n\n if (!res.ok) {\n const errText = await res.text().catch(() => \"\");\n if (isRetryableHttpStatus(res.status)) {\n logger.warn(\n `[asr-query] 长录音任务查询暂时失败: taskId=${taskId}, attempt=${attempt}, status=${res.status}, body=${errText.slice(0, 200)} — 等待下次轮询`,\n );\n if (attempt < DEFAULT_LONG_RECORDING_MAX_POLL_ATTEMPTS) {\n await sleep(pollIntervalMs);\n continue;\n }\n } else {\n logger.error(\n `[asr-query-response] 长录音任务查询失败: taskId=${taskId}, attempt=${attempt}, status=${res.status}, body=${errText.slice(0, 500)}`,\n );\n }\n return {\n ok: false,\n error: `Model Proxy ASR query error: ${res.status} ${errText.slice(0, 200)}`,\n };\n }\n\n const raw = (await res.json()) as\n | ModelProxyLongRecordingStatusResponse\n | ResponseEnvelope<ModelProxyLongRecordingStatusResponse>;\n const queryEnvelopeError = buildModelProxyEnvelopeError(raw);\n if (queryEnvelopeError) {\n logger.error(\n `[asr-query-response] 长录音任务查询失败: taskId=${taskId}, attempt=${attempt}, ${queryEnvelopeError}`,\n );\n return {\n ok: false,\n error: `Model Proxy ASR 查询失败: ${queryEnvelopeError}`,\n };\n }\n\n const data = unwrapResponse(raw);\n const status = normalizeLongRecordingStatus(data?.status) ?? \"UNKNOWN\";\n const requestId = normalizeOptionalText(data?.requestId) ?? initialRequestId;\n\n if (status !== lastStatus) {\n logger.info(\n `[asr-query-response] 长录音任务查询响应: taskId=${taskId}, attempt=${attempt}, body=${stringifyForLog(raw) ?? \"{}\"}`,\n );\n logger.info(\n `[asr] Model Proxy 长录音任务状态: taskId=${taskId}, status=${status}, attempt=${attempt}, requestId=${requestId ?? \"n/a\"}`,\n );\n lastStatus = status;\n }\n\n if (status === \"SUCCEEDED\") {\n return buildLongRecordingSuccessResult(\n taskId,\n requestId,\n data,\n audioDurationMs,\n logger,\n );\n }\n\n if (LONG_RECORDING_TERMINAL_FAILURE_STATUSES.has(status)) {\n return {\n ok: false,\n error: buildLongRecordingStatusError(data, status),\n };\n }\n\n if (!LONG_RECORDING_RUNNING_STATUSES.has(status)) {\n return {\n ok: false,\n error: `Model Proxy ASR 返回未知任务状态: ${status}`,\n };\n }\n\n if (attempt < DEFAULT_LONG_RECORDING_MAX_POLL_ATTEMPTS) {\n await sleep(pollIntervalMs);\n }\n }\n\n return {\n ok: false,\n error:\n `Model Proxy ASR 轮询超时: taskId=${taskId}, waited=${DEFAULT_LONG_RECORDING_MAX_POLL_ATTEMPTS * pollIntervalMs}ms`,\n };\n}\n\nfunction buildLongRecordingSuccessResult(\n taskId: string,\n requestId: string | undefined,\n data: ModelProxyLongRecordingStatusResponse | undefined,\n audioDurationMs: number | undefined,\n logger: Logger,\n): TranscriptionResult {\n const sourceTextList = normalizeLongRecordingSourceTextList(\n data?.recordResult?.sourceTextList,\n );\n const listResult = extractLongRecordingTextFromList(sourceTextList, audioDurationMs);\n const sourceText = normalizeOptionalText(data?.recordResult?.sourceText);\n const summaryText = normalizeOptionalText(data?.recordResult?.summaryResult) ?? \"\";\n const title = normalizeOptionalText(data?.recordResult?.title);\n const category = normalizeOptionalText(data?.recordResult?.category);\n const text = listResult.text ?? sourceText ?? summaryText;\n const status = normalizeLongRecordingStatus(data?.status) ?? \"SUCCEEDED\";\n\n if (!listResult.text && !sourceText && summaryText) {\n logger.warn(\n `[asr] Model Proxy 长录音结果缺少 sourceTextList/sourceText,已回退使用 summaryResult 作为转写文本: taskId=${taskId}`,\n );\n }\n\n logger.info(\n `[asr] Model Proxy 长录音转写完成: taskId=${taskId}, requestId=${requestId ?? \"n/a\"}, chars=${text.length}`,\n );\n\n return {\n ok: true,\n text,\n segments: listResult.segments,\n summary: title,\n summaryText,\n category,\n sourceInfo: {\n provider: \"model-proxy\",\n taskId,\n requestId,\n status,\n },\n rawResponse: data,\n };\n}\n\nfunction buildLongRecordingStatusError(\n data: ModelProxyLongRecordingStatusResponse | undefined,\n status: string,\n): string {\n const errorMessage = normalizeOptionalText(data?.errorMessage);\n return errorMessage\n ? `Model Proxy ASR ${status}: ${errorMessage}`\n : `Model Proxy ASR ${status}`;\n}\n\nfunction buildModelProxyEnvelopeError(\n payload:\n | ModelProxyLongRecordingStatusResponse\n | ResponseEnvelope<ModelProxyLongRecordingStatusResponse>,\n): string | undefined {\n if (!payload || typeof payload !== \"object\" || !(\"data\" in payload)) {\n return undefined;\n }\n\n const envelope = payload as ResponseEnvelope<ModelProxyLongRecordingStatusResponse>;\n const explicitFailure = envelope.success === false;\n const message = normalizeOptionalText(envelope.message);\n if (!explicitFailure && (!message || envelope.data)) {\n return undefined;\n }\n\n const code = normalizeOptionalCode(envelope.code);\n if (code && message) {\n return `${code} ${message}`;\n }\n return message ?? code ?? \"response envelope indicates failure\";\n}\n\nfunction unwrapResponse(\n payload:\n | ModelProxyLongRecordingStatusResponse\n | ResponseEnvelope<ModelProxyLongRecordingStatusResponse>,\n): ModelProxyLongRecordingStatusResponse | undefined {\n if (\n payload &&\n typeof payload === \"object\" &&\n \"data\" in payload &&\n payload.data &&\n typeof payload.data === \"object\"\n ) {\n return payload.data;\n }\n\n return payload as ModelProxyLongRecordingStatusResponse;\n}\n\nfunction normalizeApiKeyHeaderValue(apiKey: string): string {\n return apiKey.startsWith(\"Bearer \")\n ? apiKey.slice(\"Bearer \".length)\n : apiKey;\n}\n\nfunction normalizeLongRecordingStatus(status: unknown): string | undefined {\n return typeof status === \"string\" && status.trim()\n ? status.trim().toUpperCase()\n : undefined;\n}\n\nfunction normalizeOptionalText(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim()\n ? value.trim()\n : undefined;\n}\n\nfunction normalizeOptionalCode(value: unknown): string | undefined {\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n return undefined;\n}\n\nfunction normalizeOptionalInteger(value: unknown): number | undefined {\n return Number.isInteger(value)\n ? Number(value)\n : undefined;\n}\n\nfunction normalizeOptionalNonNegativeNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0\n ? value\n : undefined;\n}\n\nfunction normalizeLongRecordingSourceTextList(\n value: unknown,\n): Array<{\n content: string;\n speakerId?: number;\n startTime?: number;\n endTime?: number;\n}> {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value\n .flatMap((item) => {\n if (!item || typeof item !== \"object\") {\n return [];\n }\n\n const record = item as Record<string, unknown>;\n const content = normalizeOptionalText(record.content);\n if (!content) {\n return [];\n }\n\n return [{\n content,\n speakerId: normalizeOptionalInteger(record.speakerId),\n startTime: normalizeOptionalNonNegativeNumber(record.startTime),\n endTime: normalizeOptionalNonNegativeNumber(record.endTime),\n }];\n });\n}\n\nfunction extractLongRecordingTextFromList(\n items: Array<{\n content: string;\n speakerId?: number;\n startTime?: number;\n endTime?: number;\n }>,\n finalFallbackEndMs?: number,\n): {\n text?: string;\n segments: TranscriptSegment[];\n} {\n if (items.length === 0) {\n return {\n segments: [],\n };\n }\n\n const segments = items.map((item, index) => {\n const startMs = item.startTime ?? 0;\n const explicitEndMs = item.endTime;\n const nextStart = items[index + 1]?.startTime;\n const fallbackEndMs = index === items.length - 1\n ? normalizeOptionalNonNegativeNumber(finalFallbackEndMs)\n : undefined;\n const endMs = explicitEndMs ?? nextStart ?? fallbackEndMs ?? startMs;\n\n return {\n start_ms: startMs,\n end_ms: Math.max(startMs, endMs),\n text: item.content,\n speaker_id: item.speakerId,\n };\n });\n\n return {\n text: items.map((item) => item.content).join(\"\\n\\n\"),\n segments,\n };\n}\n\nfunction stringifyForLog(value: unknown, maxLength = 500): string | undefined {\n if (value == null) {\n return undefined;\n }\n\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed ? trimmed.slice(0, maxLength) : undefined;\n }\n\n try {\n const serialized = JSON.stringify(value);\n return serialized ? serialized.slice(0, maxLength) : undefined;\n } catch {\n return String(value).slice(0, maxLength);\n }\n}\n\nasync function sleep(ms: number): Promise<void> {\n await new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isRetryableHttpStatus(status: number): boolean {\n return status === 429 || status >= 500;\n}\n\nfunction getHttpRetryBackoffMs(): number {\n const raw = process.env.OPENCLAW_ASR_HTTP_RETRY_BACKOFF_MS;\n if (raw) {\n const parsed = Number(raw);\n if (Number.isFinite(parsed) && parsed >= 0) {\n return parsed;\n }\n }\n return DEFAULT_HTTP_RETRY_BACKOFF_MS;\n}\n\nfunction getPollIntervalMs(): number {\n const raw = process.env.OPENCLAW_ASR_POLL_INTERVAL_MS;\n if (raw) {\n const parsed = Number(raw);\n if (Number.isFinite(parsed) && parsed >= 0) {\n return parsed;\n }\n }\n return DEFAULT_LONG_RECORDING_POLL_INTERVAL_MS;\n}\n\n/**\n * 带重试的 fetch 包装:\n * - HTTP 5xx / 429:按指数退避重试\n * - 网络异常(fetch throw):按指数退避重试\n * - HTTP 4xx(除 429)/ 2xx / 3xx:直接返回,由调用方处理\n *\n * 用于 ASR submit 这类一次性请求;polling 走自己的节奏,无需此包装。\n */\nasync function fetchWithRetry(\n url: string,\n init: RequestInit,\n options: {\n logger: Logger;\n context: string;\n maxAttempts?: number;\n backoffMs?: number;\n },\n): Promise<Response> {\n const maxAttempts = options.maxAttempts ?? DEFAULT_HTTP_MAX_ATTEMPTS;\n const baseBackoff = options.backoffMs ?? getHttpRetryBackoffMs();\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n const res = await fetch(url, init);\n if (isRetryableHttpStatus(res.status) && attempt < maxAttempts) {\n const errText = await res.text().catch(() => \"\");\n const delay = baseBackoff * Math.pow(2, attempt - 1);\n options.logger.warn(\n `[${options.context}] HTTP ${res.status} (attempt ${attempt}/${maxAttempts}), ${delay}ms 后重试, body=${errText.slice(0, 200)}`,\n );\n await sleep(delay);\n continue;\n }\n return res;\n } catch (err) {\n lastError = err;\n if (attempt < maxAttempts) {\n const delay = baseBackoff * Math.pow(2, attempt - 1);\n const msg = (err as any)?.message ?? String(err);\n options.logger.warn(\n `[${options.context}] 网络异常 (attempt ${attempt}/${maxAttempts}): ${msg}, ${delay}ms 后重试`,\n );\n await sleep(delay);\n continue;\n }\n }\n }\n\n throw lastError instanceof Error ? lastError : new Error(String(lastError));\n}\n\nfunction extractTranscriptSummary(text: string): string {\n const normalized = text.replace(/\\s+/g, \" \").trim();\n if (!normalized) {\n return \"\";\n }\n\n const sentence = normalized\n .split(/[。!?!?]/)\n .map((part) => part.trim())\n .find((part) => part.length > 0);\n\n const candidate = sentence || normalized;\n return candidate.length <= 120\n ? candidate\n : `${candidate.slice(0, 117).trimEnd()}...`;\n}\n/** 毫秒 → \"MM:SS\" */\nfunction formatTimestamp(ms: number): string {\n const totalSeconds = Math.floor(ms / 1000);\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${String(minutes).padStart(2, \"0\")}:${String(seconds).padStart(2, \"0\")}`;\n}\n\n/** 秒 → \"HH:MM:SS\" 或 \"MM:SS\" */\nfunction formatDuration(seconds: number): string {\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n const s = Math.floor(seconds % 60);\n if (h > 0) {\n return `${h}:${String(m).padStart(2, \"0\")}:${String(s).padStart(2, \"0\")}`;\n }\n return `${String(m).padStart(2, \"0\")}:${String(s).padStart(2, \"0\")}`;\n}\n\nfunction hasText(value: unknown): boolean {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nfunction formatTranscriptSegmentText(segment: TranscriptSegment): string {\n const text = segment.text.trim();\n if (!text) {\n return text;\n }\n\n if (typeof segment.speaker_id === \"number\") {\n return `说话人${segment.speaker_id}:${text}`;\n }\n\n return text;\n}\n",
96
95
  "/**\n * 本地 Whisper 转写模块(arc-long-recording §6.4)\n *\n * 插件内置 Whisper 推理能力:\n * 1. 自动检测运行环境与硬件配置(§6.4.1)\n * 2. 选择最优推理后端(§6.4.2)\n * 3. 根据可用内存自动选择模型规格(§6.4.3)\n * 4. 首次使用时下载模型文件(§6.4.5)\n * 5. 通过 whisper.cpp CLI 执行本地离线转写\n */\n\nimport { execSync, execFileSync, spawnSync, type SpawnSyncReturns } from \"node:child_process\";\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n statSync,\n createWriteStream,\n unlinkSync,\n copyFileSync,\n openSync,\n readSync,\n closeSync,\n} from \"node:fs\";\nimport { join, dirname, basename } from \"node:path\";\nimport { pipeline } from \"node:stream/promises\";\nimport { Readable } from \"node:stream\";\nimport { platform, arch, totalmem, cpus, freemem } from \"node:os\";\nimport type {\n WhisperLocalConfig,\n WhisperModelSize,\n WhisperModelSource,\n WhisperBackend,\n WhisperEnvironmentInfo,\n} from \"../types.js\";\nimport type { Logger } from \"../logger.js\";\nimport type { TranscriptionResult, TranscriptSegment } from \"./asr.js\";\n\n// ─── Constants ───\n\nconst WHISPER_MODELS_DIR = \"whisper-models\";\nconst WHISPER_BIN_DIR = \"whisper-bin\";\n\n/** Hugging Face GGML 模型下载 URL 模板(海外) */\nconst HF_MODEL_URL_TEMPLATE =\n \"https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-{model}.bin\";\n\n/** 国内 ModelScope 镜像 URL 模板(lihuoo/whisper.cpp-asr-model-collection) */\nconst MODELSCOPE_MODEL_URL_TEMPLATE =\n \"https://modelscope.cn/models/lihuoo/whisper.cpp-asr-model-collection/resolve/master/{model}.bin\";\n\n/** 连通性探测超时(ms) */\nconst PROBE_TIMEOUT_MS = 5_000;\n\n/** 模型规格 → 文件名映射 */\nconst MODEL_FILENAMES: Record<WhisperModelSize, string> = {\n tiny: \"ggml-tiny.bin\",\n base: \"ggml-base.bin\",\n small: \"ggml-small.bin\",\n medium: \"ggml-medium.bin\",\n \"large-v3\": \"ggml-large-v3.bin\",\n};\n\n/** 模型规格 → 推理内存需求 GB(§6.4.3) */\nconst MODEL_MEMORY_REQUIREMENTS: Record<WhisperModelSize, number> = {\n tiny: 1,\n base: 1.5,\n small: 3,\n medium: 6,\n \"large-v3\": 11,\n};\n\n/** 模型规格 → 磁盘占用(字节,近似值) */\nconst MODEL_DISK_SIZES: Record<WhisperModelSize, number> = {\n tiny: 75 * 1024 * 1024,\n base: 140 * 1024 * 1024,\n small: 460 * 1024 * 1024,\n medium: 1500 * 1024 * 1024,\n \"large-v3\": 3000 * 1024 * 1024,\n};\n\n/** whisper.cpp JSON 输出格式 */\ninterface WhisperCppJsonOutput {\n transcription?: Array<{\n timestamps?: { from: string; to: string };\n offsets?: { from: number; to: number };\n text: string;\n }>;\n}\n\n// ─── Public API ───\n\n/**\n * 检测运行环境与硬件配置(§6.4.1)\n *\n * 检测操作系统、CPU 架构、GPU、可用内存,\n * 推荐最优推理后端与模型规格。\n */\nexport function detectEnvironment(logger: Logger): WhisperEnvironmentInfo {\n const os = platform() as \"darwin\" | \"linux\" | \"win32\";\n const cpuArch = arch() as \"arm64\" | \"x64\";\n const isAppleSilicon = os === \"darwin\" && cpuArch === \"arm64\";\n const hasCuda = detectCuda(logger);\n\n // 推荐后端(§6.4.2)\n let recommendedBackend: WhisperBackend;\n if (isAppleSilicon) {\n recommendedBackend = \"coreml\";\n } else if (hasCuda) {\n recommendedBackend = \"cuda\";\n } else {\n recommendedBackend = \"cpu\";\n }\n\n // 可用内存\n const availableMemoryGB = getAvailableMemoryGB(recommendedBackend, logger);\n const physicalCores = getPhysicalCoreCount();\n\n // 推荐模型\n const recommendedModel = selectModelByMemory(availableMemoryGB, isAppleSilicon);\n\n const info: WhisperEnvironmentInfo = {\n os,\n arch: cpuArch,\n isAppleSilicon,\n hasCuda,\n recommendedBackend,\n availableMemoryGB: Math.round(availableMemoryGB * 10) / 10,\n recommendedModel,\n physicalCores,\n };\n\n logger.info(\n `[whisper-local] 环境检测完成: os=${os}, arch=${cpuArch}, ` +\n `appleSilicon=${isAppleSilicon}, cuda=${hasCuda}, ` +\n `backend=${recommendedBackend}, memory=${info.availableMemoryGB}GB, ` +\n `model=${recommendedModel}, cores=${physicalCores}`,\n );\n\n return info;\n}\n\n/**\n * 根据可用内存自动选择模型规格(§6.4.3)\n *\n * 策略:优先匹配可用内存最大能承载的模型(向下取最近档位)。\n * Apple Silicon CoreML 后端内存效率更高,同档位需求降低 ~30%。\n */\nexport function selectModelByMemory(\n availableGB: number,\n isAppleSilicon: boolean = false,\n): WhisperModelSize {\n // Apple Silicon CoreML 内存效率提升约 30%\n const effectiveGB = isAppleSilicon ? availableGB / 0.7 : availableGB;\n\n if (effectiveGB >= 12) return \"large-v3\";\n if (effectiveGB >= 8) return \"medium\";\n if (effectiveGB >= 6) return \"small\";\n if (effectiveGB >= 4) return \"base\";\n return \"tiny\";\n}\n\n/**\n * 解析模型存储目录\n */\nexport function resolveModelsDir(dataDir: string): string {\n const dir = join(dataDir, WHISPER_MODELS_DIR);\n mkdirSync(dir, { recursive: true });\n return dir;\n}\n\n/**\n * 解析 whisper.cpp 二进制目录\n */\nexport function resolveBinDir(dataDir: string): string {\n const dir = join(dataDir, WHISPER_BIN_DIR);\n mkdirSync(dir, { recursive: true });\n return dir;\n}\n\n/**\n * 检查模型文件是否已下载(§6.4.5)\n */\nexport function isModelDownloaded(modelsDir: string, modelSize: WhisperModelSize): boolean {\n const modelPath = join(modelsDir, MODEL_FILENAMES[modelSize]);\n if (!existsSync(modelPath)) return false;\n\n // 简单校验:文件大小至少为预期大小的 80%(防止下载不完整)\n try {\n const stat = statSync(modelPath);\n const expectedSize = MODEL_DISK_SIZES[modelSize];\n return stat.size >= expectedSize * 0.8;\n } catch {\n return false;\n }\n}\n\n/**\n * 下载 Whisper 模型文件(§6.4.5)\n *\n * 下载源选择策略:\n * - modelMirrorUrl 存在 → 使用自定义 URL\n * - modelSource = \"huggingface\" → 直接使用 Hugging Face\n * - modelSource = \"domestic\" → 直接使用国内镜像(ModelScope)\n * - modelSource = \"auto\"(默认)→ 先探测 Hugging Face 连通性(5s 超时),\n * 可达则用 HF,不可达则回退国内镜像\n */\nexport async function downloadModel(\n modelsDir: string,\n modelSize: WhisperModelSize,\n logger: Logger,\n modelSource?: WhisperModelSource,\n mirrorUrl?: string,\n): Promise<{ ok: boolean; modelPath: string; error?: string }> {\n const filename = MODEL_FILENAMES[modelSize];\n const modelPath = join(modelsDir, filename);\n\n // 已存在且完整 → 跳过\n if (isModelDownloaded(modelsDir, modelSize)) {\n logger.info(`[whisper-local] 模型已存在,跳过下载: ${filename}`);\n return { ok: true, modelPath };\n }\n\n // 解析下载 URL\n const url = await resolveModelUrl(modelSize, modelSource, mirrorUrl, logger);\n\n logger.info(\n `[whisper-local] 开始下载模型: ${modelSize} (${formatBytes(MODEL_DISK_SIZES[modelSize])})`,\n );\n logger.info(`[whisper-local] 下载 URL: ${url}`);\n\n const result = await downloadFromUrl(url, modelPath, logger);\n\n // auto 模式且 HF 失败 → 尝试国内镜像回退\n if (\n !result.ok &&\n !mirrorUrl &&\n (modelSource === \"auto\" || !modelSource) &&\n url.includes(\"huggingface.co\")\n ) {\n const fallbackUrl = MODELSCOPE_MODEL_URL_TEMPLATE.replace(\"{model}\", modelSize);\n logger.info(\n `[whisper-local] Hugging Face 下载失败,回退至国内镜像(ModelScope): ${fallbackUrl}`,\n );\n return downloadFromUrl(fallbackUrl, modelPath, logger);\n }\n\n return result;\n}\n\n/**\n * 解析模型下载 URL\n */\nasync function resolveModelUrl(\n modelSize: WhisperModelSize,\n modelSource: WhisperModelSource | undefined,\n mirrorUrl: string | undefined,\n logger: Logger,\n): Promise<string> {\n // 自定义 URL 优先级最高\n if (mirrorUrl) {\n return `${mirrorUrl.replace(/\\/$/, \"\")}/${MODEL_FILENAMES[modelSize]}`;\n }\n\n const source = modelSource ?? \"auto\";\n\n switch (source) {\n case \"huggingface\":\n return HF_MODEL_URL_TEMPLATE.replace(\"{model}\", modelSize);\n case \"domestic\":\n return MODELSCOPE_MODEL_URL_TEMPLATE.replace(\"{model}\", modelSize);\n case \"auto\": {\n // 探测 Hugging Face 连通性\n const hfReachable = await probeUrl(\"https://huggingface.co\", logger);\n if (hfReachable) {\n logger.info(\"[whisper-local] Hugging Face 可达,使用海外源\");\n return HF_MODEL_URL_TEMPLATE.replace(\"{model}\", modelSize);\n }\n logger.info(\"[whisper-local] Hugging Face 不可达,使用国内镜像(ModelScope)\");\n return MODELSCOPE_MODEL_URL_TEMPLATE.replace(\"{model}\", modelSize);\n }\n default:\n return HF_MODEL_URL_TEMPLATE.replace(\"{model}\", modelSize);\n }\n}\n\n/**\n * 探测 URL 连通性(HEAD 请求,短超时)\n */\nasync function probeUrl(url: string, logger: Logger): Promise<boolean> {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), PROBE_TIMEOUT_MS);\n try {\n const res = await fetch(url, {\n method: \"HEAD\",\n signal: controller.signal,\n });\n return res.ok || res.status === 301 || res.status === 302;\n } finally {\n clearTimeout(timer);\n }\n } catch (err: any) {\n logger.info(\n `[whisper-local] 连通性探测失败: ${url} (${err?.name ?? err?.message ?? \"unknown\"})`,\n );\n return false;\n }\n}\n\n/**\n * 从指定 URL 下载模型文件至本地\n */\nasync function downloadFromUrl(\n url: string,\n modelPath: string,\n logger: Logger,\n): Promise<{ ok: boolean; modelPath: string; error?: string }> {\n const tmpPath = `${modelPath}.downloading`;\n\n try {\n mkdirSync(dirname(modelPath), { recursive: true });\n\n const controller = new AbortController();\n // 模型下载超时:30 分钟(large-v3 约 3GB)\n const timer = setTimeout(() => controller.abort(), 30 * 60 * 1000);\n\n try {\n const res = await fetch(url, { signal: controller.signal });\n\n if (!res.ok) {\n return {\n ok: false,\n modelPath,\n error: `模型下载失败: HTTP ${res.status} ${res.statusText}`,\n };\n }\n\n if (!res.body) {\n return { ok: false, modelPath, error: \"模型下载失败: 响应体为空\" };\n }\n\n const contentLength = Number(res.headers.get(\"content-length\") ?? 0);\n const writeStream = createWriteStream(tmpPath);\n const readable = Readable.fromWeb(res.body as any);\n\n // 下载进度日志\n let downloaded = 0;\n let lastLogPercent = 0;\n readable.on(\"data\", (chunk: Buffer) => {\n downloaded += chunk.length;\n if (contentLength > 0) {\n const percent = Math.floor((downloaded / contentLength) * 100);\n if (percent >= lastLogPercent + 10) {\n logger.info(\n `[whisper-local] 下载进度: ${percent}% (${formatBytes(downloaded)} / ${formatBytes(contentLength)})`,\n );\n lastLogPercent = percent;\n }\n }\n });\n\n await pipeline(readable, writeStream);\n } finally {\n clearTimeout(timer);\n }\n\n // 重命名为正式文件\n const { renameSync } = await import(\"node:fs\");\n renameSync(tmpPath, modelPath);\n\n const fileSize = statSync(modelPath).size;\n logger.info(\n `[whisper-local] 模型下载完成: ${basename(modelPath)} (${formatBytes(fileSize)})`,\n );\n\n return { ok: true, modelPath };\n } catch (err: any) {\n // 清理临时文件\n try {\n if (existsSync(tmpPath)) unlinkSync(tmpPath);\n } catch { /* ignore */ }\n\n const msg = err?.name === \"AbortError\"\n ? \"模型下载超时(30 分钟)\"\n : (err?.message ?? String(err));\n logger.error(`[whisper-local] 模型下载失败: ${msg}`);\n return { ok: false, modelPath, error: msg };\n }\n}\n\n/**\n * 查找 whisper.cpp CLI 二进制文件\n *\n * 按以下优先级查找:\n * 1. 插件数据目录下的 whisper-bin/\n * 2. 系统 PATH 中的 whisper-cli / whisper-cpp / whisper\n */\nexport function findWhisperBinary(dataDir: string, logger: Logger): string | null {\n // 1. 检查插件 bin 目录\n const binDir = resolveBinDir(dataDir);\n const binNames = platform() === \"win32\"\n ? [\"whisper-cli.exe\", \"whisper.exe\", \"main.exe\"]\n : [\"whisper-cli\", \"whisper\", \"main\"];\n\n for (const name of binNames) {\n const binPath = join(binDir, name);\n if (existsSync(binPath)) {\n logger.info(`[whisper-local] 找到本地二进制: ${binPath}`);\n return binPath;\n }\n }\n\n // 2. 检查系统 PATH\n const pathNames = platform() === \"win32\"\n ? [\"whisper-cli\", \"whisper-cpp\", \"whisper\"]\n : [\"whisper-cli\", \"whisper-cpp\", \"whisper\"];\n\n for (const name of pathNames) {\n try {\n const cmd = platform() === \"win32\" ? \"where\" : \"which\";\n const result = execSync(`${cmd} ${name}`, { encoding: \"utf-8\", stdio: \"pipe\" }).trim();\n if (result) {\n logger.info(`[whisper-local] 找到系统 PATH 二进制: ${result}`);\n return result.split(\"\\n\")[0].trim();\n }\n } catch {\n // not found, continue\n }\n }\n\n logger.warn(\"[whisper-local] 未找到 whisper.cpp 二进制文件\");\n return null;\n}\n\n/**\n * 使用本地 Whisper 执行转写(§6.4)\n *\n * @param audioFilePath 本地音频文件绝对路径\n * @param localConfig 本地 Whisper 配置\n * @param dataDir 插件数据目录(存放模型和二进制)\n * @param logger 日志\n */\nexport async function transcribeWithWhisperLocal(\n audioFilePath: string,\n localConfig: WhisperLocalConfig,\n dataDir: string,\n logger: Logger,\n): Promise<TranscriptionResult> {\n // 1. 检测环境\n const env = detectEnvironment(logger);\n\n // 2. 确定后端、模型、线程数\n const backend = localConfig.backend ?? env.recommendedBackend;\n const modelSize = localConfig.model ?? env.recommendedModel;\n const threads = localConfig.threads ?? env.physicalCores;\n const language = localConfig.language ?? \"auto\";\n const translate = localConfig.translate ?? false;\n\n logger.info(\n `[whisper-local] 转写参数: backend=${backend}, model=${modelSize}, ` +\n `threads=${threads}, language=${language}, translate=${translate}`,\n );\n\n // 3. 查找 whisper.cpp 二进制\n const whisperBin = findWhisperBinary(dataDir, logger);\n if (!whisperBin) {\n return {\n ok: false,\n error:\n \"未找到 whisper.cpp 二进制文件。请安装 whisper.cpp 并确保 whisper-cli 在 PATH 中,\" +\n `或将二进制文件放入 ${resolveBinDir(dataDir)}`,\n };\n }\n\n // 4. 确保模型已下载\n const modelsDir = resolveModelsDir(dataDir);\n if (!isModelDownloaded(modelsDir, modelSize)) {\n logger.info(`[whisper-local] 模型 ${modelSize} 未下载,开始下载...`);\n const downloadResult = await downloadModel(\n modelsDir,\n modelSize,\n logger,\n localConfig.modelSource,\n localConfig.modelMirrorUrl,\n );\n if (!downloadResult.ok) {\n return { ok: false, error: `模型下载失败: ${downloadResult.error}` };\n }\n }\n\n const modelPath = join(modelsDir, MODEL_FILENAMES[modelSize]);\n\n // 5. 音频格式转换(whisper.cpp 仅支持 16kHz mono WAV)\n // 通过 magic bytes 判断真实格式,不依赖扩展名\n let inputPath = audioFilePath;\n let tmpWavPath: string | null = null;\n\n const actualFmt = detectAudioFormat(audioFilePath);\n if (actualFmt !== \".wav\") {\n tmpWavPath = audioFilePath.replace(/\\.[^.]+$/, \".whisper.wav\");\n logger.info(\n `[whisper-local] 转换音频格式: ${audioFilePath} (${actualFmt ?? \"未知\"}) → WAV (16kHz mono)`,\n );\n\n const convertResult = convertToWav(audioFilePath, tmpWavPath, actualFmt, logger);\n if (!convertResult.ok) {\n return { ok: false, error: convertResult.error! };\n }\n inputPath = tmpWavPath;\n }\n\n // 6. 构建 whisper.cpp CLI 参数\n const args = buildWhisperArgs({\n audioFilePath: inputPath,\n modelPath,\n language,\n translate,\n threads,\n backend,\n });\n\n logger.info(`[whisper-local] 执行: ${whisperBin} ${args.join(\" \")}`);\n\n // 7. 执行转写\n try {\n const startMs = Date.now();\n let result: SpawnSyncReturns<string>;\n\n try {\n result = spawnSync(whisperBin, args, {\n encoding: \"utf-8\" as const,\n timeout: 60 * 60 * 1000, // 1 小时超时(5 小时录音)\n maxBuffer: 100 * 1024 * 1024, // 100MB stdout buffer\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n } catch (err: any) {\n cleanupTmpWav(tmpWavPath);\n return { ok: false, error: `whisper.cpp 执行失败: ${err?.message ?? err}` };\n }\n\n if (result.status !== 0) {\n cleanupTmpWav(tmpWavPath);\n const stderr = result.stderr?.slice(0, 500) ?? \"\";\n return {\n ok: false,\n error: `whisper.cpp 退出码 ${result.status}: ${stderr}`,\n };\n }\n\n const elapsed = Date.now() - startMs;\n logger.info(`[whisper-local] 转写耗时: ${Math.round(elapsed / 1000)}s`);\n\n // 8. 读取 JSON 输出文件(--output-json 将结果写入 {inputPath}.json)\n const jsonPath = inputPath + \".json\";\n let jsonContent: string;\n\n if (existsSync(jsonPath)) {\n jsonContent = readFileSync(jsonPath, \"utf-8\");\n // 清理 JSON 文件\n try { unlinkSync(jsonPath); } catch { /* ignore */ }\n } else {\n // 回退:尝试解析 stdout(部分 whisper.cpp 版本可能输出到 stdout)\n jsonContent = result.stdout;\n }\n\n cleanupTmpWav(tmpWavPath);\n\n return parseWhisperOutput(jsonContent, logger);\n } catch (err: any) {\n cleanupTmpWav(tmpWavPath);\n return { ok: false, error: `whisper.cpp 转写异常: ${err?.message ?? err}` };\n }\n}\n\n/**\n * 获取本地 Whisper 状态信息(供 App 查询环境检测结果)\n */\nexport function getWhisperLocalStatus(\n dataDir: string,\n logger: Logger,\n): {\n environment: WhisperEnvironmentInfo;\n binaryFound: boolean;\n binaryPath: string | null;\n downloadedModels: WhisperModelSize[];\n} {\n const env = detectEnvironment(logger);\n const binaryPath = findWhisperBinary(dataDir, logger);\n const modelsDir = resolveModelsDir(dataDir);\n\n const allModels: WhisperModelSize[] = [\"tiny\", \"base\", \"small\", \"medium\", \"large-v3\"];\n const downloadedModels = allModels.filter((m) => isModelDownloaded(modelsDir, m));\n\n return {\n environment: env,\n binaryFound: binaryPath !== null,\n binaryPath,\n downloadedModels,\n };\n}\n\n// ─── Internal Helpers ───\n\n/**\n * 检测 CUDA 是否可用(§6.4.1)\n */\nfunction detectCuda(logger: Logger): boolean {\n try {\n // 尝试运行 nvidia-smi\n execSync(\"nvidia-smi\", { encoding: \"utf-8\", stdio: \"pipe\", timeout: 5000 });\n logger.info(\"[whisper-local] 检测到 NVIDIA GPU (nvidia-smi)\");\n return true;\n } catch {\n // nvidia-smi 不存在或执行失败\n }\n\n // 检查 CUDA runtime 库\n if (platform() === \"linux\") {\n try {\n const ldconfig = execSync(\"ldconfig -p 2>/dev/null | grep libcudart\", {\n encoding: \"utf-8\",\n stdio: \"pipe\",\n timeout: 5000,\n });\n if (ldconfig.includes(\"libcudart\")) {\n logger.info(\"[whisper-local] 检测到 CUDA runtime (ldconfig)\");\n return true;\n }\n } catch { /* ignore */ }\n }\n\n return false;\n}\n\n/**\n * 获取可用内存(GB)\n *\n * CUDA 后端使用 VRAM,其余使用系统 RAM。\n */\nfunction getAvailableMemoryGB(backend: WhisperBackend, logger: Logger): number {\n if (backend === \"cuda\") {\n // 尝试获取 GPU VRAM\n try {\n const output = execSync(\n \"nvidia-smi --query-gpu=memory.free --format=csv,noheader,nounits\",\n { encoding: \"utf-8\", stdio: \"pipe\", timeout: 5000 },\n );\n const freeVramMB = parseInt(output.trim().split(\"\\n\")[0], 10);\n if (!Number.isNaN(freeVramMB) && freeVramMB > 0) {\n return freeVramMB / 1024;\n }\n } catch {\n logger.warn(\"[whisper-local] 无法获取 GPU VRAM,使用系统 RAM 代替\");\n }\n }\n\n // 使用系统可用内存(取 total 的 80% 和 free 的较大值作为可用估计)\n const totalGB = totalmem() / (1024 * 1024 * 1024);\n const freeGB = freemem() / (1024 * 1024 * 1024);\n return Math.max(freeGB, totalGB * 0.6);\n}\n\n/**\n * 获取物理 CPU 核心数\n */\nfunction getPhysicalCoreCount(): number {\n const cpuList = cpus();\n if (cpuList.length === 0) return 4; // fallback\n\n // 简单估算:逻辑核 / 2(假设超线程)\n // macOS ARM 无超线程,直接使用逻辑核数\n if (platform() === \"darwin\" && arch() === \"arm64\") {\n // Apple Silicon: P-cores only (exclude E-cores for inference)\n // 简化处理:使用总核数\n return cpuList.length;\n }\n\n return Math.max(1, Math.floor(cpuList.length / 2));\n}\n\n/**\n * 通过文件头 magic bytes 检测音频的真实格式\n * @returns 正确的文件扩展名(如 .aiff, .wav, .m4a),或 null\n */\nfunction detectAudioFormat(filePath: string): string | null {\n try {\n const fd = openSync(filePath, \"r\");\n const buf = Buffer.alloc(12);\n readSync(fd, buf, 0, 12, 0);\n closeSync(fd);\n\n const header = buf.toString(\"ascii\", 0, 4);\n const header8 = buf.toString(\"ascii\", 0, 8);\n\n // RIFF....WAVE = WAV\n if (header === \"RIFF\" && buf.toString(\"ascii\", 8, 12) === \"WAVE\") return \".wav\";\n // FORM....AIFF / FORM....AIFC = AIFF\n if (header === \"FORM\") {\n const sub = buf.toString(\"ascii\", 8, 12);\n if (sub === \"AIFF\" || sub === \"AIFC\") return \".aiff\";\n }\n // ftyp = MP4/M4A/AAC container\n if (buf.toString(\"ascii\", 4, 8) === \"ftyp\") return \".m4a\";\n // ID3 or 0xFF 0xFB = MP3\n if (header.startsWith(\"ID3\") || (buf[0] === 0xff && (buf[1] & 0xe0) === 0xe0)) return \".mp3\";\n // OggS = Ogg (Vorbis/Opus)\n if (header === \"OggS\") return \".ogg\";\n // fLaC = FLAC\n if (header === \"fLaC\") return \".flac\";\n\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * 将音频文件转换为 whisper.cpp 所需的 16kHz mono WAV 格式\n *\n * 转换链(按优先级):\n * 1. ffmpeg — 支持全格式,含 OGG/Opus\n * 2. opusdec — 专用于 OGG/Opus(来自 brew install opus-tools)\n * 3. afconvert — macOS 内置,支持 AIFF/M4A/AAC;需正确文件扩展名\n *\n * @param actualFmt detectAudioFormat 检测到的真实格式(如 \".ogg\", \".aiff\"),可为 null\n */\nfunction convertToWav(\n inputPath: string,\n outputPath: string,\n actualFmt: string | null,\n logger: Logger,\n): { ok: boolean; error?: string } {\n // 尝试 ffmpeg(可自动检测格式,不依赖扩展名)\n try {\n const ffmpegResult = spawnSync(\"ffmpeg\", [\n \"-y\", \"-i\", inputPath,\n \"-ar\", \"16000\", \"-ac\", \"1\", \"-c:a\", \"pcm_s16le\",\n outputPath,\n ], {\n encoding: \"utf-8\",\n timeout: 120_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n if (ffmpegResult.status === 0 && existsSync(outputPath)) {\n logger.info(`[whisper-local] ffmpeg 转换完成: ${outputPath}`);\n return { ok: true };\n }\n } catch {\n // ffmpeg 不可用,继续尝试其他方式\n }\n\n // 2. opusdec — 专用于 OGG/Opus(ffmpeg 不可用时)\n if (actualFmt === \".ogg\") {\n try {\n const opusResult = spawnSync(\n \"opusdec\",\n [\"--rate\", \"16000\", \"--mono\", inputPath, outputPath],\n { encoding: \"utf-8\", timeout: 120_000, stdio: [\"pipe\", \"pipe\", \"pipe\"] },\n );\n if (opusResult.status === 0 && existsSync(outputPath)) {\n logger.info(`[whisper-local] opusdec 转换完成: ${outputPath}`);\n return { ok: true };\n }\n } catch { /* opusdec 不可用,继续 */ }\n }\n\n // 3. macOS afconvert — 支持 AIFF/M4A/AAC,不支持 OGG\n if (process.platform === \"darwin\" && actualFmt !== \".ogg\") {\n // afconvert 依赖扩展名判断输入格式,先确保扩展名正确\n let actualInputPath = inputPath;\n let tmpCopy: string | null = null;\n const detectedExt = actualFmt;\n\n if (detectedExt && !inputPath.endsWith(detectedExt)) {\n // 扩展名不匹配,创建带正确扩展名的临时副本\n tmpCopy = inputPath + \".detected\" + detectedExt;\n try {\n copyFileSync(inputPath, tmpCopy);\n actualInputPath = tmpCopy;\n logger.info(\n `[whisper-local] 检测到实际格式 ${detectedExt},临时重命名`,\n );\n } catch {\n tmpCopy = null;\n }\n }\n\n try {\n const afResult = spawnSync(\"afconvert\", [\n \"-f\", \"WAVE\", \"-d\", \"LEI16@16000\", \"-c\", \"1\",\n actualInputPath, outputPath,\n ], {\n encoding: \"utf-8\",\n timeout: 120_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n // 清理临时副本\n if (tmpCopy && existsSync(tmpCopy)) {\n try { unlinkSync(tmpCopy); } catch { /* ignore */ }\n }\n\n if (afResult.status === 0 && existsSync(outputPath)) {\n logger.info(`[whisper-local] afconvert 转换完成: ${outputPath}`);\n return { ok: true };\n }\n\n const stderr = afResult.stderr?.slice(0, 200) ?? \"\";\n return { ok: false, error: `afconvert 转换失败 (exit ${afResult.status}): ${stderr}` };\n } catch (err: any) {\n // 清理临时副本\n if (tmpCopy && existsSync(tmpCopy)) {\n try { unlinkSync(tmpCopy); } catch { /* ignore */ }\n }\n return { ok: false, error: `afconvert 不可用: ${err?.message}` };\n }\n }\n\n const fmtHint = actualFmt === \".ogg\"\n ? \"OGG/Opus 格式需要 ffmpeg 或 opus-tools(brew install opus-tools)\"\n : \"请安装 ffmpeg(brew install ffmpeg)或确保音频文件为 WAV 格式\";\n return { ok: false, error: `无法将音频转换为 WAV 格式。${fmtHint}` };\n}\n\n/** 清理临时 WAV 文件 */\nfunction cleanupTmpWav(path: string | null): void {\n if (path && existsSync(path)) {\n try { unlinkSync(path); } catch { /* ignore */ }\n }\n}\n\n/**\n * 构建 whisper.cpp CLI 参数\n */\nfunction buildWhisperArgs(params: {\n audioFilePath: string;\n modelPath: string;\n language: string;\n translate: boolean;\n threads: number;\n backend: WhisperBackend;\n}): string[] {\n const args: string[] = [\n \"--model\", params.modelPath,\n \"--file\", params.audioFilePath,\n \"--output-json\", // JSON 格式输出到 {audioFilePath}.json\n \"--no-prints\", // 抑制模型信息输出\n \"--threads\", String(params.threads),\n ];\n\n // 语言\n if (params.language && params.language !== \"auto\") {\n args.push(\"--language\", params.language);\n } else {\n args.push(\"--language\", \"auto\");\n }\n\n // 翻译为英文\n if (params.translate) {\n args.push(\"--translate\");\n }\n\n return args;\n}\n\n/**\n * 解析 whisper.cpp JSON 输出\n */\nfunction parseWhisperOutput(\n stdout: string,\n logger: Logger,\n): TranscriptionResult {\n if (!stdout || !stdout.trim()) {\n return { ok: false, error: \"whisper.cpp 无输出\" };\n }\n\n try {\n const data = JSON.parse(stdout.trim()) as WhisperCppJsonOutput;\n\n if (!data.transcription || !Array.isArray(data.transcription)) {\n // 可能是纯文本输出\n return {\n ok: true,\n text: stdout.trim(),\n segments: [],\n };\n }\n\n const segments: TranscriptSegment[] = [];\n const textParts: string[] = [];\n\n for (const item of data.transcription) {\n const text = item.text?.trim() ?? \"\";\n if (!text) continue;\n\n textParts.push(text);\n\n const startMs = item.offsets?.from ?? parseTimestamp(item.timestamps?.from);\n const endMs = item.offsets?.to ?? parseTimestamp(item.timestamps?.to);\n\n segments.push({\n start_ms: startMs,\n end_ms: endMs,\n text,\n });\n }\n\n const fullText = textParts.join(\" \");\n\n logger.info(\n `[whisper-local] 转写完成: ${fullText.length} 字, ${segments.length} 段`,\n );\n\n return {\n ok: true,\n text: fullText,\n segments,\n };\n } catch (err: any) {\n logger.warn(`[whisper-local] JSON 解析失败,尝试纯文本: ${err?.message}`);\n\n // Fallback: 将 stdout 视为纯文本\n return {\n ok: true,\n text: stdout.trim(),\n segments: [],\n };\n }\n}\n\n/**\n * 解析 whisper.cpp 时间戳字符串 \"HH:MM:SS,mmm\" → 毫秒\n */\nfunction parseTimestamp(ts?: string): number {\n if (!ts) return 0;\n // \"00:00:05,000\" or \"00:00:05.000\"\n const match = ts.match(/^(\\d+):(\\d+):(\\d+)[,.](\\d+)$/);\n if (!match) return 0;\n const [, h, m, s, ms] = match;\n return (\n parseInt(h, 10) * 3600000 +\n parseInt(m, 10) * 60000 +\n parseInt(s, 10) * 1000 +\n parseInt(ms, 10)\n );\n}\n\n/**\n * 格式化字节数\n */\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)}GB`;\n}\n",
97
- "/**\n * 录音同步处理器(§2 阶段 4–5)\n *\n * 统一处理 recordings.sync 请求:\n * 1. 元数据入库\n * 2. 从 OSS 下载音频 + 打点文件\n * 3. 更新状态 → synced\n * 4. 如已配置 ASR → 自动触发转写\n */\n\nimport type {\n RecordingMetadata,\n RecordingSyncResult,\n AsrConfig,\n RecordingTranscriptItem,\n RecordingTransferStatus,\n} from \"../types.js\";\nimport type { Logger } from \"../logger.js\";\nimport { RecordingStorage } from \"./storage.js\";\nimport { downloadRecordingFiles } from \"./downloader.js\";\nimport { isAsrConfigured, runTranscriptionWorkflow } from \"./asr.js\";\nimport { canStartTranscription } from \"./state-machine.js\";\n\nexport interface RecordingStatusEvent {\n recordingId: string;\n transfer_status: RecordingTransferStatus;\n audioFile?: string;\n srtFile?: string;\n transcriptDataFile?: string;\n transcriptFile?: string;\n transcript?: RecordingTranscriptItem[];\n summary?: string;\n title: string;\n updatedAt: string;\n error?: string;\n}\n\nexport interface RecordingSyncOptions {\n notifyStatus?: (event: RecordingStatusEvent) => void;\n}\n\nfunction emitRecordingStatus(\n recordingId: string,\n storage: RecordingStorage,\n logger: Logger,\n notifyStatus?: RecordingSyncOptions[\"notifyStatus\"],\n error?: string,\n extras?: Pick<RecordingStatusEvent, \"transcript\" | \"summary\" | \"title\">,\n): void {\n if (!notifyStatus) {\n return;\n }\n\n const entry = storage.findById(recordingId);\n if (!entry) {\n return;\n }\n\n const title = extras?.title?.trim()\n || entry.title?.trim()\n || entry.metadata.name?.trim()\n || entry.id;\n const persistedError = entry.lastError?.trim() || undefined;\n\n try {\n notifyStatus({\n recordingId: entry.id,\n transfer_status: entry.status,\n audioFile: entry.audioFile,\n srtFile: entry.srtFile,\n transcriptDataFile: entry.transcriptDataFile,\n transcriptFile: entry.transcriptFile,\n transcript: extras?.transcript,\n summary: extras?.summary,\n title,\n updatedAt: entry.updatedAt,\n error: error ?? persistedError,\n });\n } catch (err: any) {\n logger.error(\n `[recording-status] 状态事件发送失败: ${recordingId}, ${err?.message ?? err}`,\n );\n }\n}\n\nasync function runRecordingSyncInBackground(\n metadata: RecordingMetadata,\n recordingId: string,\n storage: RecordingStorage,\n asrConfig: AsrConfig | undefined,\n logger: Logger,\n options: RecordingSyncOptions,\n): Promise<void> {\n const audioDestPath = storage.getAudioFilePath(\n recordingId,\n metadata.oss_audio_url,\n );\n const srtDestPath = storage.getSrtFilePath(recordingId);\n\n logger.info(\n `[recording-sync] 开始下载录音文件: ${recordingId}, audio=${metadata.oss_audio_url}`,\n );\n\n const downloadResult = await downloadRecordingFiles(\n metadata.oss_audio_url,\n metadata.oss_srt_url,\n audioDestPath,\n srtDestPath,\n logger,\n );\n\n if (!downloadResult.audio.ok) {\n const error = `音频下载失败: ${downloadResult.audio.error}`;\n logger.error(`[recording-sync] ${error}: ${recordingId}`);\n storage.updateStatus(recordingId, \"sync_failed\");\n storage.setLastError(recordingId, error);\n emitRecordingStatus(\n recordingId,\n storage,\n logger,\n options.notifyStatus,\n error,\n );\n return;\n }\n\n storage.setLastError(recordingId, undefined);\n storage.setAudioFile(\n recordingId,\n storage.buildAudioFilename(recordingId, metadata.oss_audio_url),\n );\n if (downloadResult.srt?.ok) {\n storage.setSrtFile(recordingId, storage.buildSrtFilename(recordingId));\n }\n\n storage.updateStatus(recordingId, \"synced\");\n logger.info(`[recording-sync] 录音已同步: ${recordingId}`);\n emitRecordingStatus(recordingId, storage, logger, options.notifyStatus);\n\n if (isAsrConfigured(asrConfig) && canStartTranscription(\"synced\")) {\n await triggerTranscription(\n recordingId,\n storage,\n asrConfig!,\n logger,\n options,\n );\n }\n}\n\n/**\n * 处理 recordings.sync 请求的核心逻辑\n */\nexport async function handleRecordingSync(\n recordingId: string,\n metadata: RecordingMetadata,\n storage: RecordingStorage,\n asrConfig: AsrConfig | undefined,\n logger: Logger,\n options: RecordingSyncOptions = {},\n): Promise<RecordingSyncResult> {\n const existing = storage.findById(recordingId);\n const shouldDownloadAndSync =\n !existing\n || existing.metadata.oss_audio_url !== metadata.oss_audio_url\n || !existing.audioFile\n || existing.status === \"syncing_openclaw\"\n || existing.status === \"sync_failed\";\n\n storage.ingest(recordingId, metadata);\n if (shouldDownloadAndSync) {\n runRecordingSyncInBackground(\n metadata,\n recordingId,\n storage,\n asrConfig,\n logger,\n options,\n ).catch((err) => {\n const error = `录音同步失败: ${err?.message ?? err}`;\n logger.error(`[recording-sync] ${error}: ${recordingId}`);\n const current = storage.findById(recordingId);\n if (current?.status === \"syncing_openclaw\") {\n storage.updateStatus(recordingId, \"sync_failed\");\n }\n storage.setLastError(recordingId, error);\n emitRecordingStatus(\n recordingId,\n storage,\n logger,\n options.notifyStatus,\n error,\n );\n });\n } else {\n logger.info(\n `[recording-sync] 录音已存在且音频未变化,跳过重复下载: ${recordingId}`,\n );\n emitRecordingStatus(recordingId, storage, logger, options.notifyStatus);\n\n const current = storage.findById(recordingId);\n if (current?.status === \"synced\" && isAsrConfigured(asrConfig)) {\n triggerTranscription(\n recordingId,\n storage,\n asrConfig!,\n logger,\n options,\n ).catch((err) => {\n logger.error(\n `[asr-trigger] 转写触发失败: ${recordingId}, ${err?.message ?? err}`,\n );\n });\n }\n }\n\n const current = storage.findById(recordingId);\n return {\n ok: true,\n recordingId,\n transfer_status: current?.status ?? \"syncing_openclaw\",\n ...(current?.lastError ? { error: current.lastError } : {}),\n };\n}\n\n/**\n * 触发 ASR 转写(可从 sync handler 自动触发或手动重试调用)\n */\nexport async function triggerTranscription(\n recordingId: string,\n storage: RecordingStorage,\n asrConfig: AsrConfig,\n logger: Logger,\n options: RecordingSyncOptions = {},\n): Promise<void> {\n const entry = storage.findById(recordingId);\n if (!entry) {\n logger.warn(`[asr-trigger] 录音不存在: ${recordingId}`);\n return;\n }\n\n if (!canStartTranscription(entry.status)) {\n logger.warn(\n `[asr-trigger] 当前状态不允许转写: ${recordingId} (status=${entry.status})`,\n );\n return;\n }\n\n // 状态 → transcribing\n storage.updateStatus(recordingId, \"transcribing\");\n storage.setLastError(recordingId, undefined);\n emitRecordingStatus(recordingId, storage, logger, options.notifyStatus);\n\n const audioFilePath = storage.getAudioFilePath(recordingId);\n\n let result: Awaited<ReturnType<typeof runTranscriptionWorkflow>>;\n try {\n result = await runTranscriptionWorkflow({\n audioFilePath,\n audioOssUrl: entry.metadata.oss_audio_url,\n config: asrConfig,\n markers: entry.metadata.markers ?? [],\n recordingName: entry.metadata.name,\n durationSec: entry.metadata.duration_sec,\n createdAt: entry.metadata.created_at,\n transcriptDataDir: storage.getTranscriptDataDir(),\n transcriptsDir: storage.getTranscriptsDir(),\n summariesDir: storage.getSummariesDir(),\n recordingId,\n logger,\n });\n } catch (err: any) {\n const error = `转写任务异常: ${err?.message ?? err}`;\n logger.error(`[asr-trigger] ${error}: ${recordingId}`);\n result = { ok: false, error };\n }\n\n if (result.ok && result.transcriptFilename) {\n if (result.transcriptDataFilename) {\n storage.setTranscriptDataFile(recordingId, result.transcriptDataFilename);\n }\n storage.setTranscriptFile(recordingId, result.transcriptFilename);\n if (result.summaryFilename) {\n storage.setSummaryFile(recordingId, result.summaryFilename);\n }\n storage.setTitle(recordingId, result.title);\n storage.updateStatus(recordingId, \"transcribed\");\n emitRecordingStatus(\n recordingId,\n storage,\n logger,\n options.notifyStatus,\n undefined,\n {\n transcript: result.transcript ?? [],\n summary: result.summary,\n title: result.title ?? \"\",\n },\n );\n logger.info(\n `[asr-trigger] 转写完成: ${recordingId}, summary=\"${result.summary}\"`,\n );\n } else {\n const error = result.error ?? \"ASR 转写失败\";\n storage.updateStatus(recordingId, \"transcribe_failed\");\n storage.setLastError(recordingId, error);\n emitRecordingStatus(\n recordingId,\n storage,\n logger,\n options.notifyStatus,\n error,\n );\n logger.error(\n `[asr-trigger] 转写失败: ${recordingId}, error=${error}`,\n );\n }\n}\n",
96
+ "/**\n * 录音同步处理器(§2 阶段 4–5)\n *\n * 统一处理 recordings.sync 请求:\n * 1. 元数据入库\n * 2. 从 OSS 下载音频 + 打点文件\n * 3. 更新状态 → synced\n * 4. 如已配置 ASR → 自动触发转写\n */\n\nimport type {\n RecordingMetadata,\n RecordingSyncResult,\n AsrConfig,\n RecordingTranscriptItem,\n RecordingTransferStatus,\n} from \"../types.js\";\nimport type { Logger } from \"../logger.js\";\nimport { RecordingStorage } from \"./storage.js\";\nimport { downloadRecordingFiles } from \"./downloader.js\";\nimport { isAsrConfigured, runTranscriptionWorkflow } from \"./asr.js\";\nimport { canStartTranscription } from \"./state-machine.js\";\n\nexport interface RecordingStatusEvent {\n recordingId: string;\n transfer_status: RecordingTransferStatus;\n audioFile?: string;\n srtFile?: string;\n transcriptDataFile?: string;\n transcriptFile?: string;\n summaryFile?: string;\n transcript?: RecordingTranscriptItem[];\n summary?: string;\n title: string;\n updatedAt: string;\n error?: string;\n}\n\nexport interface RecordingSyncOptions {\n notifyStatus?: (event: RecordingStatusEvent) => void;\n}\n\nfunction emitRecordingStatus(\n recordingId: string,\n storage: RecordingStorage,\n logger: Logger,\n notifyStatus?: RecordingSyncOptions[\"notifyStatus\"],\n error?: string,\n extras?: Pick<RecordingStatusEvent, \"transcript\" | \"summary\" | \"title\">,\n): void {\n if (!notifyStatus) {\n return;\n }\n\n const entry = storage.findById(recordingId);\n if (!entry) {\n return;\n }\n\n const title = extras?.title?.trim()\n || entry.title?.trim()\n || entry.metadata.name?.trim()\n || entry.id;\n const persistedError = entry.lastError?.trim() || undefined;\n\n try {\n notifyStatus({\n recordingId: entry.id,\n transfer_status: entry.status,\n audioFile: entry.audioFile,\n srtFile: entry.srtFile,\n transcriptDataFile: entry.transcriptDataFile,\n transcriptFile: entry.transcriptFile,\n transcript: extras?.transcript,\n summary: extras?.summary,\n title,\n updatedAt: entry.updatedAt,\n error: error ?? persistedError,\n });\n } catch (err: any) {\n logger.error(\n `[recording-status] 状态事件发送失败: ${recordingId}, ${err?.message ?? err}`,\n );\n }\n}\n\nasync function runRecordingSyncInBackground(\n metadata: RecordingMetadata,\n recordingId: string,\n storage: RecordingStorage,\n asrConfig: AsrConfig | undefined,\n logger: Logger,\n options: RecordingSyncOptions,\n): Promise<void> {\n const audioDestPath = storage.getAudioFilePath(\n recordingId,\n metadata.oss_audio_url,\n );\n const srtDestPath = storage.getSrtFilePath(recordingId);\n\n logger.info(\n `[recording-sync] 开始下载录音文件: ${recordingId}, audio=${metadata.oss_audio_url}`,\n );\n\n const downloadResult = await downloadRecordingFiles(\n metadata.oss_audio_url,\n metadata.oss_srt_url,\n audioDestPath,\n srtDestPath,\n logger,\n );\n\n if (!downloadResult.audio.ok) {\n const error = `音频下载失败: ${downloadResult.audio.error}`;\n logger.error(`[recording-sync] ${error}: ${recordingId}`);\n storage.updateStatus(recordingId, \"sync_failed\");\n storage.setLastError(recordingId, error);\n emitRecordingStatus(\n recordingId,\n storage,\n logger,\n options.notifyStatus,\n error,\n );\n return;\n }\n\n storage.setLastError(recordingId, undefined);\n storage.setAudioFile(\n recordingId,\n storage.buildAudioFilename(recordingId, metadata.oss_audio_url),\n );\n if (downloadResult.srt?.ok) {\n storage.setSrtFile(recordingId, storage.buildSrtFilename(recordingId));\n }\n\n const currentBeforeSynced = storage.findById(recordingId);\n if (\n currentBeforeSynced?.status === \"syncing_openclaw\"\n || currentBeforeSynced?.status === \"sync_failed\"\n ) {\n storage.updateStatus(recordingId, \"synced\");\n } else {\n logger.info(\n `[recording-sync] 录音已被其他通道更新,保留状态: ${recordingId}, status=${currentBeforeSynced?.status}`,\n );\n }\n logger.info(`[recording-sync] 录音已同步: ${recordingId}`);\n emitRecordingStatus(recordingId, storage, logger, options.notifyStatus);\n\n const currentAfterSynced = storage.findById(recordingId);\n if (isAsrConfigured(asrConfig) && canStartTranscription(currentAfterSynced?.status ?? \"synced\")) {\n await triggerTranscription(\n recordingId,\n storage,\n asrConfig!,\n logger,\n options,\n );\n }\n}\n\n/**\n * 处理 recordings.sync 请求的核心逻辑\n */\nexport async function handleRecordingSync(\n recordingId: string,\n metadata: RecordingMetadata,\n storage: RecordingStorage,\n asrConfig: AsrConfig | undefined,\n logger: Logger,\n options: RecordingSyncOptions = {},\n): Promise<RecordingSyncResult> {\n const existing = storage.findById(recordingId);\n const shouldDownloadAndSync =\n !existing\n || existing.metadata.oss_audio_url !== metadata.oss_audio_url\n || !existing.audioFile\n || existing.status === \"syncing_openclaw\"\n || existing.status === \"sync_failed\";\n\n storage.ingest(recordingId, metadata);\n if (shouldDownloadAndSync) {\n runRecordingSyncInBackground(\n metadata,\n recordingId,\n storage,\n asrConfig,\n logger,\n options,\n ).catch((err) => {\n const error = `录音同步失败: ${err?.message ?? err}`;\n logger.error(`[recording-sync] ${error}: ${recordingId}`);\n const current = storage.findById(recordingId);\n if (current?.status === \"syncing_openclaw\") {\n storage.updateStatus(recordingId, \"sync_failed\");\n }\n storage.setLastError(recordingId, error);\n emitRecordingStatus(\n recordingId,\n storage,\n logger,\n options.notifyStatus,\n error,\n );\n });\n } else {\n logger.info(\n `[recording-sync] 录音已存在且音频未变化,跳过重复下载: ${recordingId}`,\n );\n emitRecordingStatus(recordingId, storage, logger, options.notifyStatus);\n\n const current = storage.findById(recordingId);\n if (current?.status === \"synced\" && isAsrConfigured(asrConfig)) {\n triggerTranscription(\n recordingId,\n storage,\n asrConfig!,\n logger,\n options,\n ).catch((err) => {\n logger.error(\n `[asr-trigger] 转写触发失败: ${recordingId}, ${err?.message ?? err}`,\n );\n });\n }\n }\n\n const current = storage.findById(recordingId);\n return {\n ok: true,\n recordingId,\n transfer_status: current?.status ?? \"syncing_openclaw\",\n ...(current?.lastError ? { error: current.lastError } : {}),\n };\n}\n\n/**\n * 触发 ASR 转写(可从 sync handler 自动触发或手动重试调用)\n */\nexport async function triggerTranscription(\n recordingId: string,\n storage: RecordingStorage,\n asrConfig: AsrConfig,\n logger: Logger,\n options: RecordingSyncOptions = {},\n): Promise<void> {\n const entry = storage.findById(recordingId);\n if (!entry) {\n logger.warn(`[asr-trigger] 录音不存在: ${recordingId}`);\n return;\n }\n\n if (!canStartTranscription(entry.status)) {\n logger.warn(\n `[asr-trigger] 当前状态不允许转写: ${recordingId} (status=${entry.status})`,\n );\n return;\n }\n\n // 状态 → transcribing\n storage.updateStatus(recordingId, \"transcribing\");\n storage.setLastError(recordingId, undefined);\n emitRecordingStatus(recordingId, storage, logger, options.notifyStatus);\n\n const audioFilePath = storage.getAudioFilePath(recordingId);\n\n let result: Awaited<ReturnType<typeof runTranscriptionWorkflow>>;\n try {\n result = await runTranscriptionWorkflow({\n audioFilePath,\n audioOssUrl: entry.metadata.oss_audio_url,\n config: asrConfig,\n markers: entry.metadata.markers ?? [],\n recordingName: entry.metadata.name,\n durationSec: entry.metadata.duration_sec,\n createdAt: entry.metadata.created_at,\n transcriptDataDir: storage.getTranscriptDataDir(),\n transcriptsDir: storage.getTranscriptsDir(),\n summariesDir: storage.getSummariesDir(),\n recordingId,\n logger,\n });\n } catch (err: any) {\n const error = `转写任务异常: ${err?.message ?? err}`;\n logger.error(`[asr-trigger] ${error}: ${recordingId}`);\n result = { ok: false, error };\n }\n\n if (result.ok && result.transcriptFilename) {\n if (result.transcriptDataFilename) {\n storage.setTranscriptDataFile(recordingId, result.transcriptDataFilename);\n }\n storage.setTranscriptFile(recordingId, result.transcriptFilename);\n if (result.summaryFilename) {\n storage.setSummaryFile(recordingId, result.summaryFilename);\n }\n storage.setTitle(recordingId, result.title);\n storage.updateStatus(recordingId, \"transcribed\");\n emitRecordingStatus(\n recordingId,\n storage,\n logger,\n options.notifyStatus,\n undefined,\n {\n transcript: result.transcript ?? [],\n summary: result.summary,\n title: result.title ?? \"\",\n },\n );\n logger.info(\n `[asr-trigger] 转写完成: ${recordingId}, summary=\"${result.summary}\"`,\n );\n } else {\n const error = result.error ?? \"ASR 转写失败\";\n storage.updateStatus(recordingId, \"transcribe_failed\");\n storage.setLastError(recordingId, error);\n emitRecordingStatus(\n recordingId,\n storage,\n logger,\n options.notifyStatus,\n error,\n );\n logger.error(\n `[asr-trigger] 转写失败: ${recordingId}, error=${error}`,\n );\n }\n}\n",
97
+ "import { writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Logger } from \"../logger.js\";\nimport type {\n RecordingMetadata,\n RecordingResultSummary,\n RecordingResultTranscript,\n RecordingResultTranscriptSegment,\n RecordingResultWriteParams,\n RecordingResultWriteResult,\n RecordingTranscriptItem,\n} from \"../types.js\";\nimport type { RecordingStatusEvent } from \"./handler.js\";\nimport { downloadFile } from \"./downloader.js\";\nimport { RecordingStorage } from \"./storage.js\";\nimport {\n buildTranscriptDocument,\n extractSourceTextListFromDocument,\n type TranscriptDocumentSegment,\n} from \"./transcript-document.js\";\n\nexport interface RecordingResultWriteOptions {\n notifyStatus?: (event: RecordingStatusEvent) => void;\n}\n\nexport function handleRecordingResultWrite(\n params: RecordingResultWriteParams,\n storage: RecordingStorage,\n logger: Logger,\n options: RecordingResultWriteOptions = {},\n): RecordingResultWriteResult {\n const recordingId = normalizeRequiredText(params.recordingId, \"recordingId\");\n if (!params.transcript && !params.summary) {\n throw new Error(\"transcript or summary is required\");\n }\n\n // 找不到则按占位元数据新建,找得到则在其上覆盖(与 recordings.sync 的 upsert 逻辑一致)\n let entry = storage.findById(recordingId);\n if (!entry) {\n storage.ingest(recordingId, buildPlaceholderMetadata(recordingId, params));\n entry = storage.findById(recordingId);\n if (!entry) {\n throw new Error(`Recording not found: ${recordingId}`);\n }\n logger.info(`[recording-result] 录音不存在,已按结果写入新建: ${recordingId}`);\n }\n\n let transcript: RecordingTranscriptItem[] | undefined;\n let title = entry.title ?? entry.metadata.name ?? recordingId;\n let summaryText: string | undefined;\n\n if (params.transcript) {\n const written = writeTranscript(\n recordingId,\n entry.metadata,\n params.transcript,\n storage,\n logger,\n );\n transcript = written.transcript;\n title = written.title;\n }\n\n if (params.summary) {\n summaryText = writeSummary(recordingId, params.summary, storage, logger);\n }\n\n const updated = storage.markResultWritten(recordingId);\n emitResultStatus(recordingId, storage, logger, options.notifyStatus, {\n transcript,\n summary: summaryText ?? storage.readSummary(recordingId),\n title,\n });\n\n const ossUrl = normalizeText(params.ossUrl);\n if (ossUrl) {\n downloadAudioInBackground(recordingId, ossUrl, storage, logger, options);\n }\n\n return {\n ok: true,\n recordingId,\n transfer_status: updated.status,\n stored: {\n transcriptDataFile: updated.transcriptDataFile,\n transcriptFile: updated.transcriptFile,\n summaryFile: updated.summaryFile,\n },\n };\n}\n\n/**\n * result.write 找不到录音时,用请求里能拿到的信息拼一份占位元数据。\n * 缺失字段给安全默认值;后续 recordings.sync 会用真实元数据覆盖。\n */\nfunction buildPlaceholderMetadata(\n recordingId: string,\n params: RecordingResultWriteParams,\n): RecordingMetadata {\n return {\n name: normalizeText(params.transcript?.title) ?? recordingId,\n duration_sec: 0,\n file_size_bytes: 0,\n created_at: normalizeText(params.transcript?.generatedAt)\n ?? new Date().toISOString(),\n oss_audio_url: normalizeText(params.ossUrl) ?? \"\",\n markers: [],\n transfer_status: \"synced\",\n };\n}\n\nfunction writeTranscript(\n recordingId: string,\n recording: RecordingMetadata,\n transcript: RecordingResultTranscript,\n storage: RecordingStorage,\n logger: Logger,\n): { title: string; transcript: RecordingTranscriptItem[] } {\n const title = normalizeText(transcript.title)\n ?? normalizeText(recording.name)\n ?? recordingId;\n const segments = normalizeSegments(transcript.segments);\n const text = normalizePossiblyEmptyText(transcript.text)\n ?? joinSegmentTexts(segments)\n ?? normalizePossiblyEmptyText(transcript.markdown)\n ?? \"\";\n const transcriptDocument = buildTranscriptDocument({\n recordingId,\n generatedAt: normalizeText(transcript.generatedAt) ?? new Date().toISOString(),\n source: {\n provider: normalizeText(transcript.source?.provider) ?? \"app\",\n taskId: normalizeText(transcript.source?.taskId),\n requestId: normalizeText(transcript.source?.requestId),\n status: normalizeText(transcript.source?.status),\n delivery: \"result-write\",\n },\n title,\n category: normalizeText(transcript.category),\n summary: normalizePossiblyEmptyText(transcript.brief),\n text,\n segments,\n raw: transcript,\n });\n\n const transcriptDataFilename = storage.buildTranscriptDataFilename(recordingId);\n writeFileSync(\n storage.getTranscriptDataFilePath(recordingId),\n JSON.stringify(transcriptDocument, null, 2),\n \"utf-8\",\n );\n storage.setTranscriptDataFile(recordingId, transcriptDataFilename);\n\n const transcriptFilename = storage.buildTranscriptFilename(recordingId, title);\n const markdown = normalizePossiblyEmptyText(transcript.markdown)\n ?? buildTranscriptMarkdown(recording, title, text, segments);\n writeFileSync(\n join(storage.getTranscriptsDir(), transcriptFilename),\n ensureTrailingNewline(markdown),\n \"utf-8\",\n );\n storage.setTranscriptFile(recordingId, transcriptFilename);\n storage.setTitle(recordingId, title);\n logger.info(`[recording-result] 转录文本已写入: ${recordingId}`);\n\n return {\n title,\n transcript: extractSourceTextListFromDocument(transcriptDocument) ?? [],\n };\n}\n\nfunction writeSummary(\n recordingId: string,\n summary: RecordingResultSummary,\n storage: RecordingStorage,\n logger: Logger,\n): string | undefined {\n const markdown = normalizePossiblyEmptyText(summary.markdown)\n ?? buildStructuredSummaryMarkdown(summary.structured);\n if (markdown === undefined) {\n return undefined;\n }\n\n const summaryFilename = storage.buildSummaryFilename(recordingId);\n writeFileSync(\n storage.getSummaryFilePath(recordingId),\n ensureTrailingNewline(markdown),\n \"utf-8\",\n );\n storage.setSummaryFile(recordingId, summaryFilename);\n logger.info(`[recording-result] 总结已写入: ${recordingId}`);\n return markdown.trim();\n}\n\nfunction downloadAudioInBackground(\n recordingId: string,\n ossUrl: string,\n storage: RecordingStorage,\n logger: Logger,\n options: RecordingResultWriteOptions,\n): void {\n const audioDestPath = storage.getAudioFilePath(recordingId, ossUrl);\n\n logger.info(\n `[recording-result] 开始下载音频: ${recordingId}, audio=${ossUrl}`,\n );\n\n downloadFile(ossUrl, audioDestPath, logger).then((result) => {\n if (!result.ok) {\n const error = `音频下载失败: ${result.error}`;\n logger.error(`[recording-result] ${error}: ${recordingId}`);\n storage.setLastError(recordingId, error);\n emitDownloadStatus(recordingId, storage, logger, options.notifyStatus);\n return;\n }\n\n storage.setAudioFile(\n recordingId,\n storage.buildAudioFilename(recordingId, ossUrl),\n );\n logger.info(`[recording-result] 音频已更新: ${recordingId}`);\n emitDownloadStatus(recordingId, storage, logger, options.notifyStatus);\n }).catch((err) => {\n const error = `音频下载异常: ${err?.message ?? err}`;\n logger.error(`[recording-result] ${error}: ${recordingId}`);\n storage.setLastError(recordingId, error);\n emitDownloadStatus(recordingId, storage, logger, options.notifyStatus);\n });\n}\n\nfunction emitDownloadStatus(\n recordingId: string,\n storage: RecordingStorage,\n logger: Logger,\n notifyStatus: RecordingResultWriteOptions[\"notifyStatus\"],\n): void {\n const entry = storage.findById(recordingId);\n if (!entry) return;\n emitResultStatus(recordingId, storage, logger, notifyStatus, {\n summary: storage.readSummary(recordingId),\n title: entry.title ?? entry.metadata.name ?? recordingId,\n });\n}\n\nfunction emitResultStatus(\n recordingId: string,\n storage: RecordingStorage,\n logger: Logger,\n notifyStatus: RecordingResultWriteOptions[\"notifyStatus\"],\n extras: Pick<RecordingStatusEvent, \"transcript\" | \"summary\" | \"title\">,\n): void {\n if (!notifyStatus) return;\n const entry = storage.findById(recordingId);\n if (!entry) return;\n\n try {\n notifyStatus({\n recordingId: entry.id,\n transfer_status: entry.status,\n audioFile: entry.audioFile,\n srtFile: entry.srtFile,\n transcriptDataFile: entry.transcriptDataFile,\n transcriptFile: entry.transcriptFile,\n summaryFile: entry.summaryFile,\n transcript: extras.transcript,\n summary: extras.summary,\n title: extras.title,\n updatedAt: entry.updatedAt,\n error: entry.lastError,\n });\n } catch (err: any) {\n logger.error(\n `[recording-result] 状态事件发送失败: ${recordingId}, ${err?.message ?? err}`,\n );\n }\n}\n\nfunction normalizeSegments(\n segments: RecordingResultTranscriptSegment[] | undefined,\n): TranscriptDocumentSegment[] {\n if (!Array.isArray(segments)) return [];\n return segments.flatMap((segment) => {\n const text = normalizeText(segment.text);\n if (!text) return [];\n return [{\n text,\n startMs: typeof segment.startMs === \"number\" ? segment.startMs : undefined,\n endMs: typeof segment.endMs === \"number\" ? segment.endMs : undefined,\n speakerId: Number.isInteger(segment.speakerId) ? segment.speakerId : undefined,\n }];\n });\n}\n\nfunction joinSegmentTexts(\n segments: TranscriptDocumentSegment[],\n): string | undefined {\n const text = segments\n .map((segment) => segment.text)\n .filter(Boolean)\n .join(\"\\n\\n\")\n .trim();\n return text || undefined;\n}\n\nfunction buildTranscriptMarkdown(\n recording: RecordingMetadata,\n title: string,\n text: string,\n segments: TranscriptDocumentSegment[],\n): string {\n const lines: string[] = [];\n lines.push(`# ${title}`);\n lines.push(\"\");\n lines.push(`> 录音名称:${recording.name}`);\n lines.push(`> 时长:${formatDuration(recording.duration_sec)}`);\n lines.push(`> 创建时间:${recording.created_at}`);\n if ((recording.markers ?? []).length > 0) {\n lines.push(`> 关键点数:${recording.markers.length}`);\n }\n lines.push(\"\");\n lines.push(\"---\");\n lines.push(\"\");\n\n if (segments.length > 0) {\n for (const segment of segments) {\n const prefix = segment.startMs !== undefined\n ? `[${formatTimestamp(segment.startMs)}] `\n : \"\";\n lines.push(`${prefix}${segment.text}`.trim());\n lines.push(\"\");\n }\n } else {\n lines.push(text);\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction buildStructuredSummaryMarkdown(structured: unknown): string | undefined {\n if (structured === undefined || structured === null) return undefined;\n if (typeof structured === \"string\") return structured;\n if (typeof structured !== \"object\") return String(structured);\n\n const record = structured as Record<string, unknown>;\n const lines: string[] = [\"# 总结\", \"\"];\n appendSection(lines, \"结论\", record.decisions);\n appendSection(lines, \"待办\", record.todos);\n appendSection(lines, \"风险\", record.risks);\n appendSection(lines, \"未决问题\", record.openQuestions);\n\n if (lines.length === 2) {\n lines.push(\"```json\");\n lines.push(JSON.stringify(structured, null, 2));\n lines.push(\"```\");\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction appendSection(lines: string[], title: string, value: unknown): void {\n if (!Array.isArray(value) || value.length === 0) return;\n lines.push(`## ${title}`);\n lines.push(\"\");\n for (const item of value) {\n lines.push(typeof item === \"string\" ? `- ${item}` : `- ${JSON.stringify(item)}`);\n }\n lines.push(\"\");\n}\n\nfunction normalizeRequiredText(value: unknown, field: string): string {\n const text = normalizeText(value);\n if (!text) {\n throw new Error(`${field} is required`);\n }\n return text;\n}\n\nfunction normalizeText(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim()\n ? value.trim()\n : undefined;\n}\n\nfunction normalizePossiblyEmptyText(value: unknown): string | undefined {\n return typeof value === \"string\"\n ? value.replace(/\\r\\n/g, \"\\n\")\n : undefined;\n}\n\nfunction ensureTrailingNewline(value: string): string {\n return value.endsWith(\"\\n\") ? value : `${value}\\n`;\n}\n\nfunction formatDuration(sec: number): string {\n const hours = Math.floor(sec / 3600);\n const minutes = Math.floor((sec % 3600) / 60);\n const seconds = Math.floor(sec % 60);\n if (hours > 0) {\n return `${hours}:${String(minutes).padStart(2, \"0\")}:${String(seconds).padStart(2, \"0\")}`;\n }\n return `${minutes}:${String(seconds).padStart(2, \"0\")}`;\n}\n\nfunction formatTimestamp(ms: number): string {\n const totalSec = Math.floor(ms / 1000);\n const minutes = Math.floor(totalSec / 60);\n const seconds = totalSec % 60;\n return `${String(minutes).padStart(2, \"0\")}:${String(seconds).padStart(2, \"0\")}`;\n}\n",
98
+ "/**\n * 图片本地存储管理\n *\n * 目录结构:\n * <storageDir>/images/\n * ├── files/ # 下载的原图\n * │ └── <imageId>.jpg\n * └── index.json # 元数据索引({ images: [] })\n *\n * 字段与 CLI(YoooClaw/cli internal/image)严格对齐,三端共享同一份 index.json。\n */\n\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n rmSync,\n} from \"node:fs\";\nimport { join, isAbsolute } from \"node:path\";\nimport type { ImageMetadata, ImageTransferStatus } from \"../types.js\";\nimport type { Logger } from \"../logger.js\";\nimport { currentClientLabel } from \"../ingest-context.js\";\n\n// ─── Types ───\n\n/** 持久化到 index.json 的单条图片记录 */\nexport interface ImageIndexEntry {\n /** 图片 ID(客户端下发) */\n imageId: string;\n /** 来源客户端 label;旧数据无该字段,查询时视为 legacy */\n clientLabel?: string;\n /** 原始元数据 */\n metadata: ImageMetadata;\n /** 本地文件相对路径(如 \"files/<id>.jpg\") */\n localFile?: string;\n /** 缩略图相对路径(阶段一不下载,仅透传保留字段对齐) */\n thumbnail?: string;\n /** 当前同步状态 */\n status: ImageTransferStatus;\n /** 最近一次失败原因 */\n lastError?: string;\n /** 下载完成时间 ISO 8601 */\n syncedAt?: string;\n}\n\n/** 图片存储索引(整个 index.json) */\ninterface ImageIndex {\n images: ImageIndexEntry[];\n}\n\nexport interface ImageStorageContext {\n stateDir: string;\n workspaceDir?: string;\n}\n\n// ─── Constants ───\n\nconst IMAGES_DIR = \"images\";\nconst FILES_DIR = \"files\";\nconst INDEX_FILE = \"index.json\";\n\n/** 从 MIME 推断扩展名(与 CLI extFromMime 对齐),未知时回退 jpg */\nexport function extFromMime(mime?: string): string {\n const m = (mime ?? \"\").toLowerCase();\n if (m.includes(\"png\")) return \"png\";\n if (m.includes(\"webp\")) return \"webp\";\n if (m.includes(\"gif\")) return \"gif\";\n return \"jpg\";\n}\n\n/**\n * 解析图片存储根目录(与录音同级,优先 stateDir,回退 workspace)\n */\nexport function resolveImageStorageDir(\n ctx: ImageStorageContext,\n logger: Pick<Logger, \"info\" | \"warn\">,\n): string {\n const stateImagesDir = join(\n ctx.stateDir,\n \"plugins\",\n \"phone-notifications\",\n IMAGES_DIR,\n );\n\n try {\n mkdirSync(stateImagesDir, { recursive: true });\n logger.info(`图片将写入 stateDir 路径: ${stateImagesDir}`);\n return stateImagesDir;\n } catch {\n // fallback\n }\n\n if (ctx.workspaceDir) {\n const wsImagesDir = join(ctx.workspaceDir, IMAGES_DIR);\n try {\n mkdirSync(wsImagesDir, { recursive: true });\n logger.warn(`stateDir 不可用,图片已回退到 workspace 路径: ${wsImagesDir}`);\n return wsImagesDir;\n } catch {\n // fallthrough\n }\n }\n\n throw new Error(`图片存储目录不可用: ${stateImagesDir}`);\n}\n\n// ─── ImageStorage Class ───\n\nexport class ImageStorage {\n private readonly dir: string;\n private readonly filesDir: string;\n private readonly indexPath: string;\n private index: ImageIndex = { images: [] };\n\n constructor(\n dir: string,\n private readonly logger: Logger,\n ) {\n this.dir = dir;\n this.filesDir = join(dir, FILES_DIR);\n this.indexPath = join(dir, INDEX_FILE);\n }\n\n /** 初始化目录结构并加载索引 */\n async init(): Promise<void> {\n mkdirSync(this.filesDir, { recursive: true });\n this.loadIndex();\n this.logger.info(\n `图片存储已初始化: ${this.dir}(共 ${this.index.images.length} 条记录)`,\n );\n }\n\n getFilesDir(): string {\n return this.filesDir;\n }\n\n // ─── 入库 ───\n\n /**\n * 收到 images.sync 后,将元数据写入索引并置为 syncing。\n * 同 ID 已存在则覆盖元数据并重置同步状态。\n */\n ingest(imageId: string, metadata: ImageMetadata): ImageIndexEntry {\n const clientLabel = currentClientLabel(\"default\");\n const existing = this.findById(imageId);\n\n if (existing) {\n // 复用已下载文件:同 URL 且已 synced 时保留本地文件与状态\n if (\n existing.metadata.oss_image_url === metadata.oss_image_url &&\n existing.status === \"synced\" &&\n existing.localFile\n ) {\n existing.metadata = metadata;\n existing.clientLabel = clientLabel;\n this.saveIndex();\n return existing;\n }\n\n if (existing.localFile) {\n rmSync(join(this.dir, existing.localFile), { force: true });\n }\n existing.metadata = metadata;\n existing.clientLabel = clientLabel;\n existing.status = \"syncing\";\n existing.localFile = undefined;\n existing.lastError = undefined;\n existing.syncedAt = undefined;\n this.saveIndex();\n this.logger.info(`图片元数据已更新: ${imageId}`);\n return existing;\n }\n\n const entry: ImageIndexEntry = {\n imageId,\n clientLabel,\n metadata,\n status: \"syncing\",\n };\n this.index.images.push(entry);\n this.saveIndex();\n this.logger.info(`图片元数据已入库: ${imageId}`);\n return entry;\n }\n\n // ─── 状态管理 ───\n\n /** 标记下载完成 */\n setSynced(imageId: string, localFile: string): void {\n const entry = this.findById(imageId);\n if (!entry) return;\n entry.localFile = localFile;\n entry.status = \"synced\";\n entry.lastError = undefined;\n entry.syncedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /** 标记下载失败 */\n setSyncFailed(imageId: string, error: string): void {\n const entry = this.findById(imageId);\n if (!entry) return;\n entry.status = \"sync_failed\";\n entry.lastError = error.trim() || \"下载失败\";\n entry.localFile = undefined;\n this.saveIndex();\n }\n\n // ─── Helpers ───\n\n /** 生成本地文件名 <imageId>.<ext> */\n buildFilename(imageId: string, mime?: string): string {\n return `${imageId}.${extFromMime(mime)}`;\n }\n\n /** 本地文件相对路径(用于写入 localFile 字段) */\n buildRelativeFilePath(imageId: string, mime?: string): string {\n return `${FILES_DIR}/${this.buildFilename(imageId, mime)}`;\n }\n\n /** 本地文件绝对路径 */\n getFilePath(imageId: string, mime?: string): string {\n return join(this.filesDir, this.buildFilename(imageId, mime));\n }\n\n /** 把索引中的相对路径解析为绝对路径 */\n resolveFile(relative: string): string {\n return isAbsolute(relative) ? relative : join(this.dir, relative);\n }\n\n // ─── 查询 ───\n\n findById(id: string): ImageIndexEntry | undefined {\n return this.index.images.find((e) => e.imageId === id);\n }\n\n listAll(): ImageIndexEntry[] {\n return [...this.index.images].sort((a, b) =>\n b.metadata.created_at.localeCompare(a.metadata.created_at),\n );\n }\n\n // ─── 索引 IO ───\n\n private loadIndex(): void {\n if (!existsSync(this.indexPath)) {\n this.index = { images: [] };\n return;\n }\n try {\n const raw = JSON.parse(readFileSync(this.indexPath, \"utf-8\"));\n this.index =\n raw && Array.isArray(raw.images) ? { images: raw.images } : { images: [] };\n } catch {\n this.logger.warn(`图片索引文件损坏,已重建: ${this.indexPath}`);\n this.index = { images: [] };\n }\n }\n\n private saveIndex(): void {\n writeFileSync(this.indexPath, JSON.stringify(this.index, null, 2), \"utf-8\");\n }\n\n async close(): Promise<void> {\n // 当前无需额外清理\n }\n}\n",
99
+ "/**\n * 图片同步处理器\n *\n * 处理 images.sync / POST /images:\n * 1. 校验 + 去重\n * 2. 元数据入库(status=syncing)\n * 3. 后台从 OSS 下载原图(带大小上限)\n * 4. 更新状态 → synced / sync_failed\n */\n\nimport { createWriteStream, existsSync, mkdirSync, unlinkSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport type { ImageMetadata, ImageSyncResult } from \"../types.js\";\nimport type { Logger } from \"../logger.js\";\nimport { ImageStorage } from \"./store.js\";\n\n/** 默认单张图片大小上限:20MB(与 CLI 对齐) */\nexport const DEFAULT_IMAGE_MAX_BYTES = 20 * 1024 * 1024;\n\n/** 下载超时:5 分钟 */\nconst DOWNLOAD_TIMEOUT_MS = 5 * 60 * 1000;\n\n/**\n * 处理 images.sync 的核心逻辑。元数据同步落库,下载在后台进行。\n */\nexport function handleImageSync(\n imageId: string,\n metadata: ImageMetadata,\n storage: ImageStorage,\n maxBytes: number,\n logger: Logger,\n): ImageSyncResult {\n const cap = maxBytes > 0 ? maxBytes : DEFAULT_IMAGE_MAX_BYTES;\n\n // 去重:同 id + 同 url 已 synced 直接返回\n const existing = storage.findById(imageId);\n if (\n existing &&\n existing.status === \"synced\" &&\n existing.localFile &&\n existing.metadata.oss_image_url === metadata.oss_image_url\n ) {\n storage.ingest(imageId, metadata); // 仅刷新元数据,保留文件与状态\n return { ok: true, imageId, status: \"synced\", deduped: true };\n }\n\n storage.ingest(imageId, metadata);\n\n runImageDownloadInBackground(imageId, metadata, storage, cap, logger).catch(\n (err) => {\n const error = `图片同步失败: ${err?.message ?? err}`;\n logger.error(`[image-sync] ${error}: ${imageId}`);\n storage.setSyncFailed(imageId, error);\n },\n );\n\n return { ok: true, imageId, status: \"syncing\" };\n}\n\nasync function runImageDownloadInBackground(\n imageId: string,\n metadata: ImageMetadata,\n storage: ImageStorage,\n maxBytes: number,\n logger: Logger,\n): Promise<void> {\n const destPath = storage.getFilePath(imageId, metadata.mime_type);\n const relativePath = storage.buildRelativeFilePath(imageId, metadata.mime_type);\n\n logger.info(\n `[image-sync] 开始下载图片: ${imageId}, url=${metadata.oss_image_url}`,\n );\n\n const result = await downloadImage(\n metadata.oss_image_url,\n destPath,\n maxBytes,\n logger,\n );\n\n if (!result.ok) {\n const error = `图片下载失败: ${result.error}`;\n logger.error(`[image-sync] ${error}: ${imageId}`);\n storage.setSyncFailed(imageId, error);\n return;\n }\n\n storage.setSynced(imageId, relativePath);\n logger.info(`[image-sync] 图片已同步: ${imageId} (${result.sizeBytes} bytes)`);\n}\n\ninterface ImageDownloadResult {\n ok: boolean;\n sizeBytes?: number;\n error?: string;\n}\n\n/**\n * 下载图片到本地,超过 maxBytes 即中止并清理半成品。\n */\nasync function downloadImage(\n url: string,\n destPath: string,\n maxBytes: number,\n logger: Logger,\n): Promise<ImageDownloadResult> {\n mkdirSync(dirname(destPath), { recursive: true });\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), DOWNLOAD_TIMEOUT_MS);\n\n const cleanup = () => {\n try {\n if (existsSync(destPath)) unlinkSync(destPath);\n } catch {\n // ignore\n }\n };\n\n try {\n const res = await fetch(url, { signal: controller.signal });\n if (!res.ok) {\n return { ok: false, error: `HTTP ${res.status} ${res.statusText}` };\n }\n if (!res.body) {\n return { ok: false, error: \"响应体为空\" };\n }\n\n const contentLength = Number(res.headers.get(\"content-length\") ?? \"0\");\n if (contentLength > 0 && contentLength > maxBytes) {\n return { ok: false, error: `图片超过上限 ${maxBytes} 字节` };\n }\n\n const writeStream = createWriteStream(destPath);\n let total = 0;\n try {\n for await (const chunk of res.body as any) {\n total += chunk.length;\n if (total > maxBytes) {\n writeStream.destroy();\n cleanup();\n return { ok: false, error: `图片超过上限 ${maxBytes} 字节` };\n }\n if (!writeStream.write(chunk)) {\n await new Promise<void>((resolve) =>\n writeStream.once(\"drain\", resolve),\n );\n }\n }\n await new Promise<void>((resolve, reject) => {\n writeStream.end((err?: Error | null) =>\n err ? reject(err) : resolve(),\n );\n });\n } catch (err: any) {\n writeStream.destroy();\n cleanup();\n throw err;\n }\n\n return { ok: true, sizeBytes: total };\n } catch (err: any) {\n cleanup();\n const isAbort = err?.name === \"AbortError\";\n const message = isAbort ? \"下载超时\" : err?.message ?? String(err);\n logger.warn(`[image-sync] 下载异常: ${message}`);\n return { ok: false, error: message };\n } finally {\n clearTimeout(timer);\n }\n}\n",
98
100
  "import {\n closeSync,\n mkdirSync,\n openSync,\n readFileSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { RelayClient } from \"./relay-client.js\";\nimport type { AuthProvider } from \"../profile/types.js\";\nimport { credentialsPath } from \"../auth/credentials.js\";\nimport { resolveHostStateDir, resolveStateDir } from \"../host.js\";\nimport { TunnelProxy } from \"./proxy.js\";\nimport { createConnectStatusReporter } from \"./connect-status-reporter.js\";\nimport type { UpdateInfo } from \"../update/types.js\";\nimport { redactUrlSecrets } from \"./utils.js\";\n\nconst DEFAULT_HEARTBEAT_SEC = 10;\nconst DEFAULT_RECONNECT_BACKOFF_MS = 2000;\nconst AUTH_CHANGE_DEBOUNCE_MS = 500;\n/** 锁心跳刷新倍数:持锁者每 heartbeatSec 刷新一次锁文件 updatedAt。 */\nconst LOCK_REFRESH_HEARTBEAT_MULTIPLIER = 1;\n/**\n * 锁失效倍数:updatedAt 超过 heartbeatSec × 该倍数未刷新即视为僵死锁,可被抢占。\n * 取较宽松的倍数(默认 60s),避免误抢健康持锁者。\n */\nconst LOCK_STALE_HEARTBEAT_MULTIPLIER = 6;\n\ninterface TunnelServiceOptions {\n /** Relay Server WebSocket 地址(构建时从 RELAY_TUNNEL_URL 注入) */\n tunnelUrl: string;\n /** 认证 Provider:提供 ensureProvisioned 门 + relay 连接凭据。 */\n authProvider: AuthProvider;\n gatewayBaseUrl: string;\n /** Gateway 鉴权模式 */\n gatewayAuthMode?: \"token\" | \"password\";\n /** Gateway 鉴权 token */\n gatewayToken?: string;\n /** Gateway 鉴权密码 */\n gatewayPassword?: string;\n /** 心跳间隔(秒),默认 10 */\n heartbeatSec?: number;\n /** 重连基础退避时间(毫秒),默认 2000 */\n reconnectBackoffMs?: number;\n logger: {\n info: (msg: string) => void;\n warn: (msg: string) => void;\n error: (msg: string) => void;\n };\n}\n\nexport interface RelayTunnelService {\n id: string;\n start(ctx: { stateDir: string }): Promise<void>;\n stop(): Promise<void>;\n emitEvent(event: string, payload: unknown): boolean;\n notifyUpdateAvailable(update: UpdateInfo): void;\n clearPendingUpdate(): void;\n deactivateForExternalTunnel(reason: string): Promise<void>;\n}\n\n/** 生成僵死锁的可读原因,用于日志。 */\nfunction describeStaleLock(\n ownerPid: number | null,\n updatedAt: number | null,\n staleMs: number,\n): string {\n const pidLabel = `pid=${ownerPid ?? \"?\"}`;\n if (ownerPid !== null && !isProcessAliveByPid(ownerPid)) {\n return `dead ${pidLabel}`;\n }\n if (updatedAt === null) {\n return `${pidLabel}, missing heartbeat`;\n }\n return `${pidLabel}, heartbeat stale ${Date.now() - updatedAt}ms > ${staleMs}ms`;\n}\n\n/** 判断指定 pid 是否存活(模块级,供锁逻辑复用)。 */\nfunction isProcessAliveByPid(pid: number): boolean {\n if (!Number.isInteger(pid) || pid <= 0) return false;\n if (pid === process.pid) return true;\n try {\n process.kill(pid, 0);\n return true;\n } catch (err: any) {\n return err?.code === \"EPERM\";\n }\n}\n\n/**\n * 隧道服务:组装 RelayClient + TunnelProxy,作为 registerService 的入口。\n */\nexport function createTunnelService(\n opts: TunnelServiceOptions,\n): RelayTunnelService {\n let client: RelayClient | null = null;\n let proxy: TunnelProxy | null = null;\n let abortController: AbortController | null = null;\n let provisionAbortController: AbortController | null = null;\n let lockFilePath: string | null = null;\n let lockFd: number | null = null;\n let lockStartedAt: string | null = null;\n let lockRefreshTimer: ReturnType<typeof setInterval> | null = null;\n let pendingPluginUpdate: UpdateInfo | null = null;\n let suppressedByExternalTunnel = false;\n let serviceStopped = true;\n let lastStartCtx: { stateDir: string } | null = null;\n let unwatchAuth: (() => void) | null = null;\n let authRefreshTimer: ReturnType<typeof setTimeout> | null = null;\n let authRefreshPromise: Promise<void> | null = null;\n let pendingAuthRefreshReason: string | null = null;\n\n function emitRelayEvent(event: string, payload: unknown): boolean {\n if (!client?.isConnected()) return false;\n const frame = JSON.stringify({\n type: \"event\",\n event,\n payload,\n });\n client.sendRaw(frame);\n return true;\n }\n\n function emitPendingPluginUpdate(reason: string): void {\n const update = pendingPluginUpdate;\n if (!update) return;\n\n const payload = {\n pluginId: \"phone-notifications\",\n pluginName: \"消息通知\",\n current: update.current,\n latest: update.latest,\n };\n if (!emitRelayEvent(\"plugin.updateAvailable\", payload)) return;\n\n opts.logger.info(\n `Relay tunnel: sending plugin.updateAvailable ${update.current} → ${update.latest} (${reason})`,\n );\n }\n\n function readLockInfo(filePath: string): {\n pid: number | null;\n updatedAt: number | null;\n } {\n try {\n const parsed = JSON.parse(readFileSync(filePath, \"utf-8\")) as {\n pid?: unknown;\n updatedAt?: unknown;\n };\n const pid = typeof parsed.pid === \"number\" ? parsed.pid : null;\n const updatedAtMs =\n typeof parsed.updatedAt === \"string\"\n ? Date.parse(parsed.updatedAt)\n : Number.NaN;\n return {\n pid,\n updatedAt: Number.isFinite(updatedAtMs) ? updatedAtMs : null,\n };\n } catch {\n return { pid: null, updatedAt: null };\n }\n }\n\n function buildLockPayload(): string {\n return (\n JSON.stringify({\n pid: process.pid,\n startedAt: lockStartedAt ?? new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n tunnelUrl: redactUrlSecrets(opts.tunnelUrl),\n }) + \"\\n\"\n );\n }\n\n function stopLockRefresh(): void {\n if (lockRefreshTimer) {\n clearInterval(lockRefreshTimer);\n lockRefreshTimer = null;\n }\n }\n\n /**\n * 持锁期间周期性刷新 updatedAt 心跳。其他进程据此判断锁是否僵死,\n * 即便持锁 pid 仍“存活”(进程挂死或 pid 被复用)也能被安全抢占。\n */\n function startLockRefresh(intervalMs: number): void {\n stopLockRefresh();\n lockRefreshTimer = setInterval(() => {\n const filePath = lockFilePath;\n if (!filePath) return;\n try {\n writeFileSync(filePath, buildLockPayload(), { mode: 0o600 });\n } catch {\n // 刷新失败不影响主流程,下个周期重试\n }\n }, intervalMs);\n lockRefreshTimer.unref?.();\n }\n\n function releaseLock(): void {\n stopLockRefresh();\n const filePath = lockFilePath;\n const fd = lockFd;\n lockFilePath = null;\n lockFd = null;\n lockStartedAt = null;\n\n if (fd !== null) {\n try {\n closeSync(fd);\n } catch {\n // ignore\n }\n }\n if (filePath) {\n try {\n unlinkSync(filePath);\n } catch {\n // ignore\n }\n }\n }\n\n function acquireLock(filePath: string): boolean {\n mkdirSync(dirname(filePath), { recursive: true });\n\n const heartbeatSec = opts.heartbeatSec ?? DEFAULT_HEARTBEAT_SEC;\n const refreshMs = heartbeatSec * 1000 * LOCK_REFRESH_HEARTBEAT_MULTIPLIER;\n const staleMs = heartbeatSec * 1000 * LOCK_STALE_HEARTBEAT_MULTIPLIER;\n\n for (let attempt = 0; attempt < 2; attempt++) {\n try {\n lockStartedAt = new Date().toISOString();\n const fd = openSync(filePath, \"wx\", 0o600);\n writeFileSync(fd, buildLockPayload());\n lockFilePath = filePath;\n lockFd = fd;\n startLockRefresh(refreshMs);\n return true;\n } catch (err: any) {\n lockStartedAt = null;\n if (err?.code !== \"EEXIST\") {\n opts.logger.error(\n `Relay tunnel: failed to acquire local lock ${filePath}: ${String(err)}`,\n );\n return false;\n }\n\n const { pid: ownerPid, updatedAt } = readLockInfo(filePath);\n const ownerDead = ownerPid !== null && !isProcessAliveByPid(ownerPid);\n // updatedAt 缺失(旧版本锁文件)或心跳超时都视为僵死:即便 pid 仍“存活”\n // (进程挂死 / pid 被复用)也允许抢占,避免新连接被永久占用。\n const heartbeatStale =\n updatedAt === null || Date.now() - updatedAt > staleMs;\n\n if (ownerDead || heartbeatStale) {\n const staleReason = describeStaleLock(ownerPid, updatedAt, staleMs);\n opts.logger.warn(\n `Relay tunnel: removing stale local lock (${staleReason})`,\n );\n try {\n unlinkSync(filePath);\n } catch {\n // ignore, retry below will fail if lock is still present\n }\n continue;\n }\n\n opts.logger.warn(\n `Relay tunnel: another local process already owns the tunnel lock${ownerPid ? ` (pid=${ownerPid})` : \"\"}; skipping connection to avoid duplicate token sessions`,\n );\n return false;\n }\n }\n\n return false;\n }\n\n async function shutdownRuntime(reason: string): Promise<void> {\n if (provisionAbortController) {\n provisionAbortController.abort();\n provisionAbortController = null;\n }\n await client?.stop(reason);\n if (abortController) {\n abortController.abort();\n abortController = null;\n }\n releaseLock();\n proxy?.cleanup();\n proxy = null;\n client = null;\n }\n\n function teardownAuthWatcher(): void {\n if (!unwatchAuth) return;\n try {\n unwatchAuth();\n } catch {\n // ignore\n }\n unwatchAuth = null;\n }\n\n function setupAuthWatcher(): void {\n teardownAuthWatcher();\n try {\n unwatchAuth = opts.authProvider.watch(() => {\n scheduleAuthRefresh(\"auth provider changed\");\n });\n } catch (err) {\n opts.logger.warn(\n `Relay tunnel: failed to watch auth changes: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n function clearAuthRefreshTimer(): void {\n if (!authRefreshTimer) return;\n clearTimeout(authRefreshTimer);\n authRefreshTimer = null;\n }\n\n function scheduleAuthRefresh(reason: string): void {\n pendingAuthRefreshReason = pendingAuthRefreshReason\n ? `${pendingAuthRefreshReason}; ${reason}`\n : reason;\n clearAuthRefreshTimer();\n authRefreshTimer = setTimeout(() => {\n authRefreshTimer = null;\n runAuthRefresh();\n }, AUTH_CHANGE_DEBOUNCE_MS);\n authRefreshTimer.unref?.();\n }\n\n function runAuthRefresh(): void {\n if (authRefreshPromise) return;\n\n const reason = pendingAuthRefreshReason ?? \"auth changed\";\n pendingAuthRefreshReason = null;\n authRefreshPromise = (async () => {\n const ctx = lastStartCtx;\n if (serviceStopped || !ctx) return;\n\n opts.logger.info(\n `Relay tunnel: auth changed (${reason}), refreshing credentials and restarting relay`,\n );\n teardownAuthWatcher();\n try {\n await shutdownRuntime(`auth changed: ${reason}`);\n if (!serviceStopped && !suppressedByExternalTunnel) {\n await startRuntime(ctx);\n }\n } finally {\n if (!serviceStopped) {\n setupAuthWatcher();\n }\n }\n })()\n .catch((err) => {\n opts.logger.error(\n `Relay tunnel: auth refresh restart failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n })\n .finally(() => {\n authRefreshPromise = null;\n const nextReason = pendingAuthRefreshReason;\n if (nextReason) {\n pendingAuthRefreshReason = null;\n scheduleAuthRefresh(nextReason);\n }\n });\n }\n\n async function startRuntime(ctx: { stateDir: string }): Promise<void> {\n if (suppressedByExternalTunnel) {\n opts.logger.info(\n \"Relay tunnel: external tunnel currently owns ingress; skipping relay startup\",\n );\n return;\n }\n\n // provision 门:openclaw/arkclaw 为 no-op;jvsclaw 在此重试置换 apiKey 直到成功。\n // stop() 会中止此重试,避免置换长时间失败时 start() 永远挂起。\n provisionAbortController = new AbortController();\n await opts.authProvider.ensureProvisioned(provisionAbortController.signal);\n\n const authStatus = await opts.authProvider.status();\n if (!authStatus.ready) {\n opts.logger.warn(\n `Relay tunnel: 认证未就绪(${authStatus.reason ?? \"n/a\"},credentials=${credentialsPath()}),跳过隧道连接。请执行 ntf auth set-api-key <apiKey>`,\n );\n return;\n }\n\n const { logger } = opts;\n const hostStateDir = resolveHostStateDir(ctx.stateDir);\n const stateDir = resolveStateDir(hostStateDir);\n const baseStateDir = join(stateDir, \"plugins\", \"phone-notifications\");\n logger.info(\n `Relay tunnel: starting (pid=${process.pid}, url=${redactUrlSecrets(opts.tunnelUrl)}, heartbeat=${opts.heartbeatSec ?? DEFAULT_HEARTBEAT_SEC}s, backoff=${opts.reconnectBackoffMs ?? DEFAULT_RECONNECT_BACKOFF_MS}ms, gateway=${opts.gatewayBaseUrl}, hasGatewayToken=${!!opts.gatewayToken}, hasGatewayPwd=${!!opts.gatewayPassword})`,\n );\n const statusFilePath = join(baseStateDir, \"tunnel-status.json\");\n const lockPath = join(baseStateDir, \"relay-tunnel.lock\");\n\n if (!acquireLock(lockPath)) {\n return;\n }\n\n try {\n client = new RelayClient({\n tunnelUrl: opts.tunnelUrl,\n credentialProvider: () => opts.authProvider.getRelayCredential(),\n heartbeatSec: opts.heartbeatSec ?? DEFAULT_HEARTBEAT_SEC,\n reconnectBackoffMs: opts.reconnectBackoffMs ?? DEFAULT_RECONNECT_BACKOFF_MS,\n statusFilePath,\n logger,\n });\n\n proxy = new TunnelProxy({\n stateDir: baseStateDir,\n hostStateDir,\n gatewayBaseUrl: opts.gatewayBaseUrl,\n gatewayAuthMode: opts.gatewayAuthMode,\n gatewayToken: opts.gatewayToken,\n gatewayPassword: opts.gatewayPassword,\n client,\n logger,\n });\n\n const connectStatusReporter = createConnectStatusReporter({ logger });\n\n client.onInbound((frame) => proxy!.handleFrame(frame));\n client.onConnected(() => {\n connectStatusReporter.report(\"connected\");\n emitPendingPluginUpdate(\"relay connected\");\n });\n client.onDisconnected((reason) => {\n logger.warn(\n `Relay tunnel: relay disconnected, cleaning local proxy state (${reason})`,\n );\n connectStatusReporter.report(\"disconnected\");\n proxy?.cleanup();\n });\n\n abortController = new AbortController();\n // 非阻塞启动,connectWithAutoReconnect 内部会保持运行\n client.connectWithAutoReconnect(abortController.signal).catch((err) => {\n releaseLock();\n logger.error(`Relay tunnel: unexpected error: ${err}`);\n });\n\n logger.info(\"Relay tunnel 服务已启动\");\n } catch (err) {\n releaseLock();\n throw err;\n }\n }\n\n return {\n id: \"relay-tunnel\",\n\n async start(ctx: { stateDir: string }) {\n serviceStopped = false;\n lastStartCtx = ctx;\n clearAuthRefreshTimer();\n teardownAuthWatcher();\n\n // 先清理上一轮连接,防止 start() 被重复调用时产生多个 RelayClient 互踢\n if (abortController) {\n opts.logger.info(\"Relay tunnel: aborting previous connection before restart\");\n await shutdownRuntime(\"service restarting\");\n }\n\n try {\n await startRuntime(ctx);\n } finally {\n if (!serviceStopped) {\n setupAuthWatcher();\n }\n }\n },\n\n async stop() {\n serviceStopped = true;\n suppressedByExternalTunnel = false;\n lastStartCtx = null;\n clearAuthRefreshTimer();\n pendingAuthRefreshReason = null;\n teardownAuthWatcher();\n await shutdownRuntime(\"service stopping\");\n opts.logger.info(\"Relay tunnel 服务已停止\");\n },\n\n async deactivateForExternalTunnel(reason: string) {\n if (suppressedByExternalTunnel && !client && !proxy && !abortController) {\n return;\n }\n\n suppressedByExternalTunnel = true;\n opts.logger.info(\n `Relay tunnel: external tunnel claimed ingress (${reason}), shutting down relay connection`,\n );\n await shutdownRuntime(\"external tunnel active\");\n },\n\n emitEvent(event: string, payload: unknown) {\n return emitRelayEvent(event, payload);\n },\n\n notifyUpdateAvailable(update: UpdateInfo) {\n pendingPluginUpdate = update;\n emitPendingPluginUpdate(\"update detected\");\n },\n\n clearPendingUpdate() {\n pendingPluginUpdate = null;\n },\n };\n}\n",
99
101
  "import { writeFileSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport WebSocket from \"ws\";\nimport type { InboundFrame, OutboundFrame } from \"./types.js\";\nimport { maskSecret, redactUrlSecrets } from \"./utils.js\";\nimport type { AuthCredential } from \"../profile/types.js\";\n\n/** 每次(重)连接时获取最新连接凭据;jvsclaw 等可在此透明刷新 token。 */\nexport type CredentialProvider = () => Promise<AuthCredential>;\n\nfunction previewText(text: string, max = 500): string {\n return text.length <= max ? text : `${text.substring(0, max)}…`;\n}\n\nfunction formatWebSocketError(err: Error): string {\n const statusMatch = /\\bUnexpected server response:\\s*(\\d{3})\\b/.exec(\n err.message,\n );\n if (!statusMatch) {\n return err.message;\n }\n return `${err.message}, upgradeStatus=${statusMatch[1]}`;\n}\n\n/** 从凭据里挑一个代表性密文用于脱敏日志(优先 query.apiKey,其次首个 header 值)。 */\nfunction maskableSecret(credential: AuthCredential): string {\n return (\n credential.query?.apiKey ??\n Object.values(credential.headers ?? {})[0] ??\n \"\"\n );\n}\n\n/** WebSocket Upgrade 握手超时(毫秒)。云上常见 NAT/中间盒吞包场景下兜底用。 */\nconst HANDSHAKE_TIMEOUT_MS = 15_000;\n/** 兜底 watchdog:如果握手超时也没触发,强制 terminate 进入重连路径。 */\nconst CONNECT_WATCHDOG_MS = 20_000;\n/** 断线期间发送会非常密集,限频避免把真正的断线原因刷掉。 */\nconst SEND_SKIPPED_LOG_INTERVAL_MS = 30_000;\n\n/** 持久化到磁盘的隧道连接状态 */\nexport interface TunnelStatusInfo {\n /** 当前连接状态 */\n state: \"connected\" | \"disconnected\" | \"connecting\" | \"stopped\";\n /** 状态变更时间 ISO */\n since: string;\n /** 累计重连次数 */\n reconnectAttempt: number;\n /** 上次断开原因(仅 disconnected 时有值) */\n lastDisconnectReason?: string;\n}\n\nexport interface RelayClientOptions {\n tunnelUrl: string;\n /** 每次连接时获取连接凭据(query/headers);支持 token 刷新。 */\n credentialProvider: CredentialProvider;\n heartbeatSec: number;\n reconnectBackoffMs: number;\n /** 状态文件路径,设置后会在连接状态变更时写入 */\n statusFilePath?: string;\n logger: {\n info: (msg: string) => void;\n warn: (msg: string) => void;\n error: (msg: string) => void;\n };\n}\n\nexport type InboundHandler = (frame: InboundFrame) => void | Promise<void>;\nexport type ConnectedHandler = () => void | Promise<void>;\nexport type DisconnectedHandler = (reason: string) => void | Promise<void>;\n\n/**\n * Relay WebSocket 客户端。\n * 负责建连、token 认证、心跳保活、断线指数退避重连。\n */\nexport class RelayClient {\n private ws: WebSocket | null = null;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private reconnectAttempt = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private handlers: InboundHandler[] = [];\n private connectedHandlers: ConnectedHandler[] = [];\n private disconnectedHandlers: DisconnectedHandler[] = [];\n private aborted = false;\n private lastInboundAt = 0;\n private stopPromise: Promise<void> | null = null;\n private skippedSendLogLastAt: number | null = null;\n private skippedSendLogSuppressed = 0;\n\n constructor(private readonly opts: RelayClientOptions) {}\n\n /** 写连接状态到磁盘 */\n private writeStatus(\n state: TunnelStatusInfo[\"state\"],\n lastDisconnectReason?: string,\n ): void {\n if (!this.opts.statusFilePath) return;\n const info: TunnelStatusInfo = {\n state,\n since: new Date().toISOString(),\n reconnectAttempt: this.reconnectAttempt,\n lastDisconnectReason,\n };\n try {\n mkdirSync(dirname(this.opts.statusFilePath), { recursive: true });\n writeFileSync(this.opts.statusFilePath, JSON.stringify(info, null, 2));\n } catch {\n // 写状态文件失败不影响主流程\n }\n }\n\n /** 注册入站帧处理函数 */\n onInbound(handler: InboundHandler): void {\n this.handlers.push(handler);\n }\n\n /** 注册连接成功后的回调 */\n onConnected(handler: ConnectedHandler): void {\n this.connectedHandlers.push(handler);\n }\n\n /** 注册 Relay 连接断开后的回调 */\n onDisconnected(handler: DisconnectedHandler): void {\n this.disconnectedHandlers.push(handler);\n }\n\n /** 当前是否已连上 Relay */\n isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n /** 优雅停止客户端,优先发送 close 帧,超时后再强制 terminate */\n async stop(reason = \"client stopping\"): Promise<void> {\n if (this.stopPromise) {\n return this.stopPromise;\n }\n\n this.aborted = true;\n this.writeStatus(\"stopped\");\n this.stopHeartbeat();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n const ws = this.ws;\n this.ws = null;\n if (!ws) {\n return;\n }\n\n this.opts.logger.info(\n `Relay tunnel: stopping client (readyState=${ws.readyState}, reason=${reason})`,\n );\n\n if (\n ws.readyState === WebSocket.CLOSED ||\n ws.readyState === WebSocket.CLOSING\n ) {\n return;\n }\n\n if (ws.readyState !== WebSocket.OPEN) {\n try {\n ws.terminate();\n } catch {\n // ignore\n }\n return;\n }\n\n this.stopPromise = new Promise<void>((resolve) => {\n let finished = false;\n let fallbackTimer: ReturnType<typeof setTimeout> | null = null;\n\n const finish = () => {\n if (finished) return;\n finished = true;\n if (fallbackTimer) {\n clearTimeout(fallbackTimer);\n fallbackTimer = null;\n }\n ws.off(\"close\", handleClose);\n ws.off(\"error\", handleError);\n this.stopPromise = null;\n resolve();\n };\n\n const handleClose = () => finish();\n const handleError = () => finish();\n\n ws.once(\"close\", handleClose);\n ws.once(\"error\", handleError);\n\n fallbackTimer = setTimeout(() => {\n this.opts.logger.warn(\n \"Relay tunnel: graceful close timed out, forcing terminate\",\n );\n try {\n ws.terminate();\n } catch {\n // ignore\n }\n finish();\n }, 1500);\n\n try {\n ws.close(1000, reason);\n } catch {\n finish();\n }\n });\n\n await this.stopPromise;\n }\n\n /** 发送出站帧 */\n send(frame: OutboundFrame): void {\n const ws = this.ws;\n if (ws?.readyState === WebSocket.OPEN) {\n const payload = JSON.stringify(frame);\n this.opts.logger.info(\n `Relay tunnel: ▶ send frame type=${frame.type}, id=${\"id\" in frame ? frame.id : \"N/A\"} (${payload.length} chars)`,\n );\n try {\n ws.send(payload);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.opts.logger.warn(\n `Relay tunnel: send failed, forcing reconnect: ${message}`,\n );\n this.forceReconnectFromSocket(ws, `send-failed: ${message}`);\n }\n } else {\n this.logSendSkipped(\"send\", `frame type=${frame.type}`);\n }\n }\n\n /** 原样透传文本到 Relay(用于 Gateway WS 响应直接回传) */\n sendRaw(text: string): void {\n const ws = this.ws;\n if (ws?.readyState === WebSocket.OPEN) {\n this.opts.logger.info(\n `Relay tunnel: ▶ sendRaw (${text.length} chars): ${text.length <= 500 ? text : text.substring(0, 500) + \"…\"}`,\n );\n try {\n ws.send(text);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.opts.logger.warn(\n `Relay tunnel: sendRaw failed, forcing reconnect: ${message}`,\n );\n this.forceReconnectFromSocket(ws, `sendRaw-failed: ${message}`);\n }\n } else {\n this.logSendSkipped(\"sendRaw\");\n }\n }\n\n /** 启动连接,带自动重连,直到 abortSignal 触发 */\n async connectWithAutoReconnect(abortSignal?: AbortSignal): Promise<void> {\n if (abortSignal) {\n abortSignal.addEventListener(\n \"abort\",\n () => {\n void this.stop();\n },\n { once: true },\n );\n }\n\n await this.connect();\n\n // 保持运行直到 abort\n return new Promise<void>((resolve) => {\n if (abortSignal) {\n abortSignal.addEventListener(\"abort\", () => resolve(), { once: true });\n }\n });\n }\n\n private async connect(): Promise<void> {\n if (this.aborted) return;\n\n // 确保旧连接和定时器都被清理,防止重复连接\n this.cleanup(true);\n\n let credential: AuthCredential;\n try {\n credential = await this.opts.credentialProvider();\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.opts.logger.warn(\n `Relay tunnel: failed to resolve credential, scheduling reconnect: ${message}`,\n );\n this.writeStatus(\"disconnected\", `credential-error: ${message}`);\n this.scheduleReconnect();\n return;\n }\n\n this.opts.logger.info(\n `Relay tunnel: connecting to ${redactUrlSecrets(this.opts.tunnelUrl)} (attempt=${this.reconnectAttempt}, heartbeat=${this.opts.heartbeatSec}s, apiKey=${maskSecret(maskableSecret(credential))})`,\n );\n this.writeStatus(\"connecting\");\n\n return new Promise<void>((resolve) => {\n let settled = false;\n const settle = () => {\n if (!settled) {\n settled = true;\n resolve();\n }\n };\n\n const wsUrl = new URL(this.opts.tunnelUrl);\n // 凭据中的 query 参数(如 apiKey)拼到连接 URL;已显式带上的不覆盖。\n for (const [key, value] of Object.entries(credential.query ?? {})) {\n if (!wsUrl.searchParams.get(key)) {\n wsUrl.searchParams.set(key, value);\n }\n }\n\n const loggableUrl = new URL(wsUrl.toString());\n const apiKey = loggableUrl.searchParams.get(\"apiKey\");\n if (apiKey) {\n loggableUrl.searchParams.set(\n \"apiKey\",\n apiKey.length > 8 ? `${apiKey.substring(0, 8)}…` : \"…\",\n );\n }\n this.opts.logger.info(\n `Relay tunnel: connecting to ${loggableUrl.toString()} (attempt=${this.reconnectAttempt + 1})`,\n );\n\n const ws = new WebSocket(wsUrl.toString(), {\n headers: credential.headers ?? {},\n // 防止 TCP 通但 HTTP Upgrade 响应被吞导致永久挂在 CONNECTING\n handshakeTimeout: HANDSHAKE_TIMEOUT_MS,\n });\n // 将握手中的 socket 也记为当前连接,确保首连失败/握手前断开也能触发重连。\n this.ws = ws;\n\n // 兜底 watchdog:即使 handshakeTimeout 因某些原因失效,也强制 terminate 走重连路径。\n let connectWatchdog: ReturnType<typeof setTimeout> | null = setTimeout(\n () => {\n connectWatchdog = null;\n if (this.ws !== ws || ws.readyState === WebSocket.OPEN) {\n return;\n }\n this.opts.logger.warn(\n `Relay tunnel: connect watchdog fired (readyState=${ws.readyState}, attempt=${this.reconnectAttempt}), forcing reconnect`,\n );\n this.forceReconnectFromSocket(ws, \"connect-watchdog-timeout\");\n settle();\n },\n CONNECT_WATCHDOG_MS,\n );\n\n const clearConnectWatchdog = () => {\n if (connectWatchdog) {\n clearTimeout(connectWatchdog);\n connectWatchdog = null;\n }\n };\n\n ws.on(\"open\", () => {\n clearConnectWatchdog();\n if (this.aborted || this.ws !== ws) {\n this.opts.logger.warn(\n `Relay tunnel: open fired but aborted=${this.aborted}, stale=${this.ws !== ws}, closing`,\n );\n try {\n ws.terminate();\n } catch {\n // ignore\n }\n settle();\n return;\n }\n this.reconnectAttempt = 0;\n this.lastInboundAt = Date.now();\n this.startHeartbeat();\n this.opts.logger.info(\"Relay tunnel: ✔ connected, heartbeat started\");\n this.writeStatus(\"connected\");\n this.emitConnected();\n settle();\n });\n\n ws.on(\"pong\", () => {\n if (this.ws === ws) {\n this.opts.logger.info(\"Relay tunnel: ← pong received\");\n this.markInboundActivity();\n }\n });\n\n ws.on(\"message\", (data: WebSocket.RawData) => {\n if (this.ws !== ws) {\n return;\n }\n this.handleMessage(data);\n });\n\n ws.on(\"close\", (code: number, reason: Buffer) => {\n clearConnectWatchdog();\n const reasonStr = reason.toString();\n const lastInboundAgoMs = this.lastInboundAt\n ? Date.now() - this.lastInboundAt\n : null;\n const isCurrentSocket = this.ws === ws;\n const logMessage =\n `Relay tunnel: disconnected (code=${code}, reason=${previewText(reasonStr, 200)}, lastInboundAgoMs=${lastInboundAgoMs ?? \"N/A\"}, reconnectAttempt=${this.reconnectAttempt})`;\n if (this.aborted || !isCurrentSocket) {\n this.opts.logger.info(logMessage);\n } else {\n this.opts.logger.warn(logMessage);\n }\n if (isCurrentSocket) {\n this.stopHeartbeat();\n this.ws = null;\n const disconnectReason = `code=${code}, reason=${reasonStr}`;\n this.writeStatus(\"disconnected\", disconnectReason);\n this.emitDisconnected(disconnectReason);\n this.scheduleReconnect();\n }\n settle();\n });\n\n ws.on(\"error\", (err: Error) => {\n clearConnectWatchdog();\n const message = formatWebSocketError(err);\n this.opts.logger.error(\n `Relay tunnel: WebSocket error: ${message} (readyState=${ws.readyState}, reconnectAttempt=${this.reconnectAttempt}, url=${redactUrlSecrets(wsUrl.toString())})`,\n );\n // 多数情况 error 后 ws 会再触发 close;但部分底层错误只 error 不 close,\n // 这里幂等地兜底一次 scheduleReconnect,scheduleReconnect 内部对已排程的重连会跳过。\n if (this.ws === ws) {\n this.forceReconnectFromSocket(ws, `error: ${message}`);\n }\n settle();\n });\n });\n }\n\n private emitConnected(): void {\n for (const handler of this.connectedHandlers) {\n Promise.resolve(handler()).catch((err) => {\n this.opts.logger.warn(\n `Relay tunnel: onConnected handler failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n });\n }\n }\n\n private emitDisconnected(reason: string): void {\n for (const handler of this.disconnectedHandlers) {\n Promise.resolve(handler(reason)).catch((err) => {\n this.opts.logger.warn(\n `Relay tunnel: onDisconnected handler failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n });\n }\n }\n\n private handleMessage(data: WebSocket.RawData): void {\n const text =\n typeof data === \"string\"\n ? data\n : Buffer.isBuffer(data)\n ? data.toString()\n : String(data);\n\n this.markInboundActivity();\n\n // 应用层心跳 pong 直接消费,不走帧解析\n if (text === \"pong\") {\n return;\n }\n\n this.opts.logger.info(\n `Relay tunnel: ★ received message (${text.length} chars): ${previewText(text)}`,\n );\n\n let frame: InboundFrame;\n try {\n frame = JSON.parse(text) as InboundFrame;\n } catch {\n this.opts.logger.warn(\n `Relay tunnel: received invalid frame, ignoring (preview=${previewText(text, 200)})`,\n );\n return;\n }\n\n this.opts.logger.info(`Relay tunnel: parsed frame type=${frame.type}, id=${\"id\" in frame ? frame.id : \"N/A\"}`);\n\n for (const handler of this.handlers) {\n try {\n const result = handler(frame);\n if (result instanceof Promise) {\n result.catch((err) => {\n this.opts.logger.error(`Relay tunnel: handler error: ${err}`);\n });\n }\n } catch (err) {\n this.opts.logger.error(`Relay tunnel: handler error: ${err}`);\n }\n }\n }\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n const intervalMs = this.opts.heartbeatSec * 1000;\n this.sendHeartbeat();\n this.heartbeatTimer = setInterval(() => {\n this.sendHeartbeat();\n }, intervalMs);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n private getHeartbeatTimeoutMs(): number {\n return this.opts.heartbeatSec * 3 * 1000;\n }\n\n private sendHeartbeat(): void {\n const ws = this.ws;\n if (ws?.readyState !== WebSocket.OPEN) {\n return;\n }\n\n const idleMs = Date.now() - this.lastInboundAt;\n const timeoutMs = this.getHeartbeatTimeoutMs();\n if (idleMs >= timeoutMs) {\n this.opts.logger.warn(\n `Relay tunnel: heartbeat timeout, no inbound activity for ${idleMs}ms (threshold=${timeoutMs}ms)`,\n );\n this.forceReconnectFromSocket(ws, `heartbeat-timeout idleMs=${idleMs}`);\n return;\n }\n\n this.opts.logger.info('Relay tunnel: → heartbeat \"ping\"');\n try {\n ws.send(\"ping\");\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.opts.logger.warn(\n `Relay tunnel: heartbeat text ping failed, forcing reconnect: ${message}`,\n );\n this.forceReconnectFromSocket(ws, `heartbeat-send-failed: ${message}`);\n return;\n }\n try {\n ws.ping();\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.opts.logger.warn(\n `Relay tunnel: heartbeat control ping failed, forcing reconnect: ${message}`,\n );\n this.forceReconnectFromSocket(ws, `heartbeat-ping-failed: ${message}`);\n }\n }\n\n private markInboundActivity(): void {\n this.lastInboundAt = Date.now();\n }\n\n private cleanup(force = false): void {\n this.opts.logger.info(\n `Relay tunnel: cleanup (ws=${this.ws ? \"open\" : \"null\"}, heartbeat=${!!this.heartbeatTimer}, reconnect=${!!this.reconnectTimer})`,\n );\n this.stopHeartbeat();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n if (this.ws) {\n try {\n if (force) {\n this.ws.terminate();\n } else {\n this.ws.close();\n }\n } catch {\n // ignore\n }\n this.ws = null;\n }\n }\n\n private forceReconnectFromSocket(ws: WebSocket, reason: string): void {\n if (this.aborted || this.ws !== ws) return;\n\n this.stopHeartbeat();\n this.ws = null;\n this.writeStatus(\"disconnected\", reason);\n this.emitDisconnected(reason);\n this.scheduleReconnect();\n\n try {\n if (ws.readyState !== WebSocket.CLOSED) {\n ws.terminate();\n }\n } catch {\n // ignore\n }\n }\n\n private logSendSkipped(kind: \"send\" | \"sendRaw\", detail?: string): void {\n const now = Date.now();\n const shouldLog =\n this.skippedSendLogLastAt === null ||\n now - this.skippedSendLogLastAt >= SEND_SKIPPED_LOG_INTERVAL_MS;\n\n if (!shouldLog) {\n this.skippedSendLogSuppressed++;\n return;\n }\n\n const suppressedSuffix =\n this.skippedSendLogSuppressed > 0\n ? `, suppressed=${this.skippedSendLogSuppressed}`\n : \"\";\n const detailSuffix = detail ? `, ${detail}` : \"\";\n this.opts.logger.warn(\n `Relay tunnel: ▶ ${kind} skipped, ws not open (readyState=${this.ws?.readyState ?? \"null\"}${detailSuffix}${suppressedSuffix})`,\n );\n this.skippedSendLogLastAt = now;\n this.skippedSendLogSuppressed = 0;\n }\n\n private scheduleReconnect(): void {\n if (this.aborted) return;\n\n // 已经排了一次重连就不再重排,避免 error+close 双触发或 watchdog 与 close 双触发时\n // attempt 被多扣、退避被无意义重置。\n if (this.reconnectTimer) {\n return;\n }\n\n const baseMs = this.opts.reconnectBackoffMs;\n const delayMs = Math.min(\n baseMs * Math.pow(2, this.reconnectAttempt),\n 60_000,\n );\n this.reconnectAttempt++;\n\n this.opts.logger.info(\n `Relay tunnel: reconnecting in ${delayMs}ms (attempt ${this.reconnectAttempt})`,\n );\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n if (!this.aborted) {\n this.connect().catch((err) => {\n this.opts.logger.error(`Relay tunnel: reconnect failed: ${err}`);\n });\n }\n }, delayMs);\n }\n}\n",
100
102
  "import createWebSocketStream from './lib/stream.js';\nimport extension from './lib/extension.js';\nimport PerMessageDeflate from './lib/permessage-deflate.js';\nimport Receiver from './lib/receiver.js';\nimport Sender from './lib/sender.js';\nimport subprotocol from './lib/subprotocol.js';\nimport WebSocket from './lib/websocket.js';\nimport WebSocketServer from './lib/websocket-server.js';\n\nexport {\n createWebSocketStream,\n extension,\n PerMessageDeflate,\n Receiver,\n Sender,\n subprotocol,\n WebSocket,\n WebSocketServer\n};\n\nexport default WebSocket;\n",
101
103
  "export function previewText(text: string | undefined, max = 200): string {\n if (!text) return \"\";\n return text.length <= max ? text : `${text.substring(0, max)}…`;\n}\n\nexport function maskSecret(value: string | undefined): string {\n if (!value) return \"empty\";\n if (value.length <= 8) {\n return `${value.slice(0, 2)}...${value.slice(-2)}`;\n }\n return `${value.slice(0, 4)}...${value.slice(-4)}`;\n}\n\nexport function redactUrlSecrets(rawUrl: string): string {\n try {\n const url = new URL(rawUrl);\n for (const key of [\"apiKey\", \"token\", \"access_token\"]) {\n const value = url.searchParams.get(key);\n if (value) {\n url.searchParams.set(key, maskSecret(value));\n }\n }\n return url.toString();\n } catch {\n return rawUrl.replace(\n /([?&](?:apiKey|token|access_token)=)([^&]+)/gi,\n (_match, prefix: string, value: string) => {\n let decoded = value;\n try {\n decoded = decodeURIComponent(value);\n } catch {\n // Keep the original value when the URL is malformed.\n }\n return `${prefix}${maskSecret(decoded)}`;\n },\n );\n }\n}\n\nexport function findHeaderValue(\n headers: Record<string, string> | undefined,\n key: string,\n): string | undefined {\n if (!headers) return undefined;\n const lowerKey = key.toLowerCase();\n for (const [headerKey, headerValue] of Object.entries(headers)) {\n if (headerKey.toLowerCase() === lowerKey) {\n return headerValue;\n }\n }\n return undefined;\n}\n\nexport function summarizeRequestHeaders(headers: Record<string, string> | undefined): string {\n const contentType = findHeaderValue(headers, \"content-type\");\n const requestId = findHeaderValue(headers, \"x-request-id\");\n const parts: string[] = [];\n if (contentType) {\n parts.push(`contentType=${contentType}`);\n }\n if (requestId) {\n parts.push(`xRequestId=${previewText(requestId, 120)}`);\n }\n return parts.length ? `, ${parts.join(\", \")}` : \"\";\n}\n",
102
- "import { randomUUID } from \"node:crypto\";\nimport WebSocket from \"ws\";\nimport { importHostSdkModule } from \"../host-sdk.js\";\nimport type { RelayClient } from \"./relay-client.js\";\nimport type { ReqFrame, InboundFrame, RequestFrame } from \"./types.js\";\nimport { previewText } from \"./utils.js\";\nimport { resolveHostStateDir } from \"../host.js\";\nimport {\n type DeviceIdentity,\n resolveClientStateDir,\n loadOrCreateDeviceIdentity,\n loadDeviceAuthToken,\n storeDeviceAuthToken,\n clearDeviceAuthToken,\n buildDeviceAuthPayload,\n signDevicePayload,\n publicKeyRawBase64UrlFromPem,\n} from \"./device-identity.js\";\nimport { handleHttpRequest } from \"./http-proxy.js\";\nimport { WsProxy } from \"./ws-proxy.js\";\n\n// ─── Types ───\n\nexport const RELAY_TUNNEL_GATEWAY_CLIENT_INSTANCE_ID =\n \"phone-notifications-relay-tunnel\";\n\nconst GATEWAY_OPERATOR_SCOPES = [\n \"operator.admin\",\n \"operator.approvals\",\n \"operator.pairing\",\n \"operator.read\",\n \"operator.write\",\n] as const;\n\n// openclaw 2026.5.12 起本地 gateway RPC 要求 protocol >= 4;保留 3 以兼容老网关。\nconst GATEWAY_RPC_MIN_PROTOCOL = 3;\nconst GATEWAY_RPC_MAX_PROTOCOL = 4;\n\ninterface ProxyOptions {\n stateDir?: string;\n hostStateDir?: string;\n gatewayBaseUrl: string;\n /** Gateway 鉴权模式 */\n gatewayAuthMode?: \"token\" | \"password\";\n /** Gateway 鉴权 token,代理请求到本地 gateway 时使用 */\n gatewayToken?: string;\n /** Gateway 鉴权密码,代理请求到本地 gateway 时使用 */\n gatewayPassword?: string;\n client: RelayClient;\n logger: {\n info: (msg: string) => void;\n warn: (msg: string) => void;\n error: (msg: string) => void;\n };\n}\n\nconst MAX_AUTO_PAIRING_APPROVALS = 3;\nconst RECENT_ABORTED_CHAT_RUN_TTL_MS = 60_000;\nconst GATEWAY_RPC_HANDSHAKE_TIMEOUT_MS = 10_000;\nconst MAX_GATEWAY_WS_PENDING = 200;\n\ninterface PendingGatewayReqMeta {\n method: string;\n sessionKey?: string;\n}\n\ninterface PendingGatewayPayload {\n payload: string;\n reqId?: string;\n}\n\ninterface RecentAbortedChatRun {\n sessionKey: string;\n abortedAtMs: number;\n}\n\ntype ApproveDevicePairingFn = (\n requestId: string,\n hostStateDir?: string,\n) => Promise<unknown>;\n\nlet approveDevicePairingPromise: Promise<ApproveDevicePairingFn | null> | null =\n null;\nlet approveDevicePairingWarned = false;\ntype DeviceBootstrap = typeof import(\"openclaw/plugin-sdk/device-bootstrap\");\n\nfunction formatErrorMessage(err: unknown): string {\n if (err instanceof Error && err.message) return err.message;\n return String(err);\n}\n\nasync function loadApproveDevicePairing(\n logger: ProxyOptions[\"logger\"],\n): Promise<ApproveDevicePairingFn | null> {\n if (!approveDevicePairingPromise) {\n approveDevicePairingPromise = importHostSdkModule<DeviceBootstrap>(\n \"openclaw/plugin-sdk/device-bootstrap\",\n )\n .then((mod) =>\n typeof mod.approveDevicePairing === \"function\"\n ? (mod.approveDevicePairing as ApproveDevicePairingFn)\n : null,\n )\n .catch((err: unknown) => {\n if (!approveDevicePairingWarned) {\n approveDevicePairingWarned = true;\n logger.warn(\n `TunnelProxy: local gateway auto-pairing disabled because current OpenClaw runtime does not expose device bootstrap SDK (${formatErrorMessage(err)})`,\n );\n }\n return null;\n });\n }\n\n const approveDevicePairing = await approveDevicePairingPromise;\n if (!approveDevicePairing && !approveDevicePairingWarned) {\n approveDevicePairingWarned = true;\n logger.warn(\n \"TunnelProxy: local gateway auto-pairing disabled because current OpenClaw runtime does not expose device bootstrap SDK\",\n );\n }\n return approveDevicePairing;\n}\n\n/**\n * 透明代理:接收 Relay 转发的请求帧,代理到本地 gateway,回传响应帧。\n * 支持 HTTP 请求代理和 WebSocket 连接代理。\n */\nexport class TunnelProxy {\n /** 到本地 Gateway 的持久 RPC WebSocket 连接 */\n private gatewayWs: WebSocket | null = null;\n private gatewayWsConnecting = false;\n /** 握手是否已完成(收到 hello-ok) */\n private gatewayWsReady = false;\n /** 收到本地自动配对成功后,在 close 回调里触发重连 */\n private gatewayWsReconnectRequested = false;\n /** 本地自动配对审批进行中,期间 Gateway 关闭连接时先保留 pending 请求。 */\n private gatewayWsPairingApprovalPending = false;\n /** 防止配对失败时无限重连 */\n private gatewayWsAutoPairingApprovals = 0;\n /** 等待 Gateway WS 握手完成后发送的帧队列 */\n private gatewayWsPending: PendingGatewayPayload[] = [];\n /** 记录已转发到 Gateway 的 req 元信息,便于回包时做定向处理。 */\n private gatewayReqMetaById = new Map<string, PendingGatewayReqMeta>();\n /** 最近由用户手动中断的 chat.run,用于过滤 runtime 误补发的 synthetic failure。 */\n private recentAbortedChatRuns = new Map<string, RecentAbortedChatRun>();\n /** Relay 断开或服务停止时要中断的 HTTP 代理请求。 */\n private httpAbortControllers = new Map<string, AbortController>();\n\n /** 设备身份,用于 Gateway connect 握手 */\n private deviceIdentity: DeviceIdentity;\n\n private readonly stateDir: string;\n private readonly hostStateDir: string;\n private readonly wsProxy: WsProxy;\n\n constructor(private readonly opts: ProxyOptions) {\n this.stateDir = resolveClientStateDir(opts.stateDir);\n this.hostStateDir = opts.hostStateDir ?? resolveHostStateDir();\n this.deviceIdentity = loadOrCreateDeviceIdentity(this.stateDir);\n opts.logger.info(\n `TunnelProxy: loaded device identity (deviceId=${this.deviceIdentity.deviceId})`,\n );\n this.wsProxy = new WsProxy({\n gatewayBaseUrl: opts.gatewayBaseUrl,\n client: opts.client,\n logger: opts.logger,\n });\n }\n\n // ─── Frame dispatcher ───\n\n /** 处理从 Relay 收到的入站帧 */\n async handleFrame(frame: InboundFrame): Promise<void> {\n this.opts.logger.info(\n `TunnelProxy: handling frame type=${frame.type}, id=${\"id\" in frame ? frame.id : \"N/A\"}`,\n );\n switch (frame.type) {\n case \"request\":\n await this.handleRequestFrame(frame);\n break;\n case \"req\":\n this.handleReqFrame(frame);\n break;\n case \"ws_open\":\n this.wsProxy.handleWsOpen(frame);\n break;\n case \"ws_data\":\n this.wsProxy.handleWsData(frame);\n break;\n case \"ws_close\":\n this.wsProxy.handleWsClose(frame);\n break;\n default:\n this.opts.logger.warn(\n `TunnelProxy: unknown frame type=\"${(frame as any).type}\", id=${\"id\" in frame ? (frame as any).id : \"N/A\"}, forwarding raw to gateway`,\n );\n // 未知帧类型也尝试通过 RPC WS 转发,避免静默丢弃\n this.forwardRawToGateway(JSON.stringify(frame));\n break;\n }\n }\n\n /** 清理所有代理的 WebSocket 连接 */\n cleanup(): void {\n this.opts.logger.info(\n `TunnelProxy: cleanup, closing ${this.wsProxy.activeCount} active WS connections, gatewayWs=${!!this.gatewayWs}`,\n );\n this.wsProxy.cleanup();\n for (const [id, controller] of this.httpAbortControllers) {\n this.opts.logger.info(`TunnelProxy: aborting HTTP proxy id=${id}`);\n controller.abort();\n }\n this.httpAbortControllers.clear();\n\n const gatewayWs = this.gatewayWs;\n this.gatewayWs = null;\n this.gatewayWsReady = false;\n this.gatewayWsConnecting = false;\n this.gatewayWsReconnectRequested = false;\n this.gatewayWsPairingApprovalPending = false;\n this.gatewayWsAutoPairingApprovals = 0;\n this.gatewayWsPending = [];\n this.gatewayReqMetaById.clear();\n this.recentAbortedChatRuns.clear();\n if (gatewayWs) {\n try {\n gatewayWs.close();\n } catch {\n // ignore\n }\n }\n }\n\n // ─── Gateway RPC WebSocket ───\n\n private async handleRequestFrame(frame: RequestFrame): Promise<void> {\n const controller = new AbortController();\n this.httpAbortControllers.set(frame.id, controller);\n try {\n await handleHttpRequest(\n {\n ...this.opts,\n abortSignal: controller.signal,\n },\n frame,\n );\n } finally {\n this.httpAbortControllers.delete(frame.id);\n }\n }\n\n private pushGatewayPending(\n entry: PendingGatewayPayload,\n reason: string,\n ): boolean {\n if (this.gatewayWsPending.length >= MAX_GATEWAY_WS_PENDING) {\n this.opts.logger.error(\n `TunnelProxy: gateway WS pending queue overflow (${this.gatewayWsPending.length}/${MAX_GATEWAY_WS_PENDING}); failing ${entry.reqId ? `req id=${entry.reqId}` : \"raw frame\"}`,\n );\n this.failGatewayPendingEntry(\n entry,\n \"GATEWAY_RPC_QUEUE_FULL\",\n \"local gateway RPC queue is full\",\n );\n return false;\n }\n\n this.gatewayWsPending.push(entry);\n this.opts.logger.info(\n `TunnelProxy: gateway WS pending queue size=${this.gatewayWsPending.length} (${reason})`,\n );\n return true;\n }\n\n /** 将未知帧原样转发到 Gateway WS */\n private forwardRawToGateway(payload: string): void {\n if (this.gatewayWsReady && this.gatewayWs?.readyState === WebSocket.OPEN) {\n this.sendGatewayPayload(this.gatewayWs, { payload }, \"raw frame\");\n } else {\n if (\n this.pushGatewayPending(\n { payload },\n \"raw frame queued before gateway WS ready\",\n )\n ) {\n this.ensureGatewayWs();\n }\n }\n }\n\n /** 处理 Relay 转发的 Gateway RPC 请求帧,原样通过 WebSocket 发给本地 Gateway */\n private handleReqFrame(frame: ReqFrame): void {\n const payload = JSON.stringify(frame);\n this.gatewayReqMetaById.set(frame.id, {\n method: frame.method,\n sessionKey: this.normalizeSessionKey(frame.params?.sessionKey),\n });\n this.opts.logger.info(\n `TunnelProxy: req id=${frame.id} method=${frame.method} → gateway WS (${payload.length} chars)`,\n );\n\n if (this.gatewayWsReady && this.gatewayWs?.readyState === WebSocket.OPEN) {\n this.sendGatewayPayload(\n this.gatewayWs,\n { payload, reqId: frame.id },\n `req id=${frame.id}`,\n );\n } else {\n this.opts.logger.info(\n `TunnelProxy: req id=${frame.id} queued, gateway WS not ready yet`,\n );\n if (\n this.pushGatewayPending(\n { payload, reqId: frame.id },\n `req id=${frame.id} queued before gateway WS handshake`,\n )\n ) {\n this.ensureGatewayWs();\n }\n }\n }\n\n private sendGatewayRpcError(\n id: string,\n code: string,\n message: string,\n ): void {\n this.gatewayReqMetaById.delete(id);\n this.opts.client.sendRaw(\n JSON.stringify({\n type: \"res\",\n id,\n ok: false,\n error: {\n code,\n message,\n },\n }),\n );\n }\n\n private failGatewayPendingEntry(\n entry: PendingGatewayPayload,\n code: string,\n message: string,\n ): void {\n if (!entry.reqId) return;\n this.sendGatewayRpcError(entry.reqId, code, message);\n }\n\n private failGatewayPending(code: string, message: string): void {\n if (this.gatewayWsPending.length === 0) return;\n const pending = this.gatewayWsPending;\n this.gatewayWsPending = [];\n this.opts.logger.warn(\n `TunnelProxy: failing ${pending.length} pending gateway RPC frame(s): ${message}`,\n );\n for (const entry of pending) {\n this.failGatewayPendingEntry(entry, code, message);\n }\n }\n\n private failGatewayInflight(code: string, message: string): void {\n if (this.gatewayReqMetaById.size === 0) return;\n const ids = [...this.gatewayReqMetaById.keys()];\n this.opts.logger.warn(\n `TunnelProxy: failing ${ids.length} in-flight gateway RPC request(s): ${message}`,\n );\n for (const id of ids) {\n this.sendGatewayRpcError(id, code, message);\n }\n }\n\n private failAllGatewayRequests(code: string, message: string): void {\n this.failGatewayPending(code, message);\n this.failGatewayInflight(code, message);\n }\n\n private sendGatewayPayload(\n ws: WebSocket,\n entry: PendingGatewayPayload,\n context: string,\n ): boolean {\n try {\n ws.send(entry.payload);\n return true;\n } catch (err) {\n const message = formatErrorMessage(err);\n this.opts.logger.warn(\n `TunnelProxy: RPC WS send failed for ${context}: ${message}`,\n );\n this.failGatewayPendingEntry(\n entry,\n \"GATEWAY_RPC_SEND_FAILED\",\n `local gateway RPC send failed: ${message}`,\n );\n this.failGatewayInflight(\n \"GATEWAY_RPC_SEND_FAILED\",\n \"local gateway RPC connection closed after send failure\",\n );\n if (this.gatewayWs === ws) {\n this.gatewayWs = null;\n this.gatewayWsReady = false;\n this.gatewayWsConnecting = false;\n }\n try {\n if (typeof (ws as any).terminate === \"function\") {\n (ws as any).terminate();\n } else {\n ws.close();\n }\n } catch {\n // ignore\n }\n return false;\n }\n }\n\n // ─── Gateway connect auth helpers ───\n\n private resolveGatewayConnectAuth():\n | { token?: string; password?: string }\n | undefined {\n const token = this.opts.gatewayToken?.trim() || undefined;\n const password = this.opts.gatewayPassword?.trim() || undefined;\n if (!token && !password) return undefined;\n return { token, password };\n }\n\n private loadStoredDeviceToken(role: string): string | undefined {\n return (\n loadDeviceAuthToken({\n stateDir: this.stateDir,\n deviceId: this.deviceIdentity.deviceId,\n role,\n })?.token ?? undefined\n );\n }\n\n private buildGatewayConnectAuth(role: string): {\n auth?: { token?: string; deviceToken?: string; password?: string };\n authToken?: string;\n authPassword?: string;\n deviceToken?: string;\n } {\n const explicitAuth = this.resolveGatewayConnectAuth();\n const authPassword = explicitAuth?.password?.trim() || undefined;\n const explicitGatewayToken = explicitAuth?.token?.trim() || undefined;\n const deviceToken = explicitGatewayToken\n ? undefined\n : this.loadStoredDeviceToken(role);\n const authToken = explicitGatewayToken ?? deviceToken;\n const auth =\n authToken || authPassword || deviceToken\n ? { token: authToken, deviceToken, password: authPassword }\n : undefined;\n return { auth, authToken, authPassword, deviceToken };\n }\n\n private storeIssuedDeviceToken(params: {\n fallbackRole: string;\n fallbackScopes: string[];\n authInfo: any;\n }): void {\n const token = params.authInfo?.deviceToken;\n if (typeof token !== \"string\" || !token.trim()) return;\n const role =\n typeof params.authInfo?.role === \"string\" && params.authInfo.role.trim()\n ? params.authInfo.role.trim()\n : params.fallbackRole;\n const scopes = Array.isArray(params.authInfo?.scopes)\n ? params.authInfo.scopes.filter(\n (scope: unknown): scope is string =>\n typeof scope === \"string\" && !!scope.trim(),\n )\n : params.fallbackScopes;\n storeDeviceAuthToken({\n stateDir: this.stateDir,\n deviceId: this.deviceIdentity.deviceId,\n role,\n token: token.trim(),\n scopes,\n });\n }\n\n private maybeClearStoredDeviceTokenOnMismatch(code: number, reason: string): void {\n const explicitAuth = this.resolveGatewayConnectAuth();\n if (explicitAuth?.token || explicitAuth?.password) return;\n if (code !== 1008 || !reason.toLowerCase().includes(\"device token mismatch\")) return;\n clearDeviceAuthToken({\n stateDir: this.stateDir,\n deviceId: this.deviceIdentity.deviceId,\n role: \"operator\",\n });\n this.opts.logger.warn(\n `TunnelProxy: cleared stale stored device token after gateway mismatch (deviceId=${this.deviceIdentity.deviceId})`,\n );\n }\n\n private async maybeAutoApproveGatewayPairing(frame: any): Promise<boolean> {\n const errorCode =\n typeof frame?.error?.code === \"string\" ? frame.error.code : undefined;\n const detailsCode =\n typeof frame?.error?.details?.code === \"string\"\n ? frame.error.details.code\n : undefined;\n if (errorCode !== \"NOT_PAIRED\" && detailsCode !== \"PAIRING_REQUIRED\") {\n return false;\n }\n\n const requestId =\n typeof frame?.error?.details?.requestId === \"string\"\n ? frame.error.details.requestId.trim()\n : \"\";\n const reason =\n typeof frame?.error?.details?.reason === \"string\"\n ? frame.error.details.reason.trim()\n : \"\";\n\n if (!requestId) {\n this.opts.logger.warn(\n \"TunnelProxy: gateway pairing required but requestId missing; unable to auto-approve\",\n );\n return false;\n }\n\n if (\n reason &&\n reason !== \"not-paired\" &&\n reason !== \"scope-upgrade\"\n ) {\n this.opts.logger.warn(\n `TunnelProxy: gateway pairing required with unsupported reason=${reason}; skipping auto-approve`,\n );\n return false;\n }\n\n if (this.gatewayWsAutoPairingApprovals >= MAX_AUTO_PAIRING_APPROVALS) {\n this.opts.logger.warn(\n `TunnelProxy: reached auto-pairing retry limit (${MAX_AUTO_PAIRING_APPROVALS}); requestId=${requestId}`,\n );\n return false;\n }\n\n this.gatewayWsPairingApprovalPending = true;\n try {\n const approveDevicePairing = await loadApproveDevicePairing(this.opts.logger);\n if (!approveDevicePairing) {\n this.gatewayWsPairingApprovalPending = false;\n return false;\n }\n const approved = await approveDevicePairing(requestId, this.hostStateDir);\n if (!approved) {\n this.gatewayWsPairingApprovalPending = false;\n this.opts.logger.warn(\n `TunnelProxy: gateway pairing request ${requestId} not found in host state ${this.hostStateDir}`,\n );\n return false;\n }\n this.gatewayWsAutoPairingApprovals += 1;\n this.gatewayWsReconnectRequested = true;\n this.gatewayWsPairingApprovalPending = false;\n this.opts.logger.info(\n `TunnelProxy: auto-approved local gateway pairing request ${requestId} (reason=${reason || \"not-paired\"}, hostStateDir=${this.hostStateDir}, approval=${this.gatewayWsAutoPairingApprovals}/${MAX_AUTO_PAIRING_APPROVALS})`,\n );\n return true;\n } catch (err: any) {\n this.gatewayWsPairingApprovalPending = false;\n this.opts.logger.warn(\n `TunnelProxy: failed to auto-approve gateway pairing request ${requestId}: ${err?.message ?? String(err)}`,\n );\n return false;\n }\n }\n\n // ─── Gateway RPC WebSocket lifecycle ───\n\n private normalizeSessionKey(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n }\n\n private normalizeRunId(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n }\n\n private pruneRecentAbortedChatRuns(now = Date.now()): void {\n for (const [runId, entry] of this.recentAbortedChatRuns) {\n if (now - entry.abortedAtMs > RECENT_ABORTED_CHAT_RUN_TTL_MS) {\n this.recentAbortedChatRuns.delete(runId);\n }\n }\n }\n\n private rememberRecentAbortedChatRun(runId: unknown, sessionKey: unknown): void {\n const normalizedRunId = this.normalizeRunId(runId);\n const normalizedSessionKey = this.normalizeSessionKey(sessionKey);\n if (!normalizedRunId || !normalizedSessionKey) return;\n this.pruneRecentAbortedChatRuns();\n this.recentAbortedChatRuns.set(normalizedRunId, {\n sessionKey: normalizedSessionKey,\n abortedAtMs: Date.now(),\n });\n }\n\n private getAssistantMessageText(message: any): string {\n if (!message || typeof message !== \"object\") return \"\";\n if (typeof message.text === \"string\") return message.text;\n if (!Array.isArray(message.content)) return \"\";\n return message.content\n .filter(\n (item: any) =>\n item &&\n typeof item === \"object\" &&\n item.type === \"text\" &&\n typeof item.text === \"string\",\n )\n .map((item: any) => item.text)\n .join(\"\");\n }\n\n private looksLikeSyntheticAbortFailureText(text: string): boolean {\n const normalized = text.trim().toLowerCase();\n if (!normalized) return false;\n return (\n normalized.includes(\"agent failed before reply:\") &&\n normalized.includes(\"aborted\") &&\n normalized.includes(\"openclaw logs --follow\")\n );\n }\n\n private isSyntheticAbortHistoryMessage(\n message: any,\n sessionKey: string,\n ): boolean {\n const text = this.getAssistantMessageText(message);\n if (!this.looksLikeSyntheticAbortFailureText(text)) return false;\n const messageTimestamp =\n typeof message?.timestamp === \"number\" ? message.timestamp : null;\n const now = Date.now();\n this.pruneRecentAbortedChatRuns(now);\n for (const entry of this.recentAbortedChatRuns.values()) {\n if (entry.sessionKey !== sessionKey) continue;\n if (messageTimestamp === null) return true;\n if (Math.abs(messageTimestamp - entry.abortedAtMs) <= RECENT_ABORTED_CHAT_RUN_TTL_MS) {\n return true;\n }\n }\n return false;\n }\n\n private maybeRewriteGatewayFrame(text: string, frame: any): string | null {\n this.pruneRecentAbortedChatRuns();\n\n if (\n frame?.type === \"event\" &&\n frame?.event === \"chat\" &&\n frame?.payload?.state === \"aborted\"\n ) {\n this.rememberRecentAbortedChatRun(\n frame.payload?.runId,\n frame.payload?.sessionKey,\n );\n return text;\n }\n\n if (frame?.type === \"ack\" && frame?.ok === false && typeof frame?.id === \"string\") {\n this.gatewayReqMetaById.delete(frame.id);\n return text;\n }\n\n let reqMeta: PendingGatewayReqMeta | undefined;\n if (frame?.type === \"res\" && typeof frame?.id === \"string\") {\n reqMeta = this.gatewayReqMetaById.get(frame.id);\n this.gatewayReqMetaById.delete(frame.id);\n }\n\n if (\n frame?.type === \"res\" &&\n frame?.ok === true &&\n reqMeta?.method === \"chat.abort\"\n ) {\n const runIds = Array.isArray(frame?.payload?.runIds)\n ? frame.payload.runIds\n : [];\n for (const runId of runIds) {\n this.rememberRecentAbortedChatRun(runId, reqMeta.sessionKey);\n }\n return text;\n }\n\n if (\n frame?.type === \"event\" &&\n frame?.event === \"chat\" &&\n frame?.payload?.state === \"final\"\n ) {\n const runId = this.normalizeRunId(frame?.payload?.runId);\n const assistantText = this.getAssistantMessageText(frame?.payload?.message);\n const recentAbort = runId ? this.recentAbortedChatRuns.get(runId) : undefined;\n if (\n recentAbort &&\n this.looksLikeSyntheticAbortFailureText(assistantText)\n ) {\n this.opts.logger.info(\n `TunnelProxy: suppressing synthetic abort failure final for runId=${runId}`,\n );\n return null;\n }\n return text;\n }\n\n if (\n frame?.type === \"res\" &&\n frame?.ok === true &&\n reqMeta?.method === \"chat.history\" &&\n Array.isArray(frame?.payload?.messages)\n ) {\n const sessionKey =\n this.normalizeSessionKey(frame?.payload?.sessionKey) ?? reqMeta.sessionKey;\n if (!sessionKey) return text;\n const filteredMessages = frame.payload.messages.filter(\n (message: any) =>\n !this.isSyntheticAbortHistoryMessage(message, sessionKey),\n );\n if (filteredMessages.length === frame.payload.messages.length) {\n return text;\n }\n this.opts.logger.info(\n `TunnelProxy: removed ${frame.payload.messages.length - filteredMessages.length} synthetic abort history message(s) for session=${sessionKey}`,\n );\n return JSON.stringify({\n ...frame,\n payload: {\n ...frame.payload,\n messages: filteredMessages,\n },\n });\n }\n\n return text;\n }\n\n /** 确保到本地 Gateway 的 RPC WebSocket 已连接且握手完成 */\n private ensureGatewayWs(): void {\n if (this.gatewayWsReady && this.gatewayWs?.readyState === WebSocket.OPEN)\n return;\n if (this.gatewayWsConnecting) return;\n\n this.gatewayWsConnecting = true;\n this.gatewayWsReady = false;\n const wsUrl = this.opts.gatewayBaseUrl.replace(/^http/, \"ws\");\n\n this.opts.logger.info(\n `TunnelProxy: RPC WS connecting to gateway ${wsUrl} (pending=${this.gatewayWsPending.length})`,\n );\n\n let ws: WebSocket;\n try {\n ws = new WebSocket(wsUrl, {\n handshakeTimeout: GATEWAY_RPC_HANDSHAKE_TIMEOUT_MS,\n });\n } catch (err) {\n const message = formatErrorMessage(err);\n this.gatewayWsConnecting = false;\n this.opts.logger.error(\n `TunnelProxy: RPC WS failed to create gateway connection: ${message}`,\n );\n this.failAllGatewayRequests(\n \"GATEWAY_RPC_CONNECT_FAILED\",\n `local gateway RPC connect failed: ${message}`,\n );\n return;\n }\n\n this.gatewayWs = ws;\n let handshakeTimer: ReturnType<typeof setTimeout> | null = setTimeout(\n () => {\n handshakeTimer = null;\n if (this.gatewayWs !== ws || this.gatewayWsReady) return;\n this.opts.logger.warn(\n `TunnelProxy: RPC WS handshake timed out after ${GATEWAY_RPC_HANDSHAKE_TIMEOUT_MS}ms (pending=${this.gatewayWsPending.length})`,\n );\n this.gatewayWs = null;\n this.gatewayWsReady = false;\n this.gatewayWsConnecting = false;\n this.failAllGatewayRequests(\n \"GATEWAY_RPC_HANDSHAKE_TIMEOUT\",\n \"local gateway RPC handshake timed out\",\n );\n try {\n if (typeof (ws as any).terminate === \"function\") {\n (ws as any).terminate();\n } else {\n ws.close();\n }\n } catch {\n // ignore\n }\n },\n GATEWAY_RPC_HANDSHAKE_TIMEOUT_MS,\n );\n\n const clearHandshakeTimer = () => {\n if (handshakeTimer) {\n clearTimeout(handshakeTimer);\n handshakeTimer = null;\n }\n };\n\n ws.on(\"open\", () => {\n this.opts.logger.info(\n `TunnelProxy: RPC WS tcp connected, waiting for connect.challenge (pending=${this.gatewayWsPending.length})`,\n );\n });\n\n ws.on(\"message\", async (data: WebSocket.RawData) => {\n let text: string;\n if (typeof data === \"string\") {\n text = data;\n } else if (Buffer.isBuffer(data)) {\n text = data.toString();\n } else {\n text = Buffer.from(data as ArrayBuffer).toString();\n }\n\n const preview = text.length <= 500 ? text : text.substring(0, 500) + \"…\";\n this.opts.logger.info(\n `TunnelProxy: RPC WS ← gateway (${text.length} chars): ${preview}`,\n );\n\n let frame: any;\n try {\n frame = JSON.parse(text);\n } catch {\n this.opts.logger.warn(\n \"TunnelProxy: RPC WS received non-JSON, ignoring\",\n );\n return;\n }\n\n // 1) 收到 connect.challenge → 回复 connect 请求(带设备身份签名)\n if (frame.type === \"event\" && frame.event === \"connect.challenge\") {\n this.handleConnectChallenge(ws, frame);\n return;\n }\n\n // 2) 收到 connect 的 hello-ok 响应 → 握手完成,flush 待发帧\n if (\n frame.type === \"res\" &&\n frame.ok === true &&\n frame.payload?.type === \"hello-ok\"\n ) {\n clearHandshakeTimer();\n this.storeIssuedDeviceToken({\n fallbackRole: \"operator\",\n fallbackScopes: [...GATEWAY_OPERATOR_SCOPES],\n authInfo: frame.payload?.auth,\n });\n this.gatewayWsAutoPairingApprovals = 0;\n this.gatewayWsReconnectRequested = false;\n this.gatewayWsReady = true;\n this.gatewayWsConnecting = false;\n this.opts.logger.info(\n `TunnelProxy: RPC WS handshake done (hello-ok), flushing ${this.gatewayWsPending.length} pending frames`,\n );\n const pending = this.gatewayWsPending;\n this.gatewayWsPending = [];\n for (let i = 0; i < pending.length; i++) {\n const entry = pending[i];\n if (!this.sendGatewayPayload(ws, entry, entry.reqId ?? \"pending frame\")) {\n return;\n }\n }\n return;\n }\n\n // 3) 收到 connect 失败响应 → 关闭连接\n if (frame.type === \"res\" && frame.ok === false && !this.gatewayWsReady) {\n const autoApproved = await this.maybeAutoApproveGatewayPairing(frame);\n if (autoApproved) {\n const wsAlreadyClosed =\n ws.readyState === WebSocket.CLOSING ||\n ws.readyState === WebSocket.CLOSED ||\n this.gatewayWs !== ws;\n this.opts.logger.info(\n `TunnelProxy: RPC WS handshake requested local pairing approval, reconnecting${wsAlreadyClosed ? \" immediately\" : \" after close\"} (pending=${this.gatewayWsPending.length})`,\n );\n if (wsAlreadyClosed) {\n this.gatewayWsReconnectRequested = false;\n this.ensureGatewayWs();\n return;\n }\n ws.close(1000, \"pairing approved, reconnecting\");\n return;\n }\n this.opts.logger.error(\n `TunnelProxy: RPC WS handshake failed (pending=${this.gatewayWsPending.length}): ${previewText(JSON.stringify(frame.error), 500)}`,\n );\n clearHandshakeTimer();\n this.failAllGatewayRequests(\n \"GATEWAY_RPC_HANDSHAKE_FAILED\",\n `local gateway RPC handshake failed: ${previewText(JSON.stringify(frame.error), 500)}`,\n );\n ws.close();\n return;\n }\n\n // 4) 握手后的普通消息 → 透传回 Relay\n const rewritten = this.maybeRewriteGatewayFrame(text, frame);\n if (rewritten !== null) {\n this.opts.client.sendRaw(rewritten);\n }\n });\n\n ws.on(\"close\", (code: number, reason: Buffer) => {\n clearHandshakeTimer();\n const wasReady = this.gatewayWsReady;\n const pendingCount = this.gatewayWsPending.length;\n const reasonText = reason.toString();\n const shouldReconnect =\n this.gatewayWsReconnectRequested && pendingCount > 0;\n const shouldHoldForPairing =\n this.gatewayWsPairingApprovalPending && pendingCount > 0;\n this.opts.logger.info(\n `TunnelProxy: RPC WS closed by gateway (code=${code}, reason=${reasonText}, ready=${wasReady}, pending=${pendingCount}, activeWs=${this.wsProxy.activeCount})`,\n );\n if (this.gatewayWs === ws) {\n this.gatewayWs = null;\n this.gatewayWsReady = false;\n }\n this.gatewayWsConnecting = false;\n this.maybeClearStoredDeviceTokenOnMismatch(code, reasonText);\n if (shouldReconnect) {\n this.gatewayWsReconnectRequested = false;\n this.opts.logger.info(\n `TunnelProxy: retrying RPC WS after local pairing approval (pending=${this.gatewayWsPending.length})`,\n );\n queueMicrotask(() => this.ensureGatewayWs());\n } else if (\n !shouldHoldForPairing &&\n (pendingCount > 0 || this.gatewayReqMetaById.size > 0)\n ) {\n this.failAllGatewayRequests(\n \"GATEWAY_RPC_DISCONNECTED\",\n `local gateway RPC disconnected: code=${code}, reason=${reasonText}`,\n );\n }\n });\n\n ws.on(\"error\", (err: Error) => {\n clearHandshakeTimer();\n this.opts.logger.warn(\n `TunnelProxy: RPC WS error: ${err.message} (ready=${this.gatewayWsReady}, pending=${this.gatewayWsPending.length}, activeWs=${this.wsProxy.activeCount})`,\n );\n const shouldFailRequests =\n this.gatewayWs === ws &&\n (this.gatewayWsPending.length > 0 || this.gatewayReqMetaById.size > 0);\n this.gatewayWsConnecting = false;\n if (this.gatewayWs === ws) {\n this.gatewayWs = null;\n this.gatewayWsReady = false;\n }\n if (shouldFailRequests) {\n this.failAllGatewayRequests(\n \"GATEWAY_RPC_ERROR\",\n `local gateway RPC error: ${err.message}`,\n );\n }\n try {\n if (typeof (ws as any).terminate === \"function\") {\n (ws as any).terminate();\n }\n } catch {\n // ignore\n }\n });\n }\n\n private handleConnectChallenge(ws: WebSocket, frame: any): void {\n const challengeNonce: string = frame.payload?.nonce ?? \"\";\n const connectRequestId = `tunnel-connect-${randomUUID()}`;\n const role = \"operator\";\n const scopes = [...GATEWAY_OPERATOR_SCOPES];\n const gatewayConnectAuth = this.buildGatewayConnectAuth(role);\n this.opts.logger.info(\n `TunnelProxy: received connect.challenge (nonce=${challengeNonce}, connectReqId=${connectRequestId}, hasToken=${!!gatewayConnectAuth.authToken}, hasPassword=${!!gatewayConnectAuth.authPassword}, hasDeviceToken=${!!gatewayConnectAuth.deviceToken}), sending connect request with device identity`,\n );\n\n const signedAtMs = Date.now();\n const clientId = \"gateway-client\";\n const clientMode = \"backend\";\n\n const authPayload = buildDeviceAuthPayload({\n deviceId: this.deviceIdentity.deviceId,\n clientId,\n clientMode,\n role,\n scopes,\n signedAtMs,\n token: gatewayConnectAuth.authToken ?? null,\n nonce: challengeNonce,\n });\n const signature = signDevicePayload(\n this.deviceIdentity.privateKeyPem,\n authPayload,\n );\n\n const connectReq = {\n type: \"req\",\n id: connectRequestId,\n method: \"connect\",\n params: {\n minProtocol: GATEWAY_RPC_MIN_PROTOCOL,\n maxProtocol: GATEWAY_RPC_MAX_PROTOCOL,\n client: {\n id: clientId,\n version: \"1.0.0\",\n platform: process.platform,\n mode: clientMode,\n instanceId: RELAY_TUNNEL_GATEWAY_CLIENT_INSTANCE_ID,\n },\n role,\n scopes,\n ...(gatewayConnectAuth.auth ? { auth: gatewayConnectAuth.auth } : {}),\n device: {\n id: this.deviceIdentity.deviceId,\n publicKey: publicKeyRawBase64UrlFromPem(\n this.deviceIdentity.publicKeyPem,\n ),\n signature,\n signedAt: signedAtMs,\n nonce: challengeNonce,\n },\n },\n };\n ws.send(JSON.stringify(connectReq));\n }\n}\n",
104
+ "import { randomUUID } from \"node:crypto\";\nimport WebSocket from \"ws\";\nimport { importHostSdkModule } from \"../host-sdk.js\";\nimport type { RelayClient } from \"./relay-client.js\";\nimport type { ReqFrame, InboundFrame, RequestFrame } from \"./types.js\";\nimport { previewText } from \"./utils.js\";\nimport { resolveHostStateDir } from \"../host.js\";\nimport {\n type DeviceIdentity,\n resolveClientStateDir,\n loadOrCreateDeviceIdentity,\n loadDeviceAuthToken,\n storeDeviceAuthToken,\n clearDeviceAuthToken,\n buildDeviceAuthPayload,\n signDevicePayload,\n publicKeyRawBase64UrlFromPem,\n} from \"./device-identity.js\";\nimport { handleHttpRequest } from \"./http-proxy.js\";\nimport { WsProxy } from \"./ws-proxy.js\";\nimport { slimRelayFrameText } from \"./frame-slimmer.js\";\n\n// ─── Types ───\n\nexport const RELAY_TUNNEL_GATEWAY_CLIENT_INSTANCE_ID =\n \"phone-notifications-relay-tunnel\";\n\nconst GATEWAY_OPERATOR_SCOPES = [\n \"operator.admin\",\n \"operator.approvals\",\n \"operator.pairing\",\n \"operator.read\",\n \"operator.write\",\n] as const;\n\n// openclaw 2026.5.12 起本地 gateway RPC 要求 protocol >= 4;保留 3 以兼容老网关。\nconst GATEWAY_RPC_MIN_PROTOCOL = 3;\nconst GATEWAY_RPC_MAX_PROTOCOL = 4;\n\ninterface ProxyOptions {\n stateDir?: string;\n hostStateDir?: string;\n gatewayBaseUrl: string;\n /** Gateway 鉴权模式 */\n gatewayAuthMode?: \"token\" | \"password\";\n /** Gateway 鉴权 token,代理请求到本地 gateway 时使用 */\n gatewayToken?: string;\n /** Gateway 鉴权密码,代理请求到本地 gateway 时使用 */\n gatewayPassword?: string;\n client: RelayClient;\n logger: {\n info: (msg: string) => void;\n warn: (msg: string) => void;\n error: (msg: string) => void;\n };\n}\n\nconst MAX_AUTO_PAIRING_APPROVALS = 3;\nconst RECENT_ABORTED_CHAT_RUN_TTL_MS = 60_000;\nconst GATEWAY_RPC_HANDSHAKE_TIMEOUT_MS = 10_000;\nconst MAX_GATEWAY_WS_PENDING = 200;\n\ninterface PendingGatewayReqMeta {\n method: string;\n sessionKey?: string;\n}\n\ninterface PendingGatewayPayload {\n payload: string;\n reqId?: string;\n}\n\ninterface RecentAbortedChatRun {\n sessionKey: string;\n abortedAtMs: number;\n}\n\ntype ApproveDevicePairingFn = (\n requestId: string,\n hostStateDir?: string,\n) => Promise<unknown>;\n\nlet approveDevicePairingPromise: Promise<ApproveDevicePairingFn | null> | null =\n null;\nlet approveDevicePairingWarned = false;\ntype DeviceBootstrap = typeof import(\"openclaw/plugin-sdk/device-bootstrap\");\n\nfunction formatErrorMessage(err: unknown): string {\n if (err instanceof Error && err.message) return err.message;\n return String(err);\n}\n\nasync function loadApproveDevicePairing(\n logger: ProxyOptions[\"logger\"],\n): Promise<ApproveDevicePairingFn | null> {\n if (!approveDevicePairingPromise) {\n approveDevicePairingPromise = importHostSdkModule<DeviceBootstrap>(\n \"openclaw/plugin-sdk/device-bootstrap\",\n )\n .then((mod) =>\n typeof mod.approveDevicePairing === \"function\"\n ? (mod.approveDevicePairing as ApproveDevicePairingFn)\n : null,\n )\n .catch((err: unknown) => {\n if (!approveDevicePairingWarned) {\n approveDevicePairingWarned = true;\n logger.warn(\n `TunnelProxy: local gateway auto-pairing disabled because current OpenClaw runtime does not expose device bootstrap SDK (${formatErrorMessage(err)})`,\n );\n }\n return null;\n });\n }\n\n const approveDevicePairing = await approveDevicePairingPromise;\n if (!approveDevicePairing && !approveDevicePairingWarned) {\n approveDevicePairingWarned = true;\n logger.warn(\n \"TunnelProxy: local gateway auto-pairing disabled because current OpenClaw runtime does not expose device bootstrap SDK\",\n );\n }\n return approveDevicePairing;\n}\n\n/**\n * 透明代理:接收 Relay 转发的请求帧,代理到本地 gateway,回传响应帧。\n * 支持 HTTP 请求代理和 WebSocket 连接代理。\n */\nexport class TunnelProxy {\n /** 到本地 Gateway 的持久 RPC WebSocket 连接 */\n private gatewayWs: WebSocket | null = null;\n private gatewayWsConnecting = false;\n /** 握手是否已完成(收到 hello-ok) */\n private gatewayWsReady = false;\n /** 收到本地自动配对成功后,在 close 回调里触发重连 */\n private gatewayWsReconnectRequested = false;\n /** 本地自动配对审批进行中,期间 Gateway 关闭连接时先保留 pending 请求。 */\n private gatewayWsPairingApprovalPending = false;\n /** 防止配对失败时无限重连 */\n private gatewayWsAutoPairingApprovals = 0;\n /** 等待 Gateway WS 握手完成后发送的帧队列 */\n private gatewayWsPending: PendingGatewayPayload[] = [];\n /** 记录已转发到 Gateway 的 req 元信息,便于回包时做定向处理。 */\n private gatewayReqMetaById = new Map<string, PendingGatewayReqMeta>();\n /** 最近由用户手动中断的 chat.run,用于过滤 runtime 误补发的 synthetic failure。 */\n private recentAbortedChatRuns = new Map<string, RecentAbortedChatRun>();\n /** Relay 断开或服务停止时要中断的 HTTP 代理请求。 */\n private httpAbortControllers = new Map<string, AbortController>();\n\n /** 设备身份,用于 Gateway connect 握手 */\n private deviceIdentity: DeviceIdentity;\n\n private readonly stateDir: string;\n private readonly hostStateDir: string;\n private readonly wsProxy: WsProxy;\n\n constructor(private readonly opts: ProxyOptions) {\n this.stateDir = resolveClientStateDir(opts.stateDir);\n this.hostStateDir = opts.hostStateDir ?? resolveHostStateDir();\n this.deviceIdentity = loadOrCreateDeviceIdentity(this.stateDir);\n opts.logger.info(\n `TunnelProxy: loaded device identity (deviceId=${this.deviceIdentity.deviceId})`,\n );\n this.wsProxy = new WsProxy({\n gatewayBaseUrl: opts.gatewayBaseUrl,\n client: opts.client,\n logger: opts.logger,\n });\n }\n\n // ─── Frame dispatcher ───\n\n /** 处理从 Relay 收到的入站帧 */\n async handleFrame(frame: InboundFrame): Promise<void> {\n this.opts.logger.info(\n `TunnelProxy: handling frame type=${frame.type}, id=${\"id\" in frame ? frame.id : \"N/A\"}`,\n );\n switch (frame.type) {\n case \"request\":\n await this.handleRequestFrame(frame);\n break;\n case \"req\":\n this.handleReqFrame(frame);\n break;\n case \"ws_open\":\n this.wsProxy.handleWsOpen(frame);\n break;\n case \"ws_data\":\n this.wsProxy.handleWsData(frame);\n break;\n case \"ws_close\":\n this.wsProxy.handleWsClose(frame);\n break;\n default:\n this.opts.logger.warn(\n `TunnelProxy: unknown frame type=\"${(frame as any).type}\", id=${\"id\" in frame ? (frame as any).id : \"N/A\"}, forwarding raw to gateway`,\n );\n // 未知帧类型也尝试通过 RPC WS 转发,避免静默丢弃\n this.forwardRawToGateway(JSON.stringify(frame));\n break;\n }\n }\n\n /** 清理所有代理的 WebSocket 连接 */\n cleanup(): void {\n this.opts.logger.info(\n `TunnelProxy: cleanup, closing ${this.wsProxy.activeCount} active WS connections, gatewayWs=${!!this.gatewayWs}`,\n );\n this.wsProxy.cleanup();\n for (const [id, controller] of this.httpAbortControllers) {\n this.opts.logger.info(`TunnelProxy: aborting HTTP proxy id=${id}`);\n controller.abort();\n }\n this.httpAbortControllers.clear();\n\n const gatewayWs = this.gatewayWs;\n this.gatewayWs = null;\n this.gatewayWsReady = false;\n this.gatewayWsConnecting = false;\n this.gatewayWsReconnectRequested = false;\n this.gatewayWsPairingApprovalPending = false;\n this.gatewayWsAutoPairingApprovals = 0;\n this.gatewayWsPending = [];\n this.gatewayReqMetaById.clear();\n this.recentAbortedChatRuns.clear();\n if (gatewayWs) {\n try {\n gatewayWs.close();\n } catch {\n // ignore\n }\n }\n }\n\n // ─── Gateway RPC WebSocket ───\n\n private async handleRequestFrame(frame: RequestFrame): Promise<void> {\n const controller = new AbortController();\n this.httpAbortControllers.set(frame.id, controller);\n try {\n await handleHttpRequest(\n {\n ...this.opts,\n abortSignal: controller.signal,\n },\n frame,\n );\n } finally {\n this.httpAbortControllers.delete(frame.id);\n }\n }\n\n private pushGatewayPending(\n entry: PendingGatewayPayload,\n reason: string,\n ): boolean {\n if (this.gatewayWsPending.length >= MAX_GATEWAY_WS_PENDING) {\n this.opts.logger.error(\n `TunnelProxy: gateway WS pending queue overflow (${this.gatewayWsPending.length}/${MAX_GATEWAY_WS_PENDING}); failing ${entry.reqId ? `req id=${entry.reqId}` : \"raw frame\"}`,\n );\n this.failGatewayPendingEntry(\n entry,\n \"GATEWAY_RPC_QUEUE_FULL\",\n \"local gateway RPC queue is full\",\n );\n return false;\n }\n\n this.gatewayWsPending.push(entry);\n this.opts.logger.info(\n `TunnelProxy: gateway WS pending queue size=${this.gatewayWsPending.length} (${reason})`,\n );\n return true;\n }\n\n /** 将未知帧原样转发到 Gateway WS */\n private forwardRawToGateway(payload: string): void {\n if (this.gatewayWsReady && this.gatewayWs?.readyState === WebSocket.OPEN) {\n this.sendGatewayPayload(this.gatewayWs, { payload }, \"raw frame\");\n } else {\n if (\n this.pushGatewayPending(\n { payload },\n \"raw frame queued before gateway WS ready\",\n )\n ) {\n this.ensureGatewayWs();\n }\n }\n }\n\n /** 处理 Relay 转发的 Gateway RPC 请求帧,原样通过 WebSocket 发给本地 Gateway */\n private handleReqFrame(frame: ReqFrame): void {\n const payload = JSON.stringify(frame);\n this.gatewayReqMetaById.set(frame.id, {\n method: frame.method,\n sessionKey: this.normalizeSessionKey(frame.params?.sessionKey),\n });\n this.opts.logger.info(\n `TunnelProxy: req id=${frame.id} method=${frame.method} → gateway WS (${payload.length} chars)`,\n );\n\n if (this.gatewayWsReady && this.gatewayWs?.readyState === WebSocket.OPEN) {\n this.sendGatewayPayload(\n this.gatewayWs,\n { payload, reqId: frame.id },\n `req id=${frame.id}`,\n );\n } else {\n this.opts.logger.info(\n `TunnelProxy: req id=${frame.id} queued, gateway WS not ready yet`,\n );\n if (\n this.pushGatewayPending(\n { payload, reqId: frame.id },\n `req id=${frame.id} queued before gateway WS handshake`,\n )\n ) {\n this.ensureGatewayWs();\n }\n }\n }\n\n private sendGatewayRpcError(\n id: string,\n code: string,\n message: string,\n ): void {\n this.gatewayReqMetaById.delete(id);\n this.opts.client.sendRaw(\n JSON.stringify({\n type: \"res\",\n id,\n ok: false,\n error: {\n code,\n message,\n },\n }),\n );\n }\n\n private failGatewayPendingEntry(\n entry: PendingGatewayPayload,\n code: string,\n message: string,\n ): void {\n if (!entry.reqId) return;\n this.sendGatewayRpcError(entry.reqId, code, message);\n }\n\n private failGatewayPending(code: string, message: string): void {\n if (this.gatewayWsPending.length === 0) return;\n const pending = this.gatewayWsPending;\n this.gatewayWsPending = [];\n this.opts.logger.warn(\n `TunnelProxy: failing ${pending.length} pending gateway RPC frame(s): ${message}`,\n );\n for (const entry of pending) {\n this.failGatewayPendingEntry(entry, code, message);\n }\n }\n\n private failGatewayInflight(code: string, message: string): void {\n if (this.gatewayReqMetaById.size === 0) return;\n const ids = [...this.gatewayReqMetaById.keys()];\n this.opts.logger.warn(\n `TunnelProxy: failing ${ids.length} in-flight gateway RPC request(s): ${message}`,\n );\n for (const id of ids) {\n this.sendGatewayRpcError(id, code, message);\n }\n }\n\n private failAllGatewayRequests(code: string, message: string): void {\n this.failGatewayPending(code, message);\n this.failGatewayInflight(code, message);\n }\n\n private sendGatewayPayload(\n ws: WebSocket,\n entry: PendingGatewayPayload,\n context: string,\n ): boolean {\n try {\n ws.send(entry.payload);\n return true;\n } catch (err) {\n const message = formatErrorMessage(err);\n this.opts.logger.warn(\n `TunnelProxy: RPC WS send failed for ${context}: ${message}`,\n );\n this.failGatewayPendingEntry(\n entry,\n \"GATEWAY_RPC_SEND_FAILED\",\n `local gateway RPC send failed: ${message}`,\n );\n this.failGatewayInflight(\n \"GATEWAY_RPC_SEND_FAILED\",\n \"local gateway RPC connection closed after send failure\",\n );\n if (this.gatewayWs === ws) {\n this.gatewayWs = null;\n this.gatewayWsReady = false;\n this.gatewayWsConnecting = false;\n }\n try {\n if (typeof (ws as any).terminate === \"function\") {\n (ws as any).terminate();\n } else {\n ws.close();\n }\n } catch {\n // ignore\n }\n return false;\n }\n }\n\n // ─── Gateway connect auth helpers ───\n\n private resolveGatewayConnectAuth():\n | { token?: string; password?: string }\n | undefined {\n const token = this.opts.gatewayToken?.trim() || undefined;\n const password = this.opts.gatewayPassword?.trim() || undefined;\n if (!token && !password) return undefined;\n return { token, password };\n }\n\n private loadStoredDeviceToken(role: string): string | undefined {\n return (\n loadDeviceAuthToken({\n stateDir: this.stateDir,\n deviceId: this.deviceIdentity.deviceId,\n role,\n })?.token ?? undefined\n );\n }\n\n private buildGatewayConnectAuth(role: string): {\n auth?: { token?: string; deviceToken?: string; password?: string };\n authToken?: string;\n authPassword?: string;\n deviceToken?: string;\n } {\n const explicitAuth = this.resolveGatewayConnectAuth();\n const authPassword = explicitAuth?.password?.trim() || undefined;\n const explicitGatewayToken = explicitAuth?.token?.trim() || undefined;\n const deviceToken = explicitGatewayToken\n ? undefined\n : this.loadStoredDeviceToken(role);\n const authToken = explicitGatewayToken ?? deviceToken;\n const auth =\n authToken || authPassword || deviceToken\n ? { token: authToken, deviceToken, password: authPassword }\n : undefined;\n return { auth, authToken, authPassword, deviceToken };\n }\n\n private storeIssuedDeviceToken(params: {\n fallbackRole: string;\n fallbackScopes: string[];\n authInfo: any;\n }): void {\n const token = params.authInfo?.deviceToken;\n if (typeof token !== \"string\" || !token.trim()) return;\n const role =\n typeof params.authInfo?.role === \"string\" && params.authInfo.role.trim()\n ? params.authInfo.role.trim()\n : params.fallbackRole;\n const scopes = Array.isArray(params.authInfo?.scopes)\n ? params.authInfo.scopes.filter(\n (scope: unknown): scope is string =>\n typeof scope === \"string\" && !!scope.trim(),\n )\n : params.fallbackScopes;\n storeDeviceAuthToken({\n stateDir: this.stateDir,\n deviceId: this.deviceIdentity.deviceId,\n role,\n token: token.trim(),\n scopes,\n });\n }\n\n private maybeClearStoredDeviceTokenOnMismatch(code: number, reason: string): void {\n const explicitAuth = this.resolveGatewayConnectAuth();\n if (explicitAuth?.token || explicitAuth?.password) return;\n if (code !== 1008 || !reason.toLowerCase().includes(\"device token mismatch\")) return;\n clearDeviceAuthToken({\n stateDir: this.stateDir,\n deviceId: this.deviceIdentity.deviceId,\n role: \"operator\",\n });\n this.opts.logger.warn(\n `TunnelProxy: cleared stale stored device token after gateway mismatch (deviceId=${this.deviceIdentity.deviceId})`,\n );\n }\n\n private async maybeAutoApproveGatewayPairing(frame: any): Promise<boolean> {\n const errorCode =\n typeof frame?.error?.code === \"string\" ? frame.error.code : undefined;\n const detailsCode =\n typeof frame?.error?.details?.code === \"string\"\n ? frame.error.details.code\n : undefined;\n if (errorCode !== \"NOT_PAIRED\" && detailsCode !== \"PAIRING_REQUIRED\") {\n return false;\n }\n\n const requestId =\n typeof frame?.error?.details?.requestId === \"string\"\n ? frame.error.details.requestId.trim()\n : \"\";\n const reason =\n typeof frame?.error?.details?.reason === \"string\"\n ? frame.error.details.reason.trim()\n : \"\";\n\n if (!requestId) {\n this.opts.logger.warn(\n \"TunnelProxy: gateway pairing required but requestId missing; unable to auto-approve\",\n );\n return false;\n }\n\n if (\n reason &&\n reason !== \"not-paired\" &&\n reason !== \"scope-upgrade\"\n ) {\n this.opts.logger.warn(\n `TunnelProxy: gateway pairing required with unsupported reason=${reason}; skipping auto-approve`,\n );\n return false;\n }\n\n if (this.gatewayWsAutoPairingApprovals >= MAX_AUTO_PAIRING_APPROVALS) {\n this.opts.logger.warn(\n `TunnelProxy: reached auto-pairing retry limit (${MAX_AUTO_PAIRING_APPROVALS}); requestId=${requestId}`,\n );\n return false;\n }\n\n this.gatewayWsPairingApprovalPending = true;\n try {\n const approveDevicePairing = await loadApproveDevicePairing(this.opts.logger);\n if (!approveDevicePairing) {\n this.gatewayWsPairingApprovalPending = false;\n return false;\n }\n const approved = await approveDevicePairing(requestId, this.hostStateDir);\n if (!approved) {\n this.gatewayWsPairingApprovalPending = false;\n this.opts.logger.warn(\n `TunnelProxy: gateway pairing request ${requestId} not found in host state ${this.hostStateDir}`,\n );\n return false;\n }\n this.gatewayWsAutoPairingApprovals += 1;\n this.gatewayWsReconnectRequested = true;\n this.gatewayWsPairingApprovalPending = false;\n this.opts.logger.info(\n `TunnelProxy: auto-approved local gateway pairing request ${requestId} (reason=${reason || \"not-paired\"}, hostStateDir=${this.hostStateDir}, approval=${this.gatewayWsAutoPairingApprovals}/${MAX_AUTO_PAIRING_APPROVALS})`,\n );\n return true;\n } catch (err: any) {\n this.gatewayWsPairingApprovalPending = false;\n this.opts.logger.warn(\n `TunnelProxy: failed to auto-approve gateway pairing request ${requestId}: ${err?.message ?? String(err)}`,\n );\n return false;\n }\n }\n\n // ─── Gateway RPC WebSocket lifecycle ───\n\n private normalizeSessionKey(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n }\n\n private normalizeRunId(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n }\n\n private pruneRecentAbortedChatRuns(now = Date.now()): void {\n for (const [runId, entry] of this.recentAbortedChatRuns) {\n if (now - entry.abortedAtMs > RECENT_ABORTED_CHAT_RUN_TTL_MS) {\n this.recentAbortedChatRuns.delete(runId);\n }\n }\n }\n\n private rememberRecentAbortedChatRun(runId: unknown, sessionKey: unknown): void {\n const normalizedRunId = this.normalizeRunId(runId);\n const normalizedSessionKey = this.normalizeSessionKey(sessionKey);\n if (!normalizedRunId || !normalizedSessionKey) return;\n this.pruneRecentAbortedChatRuns();\n this.recentAbortedChatRuns.set(normalizedRunId, {\n sessionKey: normalizedSessionKey,\n abortedAtMs: Date.now(),\n });\n }\n\n private getAssistantMessageText(message: any): string {\n if (!message || typeof message !== \"object\") return \"\";\n if (typeof message.text === \"string\") return message.text;\n if (!Array.isArray(message.content)) return \"\";\n return message.content\n .filter(\n (item: any) =>\n item &&\n typeof item === \"object\" &&\n item.type === \"text\" &&\n typeof item.text === \"string\",\n )\n .map((item: any) => item.text)\n .join(\"\");\n }\n\n private looksLikeSyntheticAbortFailureText(text: string): boolean {\n const normalized = text.trim().toLowerCase();\n if (!normalized) return false;\n return (\n normalized.includes(\"agent failed before reply:\") &&\n normalized.includes(\"aborted\") &&\n normalized.includes(\"openclaw logs --follow\")\n );\n }\n\n private isSyntheticAbortHistoryMessage(\n message: any,\n sessionKey: string,\n ): boolean {\n const text = this.getAssistantMessageText(message);\n if (!this.looksLikeSyntheticAbortFailureText(text)) return false;\n const messageTimestamp =\n typeof message?.timestamp === \"number\" ? message.timestamp : null;\n const now = Date.now();\n this.pruneRecentAbortedChatRuns(now);\n for (const entry of this.recentAbortedChatRuns.values()) {\n if (entry.sessionKey !== sessionKey) continue;\n if (messageTimestamp === null) return true;\n if (Math.abs(messageTimestamp - entry.abortedAtMs) <= RECENT_ABORTED_CHAT_RUN_TTL_MS) {\n return true;\n }\n }\n return false;\n }\n\n private maybeRewriteGatewayFrame(text: string, frame: any): string | null {\n this.pruneRecentAbortedChatRuns();\n\n if (\n frame?.type === \"event\" &&\n frame?.event === \"chat\" &&\n frame?.payload?.state === \"aborted\"\n ) {\n this.rememberRecentAbortedChatRun(\n frame.payload?.runId,\n frame.payload?.sessionKey,\n );\n return text;\n }\n\n if (frame?.type === \"ack\" && frame?.ok === false && typeof frame?.id === \"string\") {\n this.gatewayReqMetaById.delete(frame.id);\n return text;\n }\n\n let reqMeta: PendingGatewayReqMeta | undefined;\n if (frame?.type === \"res\" && typeof frame?.id === \"string\") {\n reqMeta = this.gatewayReqMetaById.get(frame.id);\n this.gatewayReqMetaById.delete(frame.id);\n }\n\n if (\n frame?.type === \"res\" &&\n frame?.ok === true &&\n reqMeta?.method === \"chat.abort\"\n ) {\n const runIds = Array.isArray(frame?.payload?.runIds)\n ? frame.payload.runIds\n : [];\n for (const runId of runIds) {\n this.rememberRecentAbortedChatRun(runId, reqMeta.sessionKey);\n }\n return text;\n }\n\n if (\n frame?.type === \"event\" &&\n frame?.event === \"chat\" &&\n frame?.payload?.state === \"final\"\n ) {\n const runId = this.normalizeRunId(frame?.payload?.runId);\n const assistantText = this.getAssistantMessageText(frame?.payload?.message);\n const recentAbort = runId ? this.recentAbortedChatRuns.get(runId) : undefined;\n if (\n recentAbort &&\n this.looksLikeSyntheticAbortFailureText(assistantText)\n ) {\n this.opts.logger.info(\n `TunnelProxy: suppressing synthetic abort failure final for runId=${runId}`,\n );\n return null;\n }\n return text;\n }\n\n if (\n frame?.type === \"res\" &&\n frame?.ok === true &&\n reqMeta?.method === \"chat.history\" &&\n Array.isArray(frame?.payload?.messages)\n ) {\n const sessionKey =\n this.normalizeSessionKey(frame?.payload?.sessionKey) ?? reqMeta.sessionKey;\n if (!sessionKey) return text;\n const filteredMessages = frame.payload.messages.filter(\n (message: any) =>\n !this.isSyntheticAbortHistoryMessage(message, sessionKey),\n );\n if (filteredMessages.length === frame.payload.messages.length) {\n return text;\n }\n this.opts.logger.info(\n `TunnelProxy: removed ${frame.payload.messages.length - filteredMessages.length} synthetic abort history message(s) for session=${sessionKey}`,\n );\n return JSON.stringify({\n ...frame,\n payload: {\n ...frame.payload,\n messages: filteredMessages,\n },\n });\n }\n\n return text;\n }\n\n /** 确保到本地 Gateway 的 RPC WebSocket 已连接且握手完成 */\n private ensureGatewayWs(): void {\n if (this.gatewayWsReady && this.gatewayWs?.readyState === WebSocket.OPEN)\n return;\n if (this.gatewayWsConnecting) return;\n\n this.gatewayWsConnecting = true;\n this.gatewayWsReady = false;\n const wsUrl = this.opts.gatewayBaseUrl.replace(/^http/, \"ws\");\n\n this.opts.logger.info(\n `TunnelProxy: RPC WS connecting to gateway ${wsUrl} (pending=${this.gatewayWsPending.length})`,\n );\n\n let ws: WebSocket;\n try {\n ws = new WebSocket(wsUrl, {\n handshakeTimeout: GATEWAY_RPC_HANDSHAKE_TIMEOUT_MS,\n });\n } catch (err) {\n const message = formatErrorMessage(err);\n this.gatewayWsConnecting = false;\n this.opts.logger.error(\n `TunnelProxy: RPC WS failed to create gateway connection: ${message}`,\n );\n this.failAllGatewayRequests(\n \"GATEWAY_RPC_CONNECT_FAILED\",\n `local gateway RPC connect failed: ${message}`,\n );\n return;\n }\n\n this.gatewayWs = ws;\n let handshakeTimer: ReturnType<typeof setTimeout> | null = setTimeout(\n () => {\n handshakeTimer = null;\n if (this.gatewayWs !== ws || this.gatewayWsReady) return;\n this.opts.logger.warn(\n `TunnelProxy: RPC WS handshake timed out after ${GATEWAY_RPC_HANDSHAKE_TIMEOUT_MS}ms (pending=${this.gatewayWsPending.length})`,\n );\n this.gatewayWs = null;\n this.gatewayWsReady = false;\n this.gatewayWsConnecting = false;\n this.failAllGatewayRequests(\n \"GATEWAY_RPC_HANDSHAKE_TIMEOUT\",\n \"local gateway RPC handshake timed out\",\n );\n try {\n if (typeof (ws as any).terminate === \"function\") {\n (ws as any).terminate();\n } else {\n ws.close();\n }\n } catch {\n // ignore\n }\n },\n GATEWAY_RPC_HANDSHAKE_TIMEOUT_MS,\n );\n\n const clearHandshakeTimer = () => {\n if (handshakeTimer) {\n clearTimeout(handshakeTimer);\n handshakeTimer = null;\n }\n };\n\n ws.on(\"open\", () => {\n this.opts.logger.info(\n `TunnelProxy: RPC WS tcp connected, waiting for connect.challenge (pending=${this.gatewayWsPending.length})`,\n );\n });\n\n ws.on(\"message\", async (data: WebSocket.RawData) => {\n let text: string;\n if (typeof data === \"string\") {\n text = data;\n } else if (Buffer.isBuffer(data)) {\n text = data.toString();\n } else {\n text = Buffer.from(data as ArrayBuffer).toString();\n }\n\n const preview = text.length <= 500 ? text : text.substring(0, 500) + \"…\";\n this.opts.logger.info(\n `TunnelProxy: RPC WS ← gateway (${text.length} chars): ${preview}`,\n );\n\n let frame: any;\n try {\n frame = JSON.parse(text);\n } catch {\n this.opts.logger.warn(\n \"TunnelProxy: RPC WS received non-JSON, ignoring\",\n );\n return;\n }\n\n // 1) 收到 connect.challenge → 回复 connect 请求(带设备身份签名)\n if (frame.type === \"event\" && frame.event === \"connect.challenge\") {\n this.handleConnectChallenge(ws, frame);\n return;\n }\n\n // 2) 收到 connect 的 hello-ok 响应 → 握手完成,flush 待发帧\n if (\n frame.type === \"res\" &&\n frame.ok === true &&\n frame.payload?.type === \"hello-ok\"\n ) {\n clearHandshakeTimer();\n this.storeIssuedDeviceToken({\n fallbackRole: \"operator\",\n fallbackScopes: [...GATEWAY_OPERATOR_SCOPES],\n authInfo: frame.payload?.auth,\n });\n this.gatewayWsAutoPairingApprovals = 0;\n this.gatewayWsReconnectRequested = false;\n this.gatewayWsReady = true;\n this.gatewayWsConnecting = false;\n this.opts.logger.info(\n `TunnelProxy: RPC WS handshake done (hello-ok), flushing ${this.gatewayWsPending.length} pending frames`,\n );\n const pending = this.gatewayWsPending;\n this.gatewayWsPending = [];\n for (let i = 0; i < pending.length; i++) {\n const entry = pending[i];\n if (!this.sendGatewayPayload(ws, entry, entry.reqId ?? \"pending frame\")) {\n return;\n }\n }\n return;\n }\n\n // 3) 收到 connect 失败响应 → 关闭连接\n if (frame.type === \"res\" && frame.ok === false && !this.gatewayWsReady) {\n const autoApproved = await this.maybeAutoApproveGatewayPairing(frame);\n if (autoApproved) {\n const wsAlreadyClosed =\n ws.readyState === WebSocket.CLOSING ||\n ws.readyState === WebSocket.CLOSED ||\n this.gatewayWs !== ws;\n this.opts.logger.info(\n `TunnelProxy: RPC WS handshake requested local pairing approval, reconnecting${wsAlreadyClosed ? \" immediately\" : \" after close\"} (pending=${this.gatewayWsPending.length})`,\n );\n if (wsAlreadyClosed) {\n this.gatewayWsReconnectRequested = false;\n this.ensureGatewayWs();\n return;\n }\n ws.close(1000, \"pairing approved, reconnecting\");\n return;\n }\n this.opts.logger.error(\n `TunnelProxy: RPC WS handshake failed (pending=${this.gatewayWsPending.length}): ${previewText(JSON.stringify(frame.error), 500)}`,\n );\n clearHandshakeTimer();\n this.failAllGatewayRequests(\n \"GATEWAY_RPC_HANDSHAKE_FAILED\",\n `local gateway RPC handshake failed: ${previewText(JSON.stringify(frame.error), 500)}`,\n );\n ws.close();\n return;\n }\n\n // 4) 握手后的普通消息 → 瘦身超大工具输出后透传回 Relay\n const rewritten = this.maybeRewriteGatewayFrame(text, frame);\n if (rewritten !== null) {\n this.opts.client.sendRaw(slimRelayFrameText(rewritten, this.opts.logger));\n }\n });\n\n ws.on(\"close\", (code: number, reason: Buffer) => {\n clearHandshakeTimer();\n const wasReady = this.gatewayWsReady;\n const pendingCount = this.gatewayWsPending.length;\n const reasonText = reason.toString();\n const shouldReconnect =\n this.gatewayWsReconnectRequested && pendingCount > 0;\n const shouldHoldForPairing =\n this.gatewayWsPairingApprovalPending && pendingCount > 0;\n this.opts.logger.info(\n `TunnelProxy: RPC WS closed by gateway (code=${code}, reason=${reasonText}, ready=${wasReady}, pending=${pendingCount}, activeWs=${this.wsProxy.activeCount})`,\n );\n if (this.gatewayWs === ws) {\n this.gatewayWs = null;\n this.gatewayWsReady = false;\n }\n this.gatewayWsConnecting = false;\n this.maybeClearStoredDeviceTokenOnMismatch(code, reasonText);\n if (shouldReconnect) {\n this.gatewayWsReconnectRequested = false;\n this.opts.logger.info(\n `TunnelProxy: retrying RPC WS after local pairing approval (pending=${this.gatewayWsPending.length})`,\n );\n queueMicrotask(() => this.ensureGatewayWs());\n } else if (\n !shouldHoldForPairing &&\n (pendingCount > 0 || this.gatewayReqMetaById.size > 0)\n ) {\n this.failAllGatewayRequests(\n \"GATEWAY_RPC_DISCONNECTED\",\n `local gateway RPC disconnected: code=${code}, reason=${reasonText}`,\n );\n }\n });\n\n ws.on(\"error\", (err: Error) => {\n clearHandshakeTimer();\n this.opts.logger.warn(\n `TunnelProxy: RPC WS error: ${err.message} (ready=${this.gatewayWsReady}, pending=${this.gatewayWsPending.length}, activeWs=${this.wsProxy.activeCount})`,\n );\n const shouldFailRequests =\n this.gatewayWs === ws &&\n (this.gatewayWsPending.length > 0 || this.gatewayReqMetaById.size > 0);\n this.gatewayWsConnecting = false;\n if (this.gatewayWs === ws) {\n this.gatewayWs = null;\n this.gatewayWsReady = false;\n }\n if (shouldFailRequests) {\n this.failAllGatewayRequests(\n \"GATEWAY_RPC_ERROR\",\n `local gateway RPC error: ${err.message}`,\n );\n }\n try {\n if (typeof (ws as any).terminate === \"function\") {\n (ws as any).terminate();\n }\n } catch {\n // ignore\n }\n });\n }\n\n private handleConnectChallenge(ws: WebSocket, frame: any): void {\n const challengeNonce: string = frame.payload?.nonce ?? \"\";\n const connectRequestId = `tunnel-connect-${randomUUID()}`;\n const role = \"operator\";\n const scopes = [...GATEWAY_OPERATOR_SCOPES];\n const gatewayConnectAuth = this.buildGatewayConnectAuth(role);\n this.opts.logger.info(\n `TunnelProxy: received connect.challenge (nonce=${challengeNonce}, connectReqId=${connectRequestId}, hasToken=${!!gatewayConnectAuth.authToken}, hasPassword=${!!gatewayConnectAuth.authPassword}, hasDeviceToken=${!!gatewayConnectAuth.deviceToken}), sending connect request with device identity`,\n );\n\n const signedAtMs = Date.now();\n const clientId = \"gateway-client\";\n const clientMode = \"backend\";\n\n const authPayload = buildDeviceAuthPayload({\n deviceId: this.deviceIdentity.deviceId,\n clientId,\n clientMode,\n role,\n scopes,\n signedAtMs,\n token: gatewayConnectAuth.authToken ?? null,\n nonce: challengeNonce,\n });\n const signature = signDevicePayload(\n this.deviceIdentity.privateKeyPem,\n authPayload,\n );\n\n const connectReq = {\n type: \"req\",\n id: connectRequestId,\n method: \"connect\",\n params: {\n minProtocol: GATEWAY_RPC_MIN_PROTOCOL,\n maxProtocol: GATEWAY_RPC_MAX_PROTOCOL,\n client: {\n id: clientId,\n version: \"1.0.0\",\n platform: process.platform,\n mode: clientMode,\n instanceId: RELAY_TUNNEL_GATEWAY_CLIENT_INSTANCE_ID,\n },\n role,\n scopes,\n ...(gatewayConnectAuth.auth ? { auth: gatewayConnectAuth.auth } : {}),\n device: {\n id: this.deviceIdentity.deviceId,\n publicKey: publicKeyRawBase64UrlFromPem(\n this.deviceIdentity.publicKeyPem,\n ),\n signature,\n signedAt: signedAtMs,\n nonce: challengeNonce,\n },\n },\n };\n ws.send(JSON.stringify(connectReq));\n }\n}\n",
105
+ "import { createRequire } from \"node:module\";\nimport { resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\n/**\n * Plugins extracted under ~/.openclaw/extensions are outside the host package's\n * node_modules tree. Resolve SDK subpaths relative to the running host entry\n * when Node's normal package lookup cannot see the OpenClaw installation.\n */\nexport function resolveHostSdkModuleFromHostEntry(\n specifier: string,\n hostEntry: string | undefined = process.argv[1],\n): string {\n if (!hostEntry?.trim()) return \"\";\n\n try {\n return createRequire(resolve(hostEntry)).resolve(specifier);\n } catch {\n return \"\";\n }\n}\n\nexport async function importHostSdkModule<T>(\n specifier: string,\n hostEntry: string | undefined = process.argv[1],\n): Promise<T> {\n try {\n return (await import(specifier)) as T;\n } catch (primaryError) {\n const resolvedPath = resolveHostSdkModuleFromHostEntry(specifier, hostEntry);\n if (!resolvedPath) throw primaryError;\n return (await import(pathToFileURL(resolvedPath).href)) as T;\n }\n}\n",
103
106
  "import * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { resolveStateDir } from \"../host.js\";\n\n// ─── Types ───\n\nexport interface DeviceIdentity {\n deviceId: string;\n publicKeyPem: string;\n privateKeyPem: string;\n}\n\nexport interface DeviceAuthEntry {\n token: string;\n role: string;\n scopes: string[];\n updatedAtMs: number;\n}\n\ninterface DeviceAuthStore {\n version: 1;\n deviceId: string;\n tokens: Record<string, DeviceAuthEntry>;\n}\n\n// ─── Crypto helpers ───\n\nconst ED25519_SPKI_PREFIX = Buffer.from(\"302a300506032b6570032100\", \"hex\");\n\nexport function base64UrlEncode(buf: Buffer): string {\n return buf\n .toString(\"base64\")\n .replaceAll(\"+\", \"-\")\n .replaceAll(\"/\", \"_\")\n .replace(/=+$/g, \"\");\n}\n\nexport function derivePublicKeyRaw(publicKeyPem: string): Buffer {\n const spki = crypto.createPublicKey(publicKeyPem).export({\n type: \"spki\",\n format: \"der\",\n });\n if (\n spki.length === ED25519_SPKI_PREFIX.length + 32 &&\n spki.subarray(0, ED25519_SPKI_PREFIX.length).equals(ED25519_SPKI_PREFIX)\n )\n return spki.subarray(ED25519_SPKI_PREFIX.length);\n return spki;\n}\n\nexport function fingerprintPublicKey(publicKeyPem: string): string {\n const raw = derivePublicKeyRaw(publicKeyPem);\n return crypto.createHash(\"sha256\").update(raw).digest(\"hex\");\n}\n\nexport function publicKeyRawBase64UrlFromPem(publicKeyPem: string): string {\n return base64UrlEncode(derivePublicKeyRaw(publicKeyPem));\n}\n\nexport function signDevicePayload(privateKeyPem: string, payload: string): string {\n const key = crypto.createPrivateKey(privateKeyPem);\n return base64UrlEncode(crypto.sign(null, Buffer.from(payload, \"utf8\"), key));\n}\n\nexport function buildDeviceAuthPayload(params: {\n deviceId: string;\n clientId: string;\n clientMode: string;\n role: string;\n scopes: string[];\n signedAtMs: number;\n token: string | null;\n nonce: string;\n}): string {\n const scopes = params.scopes.join(\",\");\n const token = params.token ?? \"\";\n return [\n \"v2\",\n params.deviceId,\n params.clientId,\n params.clientMode,\n params.role,\n scopes,\n String(params.signedAtMs),\n token,\n params.nonce,\n ].join(\"|\");\n}\n\n// ─── File I/O helpers ───\n\nexport function resolveClientStateDir(stateDir: string | undefined): string {\n return stateDir ?? resolveStateDir();\n}\n\nfunction ensureDir(filePath: string): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n}\n\nfunction resolveIdentityPath(stateDir: string): string {\n return path.join(stateDir, \"identity\", \"device.json\");\n}\n\nfunction normalizeDeviceAuthRole(role: string): string {\n return role.trim();\n}\n\nfunction normalizeDeviceAuthScopes(scopes: string[]): string[] {\n const out = new Set<string>();\n for (const scope of scopes) {\n const trimmed = scope.trim();\n if (trimmed) {\n out.add(trimmed);\n }\n }\n return [...out].sort();\n}\n\nfunction resolveDeviceAuthPath(stateDir: string): string {\n return path.join(stateDir, \"identity\", \"device-auth.json\");\n}\n\nfunction readDeviceAuthStore(filePath: string): DeviceAuthStore | null {\n try {\n if (!fs.existsSync(filePath)) return null;\n const raw = fs.readFileSync(filePath, \"utf8\");\n const parsed = JSON.parse(raw);\n if (parsed?.version !== 1 || typeof parsed.deviceId !== \"string\") return null;\n if (!parsed.tokens || typeof parsed.tokens !== \"object\") return null;\n return parsed as DeviceAuthStore;\n } catch {\n return null;\n }\n}\n\nfunction writeDeviceAuthStore(filePath: string, store: DeviceAuthStore): void {\n ensureDir(filePath);\n fs.writeFileSync(filePath, `${JSON.stringify(store, null, 2)}\\n`, {\n mode: 0o600,\n });\n try {\n fs.chmodSync(filePath, 0o600);\n } catch {\n // ignore chmod errors on unsupported filesystems\n }\n}\n\n// ─── Token CRUD ───\n\nexport function loadDeviceAuthToken(params: {\n stateDir: string;\n deviceId: string;\n role: string;\n}): DeviceAuthEntry | null {\n const store = readDeviceAuthStore(resolveDeviceAuthPath(params.stateDir));\n if (!store || store.deviceId !== params.deviceId) return null;\n const entry = store.tokens[normalizeDeviceAuthRole(params.role)];\n if (!entry || typeof entry.token !== \"string\") return null;\n return entry;\n}\n\nexport function storeDeviceAuthToken(params: {\n stateDir: string;\n deviceId: string;\n role: string;\n token: string;\n scopes: string[];\n}): DeviceAuthEntry {\n const filePath = resolveDeviceAuthPath(params.stateDir);\n const existing = readDeviceAuthStore(filePath);\n const role = normalizeDeviceAuthRole(params.role);\n const next: DeviceAuthStore = {\n version: 1,\n deviceId: params.deviceId,\n tokens:\n existing && existing.deviceId === params.deviceId && existing.tokens\n ? { ...existing.tokens }\n : {},\n };\n const entry: DeviceAuthEntry = {\n token: params.token,\n role,\n scopes: normalizeDeviceAuthScopes(params.scopes),\n updatedAtMs: Date.now(),\n };\n next.tokens[role] = entry;\n writeDeviceAuthStore(filePath, next);\n return entry;\n}\n\nexport function clearDeviceAuthToken(params: {\n stateDir: string;\n deviceId: string;\n role: string;\n}): void {\n const filePath = resolveDeviceAuthPath(params.stateDir);\n const store = readDeviceAuthStore(filePath);\n if (!store || store.deviceId !== params.deviceId) return;\n const role = normalizeDeviceAuthRole(params.role);\n if (!store.tokens[role]) return;\n const next: DeviceAuthStore = {\n version: 1,\n deviceId: store.deviceId,\n tokens: { ...store.tokens },\n };\n delete next.tokens[role];\n writeDeviceAuthStore(filePath, next);\n}\n\n// ─── Identity lifecycle ───\n\nexport function loadOrCreateDeviceIdentity(stateDir: string): DeviceIdentity {\n const filePath = resolveIdentityPath(stateDir);\n try {\n if (fs.existsSync(filePath)) {\n const raw = fs.readFileSync(filePath, \"utf8\");\n const parsed = JSON.parse(raw);\n if (\n parsed?.version === 1 &&\n typeof parsed.deviceId === \"string\" &&\n typeof parsed.publicKeyPem === \"string\" &&\n typeof parsed.privateKeyPem === \"string\"\n ) {\n const derivedId = fingerprintPublicKey(parsed.publicKeyPem);\n return {\n deviceId: derivedId,\n publicKeyPem: parsed.publicKeyPem,\n privateKeyPem: parsed.privateKeyPem,\n };\n }\n }\n } catch {\n // fall through to generate\n }\n // Generate new identity\n const { publicKey, privateKey } = crypto.generateKeyPairSync(\"ed25519\");\n const publicKeyPem = publicKey\n .export({ type: \"spki\", format: \"pem\" })\n .toString();\n const privateKeyPem = privateKey\n .export({ type: \"pkcs8\", format: \"pem\" })\n .toString();\n const identity: DeviceIdentity = {\n deviceId: fingerprintPublicKey(publicKeyPem),\n publicKeyPem,\n privateKeyPem,\n };\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n const stored = {\n version: 1,\n ...identity,\n createdAtMs: Date.now(),\n };\n ensureDir(filePath);\n fs.writeFileSync(filePath, `${JSON.stringify(stored, null, 2)}\\n`, {\n mode: 0o600,\n });\n return identity;\n}\n",
104
107
  "import type { RelayClient } from \"./relay-client.js\";\nimport type { RequestFrame } from \"./types.js\";\nimport { previewText, summarizeRequestHeaders } from \"./utils.js\";\n\nexport const RELAY_INTERNAL_HTTP_HEADER = \"x-openclaw-relay-internal\";\n\nexport interface HttpProxyOptions {\n gatewayBaseUrl: string;\n gatewayAuthMode?: \"token\" | \"password\";\n gatewayToken?: string;\n gatewayPassword?: string;\n abortSignal?: AbortSignal;\n client: RelayClient;\n logger: {\n info: (msg: string) => void;\n warn: (msg: string) => void;\n error: (msg: string) => void;\n };\n}\n\n// ─── 路径映射 ───\n\nconst PATH_MAP: Record<string, string> = {\n \"/api/message/messageBridge/send\": \"/notifications\",\n};\n\nexport function mapPath(p: string): string {\n return PATH_MAP[p] ?? p;\n}\n\n// ─── Auth helpers ───\n\nfunction resolveGatewayConnectAuth(opts: HttpProxyOptions):\n | { token?: string; password?: string }\n | undefined {\n const token = opts.gatewayToken?.trim() || undefined;\n const password = opts.gatewayPassword?.trim() || undefined;\n if (!token && !password) return undefined;\n return { token, password };\n}\n\nexport function buildLocalGatewayAuthAttempts(\n opts: HttpProxyOptions,\n baseHeaders: Record<string, string>,\n): Array<{ label: string; headers: Record<string, string> }> {\n const auth = resolveGatewayConnectAuth(opts);\n const attempts: Array<{ label: string; headers: Record<string, string> }> = [];\n const seen = new Set<string>();\n const authMode = opts.gatewayAuthMode;\n\n const addAttempt = (kind: \"token\" | \"password\", secret?: string): void => {\n if (!secret) return;\n\n const dedupeKey = `${kind}:${secret}`;\n if (seen.has(dedupeKey)) return;\n seen.add(dedupeKey);\n\n const headers = { ...baseHeaders };\n headers.authorization = `Bearer ${secret}`;\n\n if (kind === \"password\") {\n headers[\"x-openclaw-password\"] = secret;\n } else {\n delete headers[\"x-openclaw-password\"];\n }\n\n attempts.push({\n label: kind === \"token\" ? \"gateway-token\" : \"gateway-password\",\n headers,\n });\n };\n\n if (authMode === \"password\") {\n addAttempt(\"password\", auth?.password);\n addAttempt(\"token\", auth?.token);\n } else {\n addAttempt(\"token\", auth?.token);\n addAttempt(\"password\", auth?.password);\n }\n\n if (attempts.length === 0) {\n attempts.push({\n label: \"no-auth\",\n headers: { ...baseHeaders },\n });\n }\n\n return attempts;\n}\n\n// ─── HTTP request proxy ───\n\nexport async function handleHttpRequest(\n opts: HttpProxyOptions,\n frame: RequestFrame,\n): Promise<void> {\n const mappedPath = mapPath(frame.path);\n const url = new URL(mappedPath, opts.gatewayBaseUrl);\n const startedAtMs = Date.now();\n\n // 代理到本地 gateway 时,替换外部鉴权头为本地 gateway token/password。\n const localHeaders: Record<string, string> = {};\n for (const [k, v] of Object.entries(frame.headers ?? {})) {\n const lower = k.toLowerCase();\n if (lower !== \"authorization\" && lower !== \"x-openclaw-password\") {\n localHeaders[k] = v;\n }\n }\n localHeaders[RELAY_INTERNAL_HTTP_HEADER] = \"1\";\n\n const authAttempts = buildLocalGatewayAuthAttempts(opts, localHeaders);\n opts.logger.info(\n `TunnelProxy: HTTP id=${frame.id} ${frame.method} ${frame.path} → ${url.toString()}${summarizeRequestHeaders(frame.headers)}, authAttempts=${authAttempts.map((a) => a.label).join(\" -> \")}, body=${previewText(frame.body)}`,\n );\n\n try {\n for (let attemptIndex = 0; attemptIndex < authAttempts.length; attemptIndex++) {\n const attempt = authAttempts[attemptIndex];\n opts.logger.info(\n `TunnelProxy: HTTP id=${frame.id} attempt ${attemptIndex + 1}/${authAttempts.length} auth=${attempt.label}`,\n );\n const res = await fetch(url.toString(), {\n method: frame.method,\n headers: attempt.headers,\n signal: opts.abortSignal,\n body:\n frame.method !== \"GET\" && frame.method !== \"HEAD\"\n ? frame.body\n : undefined,\n });\n\n const hasFallback = attemptIndex < authAttempts.length - 1;\n if (res.status === 401 && hasFallback) {\n const body = await res.text();\n opts.logger.warn(\n `TunnelProxy: HTTP id=${frame.id} local gateway auth via ${attempt.label} returned 401 after ${Date.now() - startedAtMs}ms, retrying next credential${body ? `, body=${previewText(body)}` : \"\"}`,\n );\n continue;\n }\n\n await sendHttpResponse(opts, {\n frameId: frame.id,\n method: frame.method,\n path: mappedPath,\n authLabel: attempt.label,\n startedAtMs,\n res,\n });\n return;\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n opts.logger.error(\n `TunnelProxy: HTTP id=${frame.id} ${frame.method} ${mappedPath} failed after ${Date.now() - startedAtMs}ms: ${message}`,\n );\n opts.client.send({\n type: \"proxy_error\",\n id: frame.id,\n status: 502,\n message: `gateway unreachable: ${message}`,\n });\n }\n}\n\n// ─── Response helpers ───\n\nasync function sendHttpResponse(\n opts: HttpProxyOptions,\n params: {\n frameId: string;\n method: string;\n path: string;\n authLabel: string;\n startedAtMs: number;\n res: Response;\n },\n): Promise<void> {\n const { frameId, method, path, authLabel, startedAtMs, res } = params;\n const contentType = res.headers.get(\"content-type\") ?? \"\";\n const isStreaming = contentType.includes(\"text/event-stream\");\n const elapsedMs = Date.now() - startedAtMs;\n\n opts.logger.info(\n `TunnelProxy: HTTP id=${frameId} ${method} ${path} <= ${res.status} (${elapsedMs}ms, auth=${authLabel}, content-type=${contentType}, streaming=${isStreaming})`,\n );\n\n if (isStreaming && res.body) {\n await streamResponse(opts, frameId, res, startedAtMs);\n return;\n }\n\n const body = await res.text();\n opts.logger.info(\n `TunnelProxy: HTTP id=${frameId} response body=${previewText(body)}`,\n );\n const headers: Record<string, string> = {};\n res.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n opts.client.send({\n type: \"proxy_response\",\n id: frameId,\n status: res.status,\n headers,\n body,\n });\n}\n\nasync function streamResponse(\n opts: HttpProxyOptions,\n requestId: string,\n res: Response,\n startedAtMs: number,\n): Promise<void> {\n const reader = res.body!.getReader();\n const decoder = new TextDecoder();\n let chunkCount = 0;\n\n opts.logger.info(`TunnelProxy: stream start id=${requestId}`);\n\n try {\n while (true) {\n if (opts.abortSignal?.aborted) {\n throw new DOMException(\"relay tunnel disconnected\", \"AbortError\");\n }\n const { done, value } = await reader.read();\n if (done) break;\n\n chunkCount++;\n const chunk = decoder.decode(value, { stream: true });\n opts.logger.info(\n `TunnelProxy: stream delta id=${requestId} chunk#${chunkCount} (${chunk.length} chars)`,\n );\n opts.client.send({\n type: \"stream\",\n id: requestId,\n state: \"delta\",\n data: chunk,\n });\n }\n\n opts.logger.info(\n `TunnelProxy: stream end id=${requestId}, total chunks=${chunkCount}, totalElapsedMs=${Date.now() - startedAtMs}`,\n );\n opts.client.send({\n type: \"stream\",\n id: requestId,\n state: \"end\",\n data: \"\",\n });\n } catch (err) {\n opts.logger.error(\n `TunnelProxy: stream error id=${requestId} after ${chunkCount} chunks and ${Date.now() - startedAtMs}ms: ${err instanceof Error ? err.message : String(err)}`,\n );\n opts.client.send({\n type: \"proxy_error\",\n id: requestId,\n status: 502,\n message: `stream error: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n}\n",
105
108
  "import WebSocket from \"ws\";\nimport type { RelayClient } from \"./relay-client.js\";\nimport type { WsOpenFrame, WsDataFrame, WsCloseFrame } from \"./types.js\";\nimport { mapPath } from \"./http-proxy.js\";\n\nconst GATEWAY_WS_HANDSHAKE_TIMEOUT_MS = 10_000;\n\nexport interface WsProxyOptions {\n gatewayBaseUrl: string;\n client: RelayClient;\n logger: {\n info: (msg: string) => void;\n warn: (msg: string) => void;\n error: (msg: string) => void;\n };\n}\n\nexport class WsProxy {\n /** 活跃的 WebSocket 代理连接,按帧 id 索引 */\n private connections = new Map<string, WebSocket>();\n\n constructor(private readonly opts: WsProxyOptions) {}\n\n get activeCount(): number {\n return this.connections.size;\n }\n\n cleanup(): void {\n const connections = [...this.connections.entries()];\n this.connections.clear();\n for (const [id, ws] of connections) {\n this.opts.logger.info(`WsProxy: closing WS id=${id}`);\n try {\n ws.close();\n } catch {\n // ignore\n }\n }\n }\n\n handleWsOpen(frame: WsOpenFrame): void {\n const wsUrl =\n this.opts.gatewayBaseUrl.replace(/^http/, \"ws\") +\n mapPath(frame.path);\n this.opts.logger.info(\n `TunnelProxy: WS open id=${frame.id}, path=${frame.path} → ${wsUrl}`,\n );\n\n try {\n const existing = this.connections.get(frame.id);\n if (existing) {\n this.opts.logger.warn(\n `TunnelProxy: WS id=${frame.id} already exists, closing previous gateway connection`,\n );\n try {\n existing.close(1000, \"replaced by new relay ws_open\");\n } catch {\n // ignore\n }\n }\n\n const ws = new WebSocket(wsUrl, {\n headers: frame.headers,\n handshakeTimeout: GATEWAY_WS_HANDSHAKE_TIMEOUT_MS,\n });\n this.connections.set(frame.id, ws);\n\n let notifiedClosed = false;\n let connectTimer: ReturnType<typeof setTimeout> | null = setTimeout(\n () => {\n connectTimer = null;\n if (\n this.connections.get(frame.id) !== ws ||\n ws.readyState === WebSocket.OPEN\n ) {\n return;\n }\n this.opts.logger.warn(\n `TunnelProxy: WS id=${frame.id} connect timed out after ${GATEWAY_WS_HANDSHAKE_TIMEOUT_MS}ms`,\n );\n notifyClosed(1011, \"gateway websocket connect timeout\");\n try {\n if (typeof (ws as any).terminate === \"function\") {\n (ws as any).terminate();\n } else {\n ws.close();\n }\n } catch {\n // ignore\n }\n },\n GATEWAY_WS_HANDSHAKE_TIMEOUT_MS,\n );\n\n const clearConnectTimer = () => {\n if (connectTimer) {\n clearTimeout(connectTimer);\n connectTimer = null;\n }\n };\n\n const notifyClosed = (code: number, reason: string) => {\n if (notifiedClosed) return;\n notifiedClosed = true;\n clearConnectTimer();\n if (this.connections.get(frame.id) === ws) {\n this.connections.delete(frame.id);\n }\n this.opts.client.send({\n type: \"ws_close\",\n id: frame.id,\n code,\n reason,\n });\n };\n\n ws.on(\"open\", () => {\n clearConnectTimer();\n if (this.connections.get(frame.id) !== ws) {\n try {\n ws.close(1000, \"stale relay ws_open\");\n } catch {\n // ignore\n }\n return;\n }\n this.opts.logger.info(\n `TunnelProxy: WS id=${frame.id} connected to gateway, active=${this.connections.size}`,\n );\n this.opts.client.send({\n type: \"ws_opened\",\n id: frame.id,\n });\n });\n\n ws.on(\"message\", (data: WebSocket.RawData) => {\n if (this.connections.get(frame.id) !== ws) {\n return;\n }\n const text =\n typeof data === \"string\"\n ? data\n : Buffer.isBuffer(data)\n ? data.toString()\n : String(data);\n\n this.opts.logger.info(\n `TunnelProxy: WS id=${frame.id} ← gateway data (${text.length} chars): ${text.substring(0, 200)}`,\n );\n this.opts.client.send({\n type: \"ws_data\",\n id: frame.id,\n data: text,\n });\n });\n\n ws.on(\"close\", (code: number, reason: Buffer) => {\n clearConnectTimer();\n const reasonText = reason.toString();\n const isCurrent = this.connections.get(frame.id) === ws;\n if (isCurrent) {\n this.connections.delete(frame.id);\n }\n this.opts.logger.info(\n `TunnelProxy: WS id=${frame.id} closed by gateway (code=${code}, reason=${reasonText}), active=${this.connections.size}`,\n );\n if (isCurrent) {\n notifyClosed(code, reasonText);\n }\n });\n\n ws.on(\"error\", (err: Error) => {\n clearConnectTimer();\n this.opts.logger.warn(\n `TunnelProxy: WS id=${frame.id} error: ${err.message}, active=${this.connections.size}`,\n );\n if (this.connections.get(frame.id) === ws) {\n notifyClosed(1011, err.message);\n }\n try {\n if (typeof (ws as any).terminate === \"function\") {\n (ws as any).terminate();\n }\n } catch {\n // ignore\n }\n });\n } catch (err) {\n this.opts.logger.error(\n `TunnelProxy: WS id=${frame.id} failed to connect: ${err instanceof Error ? err.message : String(err)}`,\n );\n this.opts.client.send({\n type: \"ws_close\",\n id: frame.id,\n code: 1011,\n reason: `failed to connect: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n }\n\n handleWsData(frame: WsDataFrame): void {\n const ws = this.connections.get(frame.id);\n if (ws?.readyState === WebSocket.OPEN) {\n this.opts.logger.info(\n `TunnelProxy: WS id=${frame.id} → gateway data (${frame.data.length} chars): ${frame.data.substring(0, 200)}`,\n );\n ws.send(frame.data);\n } else {\n this.opts.logger.warn(\n `TunnelProxy: WS id=${frame.id} data dropped, ws not open (exists=${!!ws}, readyState=${ws?.readyState ?? \"N/A\"})`,\n );\n }\n }\n\n handleWsClose(frame: WsCloseFrame): void {\n const ws = this.connections.get(frame.id);\n if (ws) {\n this.opts.logger.info(\n `TunnelProxy: WS id=${frame.id} close requested by relay (code=${frame.code ?? 1000}, reason=${frame.reason ?? \"\"})`,\n );\n this.connections.delete(frame.id);\n try {\n ws.close(frame.code ?? 1000, frame.reason ?? \"\");\n } catch {\n // ignore\n }\n } else {\n this.opts.logger.warn(\n `TunnelProxy: WS id=${frame.id} close requested but connection not found`,\n );\n }\n }\n}\n",
109
+ "/**\n * Relay 出站帧瘦身:截断超大的工具输出,避免单帧超过 App 端 WebSocket\n * 单消息上限(iOS URLSessionWebSocketTask 默认 1MiB)导致连接被杀。\n *\n * 已知的放大点(见 2026-05-12 日志,单次命令输出曾产生两帧各 ~226KB):\n * - agent 事件 stream=\"command_output\" 的 data.output 带全量命令输出;\n * - agent 事件 stream=\"item\"(kind=\"command\")的 data.summary 重复同一份全文;\n * - chat.history 响应里 toolResult 消息携带历史工具输出。\n * - sessions.list 响应里 lastMessagePreview/lastMessage 会夹带 memory 任务长文本。\n */\n\n/** 低于该长度的帧直接透传,不付出 parse/stringify 开销。 */\nexport const SLIM_TRIGGER_CHARS = 32 * 1024;\n\n/** 工具输出类文本的保留上限(command_output.output、history 里的 toolResult)。 */\nexport const AGENT_OUTPUT_CAP = 16 * 1024;\n\n/** 会话列表仅展示预览,避免 memory 沉淀任务把列表响应撑到数百 KB。 */\nexport const SESSION_LIST_PREVIEW_CAP = 256;\n\n/** 列表项若附带 lastMessage 全文,也只保留短摘要;详情由 chat.history 拉取。 */\nexport const SESSION_LIST_MESSAGE_CAP = 1024;\n\n/**\n * command 类 item 的 summary 保留上限。全量输出已由同一 toolCallId 的\n * command_output 帧承载(按 AGENT_OUTPUT_CAP 截断),summary 只需短预览,\n * 避免同一份内容以两帧全文重复下发。\n */\nexport const COMMAND_SUMMARY_CAP = 4 * 1024;\n\n/** 截断时避免落在 UTF-16 代理对中间,防止产生孤立代理项。 */\nfunction safeSliceEnd(text: string, end: number): number {\n const code = text.charCodeAt(end - 1);\n return code >= 0xd800 && code <= 0xdbff ? end - 1 : end;\n}\n\nfunction safeSliceStart(text: string, start: number): number {\n const code = text.charCodeAt(start);\n return code >= 0xdc00 && code <= 0xdfff ? start + 1 : start;\n}\n\n/** 保留首尾截断中段;命令输出的报错通常在结尾,尾部多留一些。 */\nexport function truncateText(text: string, cap: number): string {\n if (text.length <= cap) return text;\n const headLen = safeSliceEnd(text, Math.ceil(cap * 0.6));\n const tailStart = safeSliceStart(text, text.length - Math.floor(cap * 0.4));\n const omitted = tailStart - headLen;\n return (\n text.slice(0, headLen) +\n `\\n……[内容过长,已省略中间 ${omitted} 字符]……\\n` +\n text.slice(tailStart)\n );\n}\n\n/** 列表预览用单行截断,避免把换行省略标记直接展示在会话列表里。 */\nexport function truncatePreviewText(text: string, cap: number): string {\n if (text.length <= cap) return text;\n const end = safeSliceEnd(text, cap);\n return `${text.slice(0, end)}…[已截断 ${text.length - end} 字符]`;\n}\n\nfunction slimAgentEventPayload(payload: any): boolean {\n const data = payload?.data;\n if (!data || typeof data !== \"object\") return false;\n\n let changed = false;\n if (\n payload.stream === \"command_output\" &&\n typeof data.output === \"string\" &&\n data.output.length > AGENT_OUTPUT_CAP\n ) {\n data.output = truncateText(data.output, AGENT_OUTPUT_CAP);\n changed = true;\n }\n if (payload.stream === \"item\" && typeof data.summary === \"string\") {\n const cap =\n data.kind === \"command\" ? COMMAND_SUMMARY_CAP : AGENT_OUTPUT_CAP;\n if (data.summary.length > cap) {\n data.summary = truncateText(data.summary, cap);\n changed = true;\n }\n }\n return changed;\n}\n\nfunction slimToolResultContentItem(item: any): boolean {\n if (!item || typeof item !== \"object\") return false;\n\n let changed = false;\n if (\n typeof item.text === \"string\" &&\n item.text.length > AGENT_OUTPUT_CAP\n ) {\n item.text = truncateText(item.text, AGENT_OUTPUT_CAP);\n changed = true;\n }\n if (Array.isArray(item.content)) {\n for (const nested of item.content) {\n if (slimToolResultContentItem(nested)) changed = true;\n }\n }\n return changed;\n}\n\nfunction slimStringProp(\n target: any,\n prop: string,\n cap: number,\n preview = false,\n): boolean {\n if (!target || typeof target !== \"object\") return false;\n if (typeof target[prop] !== \"string\" || target[prop].length <= cap) {\n return false;\n }\n target[prop] = preview\n ? truncatePreviewText(target[prop], cap)\n : truncateText(target[prop], cap);\n return true;\n}\n\nfunction slimMessageTextContent(value: any, cap: number): boolean {\n if (!value) return false;\n\n if (typeof value === \"object\" && !Array.isArray(value)) {\n let changed = false;\n if (slimStringProp(value, \"text\", cap)) changed = true;\n if (slimStringProp(value, \"content\", cap)) changed = true;\n if (Array.isArray(value.content)) {\n for (const item of value.content) {\n if (slimMessageTextContent(item, cap)) changed = true;\n }\n }\n return changed;\n }\n\n if (Array.isArray(value)) {\n let changed = false;\n for (const item of value) {\n if (slimMessageTextContent(item, cap)) changed = true;\n }\n return changed;\n }\n\n return false;\n}\n\n/** 截断 chat.history 等响应里 toolResult 消息/内容块携带的工具输出全文。 */\nfunction slimMessagesPayload(payload: any): boolean {\n if (!Array.isArray(payload?.messages)) return false;\n\n let changed = false;\n for (const message of payload.messages) {\n if (!message || typeof message !== \"object\") continue;\n const isToolRole =\n message.role === \"toolResult\" || message.role === \"tool\";\n\n if (isToolRole && typeof message.content === \"string\") {\n if (message.content.length > AGENT_OUTPUT_CAP) {\n message.content = truncateText(message.content, AGENT_OUTPUT_CAP);\n changed = true;\n }\n continue;\n }\n\n if (!Array.isArray(message.content)) continue;\n for (const item of message.content) {\n if (!item || typeof item !== \"object\") continue;\n const isToolItem =\n item.type === \"toolResult\" || item.type === \"tool_result\";\n if (isToolRole || isToolItem) {\n if (slimToolResultContentItem(item)) changed = true;\n }\n }\n }\n return changed;\n}\n\n/** 截断 sessions.list 列表项里的长预览,保留 chat.history 的完整详情通道。 */\nfunction slimSessionsListPayload(payload: any): boolean {\n if (!Array.isArray(payload?.sessions)) return false;\n\n let changed = false;\n for (const session of payload.sessions) {\n if (!session || typeof session !== \"object\") continue;\n if (\n slimStringProp(\n session,\n \"lastMessagePreview\",\n SESSION_LIST_PREVIEW_CAP,\n true,\n )\n ) {\n changed = true;\n }\n if (slimMessageTextContent(session.lastMessage, SESSION_LIST_MESSAGE_CAP)) {\n changed = true;\n }\n }\n return changed;\n}\n\n/** 就地瘦身已解析的帧,返回是否有修改。 */\nexport function slimRelayFrame(frame: any): boolean {\n if (frame?.type === \"event\" && frame.event === \"agent\") {\n return slimAgentEventPayload(frame.payload);\n }\n if (frame?.type === \"res\" && frame.ok === true) {\n const sessionsChanged = slimSessionsListPayload(frame.payload);\n const messagesChanged = slimMessagesPayload(frame.payload);\n return sessionsChanged || messagesChanged;\n }\n return false;\n}\n\n/**\n * 对即将回传 Relay 的帧文本瘦身。小帧与无法解析的帧原样返回。\n */\nexport function slimRelayFrameText(\n text: string,\n logger?: { info: (msg: string) => void },\n): string {\n if (text.length <= SLIM_TRIGGER_CHARS) return text;\n\n let frame: any;\n try {\n frame = JSON.parse(text);\n } catch {\n return text;\n }\n\n if (!slimRelayFrame(frame)) return text;\n\n const slimmed = JSON.stringify(frame);\n logger?.info(\n `TunnelProxy: slimmed relay-bound frame ${text.length} → ${slimmed.length} chars`,\n );\n return slimmed;\n}\n",
106
110
  "import { loadApiKey } from \"../auth/credentials.js\";\nimport { getEnvUrls } from \"../env.js\";\n\nexport type GatewayConnectStatus = \"connected\" | \"disconnected\";\n\ninterface Logger {\n info: (msg: string) => void;\n warn: (msg: string) => void;\n}\n\nexport interface ConnectStatusReporter {\n report(status: GatewayConnectStatus): void;\n reset(): void;\n}\n\nexport function createConnectStatusReporter(opts: {\n logger: Logger;\n}): ConnectStatusReporter {\n const { logger } = opts;\n let lastReported: GatewayConnectStatus | null = null;\n let inFlight: Promise<void> | null = null;\n\n async function post(status: GatewayConnectStatus): Promise<void> {\n const url = getEnvUrls().gatewayConnectStatusUrl;\n if (!url) {\n logger.warn(\n \"[gateway-connect-status] url is empty for current env, skip report\",\n );\n return;\n }\n const apiKey = loadApiKey();\n if (!apiKey) {\n logger.info(\n \"[gateway-connect-status] api key missing, skip report\",\n );\n return;\n }\n const rawApiKey = apiKey.startsWith(\"Bearer \")\n ? apiKey.slice(\"Bearer \".length)\n : apiKey;\n try {\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ apiKey: rawApiKey, connectStatus: status }),\n });\n if (!res.ok) {\n logger.warn(\n `[gateway-connect-status] report ${status} failed: HTTP ${res.status} ${res.statusText}`,\n );\n return;\n }\n logger.info(`[gateway-connect-status] reported ${status}`);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n logger.warn(`[gateway-connect-status] report ${status} error: ${message}`);\n }\n }\n\n return {\n report(status: GatewayConnectStatus): void {\n if (lastReported === status) return;\n lastReported = status;\n const run = async () => {\n if (inFlight) {\n try {\n await inFlight;\n } catch {\n // ignore\n }\n }\n await post(status);\n };\n inFlight = run().finally(() => {\n inFlight = null;\n });\n },\n reset(): void {\n lastReported = null;\n },\n };\n}\n",
107
111
  "/**\n * 基于 credentials.json 的 apiKey 认证基类。\n *\n * openclaw / arkclaw / jvsclaw 三者共用同一套 apiKey 存储后端(auth/credentials.ts),\n * 仅在 ensureProvisioned(如何拿到 apiKey)上分叉。relay/HTTP 连接拿到 apiKey 后行为一致。\n *\n * 注意:插件其余位置(app-name-map / asr / light-control 等)仍直接调用 loadApiKey()\n * 读取同一个 credentials.json,因此本 Provider 只是覆盖在其上的薄层,不替换它们。\n */\nimport {\n credentialsPath,\n clearApiKeys,\n loadApiKey,\n watchCredentials,\n} from \"../../auth/credentials.js\";\nimport type { AuthCredential, AuthProvider, AuthStatus, ClawKind } from \"../types.js\";\n\n/** 去掉可能存在的 \"Bearer \" 前缀,得到裸 apiKey。 */\nfunction stripBearer(apiKey: string): string {\n return apiKey.startsWith(\"Bearer \") ? apiKey.slice(\"Bearer \".length) : apiKey;\n}\n\nexport abstract class BaseApiKeyAuthProvider implements AuthProvider {\n abstract readonly kind: ClawKind;\n\n /** 默认 no-op;jvsclaw 等需要置换 apiKey 的宿主覆写此方法。 */\n async ensureProvisioned(_abortSignal?: AbortSignal): Promise<void> {\n // openclaw / arkclaw:apiKey 由 `ntf auth set-api-key` 写入,无需置换。\n }\n\n async status(): Promise<AuthStatus> {\n const apiKey = loadApiKey();\n if (!apiKey) {\n return { ready: false, reason: \"apiKey 未设置\" };\n }\n return { ready: true, apiKeyPreview: `${apiKey.slice(0, 8)}…` };\n }\n\n async getRelayCredential(): Promise<AuthCredential> {\n const apiKey = loadApiKey();\n if (!apiKey) {\n throw new Error(\n `apiKey 未设置,请先执行 ntf auth set-api-key <apiKey>(或 ${credentialsPath()})`,\n );\n }\n const raw = stripBearer(apiKey);\n return {\n query: { apiKey: raw },\n headers: { \"X-Api-Key-Id\": raw },\n };\n }\n\n async clear(): Promise<void> {\n clearApiKeys();\n }\n\n watch(onChange: () => void): () => void {\n return watchCredentials(onChange);\n }\n}\n",
108
112
  "import { BaseApiKeyAuthProvider } from \"./base-apikey.js\";\nimport type { ClawKind } from \"../types.js\";\n\n/** 本地 openclaw:apiKey 由用户通过 `ntf auth set-api-key` 写入,ensureProvisioned 为 no-op。 */\nexport class OpenclawAuthProvider extends BaseApiKeyAuthProvider {\n readonly kind: ClawKind = \"openclaw\";\n}\n",
109
113
  "import { BaseApiKeyAuthProvider } from \"./base-apikey.js\";\nimport type { ClawKind } from \"../types.js\";\n\n/**\n * arkclaw:当前保持现状,认证流程与 openclaw 等同(apiKey 由用户写入)。\n * 后续若 arkclaw 引入独立的置换/配对流程,覆写 ensureProvisioned 即可。\n */\nexport class ArkclawAuthProvider extends BaseApiKeyAuthProvider {\n readonly kind: ClawKind = \"arkclaw\";\n}\n",
110
114
  "/**\n * jvsclaw(阿里云)认证 Provider。\n *\n * jvsclaw 实例启动时由宿主把密文写入 openclaw.json 的\n * `plugins.entries.phone-notifications.config.link_secret`。当前 jvsclaw 宿主可能把\n * pluginConfig 从错误的 openclaw.json 注入进来,所以这里优先从 profile 层统一解析的\n * 可写配置路径读取;JvsClaw 默认是 /home/admin/.openclaw/openclaw.json。\n * 拿到密文后调 claw-manager 的 instance/ready 接口换取 apiKey,落盘后再走与\n * openclaw 相同的 apiKey 连接流程。\n *\n * POST {host}/claw-manager/internal/claw-manager/instance/ready\n * body: { token, clawCode:\"JvsClaw\", pluginVersion, hostname }\n * resp: { code:\"000000\", msg:\"success\", data:{ apiKey:\"oc_api_xxx\" } }\n *\n * 失败策略:指数退避重试直到成功(拿不到 apiKey 就不放行 relay 连接);插件停止时\n * 通过 abortSignal 中止重试。但若返回参数/绑定/归属等不可恢复的错误码\n * (见 FATAL_READY_CODES),继续轮询也不会成功,直接停止重试。\n * 已有 apiKey 且 link_secret 未变化时幂等返回。\n */\nimport { createHash } from \"node:crypto\";\nimport os from \"node:os\";\nimport { readFileSync, watch } from \"node:fs\";\nimport { basename, dirname, join } from \"node:path\";\nimport {\n loadApiKey,\n readCredentials,\n writeCredentials,\n} from \"../../auth/credentials.js\";\nimport { getEnvUrls } from \"../../env.js\";\nimport { PLUGIN_VERSION } from \"../../version.js\";\nimport { resolveConfigPath } from \"../runtime-paths.js\";\nimport { DEFAULT_JVSCLAW_STATE_DIR } from \"../paths.js\";\nimport { BaseApiKeyAuthProvider } from \"./base-apikey.js\";\nimport type { ClawKind } from \"../types.js\";\nimport type { AuthProviderDeps } from \"./index.js\";\n\nconst CLAW_CODE = \"JvsClaw\";\nconst RETRY_BASE_MS = 2_000;\nconst RETRY_MAX_MS = 60_000;\n\n/**\n * instance/ready 返回这些 code 时表示参数/绑定/归属等不可恢复的错误,\n * 继续轮询也不会成功,直接放弃重试。\n */\nconst FATAL_READY_CODES = new Set<string>([\n \"54016\", // JVS_READY_PARAM_INVALID: request/token is required\n \"54017\", // JVS_READY_UNSUPPORTED_CLAW_CODE: unsupported clawCode\n \"54018\", // JVS_READY_TOKEN_INVALID: JvsClaw Token解析失败\n \"54020\", // JVS_READY_BIND_CONFLICT: JvsClaw实例绑定冲突\n \"54024\", // JVS_READY_OWNERSHIP_NOT_FOUND: JvsClaw用户归属不存在\n]);\nexport const JVSCLAW_LINK_SECRET_CONFIG_PATH = join(\n DEFAULT_JVSCLAW_STATE_DIR,\n \"openclaw.json\",\n);\nconst PLUGIN_ID = \"phone-notifications\";\nconst LINK_SECRET_WATCH_DEBOUNCE_MS = 250;\n\ninterface InstanceReadyResponse {\n code?: string;\n msg?: string;\n data?: { apiKey?: string };\n}\n\n/** instance/ready 返回不可恢复错误码时抛出,用于中止轮询。 */\nclass FatalReadyError extends Error {\n constructor(\n readonly code: string,\n message: string,\n ) {\n super(message);\n this.name = \"FatalReadyError\";\n }\n}\n\nexport class JvsclawAuthProvider extends BaseApiKeyAuthProvider {\n readonly kind: ClawKind = \"jvsclaw\";\n\n constructor(private readonly deps: AuthProviderDeps) {\n super();\n }\n\n override async ensureProvisioned(abortSignal?: AbortSignal): Promise<void> {\n const existingApiKey = loadApiKey();\n const provisionInput = this.resolveProvisionInput();\n if (existingApiKey && !provisionInput) {\n this.deps.logger.info(\n \"jvsclaw auth: apiKey 已存在且未找到 link_secret,跳过置换\",\n );\n return;\n }\n\n if (\n existingApiKey &&\n provisionInput &&\n readCredentials().jvsclawLinkSecretHash === provisionInput.linkSecretHash\n ) {\n this.deps.logger.info(\n \"jvsclaw auth: apiKey 已存在且 link_secret 未变化,跳过置换\",\n );\n return;\n }\n\n const { logger } = this.deps;\n let attempt = 0;\n\n while (!abortSignal?.aborted) {\n attempt += 1;\n try {\n const currentProvisionInput = this.resolveProvisionInput();\n const apiKey = await this.exchangeApiKey(currentProvisionInput);\n const creds = readCredentials();\n delete creds.apiKeys;\n writeCredentials({\n ...creds,\n apiKey,\n token: undefined,\n jvsclawLinkSecretHash: currentProvisionInput?.linkSecretHash,\n });\n logger.info(\n `jvsclaw auth: instance/ready 置换 apiKey 成功(attempt ${attempt})`,\n );\n return;\n } catch (err: any) {\n if (err instanceof FatalReadyError) {\n logger.error(\n `jvsclaw auth: 置换失败且不可恢复(code=${err.code}): ${err.message},停止轮询`,\n );\n return;\n }\n const delayMs = Math.min(\n RETRY_BASE_MS * 2 ** (attempt - 1),\n RETRY_MAX_MS,\n );\n logger.warn(\n `jvsclaw auth: 置换失败(attempt ${attempt}): ${err?.message ?? String(err)},${delayMs}ms 后重试`,\n );\n const aborted = await sleep(delayMs, abortSignal);\n if (aborted) break;\n }\n }\n\n logger.warn(\"jvsclaw auth: 置换重试被中止(插件停止)\");\n }\n\n /** 从 jvsclaw 可写 openclaw.json 取密文并调用 instance/ready 换取 apiKey。 */\n private async exchangeApiKey(\n input = this.resolveProvisionInput(),\n ): Promise<string> {\n if (!input) {\n const configPath = resolveConfigPath();\n throw new Error(\n `未在 ${configPath} 找到 link_secret(路径: plugins.entries.${PLUGIN_ID}.config.link_secret)`,\n );\n }\n\n const url = getEnvUrls().clawManagerInstanceReadyUrl;\n if (!url) {\n throw new Error(\"instance/ready 接口地址为空(检查 host 配置)\");\n }\n\n this.deps.logger.info(`jvsclaw auth: POST ${url}`);\n\n const resp = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n token: input.token,\n clawCode: CLAW_CODE,\n pluginVersion: PLUGIN_VERSION,\n hostname: os.hostname(),\n }),\n });\n\n if (!resp.ok) {\n throw new Error(`instance/ready HTTP ${resp.status}`);\n }\n\n const json = (await resp.json()) as InstanceReadyResponse;\n if (json.code !== \"000000\") {\n const message = `instance/ready 返回 code=${json.code} msg=${json.msg ?? \"n/a\"}`;\n if (json.code && FATAL_READY_CODES.has(json.code)) {\n throw new FatalReadyError(json.code, message);\n }\n throw new Error(message);\n }\n\n const apiKey = json.data?.apiKey?.trim();\n if (!apiKey) {\n throw new Error(\"instance/ready 响应未包含 apiKey\");\n }\n return apiKey;\n }\n\n private resolveProvisionInput():\n | { token: string; linkSecretHash: string }\n | undefined {\n const configPath = resolveConfigPath();\n const token =\n readJvsclawLinkSecretFromConfigFile(configPath) ??\n this.deps.pluginConfig.link_secret?.trim();\n if (!token) return undefined;\n return {\n token,\n linkSecretHash: hashLinkSecret(token),\n };\n }\n\n override watch(onChange: () => void): () => void {\n const unwatchCredentials = super.watch(onChange);\n const configPath = resolveConfigPath();\n const configDir = dirname(configPath);\n const configFile = basename(configPath);\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n let configWatcher: ReturnType<typeof watch> | null = null;\n\n const emitChange = () => {\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => {\n debounceTimer = null;\n onChange();\n }, LINK_SECRET_WATCH_DEBOUNCE_MS);\n debounceTimer.unref?.();\n };\n\n try {\n configWatcher = watch(\n configDir,\n { persistent: false },\n (_event, changedName) => {\n if (!changedName) return;\n const name = String(changedName);\n if (name === configFile || name.endsWith(configFile)) {\n emitChange();\n }\n },\n );\n } catch {\n // 配置目录可能尚未创建;credentials watcher 仍可处理手动写 key 的场景。\n }\n\n return () => {\n unwatchCredentials();\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n debounceTimer = null;\n }\n configWatcher?.close();\n };\n }\n}\n\nfunction hashLinkSecret(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nexport function readJvsclawLinkSecretFromConfigFile(\n configPath = resolveConfigPath(),\n): string | undefined {\n let config: unknown;\n try {\n config = JSON.parse(readFileSync(configPath, \"utf-8\"));\n } catch {\n return undefined;\n }\n\n const entries = readObject(readObject(config, \"plugins\"), \"entries\");\n const pluginEntry = readObject(entries, PLUGIN_ID);\n const pluginConfig = readObject(pluginEntry, \"config\");\n const linkSecret = pluginConfig?.link_secret;\n return typeof linkSecret === \"string\"\n ? linkSecret.trim() || undefined\n : undefined;\n}\n\nfunction readObject(\n value: unknown,\n key: string,\n): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n const nested = (value as Record<string, unknown>)[key];\n return nested && typeof nested === \"object\"\n ? (nested as Record<string, unknown>)\n : undefined;\n}\n\n/** 可被 abortSignal 提前唤醒的 sleep;返回 true 表示是被中止唤醒的。 */\nfunction sleep(ms: number, signal?: AbortSignal): Promise<boolean> {\n return new Promise((resolve) => {\n if (signal?.aborted) {\n resolve(true);\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve(false);\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n resolve(true);\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n",
111
115
  "/**\n * 按当前渠道 Profile 选择 AuthProvider。\n *\n * 调用方在拿到运行期依赖(logger 等)后调用本函数,避免把这些依赖穿透进\n * resolveClawProfile()。三者共享 credentials.json 存储,仅 ensureProvisioned 分叉。\n */\nimport { resolveClawKind } from \"../detect.js\";\nimport type { AuthProvider } from \"../types.js\";\nimport type { PluginConfig } from \"../../types.js\";\nimport { OpenclawAuthProvider } from \"./openclaw.js\";\nimport { ArkclawAuthProvider } from \"./arkclaw.js\";\nimport { JvsclawAuthProvider } from \"./jvsclaw.js\";\n\nexport interface AuthProviderDeps {\n logger: {\n info: (msg: string) => void;\n warn: (msg: string) => void;\n error: (msg: string) => void;\n };\n /** 当前插件运行期的 pluginConfig;jvsclaw 从中读取 link_secret 密文。 */\n pluginConfig: PluginConfig;\n}\n\nexport function resolveAuthProvider(deps: AuthProviderDeps): AuthProvider {\n switch (resolveClawKind()) {\n case \"arkclaw\":\n return new ArkclawAuthProvider();\n case \"jvsclaw\":\n return new JvsclawAuthProvider(deps);\n case \"openclaw\":\n default:\n return new OpenclawAuthProvider();\n }\n}\n\nexport { BaseApiKeyAuthProvider } from \"./base-apikey.js\";\nexport { OpenclawAuthProvider } from \"./openclaw.js\";\nexport { ArkclawAuthProvider } from \"./arkclaw.js\";\nexport { JvsclawAuthProvider } from \"./jvsclaw.js\";\n",
112
- "import { randomBytes } from \"node:crypto\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport type { Logger } from \"../logger.js\";\nimport {\n type NotificationIngestResult,\n NotificationStorage,\n type StoredNotification,\n} from \"../notification/storage.js\";\nimport { RELAY_INTERNAL_HTTP_HEADER } from \"../tunnel/http-proxy.js\";\nimport type { RelayTunnelService } from \"../tunnel/service.js\";\nimport type {\n HttpNotificationBody,\n NotificationPushParams,\n RawNotification,\n} from \"../types.js\";\nimport {\n readBody,\n type GatewayMethodRegistrar,\n} from \"./shared.js\";\n\nfunction newIngestId(): string {\n return `ing_${randomBytes(4).toString(\"hex\")}`;\n}\n\nfunction summarizeIncomingBatch(items: RawNotification[]): string {\n const total = items.length;\n if (total === 0) return \"items=0\";\n const now = Date.now();\n let earliest = Number.POSITIVE_INFINITY;\n let latest = Number.NEGATIVE_INFINITY;\n for (const n of items) {\n const t = new Date(n.timestamp).getTime();\n if (Number.isNaN(t)) continue;\n if (t < earliest) earliest = t;\n if (t > latest) latest = t;\n }\n if (!Number.isFinite(earliest)) {\n return `items=${total} (all ts invalid)`;\n }\n const maxLag = now - earliest;\n const minLag = now - latest;\n return `items=${total} earliestTs=${new Date(earliest).toISOString()} lag=${minLag}..${maxLag}ms`;\n}\n\nfunction createEmptyIngestResult(): NotificationIngestResult {\n return {\n received: 0,\n ingested: 0,\n dedupedById: 0,\n dedupedByContent: 0,\n invalid: 0,\n inserted: [],\n };\n}\n\nfunction isRelayInternalHttpRequest(req: IncomingMessage): boolean {\n const header = req.headers?.[RELAY_INTERNAL_HTTP_HEADER];\n if (Array.isArray(header)) {\n return header.includes(\"1\");\n }\n return header === \"1\";\n}\n\n/**\n * 将 ingest 内部结果转成对外响应:丢弃 `inserted` 字段,\n * 它只供插件内部下游链路(如 light-rule agent 评估)使用,\n * 不应该出现在 gateway / HTTP 响应里。\n */\nfunction toIngestResponse(\n result: NotificationIngestResult,\n): Omit<NotificationIngestResult, \"inserted\"> {\n const { inserted: _inserted, ...rest } = result;\n return rest;\n}\n\ninterface NotificationInterfaceDeps {\n api: OpenClawPluginApi;\n logger: Logger;\n getStorage: () => NotificationStorage | null;\n filterNotifications: (items: RawNotification[]) => RawNotification[];\n registerGatewayMethod: GatewayMethodRegistrar;\n tunnelService?: RelayTunnelService | null;\n /** 通知落盘后的钩子,用于触发灯效规则评估。 */\n onAfterIngest?: (\n inserted: StoredNotification[],\n ingestId: string,\n ) => void | Promise<void>;\n}\n\nexport function registerNotificationInterfaces(\n deps: NotificationInterfaceDeps,\n): void {\n const {\n api,\n logger,\n getStorage,\n filterNotifications,\n registerGatewayMethod,\n tunnelService,\n onAfterIngest,\n } = deps;\n\n function triggerAfterIngest(\n inserted: StoredNotification[],\n ingestId: string,\n ): void {\n if (inserted.length === 0 || !onAfterIngest) return;\n logger.info(\n `notifications[${ingestId}]: enqueue ${inserted.length} for light-rule evaluation`,\n );\n void Promise.resolve()\n .then(() => onAfterIngest(inserted, ingestId))\n .catch((err) =>\n logger.warn(\n `notifications[${ingestId}]: onAfterIngest failed: ${err?.message ?? err}`,\n ),\n );\n }\n\n registerGatewayMethod(\n \"notifications.push\",\n async ({ params, respond }) => {\n const storage = getStorage();\n if (!storage) {\n respond(false, null, {\n code: \"NOT_READY\",\n message: \"Storage service not ready\",\n });\n return;\n }\n\n const { items } = params as unknown as NotificationPushParams;\n if (!Array.isArray(items)) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"items must be an array\",\n });\n return;\n }\n\n const ingestId = newIngestId();\n const startMs = Date.now();\n logger.info(\n `notifications[${ingestId}]: gateway notifications.push received ${summarizeIncomingBatch(items)}`,\n );\n\n const filtered = filterNotifications(items);\n if (filtered.length !== items.length) {\n logger.info(\n `notifications[${ingestId}]: filtered ${items.length - filtered.length} ignored-app item(s), kept=${filtered.length}`,\n );\n }\n const result = filtered.length\n ? await storage.ingest(filtered, ingestId)\n : createEmptyIngestResult();\n\n logger.info(\n `notifications[${ingestId}]: ingest done in ${Date.now() - startMs}ms ` +\n `(received=${result.received} ingested=${result.ingested} ` +\n `dedupedById=${result.dedupedById} dedupedByContent=${result.dedupedByContent} invalid=${result.invalid})`,\n );\n\n // 主响应先返回,不阻塞灯效评估\n respond(true, toIngestResponse(result));\n\n // 落盘后异步触发灯效评估(fire-and-forget)\n triggerAfterIngest(result.inserted, ingestId);\n },\n );\n\n api.registerHttpRoute({\n path: \"/notifications\",\n auth: \"gateway\",\n async handler(req: IncomingMessage, res: ServerResponse) {\n if (req.method !== \"POST\") {\n res.writeHead(405, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: \"Method Not Allowed\" }));\n return;\n }\n\n if (!isRelayInternalHttpRequest(req)) {\n await tunnelService?.deactivateForExternalTunnel(\"POST /notifications\");\n }\n\n const storage = getStorage();\n if (!storage) {\n res.writeHead(503, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: \"Service Not Ready\" }));\n return;\n }\n\n let body: HttpNotificationBody;\n try {\n const raw = await readBody(req);\n body = JSON.parse(raw);\n } catch {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: \"Invalid JSON\" }));\n return;\n }\n\n if (!Array.isArray(body.notifications)) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n ok: false,\n error: \"notifications must be an array\",\n }),\n );\n return;\n }\n\n const ingestId = newIngestId();\n const startMs = Date.now();\n logger.info(\n `notifications[${ingestId}]: HTTP POST /notifications received ${summarizeIncomingBatch(body.notifications)}`,\n );\n\n const filtered = filterNotifications(body.notifications);\n if (filtered.length !== body.notifications.length) {\n logger.info(\n `notifications[${ingestId}]: filtered ${body.notifications.length - filtered.length} ignored-app item(s), kept=${filtered.length}`,\n );\n }\n const result = filtered.length\n ? await storage.ingest(filtered, ingestId)\n : createEmptyIngestResult();\n\n logger.info(\n `notifications[${ingestId}]: ingest done in ${Date.now() - startMs}ms ` +\n `(received=${result.received} ingested=${result.ingested} ` +\n `dedupedById=${result.dedupedById} dedupedByContent=${result.dedupedByContent} invalid=${result.invalid})`,\n );\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true, ...toIngestResponse(result) }));\n\n // Relay tunnel 会把手机通知转发到 HTTP 端点;这里也要触发事件驱动灯效评估。\n triggerAfterIngest(result.inserted, ingestId);\n },\n });\n\n logger.info(\"Gateway 通知方法已注册: notifications.push\");\n logger.info(\"HTTP 通知端点已注册: POST /notifications\");\n}\n",
113
- "import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport type { Logger } from \"../logger.js\";\nimport {\n RecordingStorage,\n canStartTranscription,\n extractSourceTextListFromDocument,\n extractTranscriptTitleFromDocument,\n handleRecordingSync,\n initializeAsr,\n triggerTranscription,\n type RecordingIndexEntry,\n type RecordingStatusEvent,\n validateAsrConfig,\n} from \"../recording/index.js\";\nimport { RELAY_INTERNAL_HTTP_HEADER } from \"../tunnel/http-proxy.js\";\nimport type { RelayTunnelService } from \"../tunnel/service.js\";\nimport type {\n HttpRecordingBody,\n RecordingAsrInitParams,\n RecordingDetail,\n RecordingListItem,\n RecordingListParams,\n RecordingRenameParams,\n RecordingRetranscribeParams,\n RecordingStatusParams,\n RecordingSyncParams,\n RecordingTransferStatus,\n} from \"../types.js\";\nimport {\n readBody,\n trimToUndefined,\n type GatewayMethodRegistrar,\n} from \"./shared.js\";\n\nconst RECORDING_TRANSFER_STATUSES = new Set<RecordingTransferStatus>([\n \"receiving_failed\",\n \"receiving\",\n \"pending_oss_upload\",\n \"uploading_oss\",\n \"oss_uploaded\",\n \"syncing_openclaw\",\n \"sync_failed\",\n \"synced\",\n \"transcribing\",\n \"transcribe_failed\",\n \"transcribed\",\n]);\n\nfunction isRecordingTransferStatus(\n value: string,\n): value is RecordingTransferStatus {\n return RECORDING_TRANSFER_STATUSES.has(value as RecordingTransferStatus);\n}\n\nfunction buildRecordingListItem(entry: RecordingIndexEntry): RecordingListItem {\n return {\n recordingId: entry.id,\n name: entry.metadata.name,\n duration_sec: entry.metadata.duration_sec,\n file_size_bytes: entry.metadata.file_size_bytes,\n created_at: entry.metadata.created_at,\n transfer_status: entry.status,\n marker_count: entry.metadata.markers?.length ?? 0,\n has_audio: !!entry.audioFile,\n has_srt: !!entry.srtFile,\n has_transcript: !!entry.transcriptFile,\n audioFile: entry.audioFile,\n transcriptDataFile: entry.transcriptDataFile,\n transcriptFile: entry.transcriptFile,\n updatedAt: entry.updatedAt,\n ...(entry.lastError ? { error: entry.lastError } : {}),\n };\n}\n\nfunction isRelayInternalHttpRequest(req: IncomingMessage): boolean {\n const header = req.headers?.[RELAY_INTERNAL_HTTP_HEADER];\n if (Array.isArray(header)) {\n return header.includes(\"1\");\n }\n return header === \"1\";\n}\n\nfunction buildRecordingDetail(\n entry: RecordingIndexEntry,\n extras?: Partial<Pick<\n RecordingDetail,\n \"summary\" | \"title\" | \"transcript\" | \"transcriptData\"\n >>,\n): RecordingDetail {\n const title = entry.title?.trim()\n || extras?.title?.trim()\n || entry.metadata.name?.trim()\n || entry.id;\n\n return {\n recordingId: entry.id,\n name: entry.metadata.name,\n duration_sec: entry.metadata.duration_sec,\n file_size_bytes: entry.metadata.file_size_bytes,\n created_at: entry.metadata.created_at,\n location: entry.metadata.location,\n oss_audio_url: entry.metadata.oss_audio_url,\n oss_srt_url: entry.metadata.oss_srt_url,\n markers: entry.metadata.markers ?? [],\n transfer_status: entry.status,\n audioFile: entry.audioFile,\n srtFile: entry.srtFile,\n transcriptDataFile: entry.transcriptDataFile,\n transcriptFile: entry.transcriptFile,\n summaryFile: entry.summaryFile,\n title,\n summary: extras?.summary,\n transcript: extras?.transcript,\n transcriptData: extras?.transcriptData,\n ingestedAt: entry.ingestedAt,\n updatedAt: entry.updatedAt,\n ...(entry.lastError ? { error: entry.lastError } : {}),\n };\n}\n\ninterface RecordingInterfaceDeps {\n api: OpenClawPluginApi;\n logger: Logger;\n asrDataDir: string;\n getRecordingStorage: () => RecordingStorage | null;\n notifyRecordingStatus: (event: RecordingStatusEvent) => void;\n registerGatewayMethod: GatewayMethodRegistrar;\n shouldBroadcastStatusOnHttp: () => boolean;\n tunnelService?: RelayTunnelService | null;\n}\n\nexport function registerRecordingInterfaces(\n deps: RecordingInterfaceDeps,\n): void {\n const {\n api,\n logger,\n asrDataDir,\n getRecordingStorage,\n notifyRecordingStatus,\n registerGatewayMethod,\n shouldBroadcastStatusOnHttp,\n tunnelService,\n } = deps;\n\n registerGatewayMethod(\"recordings.sync\", async ({ params, respond }) => {\n const recordingStorage = getRecordingStorage();\n if (!recordingStorage) {\n respond(false, null, {\n code: \"NOT_READY\",\n message: \"Recording storage service not ready\",\n });\n return;\n }\n\n const {\n recordingId: rawRecordingId,\n recording,\n asr,\n } = params as unknown as RecordingSyncParams;\n const recordingId = trimToUndefined(rawRecordingId);\n if (!recordingId) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"recordingId is required\",\n });\n return;\n }\n\n if (!recording || !recording.oss_audio_url || !recording.created_at) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"recording with oss_audio_url and created_at is required\",\n });\n return;\n }\n\n const asrError = asr ? validateAsrConfig(asr) : undefined;\n if (asrError) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: asrError,\n });\n return;\n }\n\n const result = await handleRecordingSync(\n recordingId,\n recording,\n recordingStorage,\n asr,\n logger,\n { notifyStatus: notifyRecordingStatus },\n );\n respond(\n result.ok,\n result,\n result.ok\n ? undefined\n : {\n code: \"SYNC_FAILED\",\n message: result.error ?? \"Unknown error\",\n },\n );\n });\n\n registerGatewayMethod(\"recordings.list\", async ({ params, respond }) => {\n const recordingStorage = getRecordingStorage();\n if (!recordingStorage) {\n respond(false, null, {\n code: \"NOT_READY\",\n message: \"Recording storage service not ready\",\n });\n return;\n }\n\n const rawStatus = trimToUndefined(\n (params as RecordingListParams | undefined)?.status,\n );\n if (rawStatus && !isRecordingTransferStatus(rawStatus)) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: `invalid recording status: ${rawStatus}`,\n });\n return;\n }\n\n const status = rawStatus as RecordingTransferStatus | undefined;\n const entries = status\n ? recordingStorage.listByStatus(status)\n : recordingStorage.listAll();\n\n respond(true, {\n total: entries.length,\n recordings: entries.map(buildRecordingListItem),\n });\n });\n\n registerGatewayMethod(\"recordings.status\", async ({ params, respond }) => {\n const recordingStorage = getRecordingStorage();\n if (!recordingStorage) {\n respond(false, null, {\n code: \"NOT_READY\",\n message: \"Recording storage service not ready\",\n });\n return;\n }\n\n const { recordingId } = params as unknown as RecordingStatusParams;\n if (!recordingId) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"recordingId is required\",\n });\n return;\n }\n\n const entry = recordingStorage.findById(recordingId);\n if (!entry) {\n respond(false, null, {\n code: \"NOT_FOUND\",\n message: `Recording not found: ${recordingId}`,\n });\n return;\n }\n\n respond(\n true,\n (() => {\n const transcriptDocument =\n recordingStorage.readTranscriptDocument(recordingId);\n\n return buildRecordingDetail(entry, {\n summary: recordingStorage.readSummary(recordingId),\n title: extractTranscriptTitleFromDocument(transcriptDocument),\n transcript: extractSourceTextListFromDocument(transcriptDocument),\n transcriptData: transcriptDocument,\n });\n })(),\n );\n });\n\n registerGatewayMethod(\"recordings.rename\", async ({ params, respond }) => {\n const recordingStorage = getRecordingStorage();\n if (!recordingStorage) {\n respond(false, null, {\n code: \"NOT_READY\",\n message: \"Recording storage service not ready\",\n });\n return;\n }\n\n const { recordingId: rawRecordingId, name: rawName } =\n params as unknown as RecordingRenameParams;\n const recordingId = trimToUndefined(rawRecordingId);\n const name = trimToUndefined(rawName);\n if (!recordingId) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"recordingId is required\",\n });\n return;\n }\n if (!name) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"name is required\",\n });\n return;\n }\n\n const entry = recordingStorage.findById(recordingId);\n if (!entry) {\n respond(false, null, {\n code: \"NOT_FOUND\",\n message: `Recording not found: ${recordingId}`,\n });\n return;\n }\n\n const updated = recordingStorage.rename(recordingId, name);\n respond(true, buildRecordingDetail(updated));\n });\n\n registerGatewayMethod(\"recordings.delete\", async ({ params, respond }) => {\n const recordingStorage = getRecordingStorage();\n if (!recordingStorage) {\n respond(false, null, {\n code: \"NOT_READY\",\n message: \"Recording storage service not ready\",\n });\n return;\n }\n\n const { recordingId, deleteRemote } = params as {\n recordingId: string;\n deleteRemote?: boolean;\n };\n if (!recordingId) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"recordingId is required\",\n });\n return;\n }\n\n if (deleteRemote) {\n const deleted = recordingStorage.delete(recordingId);\n respond(\n deleted,\n { ok: deleted, recordingId, deletedRemote: true },\n deleted\n ? undefined\n : {\n code: \"NOT_FOUND\",\n message: `Recording not found: ${recordingId}`,\n },\n );\n return;\n }\n\n const deleted = recordingStorage.delete(recordingId, {\n localOnly: true,\n });\n respond(\n deleted,\n { ok: deleted, recordingId, deletedRemote: false },\n deleted\n ? undefined\n : {\n code: \"NOT_FOUND\",\n message: `Recording not found: ${recordingId}`,\n },\n );\n });\n\n registerGatewayMethod(\n \"recordings.retranscribe\",\n async ({ params, respond }) => {\n const recordingStorage = getRecordingStorage();\n if (!recordingStorage) {\n respond(false, null, {\n code: \"NOT_READY\",\n message: \"Recording storage service not ready\",\n });\n return;\n }\n\n const { recordingId, asr } =\n params as unknown as RecordingRetranscribeParams;\n if (!recordingId) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"recordingId is required\",\n });\n return;\n }\n\n const asrError = validateAsrConfig(asr);\n if (asrError) {\n respond(false, null, {\n code: \"ASR_NOT_CONFIGURED\",\n message: asrError,\n });\n return;\n }\n\n const entry = recordingStorage.findById(recordingId);\n if (!entry) {\n respond(false, null, {\n code: \"NOT_FOUND\",\n message: `Recording not found: ${recordingId}`,\n });\n return;\n }\n\n if (!canStartTranscription(entry.status)) {\n respond(false, null, {\n code: \"INVALID_STATE\",\n message: `Recording status does not allow retranscribe: ${entry.status}`,\n });\n return;\n }\n\n triggerTranscription(recordingId, recordingStorage, asr, logger, {\n notifyStatus: notifyRecordingStatus,\n }).catch((err) => {\n logger.error(\n `[recordings.retranscribe] 重试转写失败: ${recordingId}, ${err?.message ?? err}`,\n );\n });\n\n respond(true, { ok: true, recordingId, message: \"转写已重新触发\" });\n },\n );\n\n registerGatewayMethod(\"recordings.asr.init\", async ({ params, respond }) => {\n const { asr } = params as unknown as RecordingAsrInitParams;\n const asrError = validateAsrConfig(asr);\n if (asrError) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: asrError,\n });\n return;\n }\n\n const result = await initializeAsr(asr, asrDataDir, logger);\n respond(\n result.ok,\n result,\n result.ok\n ? undefined\n : {\n code: \"ASR_INIT_FAILED\",\n message: result.error ?? \"ASR init failed\",\n },\n );\n });\n\n api.registerHttpRoute({\n path: \"/recordings\",\n auth: \"gateway\",\n async handler(req: IncomingMessage, res: ServerResponse) {\n if (req.method !== \"POST\") {\n res.writeHead(405, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: \"Method Not Allowed\" }));\n return;\n }\n\n if (!isRelayInternalHttpRequest(req)) {\n await tunnelService?.deactivateForExternalTunnel(\"POST /recordings\");\n }\n\n const recordingStorage = getRecordingStorage();\n if (!recordingStorage) {\n res.writeHead(503, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: \"Service Not Ready\" }));\n return;\n }\n\n let body: HttpRecordingBody;\n try {\n const raw = await readBody(req);\n body = JSON.parse(raw);\n } catch {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: \"Invalid JSON\" }));\n return;\n }\n\n const recordingId = trimToUndefined(body.recordingId);\n if (!recordingId) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n ok: false,\n error: \"recordingId is required\",\n }),\n );\n return;\n }\n\n if (!body.recording || !body.recording.oss_audio_url) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n ok: false,\n error: \"recording with oss_audio_url is required\",\n }),\n );\n return;\n }\n\n const asrError = body.asr ? validateAsrConfig(body.asr) : undefined;\n if (asrError) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: asrError }));\n return;\n }\n\n const result = await handleRecordingSync(\n recordingId,\n body.recording,\n recordingStorage,\n body.asr,\n logger,\n shouldBroadcastStatusOnHttp()\n ? { notifyStatus: notifyRecordingStatus }\n : undefined,\n );\n\n res.writeHead(result.ok ? 200 : 500, {\n \"Content-Type\": \"application/json\",\n });\n res.end(JSON.stringify(result));\n },\n } as any);\n\n logger.info(\n \"Gateway 录音方法已注册: recordings.sync / recordings.list / recordings.status / recordings.rename / recordings.delete / recordings.retranscribe / recordings.asr.init\",\n );\n logger.info(\"HTTP 录音端点已注册: POST /recordings\");\n}\n",
116
+ "import { randomBytes } from \"node:crypto\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport type { Logger } from \"../logger.js\";\nimport {\n type NotificationIngestResult,\n NotificationStorage,\n} from \"../notification/storage.js\";\nimport {\n NOTIFICATION_SUMMARY_RESULT_EVENT,\n NOTIFICATION_SUMMARY_STATUS_EVENT,\n NotificationSummaryError,\n runNotificationSummary,\n type NotificationSummaryOptions,\n type NotificationSummaryProgressEvent,\n type NotificationSummaryResult,\n type NotificationSummaryResultEvent,\n type NotificationSummaryStatusEvent,\n} from \"../notification/summary.js\";\nimport { RELAY_INTERNAL_HTTP_HEADER } from \"../tunnel/http-proxy.js\";\nimport type { RelayTunnelService } from \"../tunnel/service.js\";\nimport type {\n HttpNotificationBody,\n NotificationPushParams,\n RawNotification,\n} from \"../types.js\";\nimport {\n readBody,\n trimToUndefined,\n type GatewayMethodRegistrar,\n} from \"./shared.js\";\n\nfunction newIngestId(): string {\n return `ing_${randomBytes(4).toString(\"hex\")}`;\n}\n\nfunction summarizeIncomingBatch(items: RawNotification[]): string {\n const total = items.length;\n if (total === 0) return \"items=0\";\n const now = Date.now();\n let earliest = Number.POSITIVE_INFINITY;\n let latest = Number.NEGATIVE_INFINITY;\n for (const n of items) {\n const t = new Date(n.timestamp).getTime();\n if (Number.isNaN(t)) continue;\n if (t < earliest) earliest = t;\n if (t > latest) latest = t;\n }\n if (!Number.isFinite(earliest)) {\n return `items=${total} (all ts invalid)`;\n }\n const maxLag = now - earliest;\n const minLag = now - latest;\n return `items=${total} earliestTs=${new Date(earliest).toISOString()} lag=${minLag}..${maxLag}ms`;\n}\n\nfunction createEmptyIngestResult(): NotificationIngestResult {\n return {\n received: 0,\n ingested: 0,\n dedupedById: 0,\n dedupedByContent: 0,\n invalid: 0,\n inserted: [],\n };\n}\n\nfunction isRelayInternalHttpRequest(req: IncomingMessage): boolean {\n const header = req.headers?.[RELAY_INTERNAL_HTTP_HEADER];\n if (Array.isArray(header)) {\n return header.includes(\"1\");\n }\n return header === \"1\";\n}\n\n/**\n * 将 ingest 内部结果转成对外响应:丢弃 `inserted` 字段,\n * 该字段只用于插件内部记录新写入条目,不应该出现在 gateway / HTTP 响应里。\n */\nfunction toIngestResponse(\n result: NotificationIngestResult,\n): Omit<NotificationIngestResult, \"inserted\"> {\n const { inserted: _inserted, ...rest } = result;\n return rest;\n}\n\ninterface NotificationInterfaceDeps {\n api: OpenClawPluginApi;\n logger: Logger;\n getStorage: () => NotificationStorage | null;\n summaryNotificationsDir?: string;\n filterNotifications: (items: RawNotification[]) => RawNotification[];\n registerGatewayMethod: GatewayMethodRegistrar;\n notifyNotificationSummaryStatus?: (event: NotificationSummaryStatusEvent) => void;\n notifyNotificationSummaryResult?: (event: NotificationSummaryResultEvent) => void;\n tunnelService?: RelayTunnelService | null;\n}\n\ninterface NotificationSummaryJobState {\n jobId: string;\n status: \"queued\" | \"running\" | \"complete\" | \"failed\";\n createdAt: string;\n updatedAt: string;\n progress?: NotificationSummaryStatusEvent;\n result?: NotificationSummaryResult;\n error?: {\n code: string;\n message: string;\n };\n}\n\nconst SUMMARY_JOB_HISTORY_LIMIT = 20;\n\nfunction newSummaryJobId(): string {\n const stamp = new Date()\n .toISOString()\n .replace(/[-:.TZ]/g, \"\")\n .slice(0, 14);\n return `sum_${stamp}_${randomBytes(4).toString(\"hex\")}`;\n}\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction readSummaryOptions(params: unknown): NotificationSummaryOptions {\n return params && typeof params === \"object\"\n ? (params as NotificationSummaryOptions)\n : {};\n}\n\nfunction serializeSummaryJob(state: NotificationSummaryJobState): Record<string, unknown> {\n return {\n ok: true,\n jobId: state.jobId,\n status: state.status,\n createdAt: state.createdAt,\n updatedAt: state.updatedAt,\n progress: state.progress ?? null,\n result: state.result ?? null,\n error: state.error ?? null,\n };\n}\n\nfunction toSummaryError(err: unknown): { code: string; message: string } {\n if (err instanceof NotificationSummaryError) {\n return { code: err.code, message: err.message };\n }\n return {\n code: \"SUMMARY_FAILED\",\n message: err instanceof Error ? err.message : String(err),\n };\n}\n\nfunction summarizeResultForEvent(\n jobId: string,\n result: NotificationSummaryResult,\n): NotificationSummaryResultEvent {\n return {\n jobId,\n status: \"complete\",\n ok: true,\n updatedAt: nowIso(),\n message: \"通知总结已完成\",\n title: \"未读通知总结\",\n markdown: result.displayMarkdown,\n total: result.total,\n limit: result.limit,\n cappedLimit: result.cappedLimit,\n range: result.range,\n progress: result.progress,\n scan: result.scan,\n byApp: result.byApp,\n bySender: result.bySender,\n byConversation: result.byConversation,\n };\n}\n\nfunction failedResultEvent(\n jobId: string,\n error: { code: string; message: string },\n): NotificationSummaryResultEvent {\n return {\n jobId,\n status: \"failed\",\n ok: false,\n updatedAt: nowIso(),\n message: `通知总结失败:${error.message}`,\n error,\n };\n}\n\ntype SummaryToolUpdate = (event: NotificationSummaryStatusEvent) => void;\ntype SummaryToolResultUpdate = (event: NotificationSummaryResultEvent) => void;\n\nexport function registerNotificationInterfaces(\n deps: NotificationInterfaceDeps,\n): void {\n const {\n api,\n logger,\n getStorage,\n summaryNotificationsDir,\n filterNotifications,\n registerGatewayMethod,\n notifyNotificationSummaryStatus,\n notifyNotificationSummaryResult,\n tunnelService,\n } = deps;\n const summaryJobs = new Map<string, NotificationSummaryJobState>();\n\n function pruneSummaryJobs(): void {\n while (summaryJobs.size > SUMMARY_JOB_HISTORY_LIMIT) {\n const oldest = summaryJobs.keys().next().value;\n if (!oldest) return;\n summaryJobs.delete(oldest);\n }\n }\n\n function rememberSummaryProgress(\n jobId: string,\n event: NotificationSummaryProgressEvent,\n ): NotificationSummaryStatusEvent {\n const statusEvent: NotificationSummaryStatusEvent = {\n ...event,\n jobId,\n };\n const existing = summaryJobs.get(jobId);\n const createdAt = existing?.createdAt ?? statusEvent.updatedAt;\n summaryJobs.set(jobId, {\n jobId,\n status: statusEvent.status,\n createdAt,\n updatedAt: statusEvent.updatedAt,\n progress: statusEvent,\n result: existing?.result,\n error: existing?.error,\n });\n pruneSummaryJobs();\n return statusEvent;\n }\n\n function emitSummaryProgress(\n jobId: string,\n event: NotificationSummaryProgressEvent,\n ): NotificationSummaryStatusEvent {\n const statusEvent = rememberSummaryProgress(jobId, event);\n notifyNotificationSummaryStatus?.(statusEvent);\n return statusEvent;\n }\n\n function markSummaryResult(\n jobId: string,\n result: NotificationSummaryResult,\n ): NotificationSummaryResultEvent {\n const updatedAt = nowIso();\n const existing = summaryJobs.get(jobId);\n summaryJobs.set(jobId, {\n jobId,\n status: \"complete\",\n createdAt: existing?.createdAt ?? updatedAt,\n updatedAt,\n progress: existing?.progress,\n result,\n });\n pruneSummaryJobs();\n const resultEvent = summarizeResultForEvent(jobId, result);\n notifyNotificationSummaryResult?.(resultEvent);\n return resultEvent;\n }\n\n function markSummaryFailed(jobId: string, err: unknown): NotificationSummaryResultEvent {\n const updatedAt = nowIso();\n const error = toSummaryError(err);\n const failedEvent = rememberSummaryProgress(jobId, {\n phase: \"failed\",\n status: \"failed\",\n message: `通知摘要失败:${error.message}`,\n updatedAt,\n error,\n });\n const existing = summaryJobs.get(jobId);\n summaryJobs.set(jobId, {\n jobId,\n status: \"failed\",\n createdAt: existing?.createdAt ?? updatedAt,\n updatedAt,\n progress: failedEvent,\n error,\n });\n notifyNotificationSummaryStatus?.(failedEvent);\n pruneSummaryJobs();\n const resultEvent = failedResultEvent(jobId, error);\n notifyNotificationSummaryResult?.(resultEvent);\n return resultEvent;\n }\n\n async function runSummaryJob(\n jobId: string,\n notificationsDir: string,\n options: NotificationSummaryOptions,\n onToolUpdate?: SummaryToolUpdate,\n onToolResultUpdate?: SummaryToolResultUpdate,\n ): Promise<NotificationSummaryResult> {\n const result = await runNotificationSummary({\n notificationsDir,\n options,\n jobId,\n onProgress(event) {\n const statusEvent = emitSummaryProgress(jobId, event);\n onToolUpdate?.(statusEvent);\n },\n });\n const resultEvent = markSummaryResult(jobId, result);\n onToolResultUpdate?.(resultEvent);\n return result;\n }\n\n function resolveSummaryNotificationsDir(): string | null {\n return getStorage()?.getStorageDir() ?? summaryNotificationsDir ?? null;\n }\n\n registerGatewayMethod(\n \"notifications.push\",\n async ({ params, respond }) => {\n const storage = getStorage();\n if (!storage) {\n respond(false, null, {\n code: \"NOT_READY\",\n message: \"Storage service not ready\",\n });\n return;\n }\n\n const { items } = params as unknown as NotificationPushParams;\n if (!Array.isArray(items)) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"items must be an array\",\n });\n return;\n }\n\n const ingestId = newIngestId();\n const startMs = Date.now();\n logger.info(\n `notifications[${ingestId}]: gateway notifications.push received ${summarizeIncomingBatch(items)}`,\n );\n\n const filtered = filterNotifications(items);\n if (filtered.length !== items.length) {\n logger.info(\n `notifications[${ingestId}]: filtered ${items.length - filtered.length} ignored-app item(s), kept=${filtered.length}`,\n );\n }\n const result = filtered.length\n ? await storage.ingest(filtered, ingestId)\n : createEmptyIngestResult();\n\n logger.info(\n `notifications[${ingestId}]: ingest done in ${Date.now() - startMs}ms ` +\n `(received=${result.received} ingested=${result.ingested} ` +\n `dedupedById=${result.dedupedById} dedupedByContent=${result.dedupedByContent} invalid=${result.invalid})`,\n );\n\n respond(true, toIngestResponse(result));\n },\n );\n\n registerGatewayMethod(\"notifications.summary.start\", async ({ params, respond }) => {\n const notificationsDir = resolveSummaryNotificationsDir();\n if (!notificationsDir) {\n respond(false, null, {\n code: \"NOT_READY\",\n message: \"Storage service not ready\",\n });\n return;\n }\n\n const jobId = newSummaryJobId();\n const updatedAt = nowIso();\n const options = readSummaryOptions(params);\n emitSummaryProgress(jobId, {\n phase: \"queued\",\n status: \"queued\",\n message: \"已开始通知摘要任务...\",\n updatedAt,\n });\n\n respond(true, {\n ok: true,\n jobId,\n status: \"queued\",\n event: NOTIFICATION_SUMMARY_STATUS_EVENT,\n resultEvent: NOTIFICATION_SUMMARY_RESULT_EVENT,\n });\n\n queueMicrotask(() => {\n runSummaryJob(jobId, notificationsDir, options).catch((err) => {\n logger.warn(\n `notifications.summary.start failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n markSummaryFailed(jobId, err);\n });\n });\n });\n\n registerGatewayMethod(\"notifications.summary.status\", async ({ params, respond }) => {\n const jobId = trimToUndefined((params as { jobId?: unknown } | undefined)?.jobId);\n if (!jobId) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"jobId is required\",\n });\n return;\n }\n\n const state = summaryJobs.get(jobId);\n if (!state) {\n respond(false, null, {\n code: \"NOT_FOUND\",\n message: `summary job not found: ${jobId}`,\n });\n return;\n }\n\n respond(true, serializeSummaryJob(state));\n });\n\n registerGatewayMethod(\"notifications.summary.result\", async ({ params, respond }) => {\n const jobId = trimToUndefined((params as { jobId?: unknown } | undefined)?.jobId);\n if (!jobId) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"jobId is required\",\n });\n return;\n }\n\n const state = summaryJobs.get(jobId);\n if (!state) {\n respond(false, null, {\n code: \"NOT_FOUND\",\n message: `summary job not found: ${jobId}`,\n });\n return;\n }\n\n respond(true, {\n ...serializeSummaryJob(state),\n done: state.status === \"complete\" || state.status === \"failed\",\n });\n });\n\n api.registerTool({\n name: \"notifications_summary\",\n label: \"Summarize Notifications\",\n description:\n \"总结手机通知/消息并在执行过程中广播 notification.summary.status 进度事件。\" +\n \"当用户要求总结最近通知、未读通知、最近消息、约 N 条通知时优先调用。\" +\n \"如果用户给出约 N 条/最近 N 条,必须把 N 原样传给 limit;未读通知没有独立过滤字段时按最近通知处理,不要自行放大数量。\" +\n \"完成时会广播 notification.summary.result,携带可直接展示的完整总结 Markdown。\" +\n \"返回的是压缩后的 Markdown 摘要输入,后续回复应基于它提炼中文总结,避免逐条罗列。\",\n parameters: {\n type: \"object\",\n additionalProperties: false,\n properties: {\n from: {\n type: \"string\",\n description: \"开始时间,ISO 8601,例如 2026-06-13T09:00:00+08:00\",\n },\n to: {\n type: \"string\",\n description: \"结束时间,ISO 8601\",\n },\n app: {\n type: \"string\",\n description: \"按应用名或显示名过滤\",\n },\n sender: {\n type: \"string\",\n description: \"按发送人/标题过滤\",\n },\n conversationType: {\n type: \"string\",\n enum: [\"group\", \"private\"],\n description: \"按会话类型过滤\",\n },\n keyword: {\n type: \"string\",\n description: \"在标题、正文、发送人、会话名中搜索关键词\",\n },\n limit: {\n type: \"number\",\n minimum: 1,\n maximum: 3000,\n description: \"纳入摘要的最大通知条数;默认 700,上限 3000\",\n },\n chunkSize: {\n type: \"number\",\n minimum: 1,\n maximum: 500,\n description: \"每个分片的通知条数;默认 150\",\n },\n },\n },\n async execute(\n _toolCallId: string,\n params: unknown,\n _signal?: AbortSignal,\n onUpdate?: (partialResult: {\n content: Array<{ type: \"text\"; text: string }>;\n details: unknown;\n }) => void,\n ) {\n const notificationsDir = resolveSummaryNotificationsDir();\n if (!notificationsDir) {\n return {\n content: [{ type: \"text\" as const, text: \"通知存储服务尚未就绪\" }],\n details: {\n ok: false,\n error: {\n code: \"NOT_READY\",\n message: \"Storage service not ready\",\n },\n },\n };\n }\n\n const jobId = newSummaryJobId();\n emitSummaryProgress(jobId, {\n phase: \"queued\",\n status: \"queued\",\n message: \"已开始通知摘要任务...\",\n updatedAt: nowIso(),\n });\n onUpdate?.({\n content: [{ type: \"text\" as const, text: \"已开始通知摘要任务...\" }],\n details: {\n ok: true,\n jobId,\n status: \"queued\",\n event: NOTIFICATION_SUMMARY_STATUS_EVENT,\n resultEvent: NOTIFICATION_SUMMARY_RESULT_EVENT,\n },\n });\n\n try {\n const result = await runSummaryJob(\n jobId,\n notificationsDir,\n readSummaryOptions(params),\n (event) => {\n onUpdate?.({\n content: [{ type: \"text\" as const, text: event.message }],\n details: {\n ok: true,\n event: NOTIFICATION_SUMMARY_STATUS_EVENT,\n ...event,\n },\n });\n },\n (event) => {\n onUpdate?.({\n content: [\n {\n type: \"text\" as const,\n text: event.markdown ?? event.message,\n },\n ],\n details: {\n event: NOTIFICATION_SUMMARY_RESULT_EVENT,\n ...event,\n },\n });\n },\n );\n return {\n content: [{ type: \"text\" as const, text: result.markdown }],\n details: result,\n };\n } catch (err) {\n const resultEvent = markSummaryFailed(jobId, err);\n onUpdate?.({\n content: [{ type: \"text\" as const, text: resultEvent.message }],\n details: {\n event: NOTIFICATION_SUMMARY_RESULT_EVENT,\n ...resultEvent,\n },\n });\n const error = toSummaryError(err);\n return {\n content: [{ type: \"text\" as const, text: error.message }],\n details: {\n ok: false,\n jobId,\n error,\n },\n };\n }\n },\n });\n\n api.registerHttpRoute({\n path: \"/notifications\",\n auth: \"gateway\",\n async handler(req: IncomingMessage, res: ServerResponse) {\n if (req.method !== \"POST\") {\n res.writeHead(405, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: \"Method Not Allowed\" }));\n return;\n }\n\n if (!isRelayInternalHttpRequest(req)) {\n await tunnelService?.deactivateForExternalTunnel(\"POST /notifications\");\n }\n\n const storage = getStorage();\n if (!storage) {\n res.writeHead(503, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: \"Service Not Ready\" }));\n return;\n }\n\n let body: HttpNotificationBody;\n try {\n const raw = await readBody(req);\n body = JSON.parse(raw);\n } catch {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: \"Invalid JSON\" }));\n return;\n }\n\n if (!Array.isArray(body.notifications)) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n ok: false,\n error: \"notifications must be an array\",\n }),\n );\n return;\n }\n\n const ingestId = newIngestId();\n const startMs = Date.now();\n logger.info(\n `notifications[${ingestId}]: HTTP POST /notifications received ${summarizeIncomingBatch(body.notifications)}`,\n );\n\n const filtered = filterNotifications(body.notifications);\n if (filtered.length !== body.notifications.length) {\n logger.info(\n `notifications[${ingestId}]: filtered ${body.notifications.length - filtered.length} ignored-app item(s), kept=${filtered.length}`,\n );\n }\n const result = filtered.length\n ? await storage.ingest(filtered, ingestId)\n : createEmptyIngestResult();\n\n logger.info(\n `notifications[${ingestId}]: ingest done in ${Date.now() - startMs}ms ` +\n `(received=${result.received} ingested=${result.ingested} ` +\n `dedupedById=${result.dedupedById} dedupedByContent=${result.dedupedByContent} invalid=${result.invalid})`,\n );\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true, ...toIngestResponse(result) }));\n },\n });\n\n logger.info(\n \"Gateway 通知方法已注册: notifications.push / notifications.summary.start / notifications.summary.status / notifications.summary.result\",\n );\n logger.info(\"Agent 通知工具已注册: notifications_summary\");\n logger.info(\"HTTP 通知端点已注册: POST /notifications\");\n}\n",
117
+ "import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport type { Logger } from \"../logger.js\";\nimport {\n RecordingStorage,\n canStartTranscription,\n extractSourceTextListFromDocument,\n extractTranscriptTitleFromDocument,\n handleRecordingResultWrite,\n handleRecordingSync,\n initializeAsr,\n triggerTranscription,\n type RecordingIndexEntry,\n type RecordingStatusEvent,\n validateAsrConfig,\n} from \"../recording/index.js\";\nimport { RELAY_INTERNAL_HTTP_HEADER } from \"../tunnel/http-proxy.js\";\nimport type { RelayTunnelService } from \"../tunnel/service.js\";\nimport type {\n HttpRecordingBody,\n RecordingAsrInitParams,\n RecordingDetail,\n RecordingListItem,\n RecordingListParams,\n RecordingRenameParams,\n RecordingResultWriteParams,\n RecordingRetranscribeParams,\n RecordingStatusParams,\n RecordingSyncParams,\n RecordingTransferStatus,\n} from \"../types.js\";\nimport {\n readBody,\n trimToUndefined,\n type GatewayMethodRegistrar,\n} from \"./shared.js\";\n\nconst RECORDING_TRANSFER_STATUSES = new Set<RecordingTransferStatus>([\n \"receiving_failed\",\n \"receiving\",\n \"pending_oss_upload\",\n \"uploading_oss\",\n \"oss_uploaded\",\n \"syncing_openclaw\",\n \"sync_failed\",\n \"synced\",\n \"transcribing\",\n \"transcribe_failed\",\n \"transcribed\",\n]);\n\nfunction isRecordingTransferStatus(\n value: string,\n): value is RecordingTransferStatus {\n return RECORDING_TRANSFER_STATUSES.has(value as RecordingTransferStatus);\n}\n\nfunction buildRecordingListItem(entry: RecordingIndexEntry): RecordingListItem {\n return {\n recordingId: entry.id,\n name: entry.metadata.name,\n duration_sec: entry.metadata.duration_sec,\n file_size_bytes: entry.metadata.file_size_bytes,\n created_at: entry.metadata.created_at,\n transfer_status: entry.status,\n marker_count: entry.metadata.markers?.length ?? 0,\n has_audio: !!entry.audioFile,\n has_srt: !!entry.srtFile,\n has_transcript: !!entry.transcriptFile,\n audioFile: entry.audioFile,\n transcriptDataFile: entry.transcriptDataFile,\n transcriptFile: entry.transcriptFile,\n updatedAt: entry.updatedAt,\n ...(entry.lastError ? { error: entry.lastError } : {}),\n };\n}\n\nfunction isRelayInternalHttpRequest(req: IncomingMessage): boolean {\n const header = req.headers?.[RELAY_INTERNAL_HTTP_HEADER];\n if (Array.isArray(header)) {\n return header.includes(\"1\");\n }\n return header === \"1\";\n}\n\nfunction buildRecordingDetail(\n entry: RecordingIndexEntry,\n extras?: Partial<Pick<\n RecordingDetail,\n \"summary\" | \"title\" | \"transcript\" | \"transcriptData\"\n >>,\n): RecordingDetail {\n const title = entry.title?.trim()\n || extras?.title?.trim()\n || entry.metadata.name?.trim()\n || entry.id;\n\n return {\n recordingId: entry.id,\n name: entry.metadata.name,\n duration_sec: entry.metadata.duration_sec,\n file_size_bytes: entry.metadata.file_size_bytes,\n created_at: entry.metadata.created_at,\n location: entry.metadata.location,\n oss_audio_url: entry.metadata.oss_audio_url,\n oss_srt_url: entry.metadata.oss_srt_url,\n markers: entry.metadata.markers ?? [],\n transfer_status: entry.status,\n audioFile: entry.audioFile,\n srtFile: entry.srtFile,\n transcriptDataFile: entry.transcriptDataFile,\n transcriptFile: entry.transcriptFile,\n summaryFile: entry.summaryFile,\n title,\n summary: extras?.summary,\n transcript: extras?.transcript,\n transcriptData: extras?.transcriptData,\n ingestedAt: entry.ingestedAt,\n updatedAt: entry.updatedAt,\n ...(entry.lastError ? { error: entry.lastError } : {}),\n };\n}\n\ninterface RecordingInterfaceDeps {\n api: OpenClawPluginApi;\n logger: Logger;\n asrDataDir: string;\n getRecordingStorage: () => RecordingStorage | null;\n notifyRecordingStatus: (event: RecordingStatusEvent) => void;\n registerGatewayMethod: GatewayMethodRegistrar;\n shouldBroadcastStatusOnHttp: () => boolean;\n tunnelService?: RelayTunnelService | null;\n}\n\nexport function registerRecordingInterfaces(\n deps: RecordingInterfaceDeps,\n): void {\n const {\n api,\n logger,\n asrDataDir,\n getRecordingStorage,\n notifyRecordingStatus,\n registerGatewayMethod,\n shouldBroadcastStatusOnHttp,\n tunnelService,\n } = deps;\n\n registerGatewayMethod(\"recordings.sync\", async ({ params, respond }) => {\n const recordingStorage = getRecordingStorage();\n if (!recordingStorage) {\n respond(false, null, {\n code: \"NOT_READY\",\n message: \"Recording storage service not ready\",\n });\n return;\n }\n\n const {\n recordingId: rawRecordingId,\n recording,\n asr,\n } = params as unknown as RecordingSyncParams;\n const recordingId = trimToUndefined(rawRecordingId);\n if (!recordingId) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"recordingId is required\",\n });\n return;\n }\n\n if (!recording || !recording.oss_audio_url || !recording.created_at) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"recording with oss_audio_url and created_at is required\",\n });\n return;\n }\n\n const asrError = asr ? validateAsrConfig(asr) : undefined;\n if (asrError) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: asrError,\n });\n return;\n }\n\n const result = await handleRecordingSync(\n recordingId,\n recording,\n recordingStorage,\n asr,\n logger,\n { notifyStatus: notifyRecordingStatus },\n );\n respond(\n result.ok,\n result,\n result.ok\n ? undefined\n : {\n code: \"SYNC_FAILED\",\n message: result.error ?? \"Unknown error\",\n },\n );\n });\n\n registerGatewayMethod(\"recordings.result.write\", async ({ params, respond }) => {\n const recordingStorage = getRecordingStorage();\n if (!recordingStorage) {\n respond(false, null, {\n code: \"NOT_READY\",\n message: \"Recording storage service not ready\",\n });\n return;\n }\n\n const rawParams = params as unknown as RecordingResultWriteParams;\n const recordingId = trimToUndefined(rawParams.recordingId);\n if (!recordingId) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"recordingId is required\",\n });\n return;\n }\n\n if (!rawParams.transcript && !rawParams.summary) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"transcript or summary is required\",\n });\n return;\n }\n\n try {\n const result = handleRecordingResultWrite(\n {\n ...rawParams,\n recordingId,\n },\n recordingStorage,\n logger,\n { notifyStatus: notifyRecordingStatus },\n );\n respond(true, result, undefined);\n } catch (err: any) {\n respond(false, null, {\n code: err?.message?.startsWith(\"Recording not found:\")\n ? \"NOT_FOUND\"\n : \"RESULT_WRITE_FAILED\",\n message: err?.message ?? \"recording result write failed\",\n });\n }\n });\n\n registerGatewayMethod(\"recordings.list\", async ({ params, respond }) => {\n const recordingStorage = getRecordingStorage();\n if (!recordingStorage) {\n respond(false, null, {\n code: \"NOT_READY\",\n message: \"Recording storage service not ready\",\n });\n return;\n }\n\n const rawStatus = trimToUndefined(\n (params as RecordingListParams | undefined)?.status,\n );\n if (rawStatus && !isRecordingTransferStatus(rawStatus)) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: `invalid recording status: ${rawStatus}`,\n });\n return;\n }\n\n const status = rawStatus as RecordingTransferStatus | undefined;\n const entries = status\n ? recordingStorage.listByStatus(status)\n : recordingStorage.listAll();\n\n respond(true, {\n total: entries.length,\n recordings: entries.map(buildRecordingListItem),\n });\n });\n\n registerGatewayMethod(\"recordings.status\", async ({ params, respond }) => {\n const recordingStorage = getRecordingStorage();\n if (!recordingStorage) {\n respond(false, null, {\n code: \"NOT_READY\",\n message: \"Recording storage service not ready\",\n });\n return;\n }\n\n const { recordingId } = params as unknown as RecordingStatusParams;\n if (!recordingId) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"recordingId is required\",\n });\n return;\n }\n\n const entry = recordingStorage.findById(recordingId);\n if (!entry) {\n respond(false, null, {\n code: \"NOT_FOUND\",\n message: `Recording not found: ${recordingId}`,\n });\n return;\n }\n\n respond(\n true,\n (() => {\n const transcriptDocument =\n recordingStorage.readTranscriptDocument(recordingId);\n\n return buildRecordingDetail(entry, {\n summary: recordingStorage.readSummary(recordingId),\n title: extractTranscriptTitleFromDocument(transcriptDocument),\n transcript: extractSourceTextListFromDocument(transcriptDocument),\n transcriptData: transcriptDocument,\n });\n })(),\n );\n });\n\n registerGatewayMethod(\"recordings.rename\", async ({ params, respond }) => {\n const recordingStorage = getRecordingStorage();\n if (!recordingStorage) {\n respond(false, null, {\n code: \"NOT_READY\",\n message: \"Recording storage service not ready\",\n });\n return;\n }\n\n const { recordingId: rawRecordingId, name: rawName } =\n params as unknown as RecordingRenameParams;\n const recordingId = trimToUndefined(rawRecordingId);\n const name = trimToUndefined(rawName);\n if (!recordingId) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"recordingId is required\",\n });\n return;\n }\n if (!name) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"name is required\",\n });\n return;\n }\n\n const entry = recordingStorage.findById(recordingId);\n if (!entry) {\n respond(false, null, {\n code: \"NOT_FOUND\",\n message: `Recording not found: ${recordingId}`,\n });\n return;\n }\n\n const updated = recordingStorage.rename(recordingId, name);\n respond(true, buildRecordingDetail(updated));\n });\n\n registerGatewayMethod(\"recordings.delete\", async ({ params, respond }) => {\n const recordingStorage = getRecordingStorage();\n if (!recordingStorage) {\n respond(false, null, {\n code: \"NOT_READY\",\n message: \"Recording storage service not ready\",\n });\n return;\n }\n\n const { recordingId, deleteRemote } = params as {\n recordingId: string;\n deleteRemote?: boolean;\n };\n if (!recordingId) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"recordingId is required\",\n });\n return;\n }\n\n if (deleteRemote) {\n const deleted = recordingStorage.delete(recordingId);\n respond(\n deleted,\n { ok: deleted, recordingId, deletedRemote: true },\n deleted\n ? undefined\n : {\n code: \"NOT_FOUND\",\n message: `Recording not found: ${recordingId}`,\n },\n );\n return;\n }\n\n const deleted = recordingStorage.delete(recordingId, {\n localOnly: true,\n });\n respond(\n deleted,\n { ok: deleted, recordingId, deletedRemote: false },\n deleted\n ? undefined\n : {\n code: \"NOT_FOUND\",\n message: `Recording not found: ${recordingId}`,\n },\n );\n });\n\n registerGatewayMethod(\n \"recordings.retranscribe\",\n async ({ params, respond }) => {\n const recordingStorage = getRecordingStorage();\n if (!recordingStorage) {\n respond(false, null, {\n code: \"NOT_READY\",\n message: \"Recording storage service not ready\",\n });\n return;\n }\n\n const { recordingId, asr } =\n params as unknown as RecordingRetranscribeParams;\n if (!recordingId) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"recordingId is required\",\n });\n return;\n }\n\n const asrError = validateAsrConfig(asr);\n if (asrError) {\n respond(false, null, {\n code: \"ASR_NOT_CONFIGURED\",\n message: asrError,\n });\n return;\n }\n\n const entry = recordingStorage.findById(recordingId);\n if (!entry) {\n respond(false, null, {\n code: \"NOT_FOUND\",\n message: `Recording not found: ${recordingId}`,\n });\n return;\n }\n\n if (!canStartTranscription(entry.status)) {\n respond(false, null, {\n code: \"INVALID_STATE\",\n message: `Recording status does not allow retranscribe: ${entry.status}`,\n });\n return;\n }\n\n triggerTranscription(recordingId, recordingStorage, asr, logger, {\n notifyStatus: notifyRecordingStatus,\n }).catch((err) => {\n logger.error(\n `[recordings.retranscribe] 重试转写失败: ${recordingId}, ${err?.message ?? err}`,\n );\n });\n\n respond(true, { ok: true, recordingId, message: \"转写已重新触发\" });\n },\n );\n\n registerGatewayMethod(\"recordings.asr.init\", async ({ params, respond }) => {\n const { asr } = params as unknown as RecordingAsrInitParams;\n const asrError = validateAsrConfig(asr);\n if (asrError) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: asrError,\n });\n return;\n }\n\n const result = await initializeAsr(asr, asrDataDir, logger);\n respond(\n result.ok,\n result,\n result.ok\n ? undefined\n : {\n code: \"ASR_INIT_FAILED\",\n message: result.error ?? \"ASR init failed\",\n },\n );\n });\n\n api.registerHttpRoute({\n path: \"/recordings\",\n auth: \"gateway\",\n async handler(req: IncomingMessage, res: ServerResponse) {\n if (req.method !== \"POST\") {\n res.writeHead(405, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: \"Method Not Allowed\" }));\n return;\n }\n\n if (!isRelayInternalHttpRequest(req)) {\n await tunnelService?.deactivateForExternalTunnel(\"POST /recordings\");\n }\n\n const recordingStorage = getRecordingStorage();\n if (!recordingStorage) {\n res.writeHead(503, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: \"Service Not Ready\" }));\n return;\n }\n\n let body: HttpRecordingBody;\n try {\n const raw = await readBody(req);\n body = JSON.parse(raw);\n } catch {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: \"Invalid JSON\" }));\n return;\n }\n\n const recordingId = trimToUndefined(body.recordingId);\n if (!recordingId) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n ok: false,\n error: \"recordingId is required\",\n }),\n );\n return;\n }\n\n if (!body.recording || !body.recording.oss_audio_url) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n ok: false,\n error: \"recording with oss_audio_url is required\",\n }),\n );\n return;\n }\n\n const asrError = body.asr ? validateAsrConfig(body.asr) : undefined;\n if (asrError) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: asrError }));\n return;\n }\n\n const result = await handleRecordingSync(\n recordingId,\n body.recording,\n recordingStorage,\n body.asr,\n logger,\n shouldBroadcastStatusOnHttp()\n ? { notifyStatus: notifyRecordingStatus }\n : undefined,\n );\n\n res.writeHead(result.ok ? 200 : 500, {\n \"Content-Type\": \"application/json\",\n });\n res.end(JSON.stringify(result));\n },\n } as any);\n\n logger.info(\n \"Gateway 录音方法已注册: recordings.sync / recordings.result.write / recordings.list / recordings.status / recordings.rename / recordings.delete / recordings.retranscribe / recordings.asr.init\",\n );\n logger.info(\"HTTP 录音端点已注册: POST /recordings\");\n}\n",
118
+ "import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport type { Logger } from \"../logger.js\";\nimport {\n ImageStorage,\n handleImageSync,\n DEFAULT_IMAGE_MAX_BYTES,\n} from \"../image/index.js\";\nimport { RELAY_INTERNAL_HTTP_HEADER } from \"../tunnel/http-proxy.js\";\nimport type { RelayTunnelService } from \"../tunnel/service.js\";\nimport type { HttpImageBody, ImageMetadata, ImageSyncParams } from \"../types.js\";\nimport {\n readBody,\n trimToUndefined,\n type GatewayMethodRegistrar,\n} from \"./shared.js\";\n\nfunction isRelayInternalHttpRequest(req: IncomingMessage): boolean {\n const header = req.headers?.[RELAY_INTERNAL_HTTP_HEADER];\n if (Array.isArray(header)) {\n return header.includes(\"1\");\n }\n return header === \"1\";\n}\n\n/** 校验图片元数据必填字段,返回错误信息或 undefined */\nfunction validateImageMetadata(metadata?: ImageMetadata): string | undefined {\n if (!metadata) return \"image is required\";\n if (!trimToUndefined(metadata.oss_image_url)) {\n return \"image.oss_image_url is required\";\n }\n if (!trimToUndefined(metadata.created_at)) {\n return \"image.created_at is required\";\n }\n return undefined;\n}\n\ninterface ImageInterfaceDeps {\n api: OpenClawPluginApi;\n logger: Logger;\n getImageStorage: () => ImageStorage | null;\n registerGatewayMethod: GatewayMethodRegistrar;\n maxBytes: number;\n tunnelService?: RelayTunnelService | null;\n}\n\nexport function registerImageInterfaces(deps: ImageInterfaceDeps): void {\n const {\n api,\n logger,\n getImageStorage,\n registerGatewayMethod,\n maxBytes,\n tunnelService,\n } = deps;\n\n const effectiveMaxBytes = maxBytes > 0 ? maxBytes : DEFAULT_IMAGE_MAX_BYTES;\n\n registerGatewayMethod(\"images.sync\", async ({ params, respond }) => {\n const imageStorage = getImageStorage();\n if (!imageStorage) {\n respond(false, null, {\n code: \"NOT_READY\",\n message: \"Image storage service not ready\",\n });\n return;\n }\n\n const { imageId: rawImageId, image } = params as unknown as ImageSyncParams;\n const imageId = trimToUndefined(rawImageId);\n if (!imageId) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"imageId is required\",\n });\n return;\n }\n\n const metaError = validateImageMetadata(image);\n if (metaError) {\n respond(false, null, { code: \"INVALID_PARAMS\", message: metaError });\n return;\n }\n\n const result = handleImageSync(\n imageId,\n image,\n imageStorage,\n effectiveMaxBytes,\n logger,\n );\n respond(\n result.ok,\n result,\n result.ok\n ? undefined\n : { code: \"SYNC_FAILED\", message: result.error ?? \"Unknown error\" },\n );\n });\n\n api.registerHttpRoute({\n path: \"/images\",\n auth: \"gateway\",\n async handler(req: IncomingMessage, res: ServerResponse) {\n if (req.method !== \"POST\") {\n res.writeHead(405, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: \"Method Not Allowed\" }));\n return;\n }\n\n if (!isRelayInternalHttpRequest(req)) {\n await tunnelService?.deactivateForExternalTunnel(\"POST /images\");\n }\n\n const imageStorage = getImageStorage();\n if (!imageStorage) {\n res.writeHead(503, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: \"Service Not Ready\" }));\n return;\n }\n\n let body: HttpImageBody;\n try {\n const raw = await readBody(req);\n body = JSON.parse(raw);\n } catch {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: \"Invalid JSON\" }));\n return;\n }\n\n const imageId = trimToUndefined(body.imageId);\n if (!imageId) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({ ok: false, error: \"imageId is required\" }),\n );\n return;\n }\n\n const metaError = validateImageMetadata(body.image);\n if (metaError) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: metaError }));\n return;\n }\n\n const result = handleImageSync(\n imageId,\n body.image,\n imageStorage,\n effectiveMaxBytes,\n logger,\n );\n res.writeHead(result.ok ? 200 : 500, {\n \"Content-Type\": \"application/json\",\n });\n res.end(JSON.stringify(result));\n },\n } as any);\n\n logger.info(\"Gateway 图片方法已注册: images.sync\");\n logger.info(\"HTTP 图片端点已注册: POST /images\");\n}\n",
114
119
  "const PLUGIN_CLI_COMMANDS = new Set([\"ntf\", \"phone-notifications\"]);\nconst GLOBAL_OPTIONS_WITH_VALUE = [\n \"--container\",\n \"--log-level\",\n \"--profile\",\n] as const;\nconst GLOBAL_OPTIONS_WITH_VALUE_SET = new Set<string>(GLOBAL_OPTIONS_WITH_VALUE);\n\nfunction resolvePrimaryCommand(argv = process.argv): string | undefined {\n const args = argv.slice(2);\n\n for (let index = 0; index < args.length; index++) {\n const arg = args[index];\n if (!arg || arg === \"--\") {\n return undefined;\n }\n\n if (GLOBAL_OPTIONS_WITH_VALUE_SET.has(arg)) {\n index++;\n continue;\n }\n\n if (\n GLOBAL_OPTIONS_WITH_VALUE.some((option) => arg.startsWith(`${option}=`))\n ) {\n continue;\n }\n\n if (arg.startsWith(\"-\")) {\n continue;\n }\n\n return arg;\n }\n\n return undefined;\n}\n\nexport function isPluginCliInvocation(argv = process.argv): boolean {\n const primaryCommand = resolvePrimaryCommand(argv);\n return primaryCommand ? PLUGIN_CLI_COMMANDS.has(primaryCommand) : false;\n}\n"
115
120
  ],
116
- "mappings": "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AAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAC7C;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAC7C;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAC7C;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAC7C;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAC7C;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAC7C;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAC7C;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG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",
117
- "debugId": "7FF489376308EEFE64756E2164756E21",
121
+ "mappings": "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AAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAC7C;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAC7C;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAC7C;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAC7C;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAC7C;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAC7C;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAC7C;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG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",
122
+ "debugId": "3838A06742EC9ED664756E2164756E21",
118
123
  "names": []
119
124
  }