@zpi-dev/agent-sdk 0.0.0-stage → 0.1.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE +1206 -0
- package/README.md +54 -2
- package/dist/chunk-GPIEWH3K.js +24368 -0
- package/dist/chunk-GPIEWH3K.js.map +1 -0
- package/dist/chunk-YPFTXFZL.js +29655 -0
- package/dist/chunk-YPFTXFZL.js.map +1 -0
- package/dist/host.d.ts +1 -0
- package/dist/host.js +32 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/src-GYA4LFM7.js +126 -0
- package/dist/src-GYA4LFM7.js.map +1 -0
- package/dist/types/agent/src/agent-loop.d.ts +3 -0
- package/dist/types/agent/src/agent.d.ts +21 -0
- package/dist/types/agent/src/index.d.ts +3 -0
- package/dist/types/agent/src/streaming-tool-coordinator.d.ts +10 -0
- package/dist/types/agent/src/tool-execution.d.ts +9 -0
- package/dist/types/agent/src/types.d.ts +144 -0
- package/dist/types/agent-sdk/src/hooks.d.ts +12 -0
- package/dist/types/agent-sdk/src/host.d.ts +4 -0
- package/dist/types/agent-sdk/src/index.d.ts +4 -0
- package/dist/types/agent-sdk/src/messages.d.ts +12 -0
- package/dist/types/agent-sdk/src/permissions.d.ts +10 -0
- package/dist/types/agent-sdk/src/query-result.d.ts +7 -0
- package/dist/types/agent-sdk/src/query.d.ts +6 -0
- package/dist/types/agent-sdk/src/resources.d.ts +16 -0
- package/dist/types/agent-sdk/src/runtime.d.ts +7 -0
- package/dist/types/agent-sdk/src/sessions.d.ts +48 -0
- package/dist/types/agent-sdk/src/tasks.d.ts +8 -0
- package/dist/types/agent-sdk/src/tools.d.ts +5 -0
- package/dist/types/agent-sdk/src/types.d.ts +428 -0
- package/dist/types/ai/src/api/anthropic-messages.d.ts +70 -0
- package/dist/types/ai/src/api/constrained-sampling.d.ts +5 -0
- package/dist/types/ai/src/api/github-copilot-headers.d.ts +7 -0
- package/dist/types/ai/src/api/openai-completions.d.ts +10 -0
- package/dist/types/ai/src/api/openai-responses.d.ts +5 -0
- package/dist/types/ai/src/api/responses-cache.d.ts +6 -0
- package/dist/types/ai/src/api/responses-events.d.ts +3 -0
- package/dist/types/ai/src/api/responses-session.d.ts +56 -0
- package/dist/types/ai/src/api/simple-options.d.ts +14 -0
- package/dist/types/ai/src/api/transform-messages.d.ts +3 -0
- package/dist/types/ai/src/auth/openai-chatgpt.d.ts +32 -0
- package/dist/types/ai/src/index.d.ts +20 -0
- package/dist/types/ai/src/providers/discovery.d.ts +14 -0
- package/dist/types/ai/src/providers/registry.d.ts +155 -0
- package/dist/types/ai/src/stream.d.ts +5 -0
- package/dist/types/ai/src/types.d.ts +395 -0
- package/dist/types/ai/src/utils/abort.d.ts +2 -0
- package/dist/types/ai/src/utils/context-breakdown.d.ts +3 -0
- package/dist/types/ai/src/utils/cost.d.ts +2 -0
- package/dist/types/ai/src/utils/diagnostics.d.ts +16 -0
- package/dist/types/ai/src/utils/error-body.d.ts +24 -0
- package/dist/types/ai/src/utils/estimate.d.ts +16 -0
- package/dist/types/ai/src/utils/event-stream.d.ts +15 -0
- package/dist/types/ai/src/utils/guard-model-stream.d.ts +3 -0
- package/dist/types/ai/src/utils/headers.d.ts +1 -0
- package/dist/types/ai/src/utils/json-parse.d.ts +7 -0
- package/dist/types/ai/src/utils/media-policy.d.ts +68 -0
- package/dist/types/ai/src/utils/model-performance.d.ts +23 -0
- package/dist/types/ai/src/utils/model-retry.d.ts +3 -0
- package/dist/types/ai/src/utils/option-map/compiler.d.ts +2 -0
- package/dist/types/ai/src/utils/option-map/evaluator.d.ts +3 -0
- package/dist/types/ai/src/utils/option-map/parser.d.ts +40 -0
- package/dist/types/ai/src/utils/option-map/tokenizer.d.ts +8 -0
- package/dist/types/ai/src/utils/option-map/types.d.ts +15 -0
- package/dist/types/ai/src/utils/overflow.d.ts +68 -0
- package/dist/types/ai/src/utils/provider-cache.d.ts +11 -0
- package/dist/types/ai/src/utils/provider-env.d.ts +2 -0
- package/dist/types/ai/src/utils/provider-retry.d.ts +17 -0
- package/dist/types/ai/src/utils/reasoning.d.ts +14 -0
- package/dist/types/ai/src/utils/redact-error.d.ts +2 -0
- package/dist/types/ai/src/utils/retry.d.ts +62 -0
- package/dist/types/ai/src/utils/sanitize-unicode.d.ts +21 -0
- package/dist/types/ai/src/utils/stream-idle-timeout.d.ts +36 -0
- package/dist/types/ai/src/utils/text.d.ts +5 -0
- package/dist/types/ai/src/utils/transcript.d.ts +28 -0
- package/dist/types/coding-agent/src/core/agent-session.d.ts +175 -0
- package/dist/types/coding-agent/src/core/commands.d.ts +19 -0
- package/dist/types/coding-agent/src/core/compaction-utils.d.ts +37 -0
- package/dist/types/coding-agent/src/core/compaction.d.ts +139 -0
- package/dist/types/coding-agent/src/core/dynamic-context.d.ts +3 -0
- package/dist/types/coding-agent/src/core/file-rewind.d.ts +24 -0
- package/dist/types/coding-agent/src/core/fs.d.ts +1 -0
- package/dist/types/coding-agent/src/core/http-idle-timeout.d.ts +2 -0
- package/dist/types/coding-agent/src/core/image-limits.d.ts +19 -0
- package/dist/types/coding-agent/src/core/images.d.ts +18 -0
- package/dist/types/coding-agent/src/core/input.d.ts +3 -0
- package/dist/types/coding-agent/src/core/markdown-code.d.ts +7 -0
- package/dist/types/coding-agent/src/core/markdown.d.ts +13 -0
- package/dist/types/coding-agent/src/core/mentions.d.ts +12 -0
- package/dist/types/coding-agent/src/core/microcompact.d.ts +40 -0
- package/dist/types/coding-agent/src/core/model-performance.d.ts +57 -0
- package/dist/types/coding-agent/src/core/model-runtime.d.ts +51 -0
- package/dist/types/coding-agent/src/core/read-file-bounded.d.ts +2 -0
- package/dist/types/coding-agent/src/core/record-validation.d.ts +6 -0
- package/dist/types/coding-agent/src/core/resources.d.ts +51 -0
- package/dist/types/coding-agent/src/core/sdk.d.ts +48 -0
- package/dist/types/coding-agent/src/core/session-manager.d.ts +138 -0
- package/dist/types/coding-agent/src/core/session-state.d.ts +14 -0
- package/dist/types/coding-agent/src/core/settings-manager.d.ts +41 -0
- package/dist/types/coding-agent/src/core/streaming-tool-journal.d.ts +17 -0
- package/dist/types/coding-agent/src/core/system-prompt.d.ts +32 -0
- package/dist/types/coding-agent/src/core/tools/file-change.d.ts +21 -0
- package/dist/types/coding-agent/src/core/tools/index.d.ts +20 -0
- package/dist/types/coding-agent/src/core/tools/pi/bash.d.ts +185 -0
- package/dist/types/coding-agent/src/core/tools/pi/edit-diff.d.ts +84 -0
- package/dist/types/coding-agent/src/core/tools/pi/edit.d.ts +69 -0
- package/dist/types/coding-agent/src/core/tools/pi/file-mutation-queue.d.ts +5 -0
- package/dist/types/coding-agent/src/core/tools/pi/file-read-state.d.ts +12 -0
- package/dist/types/coding-agent/src/core/tools/pi/output-accumulator.d.ts +68 -0
- package/dist/types/coding-agent/src/core/tools/pi/path-utils.d.ts +7 -0
- package/dist/types/coding-agent/src/core/tools/pi/read.d.ts +63 -0
- package/dist/types/coding-agent/src/core/tools/pi/text-range-reader.d.ts +22 -0
- package/dist/types/coding-agent/src/core/tools/pi/tool-definition-wrapper.d.ts +4 -0
- package/dist/types/coding-agent/src/core/tools/pi/truncate.d.ts +60 -0
- package/dist/types/coding-agent/src/core/tools/pi/utils/bmp-source.d.ts +2 -0
- package/dist/types/coding-agent/src/core/tools/pi/utils/child-process.d.ts +13 -0
- package/dist/types/coding-agent/src/core/tools/pi/utils/image-budget.d.ts +16 -0
- package/dist/types/coding-agent/src/core/tools/pi/utils/image-process.d.ts +18 -0
- package/dist/types/coding-agent/src/core/tools/pi/utils/image-resize-core.d.ts +26 -0
- package/dist/types/coding-agent/src/core/tools/pi/utils/image-resize.d.ts +3 -0
- package/dist/types/coding-agent/src/core/tools/pi/utils/image-source.d.ts +11 -0
- package/dist/types/coding-agent/src/core/tools/pi/utils/mime.d.ts +3 -0
- package/dist/types/coding-agent/src/core/tools/pi/utils/paths.d.ts +16 -0
- package/dist/types/coding-agent/src/core/tools/pi/utils/read-file.d.ts +2 -0
- package/dist/types/coding-agent/src/core/tools/pi/utils/shell.d.ts +18 -0
- package/dist/types/coding-agent/src/core/tools/pi/utils/text.d.ts +5 -0
- package/dist/types/coding-agent/src/core/tools/pi/write.d.ts +44 -0
- package/dist/types/coding-agent/src/core/transcript-store.d.ts +71 -0
- package/dist/types/coding-agent/src/core/types.d.ts +60 -0
- package/dist/types/coding-agent/src/index.d.ts +42 -0
- package/dist/types/coding-agent/src/plugins/assembly.d.ts +36 -0
- package/dist/types/coding-agent/src/plugins/hooks.d.ts +82 -0
- package/dist/types/coding-agent/src/plugins/resources.d.ts +4 -0
- package/dist/types/coding-agent/src/plugins/session-hooks.d.ts +26 -0
- package/dist/types/coding-agent/src/plugins/types.d.ts +41 -0
- package/dist/types/plugin-compat/src/command-hooks.d.ts +184 -0
- package/dist/types/plugin-compat/src/index.d.ts +11 -0
- package/package.json +53 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/ms/index.js","../../../node_modules/debug/src/common.js","../../../node_modules/debug/src/browser.js","../../../node_modules/has-flag/index.js","../../../node_modules/supports-color/index.js","../../../node_modules/debug/src/node.js","../../../node_modules/debug/src/index.js","../../../node_modules/agent-base/src/helpers.ts","../../../node_modules/agent-base/src/index.ts","../../../node_modules/https-proxy-agent/src/parse-proxy-response.ts","../../../node_modules/https-proxy-agent/src/index.ts","../../../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","../../../node_modules/smart-buffer/src/utils.ts","../../../node_modules/smart-buffer/src/smartbuffer.ts","../../../node_modules/socks/src/common/constants.ts","../../../node_modules/socks/src/common/util.ts","../../../node_modules/ip-address/src/address-error.ts","../../../node_modules/ip-address/src/common.ts","../../../node_modules/ip-address/src/v4/constants.ts","../../../node_modules/ip-address/src/ipv4.ts","../../../node_modules/ip-address/src/v6/constants.ts","../../../node_modules/ip-address/src/v6/helpers.ts","../../../node_modules/ip-address/src/v6/regular-expressions.ts","../../../node_modules/ip-address/src/ipv6.ts","../../../node_modules/ip-address/src/ip-address.ts","../../../node_modules/socks/src/common/helpers.ts","../../../node_modules/socks/src/common/receivebuffer.ts","../../../node_modules/socks/src/client/socksclient.ts","../../../node_modules/socks/src/index.ts","../../../node_modules/socks-proxy-agent/src/index.ts","../../../node_modules/yaml/dist/nodes/identity.js","../../../node_modules/yaml/dist/visit.js","../../../node_modules/yaml/dist/doc/directives.js","../../../node_modules/yaml/dist/doc/anchors.js","../../../node_modules/yaml/dist/doc/applyReviver.js","../../../node_modules/yaml/dist/nodes/toJS.js","../../../node_modules/yaml/dist/nodes/Node.js","../../../node_modules/yaml/dist/nodes/Alias.js","../../../node_modules/yaml/dist/nodes/Scalar.js","../../../node_modules/yaml/dist/doc/createNode.js","../../../node_modules/yaml/dist/nodes/Collection.js","../../../node_modules/yaml/dist/stringify/stringifyComment.js","../../../node_modules/yaml/dist/stringify/foldFlowLines.js","../../../node_modules/yaml/dist/stringify/stringifyString.js","../../../node_modules/yaml/dist/stringify/stringify.js","../../../node_modules/yaml/dist/stringify/stringifyPair.js","../../../node_modules/yaml/dist/log.js","../../../node_modules/yaml/dist/schema/yaml-1.1/merge.js","../../../node_modules/yaml/dist/nodes/addPairToJSMap.js","../../../node_modules/yaml/dist/nodes/Pair.js","../../../node_modules/yaml/dist/stringify/stringifyCollection.js","../../../node_modules/yaml/dist/nodes/YAMLMap.js","../../../node_modules/yaml/dist/schema/common/map.js","../../../node_modules/yaml/dist/nodes/YAMLSeq.js","../../../node_modules/yaml/dist/schema/common/seq.js","../../../node_modules/yaml/dist/schema/common/string.js","../../../node_modules/yaml/dist/schema/common/null.js","../../../node_modules/yaml/dist/schema/core/bool.js","../../../node_modules/yaml/dist/stringify/stringifyNumber.js","../../../node_modules/yaml/dist/schema/core/float.js","../../../node_modules/yaml/dist/schema/core/int.js","../../../node_modules/yaml/dist/schema/core/schema.js","../../../node_modules/yaml/dist/schema/json/schema.js","../../../node_modules/yaml/dist/schema/yaml-1.1/binary.js","../../../node_modules/yaml/dist/schema/yaml-1.1/pairs.js","../../../node_modules/yaml/dist/schema/yaml-1.1/omap.js","../../../node_modules/yaml/dist/schema/yaml-1.1/bool.js","../../../node_modules/yaml/dist/schema/yaml-1.1/float.js","../../../node_modules/yaml/dist/schema/yaml-1.1/int.js","../../../node_modules/yaml/dist/schema/yaml-1.1/set.js","../../../node_modules/yaml/dist/schema/yaml-1.1/timestamp.js","../../../node_modules/yaml/dist/schema/yaml-1.1/schema.js","../../../node_modules/yaml/dist/schema/tags.js","../../../node_modules/yaml/dist/schema/Schema.js","../../../node_modules/yaml/dist/stringify/stringifyDocument.js","../../../node_modules/yaml/dist/doc/Document.js","../../../node_modules/yaml/dist/errors.js","../../../node_modules/yaml/dist/compose/resolve-props.js","../../../node_modules/yaml/dist/compose/util-contains-newline.js","../../../node_modules/yaml/dist/compose/util-flow-indent-check.js","../../../node_modules/yaml/dist/compose/util-map-includes.js","../../../node_modules/yaml/dist/compose/resolve-block-map.js","../../../node_modules/yaml/dist/compose/resolve-block-seq.js","../../../node_modules/yaml/dist/compose/resolve-end.js","../../../node_modules/yaml/dist/compose/resolve-flow-collection.js","../../../node_modules/yaml/dist/compose/compose-collection.js","../../../node_modules/yaml/dist/compose/resolve-block-scalar.js","../../../node_modules/yaml/dist/compose/resolve-flow-scalar.js","../../../node_modules/yaml/dist/compose/compose-scalar.js","../../../node_modules/yaml/dist/compose/util-empty-scalar-position.js","../../../node_modules/yaml/dist/compose/compose-node.js","../../../node_modules/yaml/dist/compose/compose-doc.js","../../../node_modules/yaml/dist/compose/composer.js","../../../node_modules/yaml/dist/parse/cst-scalar.js","../../../node_modules/yaml/dist/parse/cst-stringify.js","../../../node_modules/yaml/dist/parse/cst-visit.js","../../../node_modules/yaml/dist/parse/cst.js","../../../node_modules/yaml/dist/parse/lexer.js","../../../node_modules/yaml/dist/parse/line-counter.js","../../../node_modules/yaml/dist/parse/parser.js","../../../node_modules/yaml/dist/public-api.js","../../../node_modules/yaml/dist/index.js","../../../node_modules/bmp-js/lib/encoder.js","../../../node_modules/bmp-js/lib/decoder.js","../../../node_modules/bmp-js/index.js","../../coding-agent/src/core/session-manager.ts","../../coding-agent/src/core/transcript-store.ts","../../coding-agent/src/core/microcompact.ts","../../coding-agent/src/core/record-validation.ts","../../coding-agent/src/core/streaming-tool-journal.ts","../../coding-agent/src/core/settings-manager.ts","../../coding-agent/src/core/compaction.ts","../../coding-agent/src/core/compaction-utils.ts","../../ai/src/api/responses-session.ts","../../../node_modules/ws/wrapper.mjs","../../../node_modules/openai/src/internal/ws.ts","../../../node_modules/openai/src/internal/ws-adapter-node.ts","../../../node_modules/openai/src/core/EventEmitter.ts","../../../node_modules/openai/src/resources/responses/internal-base.ts","../../../node_modules/openai/src/internal/ws-adapter.ts","../../../node_modules/openai/src/resources/responses/ws-base.ts","../../../node_modules/openai/src/resources/responses/ws.ts","../../coding-agent/src/core/model-runtime.ts","../../coding-agent/src/core/sdk.ts","../../coding-agent/src/core/tools/pi/tool-definition-wrapper.ts","../../coding-agent/src/plugins/hooks.ts","../../coding-agent/src/plugins/assembly.ts","../../coding-agent/src/plugins/resources.ts","../../coding-agent/src/core/agent-session.ts","../../agent/src/tool-execution.ts","../../agent/src/streaming-tool-coordinator.ts","../../agent/src/agent-loop.ts","../../agent/src/agent.ts","../../coding-agent/src/plugins/session-hooks.ts","../../coding-agent/src/core/commands.ts","../../coding-agent/src/core/dynamic-context.ts","../../coding-agent/src/core/http-idle-timeout.ts","../../coding-agent/src/core/model-performance.ts","../../coding-agent/src/core/session-state.ts","../../coding-agent/src/core/resources.ts","../../coding-agent/src/core/markdown.ts","../../coding-agent/src/core/types.ts","../../coding-agent/src/core/system-prompt.ts","../../coding-agent/src/core/tools/index.ts","../../coding-agent/src/core/tools/file-change.ts","../../../node_modules/diff/libesm/diff/base.js","../../../node_modules/diff/libesm/diff/line.js","../../../node_modules/diff/libesm/patch/parse.js","../../../node_modules/diff/libesm/patch/create.js","../../coding-agent/src/core/tools/pi/utils/read-file.ts","../../coding-agent/src/core/tools/pi/bash.ts","../../coding-agent/src/core/tools/pi/output-accumulator.ts","../../coding-agent/src/core/tools/pi/truncate.ts","../../coding-agent/src/core/tools/pi/utils/child-process.ts","../../coding-agent/src/core/tools/pi/utils/shell.ts","../../coding-agent/src/core/tools/pi/edit.ts","../../coding-agent/src/core/tools/pi/edit-diff.ts","../../coding-agent/src/core/tools/pi/file-mutation-queue.ts","../../coding-agent/src/core/tools/pi/path-utils.ts","../../coding-agent/src/core/tools/pi/utils/paths.ts","../../coding-agent/src/core/tools/pi/utils/text.ts","../../coding-agent/src/core/tools/pi/file-read-state.ts","../../coding-agent/src/core/tools/pi/read.ts","../../coding-agent/src/core/image-limits.ts","../../coding-agent/src/core/read-file-bounded.ts","../../coding-agent/src/core/tools/pi/text-range-reader.ts","../../coding-agent/src/core/tools/pi/utils/image-budget.ts","../../coding-agent/src/core/tools/pi/utils/image-resize.ts","../../coding-agent/src/core/tools/pi/utils/image-resize-core.ts","../../coding-agent/src/core/tools/pi/utils/image-source.ts","../../coding-agent/src/core/tools/pi/utils/bmp-source.ts","../../coding-agent/src/core/tools/pi/utils/mime.ts","../../coding-agent/src/core/tools/pi/utils/image-process.ts","../../coding-agent/src/core/tools/pi/write.ts","../../coding-agent/src/core/file-rewind.ts","../../coding-agent/src/core/fs.ts","../src/sessions.ts","../src/messages.ts","../src/query.ts","../../plugin-compat/src/index.ts","../../plugin-compat/src/command-hooks.ts","../package.json","../src/hooks.ts","../src/permissions.ts","../src/resources.ts","../src/runtime.ts","../src/tasks.ts","../src/tools.ts"],"sourcesContent":["/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '')\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, ',')\n\t\t\t.split(',')\n\t\t\t.filter(Boolean);\n\n\t\tfor (const ns of split) {\n\t\t\tif (ns[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(ns.slice(1));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(ns);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the given string matches a namespace template, honoring\n\t * asterisks as wildcards.\n\t *\n\t * @param {String} search\n\t * @param {String} template\n\t * @return {Boolean}\n\t */\n\tfunction matchesTemplate(search, template) {\n\t\tlet searchIndex = 0;\n\t\tlet templateIndex = 0;\n\t\tlet starIndex = -1;\n\t\tlet matchIndex = 0;\n\n\t\twhile (searchIndex < search.length) {\n\t\t\tif (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {\n\t\t\t\t// Match character or proceed with wildcard\n\t\t\t\tif (template[templateIndex] === '*') {\n\t\t\t\t\tstarIndex = templateIndex;\n\t\t\t\t\tmatchIndex = searchIndex;\n\t\t\t\t\ttemplateIndex++; // Skip the '*'\n\t\t\t\t} else {\n\t\t\t\t\tsearchIndex++;\n\t\t\t\t\ttemplateIndex++;\n\t\t\t\t}\n\t\t\t} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition\n\t\t\t\t// Backtrack to the last '*' and try to match more characters\n\t\t\t\ttemplateIndex = starIndex + 1;\n\t\t\t\tmatchIndex++;\n\t\t\t\tsearchIndex = matchIndex;\n\t\t\t} else {\n\t\t\t\treturn false; // No match\n\t\t\t}\n\t\t}\n\n\t\t// Handle trailing '*' in template\n\t\twhile (templateIndex < template.length && template[templateIndex] === '*') {\n\t\t\ttemplateIndex++;\n\t\t}\n\n\t\treturn templateIndex === template.length;\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names,\n\t\t\t...createDebug.skips.map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tfor (const skip of createDebug.skips) {\n\t\t\tif (matchesTemplate(name, skip)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (const ns of createDebug.names) {\n\t\t\tif (matchesTemplate(name, ns)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n","/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n","'use strict';\n\nmodule.exports = (flag, argv = process.argv) => {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n};\n","'use strict';\nconst os = require('os');\nconst tty = require('tty');\nconst hasFlag = require('has-flag');\n\nconst {env} = process;\n\nlet forceColor;\nif (hasFlag('no-color') ||\n\thasFlag('no-colors') ||\n\thasFlag('color=false') ||\n\thasFlag('color=never')) {\n\tforceColor = 0;\n} else if (hasFlag('color') ||\n\thasFlag('colors') ||\n\thasFlag('color=true') ||\n\thasFlag('color=always')) {\n\tforceColor = 1;\n}\n\nif ('FORCE_COLOR' in env) {\n\tif (env.FORCE_COLOR === 'true') {\n\t\tforceColor = 1;\n\t} else if (env.FORCE_COLOR === 'false') {\n\t\tforceColor = 0;\n\t} else {\n\t\tforceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3\n\t};\n}\n\nfunction supportsColor(haveStream, streamIsTTY) {\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (hasFlag('color=16m') ||\n\t\thasFlag('color=full') ||\n\t\thasFlag('color=truecolor')) {\n\t\treturn 3;\n\t}\n\n\tif (hasFlag('color=256')) {\n\t\treturn 2;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10 &&\n\t\t\tNumber(osRelease[2]) >= 10586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app':\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\tcase 'Apple_Terminal':\n\t\t\t\treturn 2;\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nfunction getSupportLevel(stream) {\n\tconst level = supportsColor(stream, stream && stream.isTTY);\n\treturn translateLevel(level);\n}\n\nmodule.exports = {\n\tsupportsColor: getSupportLevel,\n\tstdout: translateLevel(supportsColor(true, tty.isatty(1))),\n\tstderr: translateLevel(supportsColor(true, tty.isatty(2)))\n};\n","/**\n * Module dependencies.\n */\n\nconst tty = require('tty');\nconst util = require('util');\n\n/**\n * This is the Node.js implementation of `debug()`.\n */\n\nexports.init = init;\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.destroy = util.deprecate(\n\t() => {},\n\t'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'\n);\n\n/**\n * Colors.\n */\n\nexports.colors = [6, 2, 3, 4, 5, 1];\n\ntry {\n\t// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)\n\t// eslint-disable-next-line import/no-extraneous-dependencies\n\tconst supportsColor = require('supports-color');\n\n\tif (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {\n\t\texports.colors = [\n\t\t\t20,\n\t\t\t21,\n\t\t\t26,\n\t\t\t27,\n\t\t\t32,\n\t\t\t33,\n\t\t\t38,\n\t\t\t39,\n\t\t\t40,\n\t\t\t41,\n\t\t\t42,\n\t\t\t43,\n\t\t\t44,\n\t\t\t45,\n\t\t\t56,\n\t\t\t57,\n\t\t\t62,\n\t\t\t63,\n\t\t\t68,\n\t\t\t69,\n\t\t\t74,\n\t\t\t75,\n\t\t\t76,\n\t\t\t77,\n\t\t\t78,\n\t\t\t79,\n\t\t\t80,\n\t\t\t81,\n\t\t\t92,\n\t\t\t93,\n\t\t\t98,\n\t\t\t99,\n\t\t\t112,\n\t\t\t113,\n\t\t\t128,\n\t\t\t129,\n\t\t\t134,\n\t\t\t135,\n\t\t\t148,\n\t\t\t149,\n\t\t\t160,\n\t\t\t161,\n\t\t\t162,\n\t\t\t163,\n\t\t\t164,\n\t\t\t165,\n\t\t\t166,\n\t\t\t167,\n\t\t\t168,\n\t\t\t169,\n\t\t\t170,\n\t\t\t171,\n\t\t\t172,\n\t\t\t173,\n\t\t\t178,\n\t\t\t179,\n\t\t\t184,\n\t\t\t185,\n\t\t\t196,\n\t\t\t197,\n\t\t\t198,\n\t\t\t199,\n\t\t\t200,\n\t\t\t201,\n\t\t\t202,\n\t\t\t203,\n\t\t\t204,\n\t\t\t205,\n\t\t\t206,\n\t\t\t207,\n\t\t\t208,\n\t\t\t209,\n\t\t\t214,\n\t\t\t215,\n\t\t\t220,\n\t\t\t221\n\t\t];\n\t}\n} catch (error) {\n\t// Swallow - we only care if `supports-color` is available; it doesn't have to be.\n}\n\n/**\n * Build up the default `inspectOpts` object from the environment variables.\n *\n * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js\n */\n\nexports.inspectOpts = Object.keys(process.env).filter(key => {\n\treturn /^debug_/i.test(key);\n}).reduce((obj, key) => {\n\t// Camel-case\n\tconst prop = key\n\t\t.substring(6)\n\t\t.toLowerCase()\n\t\t.replace(/_([a-z])/g, (_, k) => {\n\t\t\treturn k.toUpperCase();\n\t\t});\n\n\t// Coerce string value into JS value\n\tlet val = process.env[key];\n\tif (/^(yes|on|true|enabled)$/i.test(val)) {\n\t\tval = true;\n\t} else if (/^(no|off|false|disabled)$/i.test(val)) {\n\t\tval = false;\n\t} else if (val === 'null') {\n\t\tval = null;\n\t} else {\n\t\tval = Number(val);\n\t}\n\n\tobj[prop] = val;\n\treturn obj;\n}, {});\n\n/**\n * Is stdout a TTY? Colored output is enabled when `true`.\n */\n\nfunction useColors() {\n\treturn 'colors' in exports.inspectOpts ?\n\t\tBoolean(exports.inspectOpts.colors) :\n\t\ttty.isatty(process.stderr.fd);\n}\n\n/**\n * Adds ANSI color escape codes if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\tconst {namespace: name, useColors} = this;\n\n\tif (useColors) {\n\t\tconst c = this.color;\n\t\tconst colorCode = '\\u001B[3' + (c < 8 ? c : '8;5;' + c);\n\t\tconst prefix = ` ${colorCode};1m${name} \\u001B[0m`;\n\n\t\targs[0] = prefix + args[0].split('\\n').join('\\n' + prefix);\n\t\targs.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\\u001B[0m');\n\t} else {\n\t\targs[0] = getDate() + name + ' ' + args[0];\n\t}\n}\n\nfunction getDate() {\n\tif (exports.inspectOpts.hideDate) {\n\t\treturn '';\n\t}\n\treturn new Date().toISOString() + ' ';\n}\n\n/**\n * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr.\n */\n\nfunction log(...args) {\n\treturn process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\\n');\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\tif (namespaces) {\n\t\tprocess.env.DEBUG = namespaces;\n\t} else {\n\t\t// If you set a process.env field to null or undefined, it gets cast to the\n\t\t// string 'null' or 'undefined'. Just delete instead.\n\t\tdelete process.env.DEBUG;\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n\treturn process.env.DEBUG;\n}\n\n/**\n * Init logic for `debug` instances.\n *\n * Create a new `inspectOpts` object in case `useColors` is set\n * differently for a particular `debug` instance.\n */\n\nfunction init(debug) {\n\tdebug.inspectOpts = {};\n\n\tconst keys = Object.keys(exports.inspectOpts);\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tdebug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %o to `util.inspect()`, all on a single line.\n */\n\nformatters.o = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts)\n\t\t.split('\\n')\n\t\t.map(str => str.trim())\n\t\t.join(' ');\n};\n\n/**\n * Map %O to `util.inspect()`, allowing multiple lines if needed.\n */\n\nformatters.O = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts);\n};\n","/**\n * Detect Electron renderer / nwjs process, which is node, but we should\n * treat as a browser.\n */\n\nif (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {\n\tmodule.exports = require('./browser.js');\n} else {\n\tmodule.exports = require('./node.js');\n}\n",null,null,null,null,"'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","'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","'use strict';\n\nconst kDone = Symbol('kDone');\nconst kRun = Symbol('kRun');\n\n/**\n * A very simple job queue with adjustable concurrency. Adapted from\n * https://github.com/STRML/async-limiter\n */\nclass Limiter {\n /**\n * Creates a new `Limiter`.\n *\n * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed\n * to run concurrently\n */\n constructor(concurrency) {\n this[kDone] = () => {\n this.pending--;\n this[kRun]();\n };\n this.concurrency = concurrency || Infinity;\n this.jobs = [];\n this.pending = 0;\n }\n\n /**\n * Adds a job to the queue.\n *\n * @param {Function} job The job to run\n * @public\n */\n add(job) {\n this.jobs.push(job);\n this[kRun]();\n }\n\n /**\n * Removes a job from the queue and runs it if possible.\n *\n * @private\n */\n [kRun]() {\n if (this.pending === this.concurrency) return;\n\n if (this.jobs.length) {\n const job = this.jobs.shift();\n\n this.pending++;\n job(this[kDone]);\n }\n }\n}\n\nmodule.exports = Limiter;\n","'use strict';\n\nconst zlib = require('zlib');\n\nconst bufferUtil = require('./buffer-util');\nconst Limiter = require('./limiter');\nconst { kStatusCode } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\nconst TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]);\nconst kPerMessageDeflate = Symbol('permessage-deflate');\nconst kTotalLength = Symbol('total-length');\nconst kCallback = Symbol('callback');\nconst kBuffers = Symbol('buffers');\nconst kError = Symbol('error');\n\n//\n// We limit zlib concurrency, which prevents severe memory fragmentation\n// as documented in https://github.com/nodejs/node/issues/8871#issuecomment-250915913\n// and https://github.com/websockets/ws/issues/1202\n//\n// Intentionally global; it's the global thread pool that's an issue.\n//\nlet zlibLimiter;\n\n/**\n * permessage-deflate implementation.\n */\nclass PerMessageDeflate {\n /**\n * Creates a PerMessageDeflate instance.\n *\n * @param {Object} [options] Configuration options\n * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support\n * for, or request, a custom client window size\n * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/\n * acknowledge disabling of client context takeover\n * @param {Number} [options.concurrencyLimit=10] The number of concurrent\n * calls to zlib\n * @param {Boolean} [options.isServer=false] Create the instance in either\n * server or client mode\n * @param {Number} [options.maxPayload=0] The maximum allowed message length\n * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the\n * use of a custom server window size\n * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept\n * disabling of server context takeover\n * @param {Number} [options.threshold=1024] Size (in bytes) below which\n * messages should not be compressed if context takeover is disabled\n * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on\n * deflate\n * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on\n * inflate\n */\n constructor(options) {\n this._options = options || {};\n this._threshold =\n this._options.threshold !== undefined ? this._options.threshold : 1024;\n this._maxPayload = this._options.maxPayload | 0;\n this._isServer = !!this._options.isServer;\n this._deflate = null;\n this._inflate = null;\n\n this.params = null;\n\n if (!zlibLimiter) {\n const concurrency =\n this._options.concurrencyLimit !== undefined\n ? this._options.concurrencyLimit\n : 10;\n zlibLimiter = new Limiter(concurrency);\n }\n }\n\n /**\n * @type {String}\n */\n static get extensionName() {\n return 'permessage-deflate';\n }\n\n /**\n * Create an extension negotiation offer.\n *\n * @return {Object} Extension parameters\n * @public\n */\n offer() {\n const params = {};\n\n if (this._options.serverNoContextTakeover) {\n params.server_no_context_takeover = true;\n }\n if (this._options.clientNoContextTakeover) {\n params.client_no_context_takeover = true;\n }\n if (this._options.serverMaxWindowBits) {\n params.server_max_window_bits = this._options.serverMaxWindowBits;\n }\n if (this._options.clientMaxWindowBits) {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n } else if (this._options.clientMaxWindowBits == null) {\n params.client_max_window_bits = true;\n }\n\n return params;\n }\n\n /**\n * Accept an extension negotiation offer/response.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Object} Accepted configuration\n * @public\n */\n accept(configurations) {\n configurations = this.normalizeParams(configurations);\n\n this.params = this._isServer\n ? this.acceptAsServer(configurations)\n : this.acceptAsClient(configurations);\n\n return this.params;\n }\n\n /**\n * Releases all resources used by the extension.\n *\n * @public\n */\n cleanup() {\n if (this._inflate) {\n this._inflate.close();\n this._inflate = null;\n }\n\n if (this._deflate) {\n const callback = this._deflate[kCallback];\n\n this._deflate.close();\n this._deflate = null;\n\n if (callback) {\n callback(\n new Error(\n 'The deflate stream was closed while data was being processed'\n )\n );\n }\n }\n }\n\n /**\n * Accept an extension negotiation offer.\n *\n * @param {Array} offers The extension negotiation offers\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsServer(offers) {\n const opts = this._options;\n const accepted = offers.find((params) => {\n if (\n (opts.serverNoContextTakeover === false &&\n params.server_no_context_takeover) ||\n (params.server_max_window_bits &&\n (opts.serverMaxWindowBits === false ||\n (typeof opts.serverMaxWindowBits === 'number' &&\n opts.serverMaxWindowBits > params.server_max_window_bits))) ||\n (typeof opts.clientMaxWindowBits === 'number' &&\n (typeof params.client_max_window_bits === 'number'\n ? opts.clientMaxWindowBits > params.client_max_window_bits\n : !params.client_max_window_bits))\n ) {\n return false;\n }\n\n return true;\n });\n\n if (!accepted) {\n throw new Error('None of the extension offers can be accepted');\n }\n\n if (opts.serverNoContextTakeover) {\n accepted.server_no_context_takeover = true;\n }\n if (opts.clientNoContextTakeover) {\n accepted.client_no_context_takeover = true;\n }\n if (typeof opts.serverMaxWindowBits === 'number') {\n accepted.server_max_window_bits = opts.serverMaxWindowBits;\n }\n if (typeof opts.clientMaxWindowBits === 'number') {\n accepted.client_max_window_bits = opts.clientMaxWindowBits;\n } else if (\n accepted.client_max_window_bits === true ||\n opts.clientMaxWindowBits === false\n ) {\n delete accepted.client_max_window_bits;\n }\n\n return accepted;\n }\n\n /**\n * Accept the extension negotiation response.\n *\n * @param {Array} response The extension negotiation response\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsClient(response) {\n const params = response[0];\n\n if (\n this._options.clientNoContextTakeover === false &&\n params.client_no_context_takeover\n ) {\n throw new Error('Unexpected parameter \"client_no_context_takeover\"');\n }\n\n if (!params.client_max_window_bits) {\n if (typeof this._options.clientMaxWindowBits === 'number') {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n }\n } else if (\n this._options.clientMaxWindowBits === false ||\n (typeof this._options.clientMaxWindowBits === 'number' &&\n params.client_max_window_bits > this._options.clientMaxWindowBits)\n ) {\n throw new Error(\n 'Unexpected or invalid parameter \"client_max_window_bits\"'\n );\n }\n\n return params;\n }\n\n /**\n * Normalize parameters.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Array} The offers/response with normalized parameters\n * @private\n */\n normalizeParams(configurations) {\n configurations.forEach((params) => {\n Object.keys(params).forEach((key) => {\n let value = params[key];\n\n if (value.length > 1) {\n throw new Error(`Parameter \"${key}\" must have only a single value`);\n }\n\n value = value[0];\n\n if (key === 'client_max_window_bits') {\n if (value !== true) {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (!this._isServer) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else if (key === 'server_max_window_bits') {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (\n key === 'client_no_context_takeover' ||\n key === 'server_no_context_takeover'\n ) {\n if (value !== true) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else {\n throw new Error(`Unknown parameter \"${key}\"`);\n }\n\n params[key] = value;\n });\n });\n\n return configurations;\n }\n\n /**\n * Decompress data. Concurrency limited.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n decompress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._decompress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Compress data. Concurrency limited.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n compress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._compress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Decompress data.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _decompress(data, fin, callback) {\n const endpoint = this._isServer ? 'client' : 'server';\n\n if (!this._inflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._inflate = zlib.createInflateRaw({\n ...this._options.zlibInflateOptions,\n windowBits\n });\n this._inflate[kPerMessageDeflate] = this;\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n this._inflate.on('error', inflateOnError);\n this._inflate.on('data', inflateOnData);\n }\n\n this._inflate[kCallback] = callback;\n\n this._inflate.write(data);\n if (fin) this._inflate.write(TRAILER);\n\n this._inflate.flush(() => {\n const err = this._inflate[kError];\n\n if (err) {\n this._inflate.close();\n this._inflate = null;\n callback(err);\n return;\n }\n\n const data = bufferUtil.concat(\n this._inflate[kBuffers],\n this._inflate[kTotalLength]\n );\n\n if (this._inflate._readableState.endEmitted) {\n this._inflate.close();\n this._inflate = null;\n } else {\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._inflate.reset();\n }\n }\n\n callback(null, data);\n });\n }\n\n /**\n * Compress data.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _compress(data, fin, callback) {\n const endpoint = this._isServer ? 'server' : 'client';\n\n if (!this._deflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._deflate = zlib.createDeflateRaw({\n ...this._options.zlibDeflateOptions,\n windowBits\n });\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n this._deflate.on('data', deflateOnData);\n }\n\n this._deflate[kCallback] = callback;\n\n this._deflate.write(data);\n this._deflate.flush(zlib.Z_SYNC_FLUSH, () => {\n if (!this._deflate) {\n //\n // The deflate stream was closed while data was being processed.\n //\n return;\n }\n\n let data = bufferUtil.concat(\n this._deflate[kBuffers],\n this._deflate[kTotalLength]\n );\n\n if (fin) {\n data = new FastBuffer(data.buffer, data.byteOffset, data.length - 4);\n }\n\n //\n // Ensure that the callback will not be called again in\n // `PerMessageDeflate#cleanup()`.\n //\n this._deflate[kCallback] = null;\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._deflate.reset();\n }\n\n callback(null, data);\n });\n }\n}\n\nmodule.exports = PerMessageDeflate;\n\n/**\n * The listener of the `zlib.DeflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction deflateOnData(chunk) {\n this[kBuffers].push(chunk);\n this[kTotalLength] += chunk.length;\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction inflateOnData(chunk) {\n this[kTotalLength] += chunk.length;\n\n if (\n this[kPerMessageDeflate]._maxPayload < 1 ||\n this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload\n ) {\n this[kBuffers].push(chunk);\n return;\n }\n\n this[kError] = new RangeError('Max payload size exceeded');\n this[kError].code = 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH';\n this[kError][kStatusCode] = 1009;\n this.removeListener('data', inflateOnData);\n\n //\n // The choice to employ `zlib.reset()` over `zlib.close()` is dictated by the\n // fact that in Node.js versions prior to 13.10.0, the callback for\n // `zlib.flush()` is not called if `zlib.close()` is used. Utilizing\n // `zlib.reset()` ensures that either the callback is invoked or an error is\n // emitted.\n //\n this.reset();\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'error'` event.\n *\n * @param {Error} err The emitted error\n * @private\n */\nfunction inflateOnError(err) {\n //\n // There is no need to call `Zlib#close()` as the handle is automatically\n // closed when an error is emitted.\n //\n this[kPerMessageDeflate]._inflate = null;\n\n if (this[kError]) {\n this[kCallback](this[kError]);\n return;\n }\n\n err[kStatusCode] = 1007;\n this[kCallback](err);\n}\n","'use strict';\n\nconst { isUtf8 } = require('buffer');\n\nconst { hasBlob } = require('./constants');\n\n//\n// Allowed token characters:\n//\n// '!', '#', '$', '%', '&', ''', '*', '+', '-',\n// '.', 0-9, A-Z, '^', '_', '`', a-z, '|', '~'\n//\n// tokenChars[32] === 0 // ' '\n// tokenChars[33] === 1 // '!'\n// tokenChars[34] === 0 // '\"'\n// ...\n//\n// prettier-ignore\nconst tokenChars = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31\n 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 47\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63\n 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 95\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 // 112 - 127\n];\n\n/**\n * Checks if a status code is allowed in a close frame.\n *\n * @param {Number} code The status code\n * @return {Boolean} `true` if the status code is valid, else `false`\n * @public\n */\nfunction isValidStatusCode(code) {\n return (\n (code >= 1000 &&\n code <= 1014 &&\n code !== 1004 &&\n code !== 1005 &&\n code !== 1006) ||\n (code >= 3000 && code <= 4999)\n );\n}\n\n/**\n * Checks if a given buffer contains only correct UTF-8.\n * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by\n * Markus Kuhn.\n *\n * @param {Buffer} buf The buffer to check\n * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false`\n * @public\n */\nfunction _isValidUTF8(buf) {\n const len = buf.length;\n let i = 0;\n\n while (i < len) {\n if ((buf[i] & 0x80) === 0) {\n // 0xxxxxxx\n i++;\n } else if ((buf[i] & 0xe0) === 0xc0) {\n // 110xxxxx 10xxxxxx\n if (\n i + 1 === len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i] & 0xfe) === 0xc0 // Overlong\n ) {\n return false;\n }\n\n i += 2;\n } else if ((buf[i] & 0xf0) === 0xe0) {\n // 1110xxxx 10xxxxxx 10xxxxxx\n if (\n i + 2 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80) || // Overlong\n (buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0) // Surrogate (U+D800 - U+DFFF)\n ) {\n return false;\n }\n\n i += 3;\n } else if ((buf[i] & 0xf8) === 0xf0) {\n // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n if (\n i + 3 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i + 3] & 0xc0) !== 0x80 ||\n (buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80) || // Overlong\n (buf[i] === 0xf4 && buf[i + 1] > 0x8f) ||\n buf[i] > 0xf4 // > U+10FFFF\n ) {\n return false;\n }\n\n i += 4;\n } else {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Determines whether a value is a `Blob`.\n *\n * @param {*} value The value to be tested\n * @return {Boolean} `true` if `value` is a `Blob`, else `false`\n * @private\n */\nfunction isBlob(value) {\n return (\n hasBlob &&\n typeof value === 'object' &&\n typeof value.arrayBuffer === 'function' &&\n typeof value.type === 'string' &&\n typeof value.stream === 'function' &&\n (value[Symbol.toStringTag] === 'Blob' ||\n value[Symbol.toStringTag] === 'File')\n );\n}\n\nmodule.exports = {\n isBlob,\n isValidStatusCode,\n isValidUTF8: _isValidUTF8,\n tokenChars\n};\n\nif (isUtf8) {\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 24 ? _isValidUTF8(buf) : isUtf8(buf);\n };\n} /* istanbul ignore else */ else if (!process.env.WS_NO_UTF_8_VALIDATE) {\n try {\n const isValidUTF8 = require('utf-8-validate');\n\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 32 ? _isValidUTF8(buf) : isValidUTF8(buf);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n","'use strict';\n\nconst { Writable } = require('stream');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst {\n BINARY_TYPES,\n EMPTY_BUFFER,\n kStatusCode,\n kWebSocket\n} = require('./constants');\nconst { concat, toArrayBuffer, unmask } = require('./buffer-util');\nconst { isValidStatusCode, isValidUTF8 } = require('./validation');\n\nconst FastBuffer = Buffer[Symbol.species];\n\nconst GET_INFO = 0;\nconst GET_PAYLOAD_LENGTH_16 = 1;\nconst GET_PAYLOAD_LENGTH_64 = 2;\nconst GET_MASK = 3;\nconst GET_DATA = 4;\nconst INFLATING = 5;\nconst DEFER_EVENT = 6;\n\n/**\n * HyBi Receiver implementation.\n *\n * @extends Writable\n */\nclass Receiver extends Writable {\n /**\n * Creates a Receiver instance.\n *\n * @param {Object} [options] Options object\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 {String} [options.binaryType=nodebuffer] The type for binary data\n * @param {Object} [options.extensions] An object containing the negotiated\n * extensions\n * @param {Boolean} [options.isServer=false] Specifies whether to operate in\n * client or server mode\n * @param {Number} [options.maxBufferedChunks=0] The maximum number of\n * buffered data chunks\n * @param {Number} [options.maxFragments=0] The maximum number of message\n * fragments\n * @param {Number} [options.maxPayload=0] The maximum allowed message length\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n */\n constructor(options = {}) {\n super();\n\n this._allowSynchronousEvents =\n options.allowSynchronousEvents !== undefined\n ? options.allowSynchronousEvents\n : true;\n this._binaryType = options.binaryType || BINARY_TYPES[0];\n this._extensions = options.extensions || {};\n this._isServer = !!options.isServer;\n this._maxBufferedChunks = options.maxBufferedChunks | 0;\n this._maxFragments = options.maxFragments | 0;\n this._maxPayload = options.maxPayload | 0;\n this._skipUTF8Validation = !!options.skipUTF8Validation;\n this[kWebSocket] = undefined;\n\n this._bufferedBytes = 0;\n this._buffers = [];\n\n this._compressed = false;\n this._payloadLength = 0;\n this._mask = undefined;\n this._fragmented = 0;\n this._masked = false;\n this._fin = false;\n this._opcode = 0;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._numFragments = 0;\n this._fragments = [];\n\n this._errored = false;\n this._loop = false;\n this._state = GET_INFO;\n }\n\n /**\n * Implements `Writable.prototype._write()`.\n *\n * @param {Buffer} chunk The chunk of data to write\n * @param {String} encoding The character encoding of `chunk`\n * @param {Function} cb Callback\n * @private\n */\n _write(chunk, encoding, cb) {\n if (this._opcode === 0x08 && this._state == GET_INFO) return cb();\n\n if (\n this._maxBufferedChunks > 0 &&\n this._buffers.length >= this._maxBufferedChunks\n ) {\n cb(\n this.createError(\n RangeError,\n 'Too many buffered chunks',\n false,\n 1008,\n 'WS_ERR_TOO_MANY_BUFFERED_PARTS'\n )\n );\n return;\n }\n\n this._bufferedBytes += chunk.length;\n this._buffers.push(chunk);\n this.startLoop(cb);\n }\n\n /**\n * Consumes `n` bytes from the buffered data.\n *\n * @param {Number} n The number of bytes to consume\n * @return {Buffer} The consumed bytes\n * @private\n */\n consume(n) {\n this._bufferedBytes -= n;\n\n if (n === this._buffers[0].length) return this._buffers.shift();\n\n if (n < this._buffers[0].length) {\n const buf = this._buffers[0];\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n\n return new FastBuffer(buf.buffer, buf.byteOffset, n);\n }\n\n const dst = Buffer.allocUnsafe(n);\n\n do {\n const buf = this._buffers[0];\n const offset = dst.length - n;\n\n if (n >= buf.length) {\n dst.set(this._buffers.shift(), offset);\n } else {\n dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset);\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n }\n\n n -= buf.length;\n } while (n > 0);\n\n return dst;\n }\n\n /**\n * Starts the parsing loop.\n *\n * @param {Function} cb Callback\n * @private\n */\n startLoop(cb) {\n this._loop = true;\n\n do {\n switch (this._state) {\n case GET_INFO:\n this.getInfo(cb);\n break;\n case GET_PAYLOAD_LENGTH_16:\n this.getPayloadLength16(cb);\n break;\n case GET_PAYLOAD_LENGTH_64:\n this.getPayloadLength64(cb);\n break;\n case GET_MASK:\n this.getMask();\n break;\n case GET_DATA:\n this.getData(cb);\n break;\n case INFLATING:\n case DEFER_EVENT:\n this._loop = false;\n return;\n }\n } while (this._loop);\n\n if (!this._errored) cb();\n }\n\n /**\n * Reads the first two bytes of a frame.\n *\n * @param {Function} cb Callback\n * @private\n */\n getInfo(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(2);\n\n if ((buf[0] & 0x30) !== 0x00) {\n const error = this.createError(\n RangeError,\n 'RSV2 and RSV3 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_2_3'\n );\n\n cb(error);\n return;\n }\n\n const compressed = (buf[0] & 0x40) === 0x40;\n\n if (compressed && !this._extensions[PerMessageDeflate.extensionName]) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n this._fin = (buf[0] & 0x80) === 0x80;\n this._opcode = buf[0] & 0x0f;\n this._payloadLength = buf[1] & 0x7f;\n\n if (this._opcode === 0x00) {\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fragmented) {\n const error = this.createError(\n RangeError,\n 'invalid opcode 0',\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._opcode = this._fragmented;\n } else if (this._opcode === 0x01 || this._opcode === 0x02) {\n if (this._fragmented) {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._compressed = compressed;\n } else if (this._opcode > 0x07 && this._opcode < 0x0b) {\n if (!this._fin) {\n const error = this.createError(\n RangeError,\n 'FIN must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_FIN'\n );\n\n cb(error);\n return;\n }\n\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (\n this._payloadLength > 0x7d ||\n (this._opcode === 0x08 && this._payloadLength === 1)\n ) {\n const error = this.createError(\n RangeError,\n `invalid payload length ${this._payloadLength}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n } else {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fin && !this._fragmented) this._fragmented = this._opcode;\n this._masked = (buf[1] & 0x80) === 0x80;\n\n if (this._isServer) {\n if (!this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n } else if (this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n\n if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16;\n else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64;\n else this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+16).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength16(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n this._payloadLength = this.consume(2).readUInt16BE(0);\n this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+64).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength64(cb) {\n if (this._bufferedBytes < 8) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(8);\n const num = buf.readUInt32BE(0);\n\n //\n // The maximum safe integer in JavaScript is 2^53 - 1. An error is returned\n // if payload length is greater than this number.\n //\n if (num > Math.pow(2, 53 - 32) - 1) {\n const error = this.createError(\n RangeError,\n 'Unsupported WebSocket frame: payload length > 2^53 - 1',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4);\n this.haveLength(cb);\n }\n\n /**\n * Payload length has been read.\n *\n * @param {Function} cb Callback\n * @private\n */\n haveLength(cb) {\n if (this._payloadLength && this._opcode < 0x08) {\n this._totalPayloadLength += this._payloadLength;\n if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n }\n\n if (this._masked) this._state = GET_MASK;\n else this._state = GET_DATA;\n }\n\n /**\n * Reads mask bytes.\n *\n * @private\n */\n getMask() {\n if (this._bufferedBytes < 4) {\n this._loop = false;\n return;\n }\n\n this._mask = this.consume(4);\n this._state = GET_DATA;\n }\n\n /**\n * Reads data bytes.\n *\n * @param {Function} cb Callback\n * @private\n */\n getData(cb) {\n let data = EMPTY_BUFFER;\n\n if (this._payloadLength) {\n if (this._bufferedBytes < this._payloadLength) {\n this._loop = false;\n return;\n }\n\n data = this.consume(this._payloadLength);\n\n if (\n this._masked &&\n (this._mask[0] | this._mask[1] | this._mask[2] | this._mask[3]) !== 0\n ) {\n unmask(data, this._mask);\n }\n }\n\n if (this._opcode > 0x07) {\n this.controlMessage(data, cb);\n return;\n }\n\n if (this._maxFragments > 0 && ++this._numFragments > this._maxFragments) {\n const error = this.createError(\n RangeError,\n 'Too many message fragments',\n false,\n 1008,\n 'WS_ERR_TOO_MANY_BUFFERED_PARTS'\n );\n\n cb(error);\n return;\n }\n\n if (this._compressed) {\n this._state = INFLATING;\n this.decompress(data, cb);\n return;\n }\n\n if (data.length) {\n //\n // This message is not compressed so its length is the sum of the payload\n // length of all fragments.\n //\n this._messageLength = this._totalPayloadLength;\n this._fragments.push(data);\n }\n\n this.dataMessage(cb);\n }\n\n /**\n * Decompresses data.\n *\n * @param {Buffer} data Compressed data\n * @param {Function} cb Callback\n * @private\n */\n decompress(data, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n perMessageDeflate.decompress(data, this._fin, (err, buf) => {\n if (err) return cb(err);\n\n if (buf.length) {\n this._messageLength += buf.length;\n if (this._messageLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._fragments.push(buf);\n }\n\n this.dataMessage(cb);\n if (this._state === GET_INFO) this.startLoop(cb);\n });\n }\n\n /**\n * Handles a data message.\n *\n * @param {Function} cb Callback\n * @private\n */\n dataMessage(cb) {\n if (!this._fin) {\n this._state = GET_INFO;\n return;\n }\n\n const messageLength = this._messageLength;\n const fragments = this._fragments;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragmented = 0;\n this._numFragments = 0;\n this._fragments = [];\n\n if (this._opcode === 2) {\n let data;\n\n if (this._binaryType === 'nodebuffer') {\n data = concat(fragments, messageLength);\n } else if (this._binaryType === 'arraybuffer') {\n data = toArrayBuffer(concat(fragments, messageLength));\n } else if (this._binaryType === 'blob') {\n data = new Blob(fragments);\n } else {\n data = fragments;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit('message', data, true);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', data, true);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n } else {\n const buf = concat(fragments, messageLength);\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n if (this._state === INFLATING || this._allowSynchronousEvents) {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n }\n\n /**\n * Handles a control message.\n *\n * @param {Buffer} data Data to handle\n * @return {(Error|RangeError|undefined)} A possible error\n * @private\n */\n controlMessage(data, cb) {\n if (this._opcode === 0x08) {\n if (data.length === 0) {\n this._loop = false;\n this.emit('conclude', 1005, EMPTY_BUFFER);\n this.end();\n } else {\n const code = data.readUInt16BE(0);\n\n if (!isValidStatusCode(code)) {\n const error = this.createError(\n RangeError,\n `invalid status code ${code}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CLOSE_CODE'\n );\n\n cb(error);\n return;\n }\n\n const buf = new FastBuffer(\n data.buffer,\n data.byteOffset + 2,\n data.length - 2\n );\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n this._loop = false;\n this.emit('conclude', code, buf);\n this.end();\n }\n\n this._state = GET_INFO;\n return;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n\n /**\n * Builds an error object.\n *\n * @param {function(new:Error|RangeError)} ErrorCtor The error constructor\n * @param {String} message The error message\n * @param {Boolean} prefix Specifies whether or not to add a default prefix to\n * `message`\n * @param {Number} statusCode The status code\n * @param {String} errorCode The exposed error code\n * @return {(Error|RangeError)} The error\n * @private\n */\n createError(ErrorCtor, message, prefix, statusCode, errorCode) {\n this._loop = false;\n this._errored = true;\n\n const err = new ErrorCtor(\n prefix ? `Invalid WebSocket frame: ${message}` : message\n );\n\n Error.captureStackTrace(err, this.createError);\n err.code = errorCode;\n err[kStatusCode] = statusCode;\n return err;\n }\n}\n\nmodule.exports = Receiver;\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex\" }] */\n\n'use strict';\n\nconst { Duplex } = require('stream');\nconst { randomFillSync } = require('crypto');\nconst {\n types: { isUint8Array }\n} = require('util');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst { EMPTY_BUFFER, kWebSocket, NOOP } = require('./constants');\nconst { isBlob, isValidStatusCode } = require('./validation');\nconst { mask: applyMask, toBuffer } = require('./buffer-util');\n\nconst kByteLength = Symbol('kByteLength');\nconst maskBuffer = Buffer.alloc(4);\nconst RANDOM_POOL_SIZE = 8 * 1024;\nlet randomPool;\nlet randomPoolPointer = RANDOM_POOL_SIZE;\n\nconst DEFAULT = 0;\nconst DEFLATING = 1;\nconst GET_BLOB_DATA = 2;\n\n/**\n * HyBi Sender implementation.\n */\nclass Sender {\n /**\n * Creates a Sender instance.\n *\n * @param {Duplex} socket The connection socket\n * @param {Object} [extensions] An object containing the negotiated extensions\n * @param {Function} [generateMask] The function used to generate the masking\n * key\n */\n constructor(socket, extensions, generateMask) {\n this._extensions = extensions || {};\n\n if (generateMask) {\n this._generateMask = generateMask;\n this._maskBuffer = Buffer.alloc(4);\n }\n\n this._socket = socket;\n\n this._firstFragment = true;\n this._compress = false;\n\n this._bufferedBytes = 0;\n this._queue = [];\n this._state = DEFAULT;\n this.onerror = NOOP;\n this[kWebSocket] = undefined;\n }\n\n /**\n * Frames a piece of data according to the HyBi WebSocket protocol.\n *\n * @param {(Buffer|String)} data The data to frame\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @return {(Buffer|String)[]} The framed data\n * @public\n */\n static frame(data, options) {\n let mask;\n let merge = false;\n let offset = 2;\n let skipMasking = false;\n\n if (options.mask) {\n mask = options.maskBuffer || maskBuffer;\n\n if (options.generateMask) {\n options.generateMask(mask);\n } else {\n if (randomPoolPointer === RANDOM_POOL_SIZE) {\n /* istanbul ignore else */\n if (randomPool === undefined) {\n //\n // This is lazily initialized because server-sent frames must not\n // be masked so it may never be used.\n //\n randomPool = Buffer.alloc(RANDOM_POOL_SIZE);\n }\n\n randomFillSync(randomPool, 0, RANDOM_POOL_SIZE);\n randomPoolPointer = 0;\n }\n\n mask[0] = randomPool[randomPoolPointer++];\n mask[1] = randomPool[randomPoolPointer++];\n mask[2] = randomPool[randomPoolPointer++];\n mask[3] = randomPool[randomPoolPointer++];\n }\n\n skipMasking = (mask[0] | mask[1] | mask[2] | mask[3]) === 0;\n offset = 6;\n }\n\n let dataLength;\n\n if (typeof data === 'string') {\n if (\n (!options.mask || skipMasking) &&\n options[kByteLength] !== undefined\n ) {\n dataLength = options[kByteLength];\n } else {\n data = Buffer.from(data);\n dataLength = data.length;\n }\n } else {\n dataLength = data.length;\n merge = options.mask && options.readOnly && !skipMasking;\n }\n\n let payloadLength = dataLength;\n\n if (dataLength >= 65536) {\n offset += 8;\n payloadLength = 127;\n } else if (dataLength > 125) {\n offset += 2;\n payloadLength = 126;\n }\n\n const target = Buffer.allocUnsafe(merge ? dataLength + offset : offset);\n\n target[0] = options.fin ? options.opcode | 0x80 : options.opcode;\n if (options.rsv1) target[0] |= 0x40;\n\n target[1] = payloadLength;\n\n if (payloadLength === 126) {\n target.writeUInt16BE(dataLength, 2);\n } else if (payloadLength === 127) {\n target[2] = target[3] = 0;\n target.writeUIntBE(dataLength, 4, 6);\n }\n\n if (!options.mask) return [target, data];\n\n target[1] |= 0x80;\n target[offset - 4] = mask[0];\n target[offset - 3] = mask[1];\n target[offset - 2] = mask[2];\n target[offset - 1] = mask[3];\n\n if (skipMasking) return [target, data];\n\n if (merge) {\n applyMask(data, mask, target, offset, dataLength);\n return [target];\n }\n\n applyMask(data, mask, data, 0, dataLength);\n return [target, data];\n }\n\n /**\n * Sends a close message to the other peer.\n *\n * @param {Number} [code] The status code component of the body\n * @param {(String|Buffer)} [data] The message component of the body\n * @param {Boolean} [mask=false] Specifies whether or not to mask the message\n * @param {Function} [cb] Callback\n * @public\n */\n close(code, data, mask, cb) {\n let buf;\n\n if (code === undefined) {\n buf = EMPTY_BUFFER;\n } else if (typeof code !== 'number' || !isValidStatusCode(code)) {\n throw new TypeError('First argument must be a valid error code number');\n } else if (data === undefined || !data.length) {\n buf = Buffer.allocUnsafe(2);\n buf.writeUInt16BE(code, 0);\n } else {\n const length = Buffer.byteLength(data);\n\n if (length > 123) {\n throw new RangeError('The message must not be greater than 123 bytes');\n }\n\n buf = Buffer.allocUnsafe(2 + length);\n buf.writeUInt16BE(code, 0);\n\n if (typeof data === 'string') {\n buf.write(data, 2);\n } else if (isUint8Array(data)) {\n buf.set(data, 2);\n } else {\n throw new TypeError('Second argument must be a string or a Uint8Array');\n }\n }\n\n const options = {\n [kByteLength]: buf.length,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x08,\n readOnly: false,\n rsv1: false\n };\n\n if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, buf, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(buf, options), cb);\n }\n }\n\n /**\n * Sends a ping message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n ping(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x09,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a pong message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n pong(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x0a,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a data message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Object} options Options object\n * @param {Boolean} [options.binary=false] Specifies whether `data` is binary\n * or text\n * @param {Boolean} [options.compress=false] Specifies whether or not to\n * compress `data`\n * @param {Boolean} [options.fin=false] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Function} [cb] Callback\n * @public\n */\n send(data, options, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n let opcode = options.binary ? 2 : 1;\n let rsv1 = options.compress;\n\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (this._firstFragment) {\n this._firstFragment = false;\n if (\n rsv1 &&\n perMessageDeflate &&\n perMessageDeflate.params[\n perMessageDeflate._isServer\n ? 'server_no_context_takeover'\n : 'client_no_context_takeover'\n ]\n ) {\n rsv1 = byteLength >= perMessageDeflate._threshold;\n }\n this._compress = rsv1;\n } else {\n rsv1 = false;\n opcode = 0;\n }\n\n if (options.fin) this._firstFragment = true;\n\n const opts = {\n [kByteLength]: byteLength,\n fin: options.fin,\n generateMask: this._generateMask,\n mask: options.mask,\n maskBuffer: this._maskBuffer,\n opcode,\n readOnly,\n rsv1\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, this._compress, opts, cb]);\n } else {\n this.getBlobData(data, this._compress, opts, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, this._compress, opts, cb]);\n } else {\n this.dispatch(data, this._compress, opts, cb);\n }\n }\n\n /**\n * Gets the contents of a blob as binary data.\n *\n * @param {Blob} blob The blob\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * the data\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n getBlobData(blob, compress, options, cb) {\n this._bufferedBytes += options[kByteLength];\n this._state = GET_BLOB_DATA;\n\n blob\n .arrayBuffer()\n .then((arrayBuffer) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while the blob was being read'\n );\n\n //\n // `callCallbacks` is called in the next tick to ensure that errors\n // that might be thrown in the callbacks behave like errors thrown\n // outside the promise chain.\n //\n process.nextTick(callCallbacks, this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n const data = toBuffer(arrayBuffer);\n\n if (!compress) {\n this._state = DEFAULT;\n this.sendFrame(Sender.frame(data, options), cb);\n this.dequeue();\n } else {\n this.dispatch(data, compress, options, cb);\n }\n })\n .catch((err) => {\n //\n // `onError` is called in the next tick for the same reason that\n // `callCallbacks` above is.\n //\n process.nextTick(onError, this, err, cb);\n });\n }\n\n /**\n * Dispatches a message.\n *\n * @param {(Buffer|String)} data The message to send\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * `data`\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n dispatch(data, compress, options, cb) {\n if (!compress) {\n this.sendFrame(Sender.frame(data, options), cb);\n return;\n }\n\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n this._bufferedBytes += options[kByteLength];\n this._state = DEFLATING;\n perMessageDeflate.compress(data, options.fin, (_, buf) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while data was being compressed'\n );\n\n callCallbacks(this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n this._state = DEFAULT;\n options.readOnly = false;\n this.sendFrame(Sender.frame(buf, options), cb);\n this.dequeue();\n });\n }\n\n /**\n * Executes queued send operations.\n *\n * @private\n */\n dequeue() {\n while (this._state === DEFAULT && this._queue.length) {\n const params = this._queue.shift();\n\n this._bufferedBytes -= params[3][kByteLength];\n Reflect.apply(params[0], this, params.slice(1));\n }\n }\n\n /**\n * Enqueues a send operation.\n *\n * @param {Array} params Send operation parameters.\n * @private\n */\n enqueue(params) {\n this._bufferedBytes += params[3][kByteLength];\n this._queue.push(params);\n }\n\n /**\n * Sends a frame.\n *\n * @param {(Buffer | String)[]} list The frame to send\n * @param {Function} [cb] Callback\n * @private\n */\n sendFrame(list, cb) {\n if (list.length === 2) {\n this._socket.cork();\n this._socket.write(list[0]);\n this._socket.write(list[1], cb);\n this._socket.uncork();\n } else {\n this._socket.write(list[0], cb);\n }\n }\n}\n\nmodule.exports = Sender;\n\n/**\n * Calls queued callbacks with an error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error to call the callbacks with\n * @param {Function} [cb] The first callback\n * @private\n */\nfunction callCallbacks(sender, err, cb) {\n if (typeof cb === 'function') cb(err);\n\n for (let i = 0; i < sender._queue.length; i++) {\n const params = sender._queue[i];\n const callback = params[params.length - 1];\n\n if (typeof callback === 'function') callback(err);\n }\n}\n\n/**\n * Handles a `Sender` error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error\n * @param {Function} [cb] The first pending callback\n * @private\n */\nfunction onError(sender, err, cb) {\n callCallbacks(sender, err, cb);\n sender.onerror(err);\n}\n","'use strict';\n\nconst { kForOnEventAttribute, kListener } = require('./constants');\n\nconst kCode = Symbol('kCode');\nconst kData = Symbol('kData');\nconst kError = Symbol('kError');\nconst kMessage = Symbol('kMessage');\nconst kReason = Symbol('kReason');\nconst kTarget = Symbol('kTarget');\nconst kType = Symbol('kType');\nconst kWasClean = Symbol('kWasClean');\n\n/**\n * Class representing an event.\n */\nclass Event {\n /**\n * Create a new `Event`.\n *\n * @param {String} type The name of the event\n * @throws {TypeError} If the `type` argument is not specified\n */\n constructor(type) {\n this[kTarget] = null;\n this[kType] = type;\n }\n\n /**\n * @type {*}\n */\n get target() {\n return this[kTarget];\n }\n\n /**\n * @type {String}\n */\n get type() {\n return this[kType];\n }\n}\n\nObject.defineProperty(Event.prototype, 'target', { enumerable: true });\nObject.defineProperty(Event.prototype, 'type', { enumerable: true });\n\n/**\n * Class representing a close event.\n *\n * @extends Event\n */\nclass CloseEvent extends Event {\n /**\n * Create a new `CloseEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {Number} [options.code=0] The status code explaining why the\n * connection was closed\n * @param {String} [options.reason=''] A human-readable string explaining why\n * the connection was closed\n * @param {Boolean} [options.wasClean=false] Indicates whether or not the\n * connection was cleanly closed\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kCode] = options.code === undefined ? 0 : options.code;\n this[kReason] = options.reason === undefined ? '' : options.reason;\n this[kWasClean] = options.wasClean === undefined ? false : options.wasClean;\n }\n\n /**\n * @type {Number}\n */\n get code() {\n return this[kCode];\n }\n\n /**\n * @type {String}\n */\n get reason() {\n return this[kReason];\n }\n\n /**\n * @type {Boolean}\n */\n get wasClean() {\n return this[kWasClean];\n }\n}\n\nObject.defineProperty(CloseEvent.prototype, 'code', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'reason', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'wasClean', { enumerable: true });\n\n/**\n * Class representing an error event.\n *\n * @extends Event\n */\nclass ErrorEvent extends Event {\n /**\n * Create a new `ErrorEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.error=null] The error that generated this event\n * @param {String} [options.message=''] The error message\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kError] = options.error === undefined ? null : options.error;\n this[kMessage] = options.message === undefined ? '' : options.message;\n }\n\n /**\n * @type {*}\n */\n get error() {\n return this[kError];\n }\n\n /**\n * @type {String}\n */\n get message() {\n return this[kMessage];\n }\n}\n\nObject.defineProperty(ErrorEvent.prototype, 'error', { enumerable: true });\nObject.defineProperty(ErrorEvent.prototype, 'message', { enumerable: true });\n\n/**\n * Class representing a message event.\n *\n * @extends Event\n */\nclass MessageEvent extends Event {\n /**\n * Create a new `MessageEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.data=null] The message content\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kData] = options.data === undefined ? null : options.data;\n }\n\n /**\n * @type {*}\n */\n get data() {\n return this[kData];\n }\n}\n\nObject.defineProperty(MessageEvent.prototype, 'data', { enumerable: true });\n\n/**\n * This provides methods for emulating the `EventTarget` interface. It's not\n * meant to be used directly.\n *\n * @mixin\n */\nconst EventTarget = {\n /**\n * Register an event listener.\n *\n * @param {String} type A string representing the event type to listen for\n * @param {(Function|Object)} handler The listener to add\n * @param {Object} [options] An options object specifies characteristics about\n * the event listener\n * @param {Boolean} [options.once=false] A `Boolean` indicating that the\n * listener should be invoked at most once after being added. If `true`,\n * the listener would be automatically removed when invoked.\n * @public\n */\n addEventListener(type, handler, options = {}) {\n for (const listener of this.listeners(type)) {\n if (\n !options[kForOnEventAttribute] &&\n listener[kListener] === handler &&\n !listener[kForOnEventAttribute]\n ) {\n return;\n }\n }\n\n let wrapper;\n\n if (type === 'message') {\n wrapper = function onMessage(data, isBinary) {\n const event = new MessageEvent('message', {\n data: isBinary ? data : data.toString()\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'close') {\n wrapper = function onClose(code, message) {\n const event = new CloseEvent('close', {\n code,\n reason: message.toString(),\n wasClean: this._closeFrameReceived && this._closeFrameSent\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'error') {\n wrapper = function onError(error) {\n const event = new ErrorEvent('error', {\n error,\n message: error.message\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'open') {\n wrapper = function onOpen() {\n const event = new Event('open');\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else {\n return;\n }\n\n wrapper[kForOnEventAttribute] = !!options[kForOnEventAttribute];\n wrapper[kListener] = handler;\n\n if (options.once) {\n this.once(type, wrapper);\n } else {\n this.on(type, wrapper);\n }\n },\n\n /**\n * Remove an event listener.\n *\n * @param {String} type A string representing the event type to remove\n * @param {(Function|Object)} handler The listener to remove\n * @public\n */\n removeEventListener(type, handler) {\n for (const listener of this.listeners(type)) {\n if (listener[kListener] === handler && !listener[kForOnEventAttribute]) {\n this.removeListener(type, listener);\n break;\n }\n }\n }\n};\n\nmodule.exports = {\n CloseEvent,\n ErrorEvent,\n Event,\n EventTarget,\n MessageEvent\n};\n\n/**\n * Call an event listener\n *\n * @param {(Function|Object)} listener The listener to call\n * @param {*} thisArg The value to use as `this`` when calling the listener\n * @param {Event} event The event to pass to the listener\n * @private\n */\nfunction callListener(listener, thisArg, event) {\n if (typeof listener === 'object' && listener.handleEvent) {\n listener.handleEvent.call(listener, event);\n } else {\n listener.call(thisArg, event);\n }\n}\n","'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Adds an offer to the map of extension offers or a parameter to the map of\n * parameters.\n *\n * @param {Object} dest The map of extension offers or parameters\n * @param {String} name The extension or parameter name\n * @param {(Object|Boolean|String)} elem The extension parameters or the\n * parameter value\n * @private\n */\nfunction push(dest, name, elem) {\n if (dest[name] === undefined) dest[name] = [elem];\n else dest[name].push(elem);\n}\n\n/**\n * Parses the `Sec-WebSocket-Extensions` header into an object.\n *\n * @param {String} header The field value of the header\n * @return {Object} The parsed object\n * @public\n */\nfunction parse(header) {\n const offers = Object.create(null);\n let params = Object.create(null);\n let mustUnescape = false;\n let isEscaping = false;\n let inQuotes = false;\n let extensionName;\n let paramName;\n let start = -1;\n let code = -1;\n let end = -1;\n let i = 0;\n\n for (; i < header.length; i++) {\n code = header.charCodeAt(i);\n\n if (extensionName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (\n i !== 0 &&\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\n ) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b /* ';' */ || code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n const name = header.slice(start, end);\n if (code === 0x2c) {\n push(offers, name, params);\n params = Object.create(null);\n } else {\n extensionName = name;\n }\n\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (paramName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x20 || code === 0x09) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n push(params, header.slice(start, end), true);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n start = end = -1;\n } else if (code === 0x3d /* '=' */ && start !== -1 && end === -1) {\n paramName = header.slice(start, i);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else {\n //\n // The value of a quoted-string after unescaping must conform to the\n // token ABNF, so only token characters are valid.\n // Ref: https://tools.ietf.org/html/rfc6455#section-9.1\n //\n if (isEscaping) {\n if (tokenChars[code] !== 1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n if (start === -1) start = i;\n else if (!mustUnescape) mustUnescape = true;\n isEscaping = false;\n } else if (inQuotes) {\n if (tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x22 /* '\"' */ && start !== -1) {\n inQuotes = false;\n end = i;\n } else if (code === 0x5c /* '\\' */) {\n isEscaping = true;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (code === 0x22 && header.charCodeAt(i - 1) === 0x3d) {\n inQuotes = true;\n } else if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (start !== -1 && (code === 0x20 || code === 0x09)) {\n if (end === -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n let value = header.slice(start, end);\n if (mustUnescape) {\n value = value.replace(/\\\\/g, '');\n mustUnescape = false;\n }\n push(params, paramName, value);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n paramName = undefined;\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n }\n\n if (start === -1 || inQuotes || code === 0x20 || code === 0x09) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n if (end === -1) end = i;\n const token = header.slice(start, end);\n if (extensionName === undefined) {\n push(offers, token, params);\n } else {\n if (paramName === undefined) {\n push(params, token, true);\n } else if (mustUnescape) {\n push(params, paramName, token.replace(/\\\\/g, ''));\n } else {\n push(params, paramName, token);\n }\n push(offers, extensionName, params);\n }\n\n return offers;\n}\n\n/**\n * Builds the `Sec-WebSocket-Extensions` header field value.\n *\n * @param {Object} extensions The map of extensions and parameters to format\n * @return {String} A string representing the given object\n * @public\n */\nfunction format(extensions) {\n return Object.keys(extensions)\n .map((extension) => {\n let configurations = extensions[extension];\n if (!Array.isArray(configurations)) configurations = [configurations];\n return configurations\n .map((params) => {\n return [extension]\n .concat(\n Object.keys(params).map((k) => {\n let values = params[k];\n if (!Array.isArray(values)) values = [values];\n return values\n .map((v) => (v === true ? k : `${k}=${v}`))\n .join('; ');\n })\n )\n .join('; ');\n })\n .join(', ');\n })\n .join(', ');\n}\n\nmodule.exports = { format, parse };\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex|Readable$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst https = require('https');\nconst http = require('http');\nconst net = require('net');\nconst tls = require('tls');\nconst { randomBytes, createHash } = require('crypto');\nconst { Duplex, Readable } = require('stream');\nconst { URL } = require('url');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst Receiver = require('./receiver');\nconst Sender = require('./sender');\nconst { isBlob } = require('./validation');\n\nconst {\n BINARY_TYPES,\n CLOSE_TIMEOUT,\n EMPTY_BUFFER,\n GUID,\n kForOnEventAttribute,\n kListener,\n kStatusCode,\n kWebSocket,\n NOOP\n} = require('./constants');\nconst {\n EventTarget: { addEventListener, removeEventListener }\n} = require('./event-target');\nconst { format, parse } = require('./extension');\nconst { toBuffer } = require('./buffer-util');\n\nconst kAborted = Symbol('kAborted');\nconst protocolVersions = [8, 13];\nconst readyStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'];\nconst subprotocolRegex = /^[!#$%&'*+\\-.0-9A-Z^_`|a-z~]+$/;\n\n/**\n * Class representing a WebSocket.\n *\n * @extends EventEmitter\n */\nclass WebSocket extends EventEmitter {\n /**\n * Create a new `WebSocket`.\n *\n * @param {(String|URL)} address The URL to which to connect\n * @param {(String|String[])} [protocols] The subprotocols\n * @param {Object} [options] Connection options\n */\n constructor(address, protocols, options) {\n super();\n\n this._binaryType = BINARY_TYPES[0];\n this._closeCode = 1006;\n this._closeFrameReceived = false;\n this._closeFrameSent = false;\n this._closeMessage = EMPTY_BUFFER;\n this._closeTimer = null;\n this._errorEmitted = false;\n this._extensions = {};\n this._paused = false;\n this._protocol = '';\n this._readyState = WebSocket.CONNECTING;\n this._receiver = null;\n this._sender = null;\n this._socket = null;\n\n if (address !== null) {\n this._bufferedAmount = 0;\n this._isServer = false;\n this._redirects = 0;\n\n if (protocols === undefined) {\n if (!options || options.protocols === undefined) {\n protocols = [];\n } else if (Array.isArray(options.protocols)) {\n protocols = options.protocols;\n } else {\n protocols = [options.protocols];\n }\n } else if (!Array.isArray(protocols)) {\n if (typeof protocols === 'object' && protocols !== null) {\n options = protocols;\n\n if (options.protocols === undefined) {\n protocols = [];\n } else if (Array.isArray(options.protocols)) {\n protocols = options.protocols;\n } else {\n protocols = [options.protocols];\n }\n } else {\n protocols = [protocols];\n }\n }\n\n initAsClient(this, address, protocols, options);\n } else {\n this._autoPong = options.autoPong;\n this._closeTimeout = options.closeTimeout;\n this._isServer = true;\n }\n }\n\n /**\n * For historical reasons, the custom \"nodebuffer\" type is used by the default\n * instead of \"blob\".\n *\n * @type {String}\n */\n get binaryType() {\n return this._binaryType;\n }\n\n set binaryType(type) {\n if (!BINARY_TYPES.includes(type)) return;\n\n this._binaryType = type;\n\n //\n // Allow to change `binaryType` on the fly.\n //\n if (this._receiver) this._receiver._binaryType = type;\n }\n\n /**\n * @type {Number}\n */\n get bufferedAmount() {\n if (!this._socket) return this._bufferedAmount;\n\n return this._socket._writableState.length + this._sender._bufferedBytes;\n }\n\n /**\n * @type {String}\n */\n get extensions() {\n return Object.keys(this._extensions).join();\n }\n\n /**\n * @type {Boolean}\n */\n get isPaused() {\n return this._paused;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onclose() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onerror() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onopen() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onmessage() {\n return null;\n }\n\n /**\n * @type {String}\n */\n get protocol() {\n return this._protocol;\n }\n\n /**\n * @type {Number}\n */\n get readyState() {\n return this._readyState;\n }\n\n /**\n * @type {String}\n */\n get url() {\n return this._url;\n }\n\n /**\n * Set up the socket and the internal resources.\n *\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 {Object} options Options object\n * @param {Boolean} [options.allowSynchronousEvents=false] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.maxBufferedChunks=0] The maximum number of\n * buffered data chunks\n * @param {Number} [options.maxFragments=0] The maximum number of message\n * fragments\n * @param {Number} [options.maxPayload=0] The maximum allowed message size\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\n setSocket(socket, head, options) {\n const receiver = new Receiver({\n allowSynchronousEvents: options.allowSynchronousEvents,\n binaryType: this.binaryType,\n extensions: this._extensions,\n isServer: this._isServer,\n maxBufferedChunks: options.maxBufferedChunks,\n maxFragments: options.maxFragments,\n maxPayload: options.maxPayload,\n skipUTF8Validation: options.skipUTF8Validation\n });\n\n const sender = new Sender(socket, this._extensions, options.generateMask);\n\n this._receiver = receiver;\n this._sender = sender;\n this._socket = socket;\n\n receiver[kWebSocket] = this;\n sender[kWebSocket] = this;\n socket[kWebSocket] = this;\n\n receiver.on('conclude', receiverOnConclude);\n receiver.on('drain', receiverOnDrain);\n receiver.on('error', receiverOnError);\n receiver.on('message', receiverOnMessage);\n receiver.on('ping', receiverOnPing);\n receiver.on('pong', receiverOnPong);\n\n sender.onerror = senderOnError;\n\n //\n // These methods may not be available if `socket` is just a `Duplex`.\n //\n if (socket.setTimeout) socket.setTimeout(0);\n if (socket.setNoDelay) socket.setNoDelay();\n\n if (head.length > 0) socket.unshift(head);\n\n socket.on('close', socketOnClose);\n socket.on('data', socketOnData);\n socket.on('end', socketOnEnd);\n socket.on('error', socketOnError);\n\n this._readyState = WebSocket.OPEN;\n this.emit('open');\n }\n\n /**\n * Emit the `'close'` event.\n *\n * @private\n */\n emitClose() {\n if (!this._socket) {\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n return;\n }\n\n if (this._extensions[PerMessageDeflate.extensionName]) {\n this._extensions[PerMessageDeflate.extensionName].cleanup();\n }\n\n this._receiver.removeAllListeners();\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n }\n\n /**\n * Start a closing handshake.\n *\n * +----------+ +-----------+ +----------+\n * - - -|ws.close()|-->|close frame|-->|ws.close()|- - -\n * | +----------+ +-----------+ +----------+ |\n * +----------+ +-----------+ |\n * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING\n * +----------+ +-----------+ |\n * | | | +---+ |\n * +------------------------+-->|fin| - - - -\n * | +---+ | +---+\n * - - - - -|fin|<---------------------+\n * +---+\n *\n * @param {Number} [code] Status code explaining why the connection is closing\n * @param {(String|Buffer)} [data] The reason why the connection is\n * closing\n * @public\n */\n close(code, data) {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this.readyState === WebSocket.CLOSING) {\n if (\n this._closeFrameSent &&\n (this._closeFrameReceived || this._receiver._writableState.errorEmitted)\n ) {\n this._socket.end();\n }\n\n return;\n }\n\n this._sender.close(code, data, !this._isServer, (err) => {\n //\n // This error is handled by the `'error'` listener on the socket. We only\n // want to know if the close frame has been sent here.\n //\n if (err) return;\n\n this._closeFrameSent = true;\n\n if (\n this._closeFrameReceived ||\n this._receiver._writableState.errorEmitted\n ) {\n this._socket.end();\n }\n });\n\n this._readyState = WebSocket.CLOSING;\n setCloseTimer(this);\n }\n\n /**\n * Pause the socket.\n *\n * @public\n */\n pause() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = true;\n this._socket.pause();\n }\n\n /**\n * Send a ping.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the ping is sent\n * @public\n */\n ping(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.ping(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Send a pong.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the pong is sent\n * @public\n */\n pong(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.pong(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Resume the socket.\n *\n * @public\n */\n resume() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = false;\n if (!this._receiver._writableState.needDrain) this._socket.resume();\n }\n\n /**\n * Send a data message.\n *\n * @param {*} data The message to send\n * @param {Object} [options] Options object\n * @param {Boolean} [options.binary] Specifies whether `data` is binary or\n * text\n * @param {Boolean} [options.compress] Specifies whether or not to compress\n * `data`\n * @param {Boolean} [options.fin=true] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when data is written out\n * @public\n */\n send(data, options, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof options === 'function') {\n cb = options;\n options = {};\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n const opts = {\n binary: typeof data !== 'string',\n mask: !this._isServer,\n compress: true,\n fin: true,\n ...options\n };\n\n if (!this._extensions[PerMessageDeflate.extensionName]) {\n opts.compress = false;\n }\n\n this._sender.send(data || EMPTY_BUFFER, opts, cb);\n }\n\n /**\n * Forcibly close the connection.\n *\n * @public\n */\n terminate() {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this._socket) {\n this._readyState = WebSocket.CLOSING;\n this._socket.destroy();\n }\n }\n}\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n[\n 'binaryType',\n 'bufferedAmount',\n 'extensions',\n 'isPaused',\n 'protocol',\n 'readyState',\n 'url'\n].forEach((property) => {\n Object.defineProperty(WebSocket.prototype, property, { enumerable: true });\n});\n\n//\n// Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes.\n// See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface\n//\n['open', 'error', 'close', 'message'].forEach((method) => {\n Object.defineProperty(WebSocket.prototype, `on${method}`, {\n enumerable: true,\n get() {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) return listener[kListener];\n }\n\n return null;\n },\n set(handler) {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) {\n this.removeListener(method, listener);\n break;\n }\n }\n\n if (typeof handler !== 'function') return;\n\n this.addEventListener(method, handler, {\n [kForOnEventAttribute]: true\n });\n }\n });\n});\n\nWebSocket.prototype.addEventListener = addEventListener;\nWebSocket.prototype.removeEventListener = removeEventListener;\n\nmodule.exports = WebSocket;\n\n/**\n * Initialize a WebSocket client.\n *\n * @param {WebSocket} websocket The client to initialize\n * @param {(String|URL)} address The URL to which to connect\n * @param {Array} protocols The subprotocols\n * @param {Object} [options] Connection options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether any\n * of the `'message'`, `'ping'`, and `'pong'` events can be emitted multiple\n * 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.closeTimeout=30000] Duration in milliseconds to wait\n * for the closing handshake to finish after `websocket.close()` is called\n * @param {Function} [options.finishRequest] A function which can be used to\n * customize the headers of each http request before it is sent\n * @param {Boolean} [options.followRedirects=false] Whether or not to follow\n * redirects\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.handshakeTimeout] Timeout in milliseconds for the\n * handshake request\n * @param {Number} [options.maxBufferedChunks=262144] The maximum number of\n * buffered data chunks\n * @param {Number} [options.maxFragments=16384] The maximum number of message\n * fragments\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Number} [options.maxRedirects=10] The maximum number of redirects\n * allowed\n * @param {String} [options.origin] Value of the `Origin` or\n * `Sec-WebSocket-Origin` header\n * @param {(Boolean|Object)} [options.perMessageDeflate=true] Enable/disable\n * permessage-deflate\n * @param {Number} [options.protocolVersion=13] Value of the\n * `Sec-WebSocket-Version` header\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\nfunction initAsClient(websocket, address, protocols, options) {\n const opts = {\n allowSynchronousEvents: true,\n autoPong: true,\n closeTimeout: CLOSE_TIMEOUT,\n protocolVersion: protocolVersions[1],\n maxBufferedChunks: 256 * 1024,\n maxFragments: 16 * 1024,\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: true,\n followRedirects: false,\n maxRedirects: 10,\n ...options,\n socketPath: undefined,\n hostname: undefined,\n protocol: undefined,\n protocols: undefined,\n timeout: undefined,\n method: 'GET',\n host: undefined,\n path: undefined,\n port: undefined\n };\n\n websocket._autoPong = opts.autoPong;\n websocket._closeTimeout = opts.closeTimeout;\n\n if (!protocolVersions.includes(opts.protocolVersion)) {\n throw new RangeError(\n `Unsupported protocol version: ${opts.protocolVersion} ` +\n `(supported versions: ${protocolVersions.join(', ')})`\n );\n }\n\n let parsedUrl;\n\n if (address instanceof URL) {\n parsedUrl = address;\n } else {\n try {\n parsedUrl = new URL(address);\n } catch {\n throw new SyntaxError(`Invalid URL: ${address}`);\n }\n }\n\n if (parsedUrl.protocol === 'http:') {\n parsedUrl.protocol = 'ws:';\n } else if (parsedUrl.protocol === 'https:') {\n parsedUrl.protocol = 'wss:';\n }\n\n websocket._url = parsedUrl.href;\n\n const isSecure = parsedUrl.protocol === 'wss:';\n const isIpcUrl = parsedUrl.protocol === 'ws+unix:';\n let invalidUrlMessage;\n\n if (parsedUrl.protocol !== 'ws:' && !isSecure && !isIpcUrl) {\n invalidUrlMessage =\n 'The URL\\'s protocol must be one of \"ws:\", \"wss:\", ' +\n '\"http:\", \"https:\", or \"ws+unix:\"';\n } else if (isIpcUrl && !parsedUrl.pathname) {\n invalidUrlMessage = \"The URL's pathname is empty\";\n } else if (parsedUrl.hash) {\n invalidUrlMessage = 'The URL contains a fragment identifier';\n }\n\n if (invalidUrlMessage) {\n const err = new SyntaxError(invalidUrlMessage);\n\n if (websocket._redirects === 0) {\n throw err;\n } else {\n emitErrorAndClose(websocket, err);\n return;\n }\n }\n\n const defaultPort = isSecure ? 443 : 80;\n const key = randomBytes(16).toString('base64');\n const request = isSecure ? https.request : http.request;\n const protocolSet = new Set();\n let perMessageDeflate;\n\n opts.createConnection =\n opts.createConnection || (isSecure ? tlsConnect : netConnect);\n opts.defaultPort = opts.defaultPort || defaultPort;\n opts.port = parsedUrl.port || defaultPort;\n opts.host = parsedUrl.hostname.startsWith('[')\n ? parsedUrl.hostname.slice(1, -1)\n : parsedUrl.hostname;\n opts.headers = {\n ...opts.headers,\n 'Sec-WebSocket-Version': opts.protocolVersion,\n 'Sec-WebSocket-Key': key,\n Connection: 'Upgrade',\n Upgrade: 'websocket'\n };\n opts.path = parsedUrl.pathname + parsedUrl.search;\n opts.timeout = opts.handshakeTimeout;\n\n if (opts.perMessageDeflate) {\n perMessageDeflate = new PerMessageDeflate({\n ...opts.perMessageDeflate,\n isServer: false,\n maxPayload: opts.maxPayload\n });\n opts.headers['Sec-WebSocket-Extensions'] = format({\n [PerMessageDeflate.extensionName]: perMessageDeflate.offer()\n });\n }\n if (protocols.length) {\n for (const protocol of protocols) {\n if (\n typeof protocol !== 'string' ||\n !subprotocolRegex.test(protocol) ||\n protocolSet.has(protocol)\n ) {\n throw new SyntaxError(\n 'An invalid or duplicated subprotocol was specified'\n );\n }\n\n protocolSet.add(protocol);\n }\n\n opts.headers['Sec-WebSocket-Protocol'] = protocols.join(',');\n }\n if (opts.origin) {\n if (opts.protocolVersion < 13) {\n opts.headers['Sec-WebSocket-Origin'] = opts.origin;\n } else {\n opts.headers.Origin = opts.origin;\n }\n }\n if (parsedUrl.username || parsedUrl.password) {\n opts.auth = `${parsedUrl.username}:${parsedUrl.password}`;\n }\n\n if (isIpcUrl) {\n const parts = opts.path.split(':');\n\n opts.socketPath = parts[0];\n opts.path = parts[1];\n }\n\n let req;\n\n if (opts.followRedirects) {\n if (websocket._redirects === 0) {\n websocket._originalIpc = isIpcUrl;\n websocket._originalSecure = isSecure;\n websocket._originalHostOrSocketPath = isIpcUrl\n ? opts.socketPath\n : parsedUrl.host;\n\n const headers = options && options.headers;\n\n //\n // Shallow copy the user provided options so that headers can be changed\n // without mutating the original object.\n //\n options = { ...options, headers: {} };\n\n if (headers) {\n for (const [key, value] of Object.entries(headers)) {\n options.headers[key.toLowerCase()] = value;\n }\n }\n } else if (websocket.listenerCount('redirect') === 0) {\n const isSameHost = isIpcUrl\n ? websocket._originalIpc\n ? opts.socketPath === websocket._originalHostOrSocketPath\n : false\n : websocket._originalIpc\n ? false\n : parsedUrl.host === websocket._originalHostOrSocketPath;\n\n if (!isSameHost || (websocket._originalSecure && !isSecure)) {\n //\n // Match curl 7.77.0 behavior and drop the following headers. These\n // headers are also dropped when following a redirect to a subdomain.\n //\n delete opts.headers.authorization;\n delete opts.headers.cookie;\n\n if (!isSameHost) delete opts.headers.host;\n\n opts.auth = undefined;\n }\n }\n\n //\n // Match curl 7.77.0 behavior and make the first `Authorization` header win.\n // If the `Authorization` header is set, then there is nothing to do as it\n // will take precedence.\n //\n if (opts.auth && !options.headers.authorization) {\n options.headers.authorization =\n 'Basic ' + Buffer.from(opts.auth).toString('base64');\n }\n\n req = websocket._req = request(opts);\n\n if (websocket._redirects) {\n //\n // Unlike what is done for the `'upgrade'` event, no early exit is\n // triggered here if the user calls `websocket.close()` or\n // `websocket.terminate()` from a listener of the `'redirect'` event. This\n // is because the user can also call `request.destroy()` with an error\n // before calling `websocket.close()` or `websocket.terminate()` and this\n // would result in an error being emitted on the `request` object with no\n // `'error'` event listeners attached.\n //\n websocket.emit('redirect', websocket.url, req);\n }\n } else {\n req = websocket._req = request(opts);\n }\n\n if (opts.timeout) {\n req.on('timeout', () => {\n abortHandshake(websocket, req, 'Opening handshake has timed out');\n });\n }\n\n req.on('error', (err) => {\n if (req === null || req[kAborted]) return;\n\n req = websocket._req = null;\n emitErrorAndClose(websocket, err);\n });\n\n req.on('response', (res) => {\n const location = res.headers.location;\n const statusCode = res.statusCode;\n\n if (\n location &&\n opts.followRedirects &&\n statusCode >= 300 &&\n statusCode < 400\n ) {\n if (++websocket._redirects > opts.maxRedirects) {\n abortHandshake(websocket, req, 'Maximum redirects exceeded');\n return;\n }\n\n req.abort();\n\n let addr;\n\n try {\n addr = new URL(location, address);\n } catch (e) {\n const err = new SyntaxError(`Invalid URL: ${location}`);\n emitErrorAndClose(websocket, err);\n return;\n }\n\n initAsClient(websocket, addr, protocols, options);\n } else if (!websocket.emit('unexpected-response', req, res)) {\n abortHandshake(\n websocket,\n req,\n `Unexpected server response: ${res.statusCode}`\n );\n }\n });\n\n req.on('upgrade', (res, socket, head) => {\n websocket.emit('upgrade', res);\n\n //\n // The user may have closed the connection from a listener of the\n // `'upgrade'` event.\n //\n if (websocket.readyState !== WebSocket.CONNECTING) return;\n\n req = websocket._req = null;\n\n const upgrade = res.headers.upgrade;\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n abortHandshake(websocket, socket, 'Invalid Upgrade header');\n return;\n }\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n if (res.headers['sec-websocket-accept'] !== digest) {\n abortHandshake(websocket, socket, 'Invalid Sec-WebSocket-Accept header');\n return;\n }\n\n const serverProt = res.headers['sec-websocket-protocol'];\n let protError;\n\n if (serverProt !== undefined) {\n if (!protocolSet.size) {\n protError = 'Server sent a subprotocol but none was requested';\n } else if (!protocolSet.has(serverProt)) {\n protError = 'Server sent an invalid subprotocol';\n }\n } else if (protocolSet.size) {\n protError = 'Server sent no subprotocol';\n }\n\n if (protError) {\n abortHandshake(websocket, socket, protError);\n return;\n }\n\n if (serverProt) websocket._protocol = serverProt;\n\n const secWebSocketExtensions = res.headers['sec-websocket-extensions'];\n\n if (secWebSocketExtensions !== undefined) {\n if (!perMessageDeflate) {\n const message =\n 'Server sent a Sec-WebSocket-Extensions header but no extension ' +\n 'was requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n let extensions;\n\n try {\n extensions = parse(secWebSocketExtensions);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n const extensionNames = Object.keys(extensions);\n\n if (\n extensionNames.length !== 1 ||\n extensionNames[0] !== PerMessageDeflate.extensionName\n ) {\n const message = 'Server indicated an extension that was not requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n try {\n perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n websocket._extensions[PerMessageDeflate.extensionName] =\n perMessageDeflate;\n }\n\n websocket.setSocket(socket, head, {\n allowSynchronousEvents: opts.allowSynchronousEvents,\n generateMask: opts.generateMask,\n maxBufferedChunks: opts.maxBufferedChunks,\n maxFragments: opts.maxFragments,\n maxPayload: opts.maxPayload,\n skipUTF8Validation: opts.skipUTF8Validation\n });\n });\n\n if (opts.finishRequest) {\n opts.finishRequest(req, websocket);\n } else {\n req.end();\n }\n}\n\n/**\n * Emit the `'error'` and `'close'` events.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {Error} The error to emit\n * @private\n */\nfunction emitErrorAndClose(websocket, err) {\n websocket._readyState = WebSocket.CLOSING;\n //\n // The following assignment is practically useless and is done only for\n // consistency.\n //\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n websocket.emitClose();\n}\n\n/**\n * Create a `net.Socket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {net.Socket} The newly created socket used to start the connection\n * @private\n */\nfunction netConnect(options) {\n options.path = options.socketPath;\n return net.connect(options);\n}\n\n/**\n * Create a `tls.TLSSocket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {tls.TLSSocket} The newly created socket used to start the connection\n * @private\n */\nfunction tlsConnect(options) {\n options.path = undefined;\n\n if (!options.servername && options.servername !== '') {\n options.servername = net.isIP(options.host) ? '' : options.host;\n }\n\n return tls.connect(options);\n}\n\n/**\n * Abort the handshake and emit an error.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {(http.ClientRequest|net.Socket|tls.Socket)} stream The request to\n * abort or the socket to destroy\n * @param {String} message The error message\n * @private\n */\nfunction abortHandshake(websocket, stream, message) {\n websocket._readyState = WebSocket.CLOSING;\n\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshake);\n\n if (stream.setHeader) {\n stream[kAborted] = true;\n stream.abort();\n\n if (stream.socket && !stream.socket.destroyed) {\n //\n // On Node.js >= 14.3.0 `request.abort()` does not destroy the socket if\n // called after the request completed. See\n // https://github.com/websockets/ws/issues/1869.\n //\n stream.socket.destroy();\n }\n\n process.nextTick(emitErrorAndClose, websocket, err);\n } else {\n stream.destroy(err);\n stream.once('error', websocket.emit.bind(websocket, 'error'));\n stream.once('close', websocket.emitClose.bind(websocket));\n }\n}\n\n/**\n * Handle cases where the `ping()`, `pong()`, or `send()` methods are called\n * when the `readyState` attribute is `CLOSING` or `CLOSED`.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {*} [data] The data to send\n * @param {Function} [cb] Callback\n * @private\n */\nfunction sendAfterClose(websocket, data, cb) {\n if (data) {\n const length = isBlob(data) ? data.size : toBuffer(data).length;\n\n //\n // The `_bufferedAmount` property is used only when the peer is a client and\n // the opening handshake fails. Under these circumstances, in fact, the\n // `setSocket()` method is not called, so the `_socket` and `_sender`\n // properties are set to `null`.\n //\n if (websocket._socket) websocket._sender._bufferedBytes += length;\n else websocket._bufferedAmount += length;\n }\n\n if (cb) {\n const err = new Error(\n `WebSocket is not open: readyState ${websocket.readyState} ` +\n `(${readyStates[websocket.readyState]})`\n );\n process.nextTick(cb, err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'conclude'` event.\n *\n * @param {Number} code The status code\n * @param {Buffer} reason The reason for closing\n * @private\n */\nfunction receiverOnConclude(code, reason) {\n const websocket = this[kWebSocket];\n\n websocket._closeFrameReceived = true;\n websocket._closeMessage = reason;\n websocket._closeCode = code;\n\n if (websocket._socket[kWebSocket] === undefined) return;\n\n websocket._socket.removeListener('data', socketOnData);\n process.nextTick(resume, websocket._socket);\n\n if (code === 1005) websocket.close();\n else websocket.close(code, reason);\n}\n\n/**\n * The listener of the `Receiver` `'drain'` event.\n *\n * @private\n */\nfunction receiverOnDrain() {\n const websocket = this[kWebSocket];\n\n if (!websocket.isPaused) websocket._socket.resume();\n}\n\n/**\n * The listener of the `Receiver` `'error'` event.\n *\n * @param {(RangeError|Error)} err The emitted error\n * @private\n */\nfunction receiverOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket._socket[kWebSocket] !== undefined) {\n websocket._socket.removeListener('data', socketOnData);\n\n //\n // On Node.js < 14.0.0 the `'error'` event is emitted synchronously. See\n // https://github.com/websockets/ws/issues/1940.\n //\n process.nextTick(resume, websocket._socket);\n\n websocket.close(err[kStatusCode]);\n }\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'finish'` event.\n *\n * @private\n */\nfunction receiverOnFinish() {\n this[kWebSocket].emitClose();\n}\n\n/**\n * The listener of the `Receiver` `'message'` event.\n *\n * @param {Buffer|ArrayBuffer|Buffer[])} data The message\n * @param {Boolean} isBinary Specifies whether the message is binary or not\n * @private\n */\nfunction receiverOnMessage(data, isBinary) {\n this[kWebSocket].emit('message', data, isBinary);\n}\n\n/**\n * The listener of the `Receiver` `'ping'` event.\n *\n * @param {Buffer} data The data included in the ping frame\n * @private\n */\nfunction receiverOnPing(data) {\n const websocket = this[kWebSocket];\n\n if (websocket._autoPong) websocket.pong(data, !this._isServer, NOOP);\n websocket.emit('ping', data);\n}\n\n/**\n * The listener of the `Receiver` `'pong'` event.\n *\n * @param {Buffer} data The data included in the pong frame\n * @private\n */\nfunction receiverOnPong(data) {\n this[kWebSocket].emit('pong', data);\n}\n\n/**\n * Resume a readable stream\n *\n * @param {Readable} stream The readable stream\n * @private\n */\nfunction resume(stream) {\n stream.resume();\n}\n\n/**\n * The `Sender` error event handler.\n *\n * @param {Error} The error\n * @private\n */\nfunction senderOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket.readyState === WebSocket.CLOSED) return;\n if (websocket.readyState === WebSocket.OPEN) {\n websocket._readyState = WebSocket.CLOSING;\n setCloseTimer(websocket);\n }\n\n //\n // `socket.end()` is used instead of `socket.destroy()` to allow the other\n // peer to finish sending queued data. There is no need to set a timer here\n // because `CLOSING` means that it is already set or not needed.\n //\n this._socket.end();\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * Set a timer to destroy the underlying raw socket of a WebSocket.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @private\n */\nfunction setCloseTimer(websocket) {\n websocket._closeTimer = setTimeout(\n websocket._socket.destroy.bind(websocket._socket),\n websocket._closeTimeout\n );\n}\n\n/**\n * The listener of the socket `'close'` event.\n *\n * @private\n */\nfunction socketOnClose() {\n const websocket = this[kWebSocket];\n\n this.removeListener('close', socketOnClose);\n this.removeListener('data', socketOnData);\n this.removeListener('end', socketOnEnd);\n\n websocket._readyState = WebSocket.CLOSING;\n\n //\n // The close frame might not have been received or the `'end'` event emitted,\n // for example, if the socket was destroyed due to an error. Ensure that the\n // `receiver` stream is closed after writing any remaining buffered data to\n // it. If the readable side of the socket is in flowing mode then there is no\n // buffered data as everything has been already written. If instead, the\n // socket is paused, any possible buffered data will be read as a single\n // chunk.\n //\n if (\n !this._readableState.endEmitted &&\n !websocket._closeFrameReceived &&\n !websocket._receiver._writableState.errorEmitted &&\n this._readableState.length !== 0\n ) {\n const chunk = this.read(this._readableState.length);\n\n websocket._receiver.write(chunk);\n }\n\n websocket._receiver.end();\n\n this[kWebSocket] = undefined;\n\n clearTimeout(websocket._closeTimer);\n\n if (\n websocket._receiver._writableState.finished ||\n websocket._receiver._writableState.errorEmitted\n ) {\n websocket.emitClose();\n } else {\n websocket._receiver.on('error', receiverOnFinish);\n websocket._receiver.on('finish', receiverOnFinish);\n }\n}\n\n/**\n * The listener of the socket `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction socketOnData(chunk) {\n if (!this[kWebSocket]._receiver.write(chunk)) {\n this.pause();\n }\n}\n\n/**\n * The listener of the socket `'end'` event.\n *\n * @private\n */\nfunction socketOnEnd() {\n const websocket = this[kWebSocket];\n\n websocket._readyState = WebSocket.CLOSING;\n websocket._receiver.end();\n this.end();\n}\n\n/**\n * The listener of the socket `'error'` event.\n *\n * @private\n */\nfunction socketOnError() {\n const websocket = this[kWebSocket];\n\n this.removeListener('error', socketOnError);\n this.on('error', NOOP);\n\n if (websocket) {\n websocket._readyState = WebSocket.CLOSING;\n this.destroy();\n }\n}\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^WebSocket$\" }] */\n'use strict';\n\nconst WebSocket = require('./websocket');\nconst { Duplex } = require('stream');\n\n/**\n * Emits the `'close'` event on a stream.\n *\n * @param {Duplex} stream The stream.\n * @private\n */\nfunction emitClose(stream) {\n stream.emit('close');\n}\n\n/**\n * The listener of the `'end'` event.\n *\n * @private\n */\nfunction duplexOnEnd() {\n if (!this.destroyed && this._writableState.finished) {\n this.destroy();\n }\n}\n\n/**\n * The listener of the `'error'` event.\n *\n * @param {Error} err The error\n * @private\n */\nfunction duplexOnError(err) {\n this.removeListener('error', duplexOnError);\n this.destroy();\n if (this.listenerCount('error') === 0) {\n // Do not suppress the throwing behavior.\n this.emit('error', err);\n }\n}\n\n/**\n * Wraps a `WebSocket` in a duplex stream.\n *\n * @param {WebSocket} ws The `WebSocket` to wrap\n * @param {Object} [options] The options for the `Duplex` constructor\n * @return {Duplex} The duplex stream\n * @public\n */\nfunction createWebSocketStream(ws, options) {\n let terminateOnDestroy = true;\n\n const duplex = new Duplex({\n ...options,\n autoDestroy: false,\n emitClose: false,\n objectMode: false,\n writableObjectMode: false\n });\n\n ws.on('message', function message(msg, isBinary) {\n const data =\n !isBinary && duplex._readableState.objectMode ? msg.toString() : msg;\n\n if (!duplex.push(data)) ws.pause();\n });\n\n ws.once('error', function error(err) {\n if (duplex.destroyed) return;\n\n // Prevent `ws.terminate()` from being called by `duplex._destroy()`.\n //\n // - If the `'error'` event is emitted before the `'open'` event, then\n // `ws.terminate()` is a noop as no socket is assigned.\n // - Otherwise, the error is re-emitted by the listener of the `'error'`\n // event of the `Receiver` object. The listener already closes the\n // connection by calling `ws.close()`. This allows a close frame to be\n // sent to the other peer. If `ws.terminate()` is called right after this,\n // then the close frame might not be sent.\n terminateOnDestroy = false;\n duplex.destroy(err);\n });\n\n ws.once('close', function close() {\n if (duplex.destroyed) return;\n\n duplex.push(null);\n });\n\n duplex._destroy = function (err, callback) {\n if (ws.readyState === ws.CLOSED) {\n callback(err);\n process.nextTick(emitClose, duplex);\n return;\n }\n\n let called = false;\n\n ws.once('error', function error(err) {\n called = true;\n callback(err);\n });\n\n ws.once('close', function close() {\n if (!called) callback(err);\n process.nextTick(emitClose, duplex);\n });\n\n if (terminateOnDestroy) ws.terminate();\n };\n\n duplex._final = function (callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._final(callback);\n });\n return;\n }\n\n // If the value of the `_socket` property is `null` it means that `ws` is a\n // client websocket and the handshake failed. In fact, when this happens, a\n // socket is never assigned to the websocket. Wait for the `'error'` event\n // that will be emitted by the websocket.\n if (ws._socket === null) return;\n\n if (ws._socket._writableState.finished) {\n callback();\n if (duplex._readableState.endEmitted) duplex.destroy();\n } else {\n ws._socket.once('finish', function finish() {\n // `duplex` is not destroyed here because the `'end'` event will be\n // emitted on `duplex` after this `'finish'` event. The EOF signaling\n // `null` chunk is, in fact, pushed when the websocket emits `'close'`.\n callback();\n });\n ws.close();\n }\n };\n\n duplex._read = function () {\n if (ws.isPaused) ws.resume();\n };\n\n duplex._write = function (chunk, encoding, callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._write(chunk, encoding, callback);\n });\n return;\n }\n\n ws.send(chunk, callback);\n };\n\n duplex.on('end', duplexOnEnd);\n duplex.on('error', duplexOnError);\n return duplex;\n}\n\nmodule.exports = createWebSocketStream;\n","'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Parses the `Sec-WebSocket-Protocol` header into a set of subprotocol names.\n *\n * @param {String} header The field value of the header\n * @return {Set} The subprotocol names\n * @public\n */\nfunction parse(header) {\n const protocols = new Set();\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (i; i < header.length; i++) {\n const code = header.charCodeAt(i);\n\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (\n i !== 0 &&\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\n ) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n\n const protocol = header.slice(start, end);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n\n if (start === -1 || end !== -1) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n const protocol = header.slice(start, i);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n return protocols;\n}\n\nmodule.exports = { parse };\n","/* 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=262144] The maximum number of\n * buffered data chunks\n * @param {Number} [options.maxFragments=16384] 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: 256 * 1024,\n maxFragments: 16 * 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",null,null,null,null,"export class AddressError extends Error {\n /**\n * The offending address with the portion that failed to parse wrapped in\n * `<span class=\"parse-error\">`, e.g. `2001:db8<span\n * class=\"parse-error\">:::</span>1`. Present only on errors thrown from a\n * parse path that can point at a specific substring.\n *\n * This is an HTML fragment intended for an address-inspector UI. The\n * address content is HTML-escaped, so it is safe to insert as-is; treat it\n * as markup rather than as a plain-text message, and use `message` for\n * anything that renders as text.\n */\n parseMessage?: string;\n\n constructor(message: string, parseMessage?: string) {\n super(message);\n\n this.name = 'AddressError';\n\n this.parseMessage = parseMessage;\n }\n}\n","import { Address4 } from './ipv4';\nimport { Address6 } from './ipv6';\nimport { AddressError } from './address-error';\n\nexport interface ReverseFormOptions {\n omitSuffix?: boolean;\n}\n\n/**\n * Returns whether this address's *network* is contained within `address`,\n * i.e. whether every address this one can represent also falls inside\n * `address`. A network wider than `address` is not contained in it, so\n * `10.0.0.0/8` is not in `10.0.0.0/16`.\n *\n * To ask whether the address itself falls inside a range, ignoring any CIDR\n * suffix it was written with, use {@link isHostInSubnet} instead. That is the\n * question the special-use classifiers ask.\n */\nexport function isInSubnet(this: Address4 | Address6, address: Address4 | Address6) {\n if (this.subnetMask < address.subnetMask) {\n return false;\n }\n\n return isHostInSubnet.call(this, address);\n}\n\n/**\n * Returns whether this address's host bits fall inside `address`, ignoring\n * this address's own subnet mask.\n *\n * This is the primitive the special-use classifiers (`isLoopback`,\n * `isPrivate`, `isLinkLocal`, `getType`, …) are built on: they answer a\n * question about the address, so the answer must not change with the CIDR\n * suffix the caller happened to write. Use this rather than\n * {@link isInSubnet} when classifying a single address — notably when the\n * address came from untrusted input and the result backs a trust-boundary\n * decision such as an SSRF allow/deny filter.\n *\n * An address of one family is never inside a network of the other, so an\n * `Address4` against an `Address6` (or the reverse) is `false`. To compare\n * across families, convert first: `Address6.fromAddress4()`, `to4()`, or\n * `toAddress4Nat64()`.\n */\nexport function isHostInSubnet(this: Address4 | Address6, address: Address4 | Address6) {\n // mask() is a bit string of the family's width, and the leading bits of a\n // 32-bit string can coincide with those of a 128-bit one (a00::1 and\n // 10.0.0.0/8 both mask to 00001010), so the widths must agree before the\n // strings are compared.\n if (this.binaryZeroPad().length !== address.binaryZeroPad().length) {\n return false;\n }\n\n return this.mask(address.subnetMask) === address.mask();\n}\n\n/**\n * One parsed row of an IANA special-purpose address registry: the block, and\n * whether the registry marks it globally reachable (`null` when the column is\n * blank, in which case the containing block answers).\n */\nexport interface SpecialPurposeEntry<A extends Address4 | Address6> {\n subnet: A;\n reachable: boolean | null;\n}\n\n/**\n * Returns whether the registry marks this address globally reachable: the\n * answer of the most specific entry containing it that has one, or `true`\n * when no entry contains it.\n */\nexport function isGloballyReachable<A extends Address4 | Address6>(\n this: A,\n entries: ReadonlyArray<SpecialPurposeEntry<A>>,\n): boolean {\n let best: SpecialPurposeEntry<A> | null = null;\n\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i];\n\n if (\n entry.reachable !== null &&\n isHostInSubnet.call(this, entry.subnet) &&\n (best === null || entry.subnet.subnetMask > best.subnet.subnetMask)\n ) {\n best = entry;\n }\n }\n\n return best === null ? true : (best.reachable as boolean);\n}\n\n/**\n * Adds `n` to `value` and returns the result, throwing `AddressError` unless\n * `n` is an integer and the result stays within `[0, 2**bits - 1]`.\n */\nexport function offsetBigInt(\n value: bigint,\n n: number | bigint,\n bits: number,\n family: string,\n): bigint {\n if (typeof n === 'number' && !Number.isSafeInteger(n)) {\n throw new AddressError(`${family} offset must be an integer`);\n }\n\n if (typeof n !== 'number' && typeof n !== 'bigint') {\n throw new AddressError(`${family} offset must be an integer`);\n }\n\n const result = value + BigInt(n);\n\n if (result < BigInt(0) || result > (BigInt(1) << BigInt(bits)) - BigInt(1)) {\n throw new AddressError(`${family} offset leaves the address space`);\n }\n\n return result;\n}\n\nexport function isCorrect(defaultBits: number) {\n return function isCorrectForm(this: Address4 | Address6) {\n if (this.addressMinusSuffix !== this.correctForm()) {\n return false;\n }\n\n if (this.subnetMask === defaultBits && !this.parsedSubnet) {\n return true;\n }\n\n return this.parsedSubnet === String(this.subnetMask);\n };\n}\n\n/**\n * Returns the prefix length (number of leading 1 bits) of a contiguous\n * subnet mask. Throws `AddressError` if the mask is non-contiguous (e.g.\n * `255.0.255.0`).\n */\nexport function prefixLengthFromMask(value: bigint, totalBits: number): number {\n const binary = value.toString(2).padStart(totalBits, '0');\n\n if (binary.length > totalBits) {\n throw new AddressError('Invalid subnet mask.');\n }\n\n const firstZero = binary.indexOf('0');\n\n if (firstZero === -1) {\n return totalBits;\n }\n\n if (binary.slice(firstZero).includes('1')) {\n throw new AddressError('Invalid subnet mask.');\n }\n\n return firstZero;\n}\n\n/**\n * Throws `AddressError` unless `bytes` holds exactly `byteCount` integers,\n * each from `minimum` to 255. Pass a `minimum` of `-128` where signed bytes\n * are accepted and folded to unsigned, and `0` where they are not.\n */\nexport function assertByteArray(\n bytes: number[],\n byteCount: number,\n family: 'IPv4' | 'IPv6',\n minimum: number,\n): void {\n if (bytes.length !== byteCount) {\n throw new AddressError(`${family} addresses require exactly ${byteCount} bytes`);\n }\n\n for (let i = 0; i < bytes.length; i++) {\n if (!Number.isInteger(bytes[i]) || bytes[i] < minimum || bytes[i] > 255) {\n throw new AddressError(`All bytes must be integers between ${minimum} and 255`);\n }\n }\n}\n\nexport function numberToPaddedHex(number: number) {\n return number.toString(16).padStart(2, '0');\n}\n\nexport function stringToPaddedHex(numberString: string) {\n return numberToPaddedHex(parseInt(numberString, 10));\n}\n\n/**\n * @param binaryValue Binary representation of a value (e.g. `10`)\n * @param position Byte position, where 0 is the least significant bit\n */\nexport function testBit(binaryValue: string, position: number): boolean {\n const { length } = binaryValue;\n\n if (position >= length) {\n return false;\n }\n\n const positionInString = length - position - 1;\n return binaryValue.substring(positionInString, positionInString + 1) === '1';\n}\n","export const BITS = 32;\nexport const GROUPS = 4;\n\n// Each octet is 0-255 written without a leading zero. A leading zero is\n// octal to the WHATWG URL parser, inet_aton, and getaddrinfo, but decimal to\n// parseInt(part, 10), so accepting the notation would make this library\n// disagree with the network stack about which host a string names.\nexport const RE_ADDRESS =\n /^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])$/g;\n\nexport const RE_SUBNET_STRING = /\\/\\d{1,2}$/;\n\n/**\n * The IANA IPv4 Special-Purpose Address Registry\n * (https://www.iana.org/assignments/iana-ipv4-special-registry/), one entry\n * per block: `[cidr, name, globallyReachable]`. A `null` reachability means\n * the registry leaves the column blank and the block inherits the answer of\n * the block containing it (or is global when nothing contains it).\n *\n * `Address4.isGlobal()` answers from the most specific entry containing the\n * address. `test/data/iana-corpus.json` is generated from the registry's CSV\n * and pins this table to it.\n */\nexport const SPECIAL_PURPOSE: ReadonlyArray<readonly [string, string, boolean | null]> = [\n ['0.0.0.0/8', 'This network', false],\n ['0.0.0.0/32', 'This host on this network', false],\n ['10.0.0.0/8', 'Private-Use', false],\n ['100.64.0.0/10', 'Shared Address Space', false],\n ['127.0.0.0/8', 'Loopback', false],\n ['169.254.0.0/16', 'Link Local', false],\n ['172.16.0.0/12', 'Private-Use', false],\n ['192.0.0.0/24', 'IETF Protocol Assignments', false],\n ['192.0.0.0/29', 'IPv4 Service Continuity Prefix', false],\n ['192.0.0.8/32', 'IPv4 dummy address', false],\n ['192.0.0.9/32', 'Port Control Protocol Anycast', true],\n ['192.0.0.10/32', 'Traversal Using Relays around NAT Anycast', true],\n ['192.0.0.170/32', 'NAT64/DNS64 Discovery', false],\n ['192.0.0.171/32', 'NAT64/DNS64 Discovery', false],\n ['192.0.2.0/24', 'Documentation (TEST-NET-1)', false],\n ['192.31.196.0/24', 'AS112-v4', true],\n ['192.52.193.0/24', 'AMT', true],\n ['192.88.99.0/24', 'Deprecated (6to4 Relay Anycast)', null],\n ['192.88.99.2/32', '6a44-relay anycast address', false],\n ['192.168.0.0/16', 'Private-Use', false],\n ['192.175.48.0/24', 'Direct Delegation AS112 Service', true],\n ['198.18.0.0/15', 'Benchmarking', false],\n ['198.51.100.0/24', 'Documentation (TEST-NET-2)', false],\n ['203.0.113.0/24', 'Documentation (TEST-NET-3)', false],\n ['240.0.0.0/4', 'Reserved', false],\n ['255.255.255.255/32', 'Limited Broadcast', false],\n];\n","/* eslint-disable no-param-reassign */\n\nimport * as common from './common';\nimport * as constants from './v4/constants';\nimport { AddressError } from './address-error';\n\nconst isCorrect4 = common.isCorrect(constants.BITS);\n\n/**\n * Represents an IPv4 address\n * @param {string} address - An IPv4 address string\n */\nexport class Address4 {\n address: string;\n addressMinusSuffix: string = '';\n groups: number = constants.GROUPS;\n parsedAddress: string[] = [];\n parsedSubnet: string = '';\n subnet: string = '/32';\n subnetMask: number = 32;\n v4: boolean = true;\n private _binaryZeroPad?: string;\n\n constructor(address: string) {\n this.address = address;\n\n const subnet = constants.RE_SUBNET_STRING.exec(address);\n\n if (subnet) {\n this.parsedSubnet = subnet[0].replace('/', '');\n this.subnetMask = parseInt(this.parsedSubnet, 10);\n this.subnet = `/${this.subnetMask}`;\n\n if (this.subnetMask < 0 || this.subnetMask > constants.BITS) {\n throw new AddressError('Invalid subnet mask.');\n }\n\n address = address.replace(constants.RE_SUBNET_STRING, '');\n }\n\n // Four three-digit octets and three dots: the longest well-formed address\n // is 15 characters. Longer input is rejected before parsing, as Address6\n // does at its own limit.\n const longest = constants.GROUPS * 4 - 1;\n\n if (address.length > longest) {\n throw new AddressError(`IPv4 addresses are at most ${longest} characters.`);\n }\n\n this.addressMinusSuffix = address;\n\n this.parsedAddress = this.parse(address);\n }\n\n /**\n * Returns true if the given string is a valid IPv4 address (with optional\n * CIDR subnet), false otherwise. Host bits in the subnet portion are\n * allowed (e.g. `192.168.1.5/24` is valid); for strict network-address\n * validation compare `correctForm()` to `startAddress().correctForm()`,\n * or use `networkForm()`.\n */\n static isValid(address: string): boolean {\n try {\n // eslint-disable-next-line no-new\n new Address4(address);\n\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Parses an IPv4 address string into its four octet groups and stores the\n * result on `this.parsedAddress`. Called automatically by the constructor;\n * you typically don't need to call it directly. Throws `AddressError` if\n * the input is not a valid IPv4 address.\n */\n parse(address: string) {\n const groups = address.split('.');\n\n // Checked before the general match so the error names the actual problem.\n // Address6 rejects the same notation on its v4-in-v6 path.\n if (groups.some((group) => /^0\\d/.test(group))) {\n throw new AddressError(\"IPv4 addresses can't have leading zeroes.\");\n }\n\n if (!address.match(constants.RE_ADDRESS)) {\n throw new AddressError('Invalid IPv4 address.');\n }\n\n return groups;\n }\n\n /**\n * Returns the address in correct form: octets joined with `.` and any\n * leading zeros stripped (e.g. `192.168.1.1`). For IPv4 this matches the\n * canonical dotted-decimal representation.\n */\n correctForm(): string {\n return this.parsedAddress.map((part) => parseInt(part, 10)).join('.');\n }\n\n /**\n * Returns true if the address is correct, false otherwise\n * @returns {Boolean}\n */\n isCorrect = isCorrect4;\n\n /**\n * Construct an `Address4` from an address and a dotted-decimal subnet\n * mask given as separate strings (e.g. as returned by Node's\n * `os.networkInterfaces()`). Throws `AddressError` if the mask is\n * non-contiguous (e.g. `255.0.255.0`).\n * @example\n * var address = Address4.fromAddressAndMask('192.168.1.1', '255.255.255.0');\n * address.subnetMask; // 24\n */\n static fromAddressAndMask(address: string, mask: string): Address4 {\n const bits = common.prefixLengthFromMask(new Address4(mask).bigInt(), constants.BITS);\n return new Address4(`${address}/${bits}`);\n }\n\n /**\n * Construct an `Address4` from an address and a Cisco-style wildcard mask\n * given as separate strings (e.g. `0.0.0.255` for a `/24`). The wildcard\n * mask is the bitwise inverse of the subnet mask. Throws `AddressError`\n * if the mask is non-contiguous (e.g. `0.255.0.255`).\n * @example\n * var address = Address4.fromAddressAndWildcardMask('10.0.0.1', '0.0.0.255');\n * address.subnetMask; // 24\n */\n static fromAddressAndWildcardMask(address: string, wildcardMask: string): Address4 {\n const wildcard = new Address4(wildcardMask).bigInt();\n const allOnes = (BigInt(1) << BigInt(constants.BITS)) - BigInt(1);\n const mask = wildcard ^ allOnes;\n const bits = common.prefixLengthFromMask(mask, constants.BITS);\n return new Address4(`${address}/${bits}`);\n }\n\n /**\n * Construct an `Address4` from a wildcard pattern with trailing `*`\n * octets. The number of trailing wildcards determines the prefix\n * length: each `*` represents 8 bits.\n *\n * Only trailing whole-octet wildcards are supported. Partial-octet\n * wildcards (e.g. `192.168.0.1*`) and interior wildcards (e.g.\n * `192.*.0.1`) throw `AddressError`.\n * @example\n * Address4.fromWildcard('192.168.0.*').subnet; // '/24'\n * Address4.fromWildcard('192.168.*.*').subnet; // '/16'\n * Address4.fromWildcard('*.*.*.*').subnet; // '/0'\n */\n static fromWildcard(input: string): Address4 {\n const groups = input.split('.');\n\n if (groups.length !== constants.GROUPS) {\n throw new AddressError('Wildcard pattern must have 4 octets');\n }\n\n let firstWildcard = -1;\n\n for (let i = 0; i < groups.length; i++) {\n if (groups[i] === '*') {\n if (firstWildcard === -1) {\n firstWildcard = i;\n }\n } else if (firstWildcard !== -1) {\n throw new AddressError(\n 'Wildcard `*` must only appear in trailing octets (e.g. `192.168.0.*`)',\n );\n }\n }\n\n const trailing = firstWildcard === -1 ? 0 : groups.length - firstWildcard;\n const replaced = groups.map((g) => (g === '*' ? '0' : g));\n const subnetBits = constants.BITS - trailing * 8;\n\n return new Address4(`${replaced.join('.')}/${subnetBits}`);\n }\n\n /**\n * Converts a hex string to an IPv4 address object. Accepts 8 hex digits\n * with optional `:` separators (e.g. `'7f000001'` or `'7f:00:00:01'`).\n * Throws `AddressError` for any other length or for non-hex characters.\n * @param {string} hex - a hex string to convert\n * @returns {Address4}\n */\n static fromHex(hex: string): Address4 {\n const stripped = hex.replace(/:/g, '');\n\n if (!/^[0-9a-fA-F]{8}$/.test(stripped)) {\n throw new AddressError('IPv4 hex must be exactly 8 hex digits');\n }\n\n const groups = [];\n\n for (let i = 0; i < 8; i += 2) {\n groups.push(parseInt(stripped.slice(i, i + 2), 16));\n }\n\n return new Address4(groups.join('.'));\n }\n\n /**\n * Converts an integer into a IPv4 address object. The integer must be a\n * non-negative safe integer in the range `[0, 2**32 - 1]`; otherwise\n * `AddressError` is thrown.\n * @param {integer} integer - a number to convert\n * @returns {Address4}\n */\n static fromInteger(integer: number): Address4 {\n if (!Number.isInteger(integer) || integer < 0 || integer > 0xffffffff) {\n throw new AddressError('IPv4 integer must be in the range 0 to 2**32 - 1');\n }\n\n return Address4.fromHex(integer.toString(16).padStart(8, '0'));\n }\n\n /**\n * Return an address from in-addr.arpa form: the four octets reversed, with\n * or without the `.in-addr.arpa` suffix and root dot, in any case. Throws\n * `AddressError` unless the reversed labels form a valid IPv4 address, so\n * `fromArpa(x.reverseForm())` round-trips {@link reverseForm}.\n * @param {string} arpaFormAddress - an 'in-addr.arpa' form ipv4 address\n * @returns {Adress4}\n * @example\n * var address = Address4.fromArpa('42.2.0.192.in-addr.arpa.')\n * address.correctForm(); // '192.0.2.42'\n */\n static fromArpa(arpaFormAddress: string): Address4 {\n // A 15-character address, a \"/32\" prefix length and \".in-addr.arpa.\": the\n // longest name is 32 characters. Longer input is rejected before its\n // labels are split, as the constructor does at its own limit.\n const longest = constants.GROUPS * 4 - 1 + '/32'.length + '.in-addr.arpa.'.length;\n\n if (arpaFormAddress.length > longest) {\n throw new AddressError(`in-addr.arpa names are at most ${longest} characters.`);\n }\n\n // remove an ending \".in-addr.arpa\", in any case and with or without the\n // root dot, as Address6.fromArpa does for \".ip6.arpa\"\n const leader = arpaFormAddress.replace(/(\\.in-addr\\.arpa)?\\.?$/i, '');\n\n const address = leader.split('.').reverse().join('.');\n\n return new Address4(address);\n }\n\n /**\n * Converts an IPv4 address object to a hex string\n * @returns {String}\n */\n toHex(): string {\n return this.parsedAddress.map((part) => common.stringToPaddedHex(part)).join(':');\n }\n\n /**\n * Converts an IPv4 address object to an array of bytes.\n *\n * To get a Node.js `Buffer`, wrap the result: `Buffer.from(address.toArray())`.\n * @returns {Array}\n */\n toArray(): number[] {\n return this.parsedAddress.map((part) => parseInt(part, 10));\n }\n\n /**\n * Converts an IPv4 address object to an IPv6 address group\n * @returns {String}\n */\n toGroup6(): string {\n const output = [];\n let i;\n\n for (i = 0; i < constants.GROUPS; i += 2) {\n output.push(\n `${common.stringToPaddedHex(this.parsedAddress[i])}${common.stringToPaddedHex(\n this.parsedAddress[i + 1],\n )}`,\n );\n }\n\n return output.join(':');\n }\n\n /**\n * Returns the address as a `bigint`\n * @returns {bigint}\n */\n bigInt(): bigint {\n return BigInt(`0x${this.parsedAddress.map((n) => common.stringToPaddedHex(n)).join('')}`);\n }\n\n /**\n * Helper function getting start address.\n * @returns {bigint}\n */\n _startAddress(): bigint {\n return BigInt(`0b${this.mask() + '0'.repeat(constants.BITS - this.subnetMask)}`);\n }\n\n /**\n * The first address in the range given by this address' subnet.\n * Often referred to as the Network Address.\n * @returns {Address4}\n */\n startAddress(): Address4 {\n return Address4.fromBigInt(this._startAddress());\n }\n\n /**\n * The first host address in the range given by this address's subnet ie\n * the first address after the Network Address\n * @returns {Address4}\n */\n startAddressExclusive(): Address4 {\n const adjust = BigInt('1');\n return Address4.fromBigInt(this._startAddress() + adjust);\n }\n\n /**\n * Returns the address `n` addresses after this one (or before, when `n` is\n * negative), keeping this address's subnet mask. Throws `AddressError` when\n * the result would fall outside the IPv4 address space or `n` is not an\n * integer.\n * @param {number | bigint} n\n * @returns {Address4}\n * @example\n * new Address4('10.0.0.0/24').offset(1).correctForm(); // '10.0.0.1'\n */\n offset(n: number | bigint): Address4 {\n return Address4.fromBigInt(\n common.offsetBigInt(this.bigInt(), n, constants.BITS, 'IPv4'),\n ).withSubnetMask(this.subnetMask);\n }\n\n /**\n * Returns the network that follows this address's network: the address after\n * {@link endAddress}, with the same subnet mask. Throws `AddressError` when\n * this network is the last one in the address space.\n * @returns {Address4}\n * @example\n * new Address4('10.0.0.0/24').nextNetwork().networkForm(); // '10.0.1.0/24'\n */\n nextNetwork(): Address4 {\n return Address4.fromBigInt(\n common.offsetBigInt(this._endAddress(), 1, constants.BITS, 'IPv4'),\n ).withSubnetMask(this.subnetMask);\n }\n\n private withSubnetMask(subnetMask: number): Address4 {\n return new Address4(`${this.correctForm()}/${subnetMask}`);\n }\n\n /**\n * Helper function getting end address.\n * @returns {bigint}\n */\n _endAddress(): bigint {\n return BigInt(`0b${this.mask() + '1'.repeat(constants.BITS - this.subnetMask)}`);\n }\n\n /**\n * The last address in the range given by this address' subnet\n * Often referred to as the Broadcast\n * @returns {Address4}\n */\n endAddress(): Address4 {\n return Address4.fromBigInt(this._endAddress());\n }\n\n /**\n * The last host address in the range given by this address's subnet ie\n * the last address prior to the Broadcast Address\n * @returns {Address4}\n */\n endAddressExclusive(): Address4 {\n const adjust = BigInt('1');\n return Address4.fromBigInt(this._endAddress() - adjust);\n }\n\n /**\n * The dotted-decimal form of the subnet mask, e.g. `255.255.240.0` for\n * a `/20`. Returns an `Address4`; call `.correctForm()` for the string.\n * @returns {Address4}\n */\n subnetMaskAddress(): Address4 {\n return Address4.fromBigInt(\n BigInt(`0b${'1'.repeat(this.subnetMask)}${'0'.repeat(constants.BITS - this.subnetMask)}`),\n );\n }\n\n /**\n * The Cisco-style wildcard mask, e.g. `0.0.0.255` for a `/24`. This is\n * the bitwise inverse of `subnetMaskAddress()`. Returns an `Address4`;\n * call `.correctForm()` for the string.\n * @returns {Address4}\n */\n wildcardMask(): Address4 {\n return Address4.fromBigInt(\n BigInt(`0b${'0'.repeat(this.subnetMask)}${'1'.repeat(constants.BITS - this.subnetMask)}`),\n );\n }\n\n /**\n * The network address in CIDR string form, e.g. `192.168.1.0/24` for\n * `192.168.1.5/24`. For an address with no explicit subnet the prefix is\n * `/32`, e.g. `networkForm()` on `192.168.1.5` returns `192.168.1.5/32`.\n * @returns {string}\n */\n networkForm(): string {\n return `${this.startAddress().correctForm()}/${this.subnetMask}`;\n }\n\n /**\n * Converts a BigInt to a v4 address object. The value must be in the\n * range `[0, 2**32 - 1]`; otherwise `AddressError` is thrown.\n * @param {bigint} bigInt - a BigInt to convert\n * @returns {Address4}\n */\n static fromBigInt(bigInt: bigint): Address4 {\n if (bigInt < BigInt(0) || bigInt > BigInt(0xffffffff)) {\n throw new AddressError('IPv4 BigInt must be in the range 0 to 2**32 - 1');\n }\n\n return Address4.fromHex(bigInt.toString(16).padStart(8, '0'));\n }\n\n /**\n * Convert a byte array to an Address4 object. Throws `AddressError` unless\n * given exactly 4 integers from 0 to 255. Signed bytes are rejected, so\n * this differs from `Address6.fromByteArray`, which folds them; the two\n * contracts converge on this stricter form in the next major version.\n *\n * To convert from a Node.js `Buffer`, spread it: `Address4.fromByteArray([...buf])`.\n * @param {Array<number>} bytes - an array of 4 bytes (0-255)\n * @returns {Address4}\n */\n static fromByteArray(bytes: Array<number>): Address4 {\n common.assertByteArray(bytes, 4, 'IPv4', 0);\n\n return this.fromUnsignedByteArray(bytes);\n }\n\n /**\n * Convert an unsigned byte array to an Address4 object. Throws\n * `AddressError` unless given exactly 4 bytes, and rejects values outside\n * 0 to 255 when parsing the resulting address.\n *\n * To convert from a Node.js `Buffer`, spread it:\n * `Address4.fromUnsignedByteArray([...buf])`.\n * @param {Array<number>} bytes - an array of 4 unsigned bytes (0-255)\n * @returns {Address4}\n */\n static fromUnsignedByteArray(bytes: Array<number>): Address4 {\n if (bytes.length !== 4) {\n throw new AddressError('IPv4 addresses require exactly 4 bytes');\n }\n\n const address = bytes.join('.');\n return new Address4(address);\n }\n\n /**\n * Returns the first n bits of the address, defaulting to the\n * subnet mask\n * @returns {String}\n */\n mask(mask?: number): string {\n if (mask === undefined) {\n mask = this.subnetMask;\n }\n\n return this.getBitsBase2(0, mask);\n }\n\n /**\n * Returns the bits in the given range as a base-2 string\n * @returns {string}\n */\n getBitsBase2(start: number, end: number): string {\n return this.binaryZeroPad().slice(start, end);\n }\n\n /**\n * Return the reversed in-addr.arpa form of the address, e.g.\n * `42.2.0.192.in-addr.arpa.` for `192.0.2.42`.\n * @param {Object} options\n * @param {boolean} options.omitSuffix - omit the \"in-addr.arpa\" suffix\n * @returns {String}\n */\n reverseForm(options?: common.ReverseFormOptions): string {\n if (!options) {\n options = {};\n }\n\n const reversed = this.correctForm().split('.').reverse().join('.');\n\n if (options.omitSuffix) {\n return reversed;\n }\n\n return `${reversed}.in-addr.arpa.`;\n }\n\n /**\n * Returns true if the given address is in the subnet of the current address.\n * An `Address6` is never in the subnet of an `Address4`; convert with\n * `to4()` or `Address6.fromAddress4()` to compare across families.\n * @returns {boolean}\n */\n isInSubnet = common.isInSubnet;\n\n /**\n * Returns true if this address's host bits fall inside the given subnet,\n * ignoring this address's own subnet mask. Prefer this over `isInSubnet`\n * when classifying a single address, so the answer doesn't change with the\n * CIDR suffix the caller happened to write — notably when the address came\n * from untrusted input and the result backs a trust-boundary decision.\n * An `Address6` is never in the subnet of an `Address4`; convert with\n * `to4()` or `Address6.fromAddress4()` to compare across families.\n * @returns {boolean}\n */\n isHostInSubnet = common.isHostInSubnet;\n\n /**\n * Returns true if the given address is a multicast address\n * @returns {boolean}\n */\n isMulticast(): boolean {\n return this.isHostInSubnet(MULTICAST_V4);\n }\n\n /**\n * Returns true if the address is in one of the [RFC 1918](https://datatracker.ietf.org/doc/html/rfc1918) private address ranges (`10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`).\n * @returns {boolean}\n */\n isPrivate(): boolean {\n return PRIVATE_V4.some((subnet) => this.isHostInSubnet(subnet));\n }\n\n /**\n * Returns true if the address is in the loopback range `127.0.0.0/8` ([RFC 1122](https://datatracker.ietf.org/doc/html/rfc1122)).\n * @returns {boolean}\n */\n isLoopback(): boolean {\n return this.isHostInSubnet(LOOPBACK_V4);\n }\n\n /**\n * Returns true if the address is in the link-local range `169.254.0.0/16` ([RFC 3927](https://datatracker.ietf.org/doc/html/rfc3927)).\n * @returns {boolean}\n */\n isLinkLocal(): boolean {\n return this.isHostInSubnet(LINK_LOCAL_V4);\n }\n\n /**\n * Returns true if the address is the unspecified address `0.0.0.0`.\n * @returns {boolean}\n */\n isUnspecified(): boolean {\n return this.isHostInSubnet(UNSPECIFIED_V4);\n }\n\n /**\n * Returns true if the address is the limited broadcast address `255.255.255.255` ([RFC 919](https://datatracker.ietf.org/doc/html/rfc919)).\n * @returns {boolean}\n */\n isBroadcast(): boolean {\n return this.isHostInSubnet(BROADCAST_V4);\n }\n\n /**\n * Returns true if the address is in the carrier-grade NAT range `100.64.0.0/10` ([RFC 6598](https://datatracker.ietf.org/doc/html/rfc6598)).\n * @returns {boolean}\n */\n isCGNAT(): boolean {\n return this.isHostInSubnet(CGNAT_V4);\n }\n\n /**\n * Returns true if the address is in one of the documentation ranges\n * `192.0.2.0/24`, `198.51.100.0/24`, or `203.0.113.0/24` ([RFC 5737](https://datatracker.ietf.org/doc/html/rfc5737)).\n * @returns {boolean}\n */\n isDocumentation(): boolean {\n return DOCUMENTATION_V4.some((subnet) => this.isHostInSubnet(subnet));\n }\n\n /**\n * Returns true if the address is in the benchmarking range `198.18.0.0/15` ([RFC 2544](https://datatracker.ietf.org/doc/html/rfc2544)).\n * @returns {boolean}\n */\n isBenchmarking(): boolean {\n return this.isHostInSubnet(BENCHMARKING_V4);\n }\n\n /**\n * Returns true if the address is in the reserved range `240.0.0.0/4` ([RFC 1112](https://datatracker.ietf.org/doc/html/rfc1112)),\n * which includes the limited broadcast address.\n * @returns {boolean}\n */\n isReserved(): boolean {\n return this.isHostInSubnet(RESERVED_V4);\n }\n\n /**\n * Returns true if the address is globally reachable: not multicast, and not\n * in any block the [IANA IPv4 Special-Purpose Address Registry](https://www.iana.org/assignments/iana-ipv4-special-registry/)\n * marks as not globally reachable. That covers everything the individual\n * classifiers name (private, loopback, link-local, CGNAT, unspecified,\n * broadcast, documentation, benchmarking, reserved) and the blocks they do\n * not, such as `0.0.0.0/8` and the IETF protocol assignments in\n * `192.0.0.0/24`. This is the single predicate to use where a request must\n * not reach an internal or special-purpose destination; see SECURITY.md.\n * @returns {boolean}\n */\n isGlobal(): boolean {\n return !this.isMulticast() && common.isGloballyReachable.call(this, SPECIAL_PURPOSE_V4);\n }\n\n /**\n * Returns a zero-padded base-2 string representation of the address\n * @returns {string}\n */\n binaryZeroPad(): string {\n if (this._binaryZeroPad === undefined) {\n this._binaryZeroPad = this.bigInt().toString(2).padStart(constants.BITS, '0');\n }\n return this._binaryZeroPad;\n }\n\n /**\n * Groups an IPv4 address for inclusion at the end of an IPv6 address.\n *\n * Returns an HTML fragment: each half of the address is wrapped in a\n * `<span>` carrying the group classes an address-inspector UI hovers on.\n * The address content is HTML-escaped; anything you concatenate around it\n * is your responsibility.\n * @returns {String}\n */\n groupForV6(): string {\n const segments = this.parsedAddress;\n\n return this.correctForm().replace(\n constants.RE_ADDRESS,\n `<span class=\"hover-group group-v4 group-6\">${segments\n .slice(0, 2)\n .join('.')}</span>.<span class=\"hover-group group-v4 group-7\">${segments\n .slice(2, 4)\n .join('.')}</span>`,\n );\n }\n}\n\nconst MULTICAST_V4 = new Address4('224.0.0.0/4');\nconst PRIVATE_V4 = [\n new Address4('10.0.0.0/8'),\n new Address4('172.16.0.0/12'),\n new Address4('192.168.0.0/16'),\n];\nconst LOOPBACK_V4 = new Address4('127.0.0.0/8');\nconst LINK_LOCAL_V4 = new Address4('169.254.0.0/16');\nconst UNSPECIFIED_V4 = new Address4('0.0.0.0/32');\nconst BROADCAST_V4 = new Address4('255.255.255.255/32');\nconst CGNAT_V4 = new Address4('100.64.0.0/10');\nconst DOCUMENTATION_V4 = [\n new Address4('192.0.2.0/24'),\n new Address4('198.51.100.0/24'),\n new Address4('203.0.113.0/24'),\n];\nconst BENCHMARKING_V4 = new Address4('198.18.0.0/15');\nconst RESERVED_V4 = new Address4('240.0.0.0/4');\nconst SPECIAL_PURPOSE_V4 = constants.SPECIAL_PURPOSE.map(([cidr, , reachable]) => ({\n subnet: new Address4(cidr),\n reachable,\n}));\n","export const BITS = 128;\nexport const GROUPS = 8;\n\n/**\n * Represents IPv6 address scopes\n * @memberof Address6\n * @static\n */\nexport const SCOPES: { [key: number]: string | undefined } = {\n 0: 'Reserved',\n 1: 'Interface local',\n 2: 'Link local',\n 4: 'Admin local',\n 5: 'Site local',\n 8: 'Organization local',\n 14: 'Global',\n 15: 'Reserved',\n} as const;\n\n/**\n * Represents IPv6 address types\n * @memberof Address6\n * @static\n */\nexport const TYPES: { [key: string]: string | undefined } = {\n 'ff01::1/128': 'Multicast (All nodes on this interface)',\n 'ff01::2/128': 'Multicast (All routers on this interface)',\n 'ff02::1/128': 'Multicast (All nodes on this link)',\n 'ff02::2/128': 'Multicast (All routers on this link)',\n 'ff05::2/128': 'Multicast (All routers in this site)',\n 'ff02::5/128': 'Multicast (OSPFv3 AllSPF routers)',\n 'ff02::6/128': 'Multicast (OSPFv3 AllDR routers)',\n 'ff02::9/128': 'Multicast (RIP routers)',\n 'ff02::a/128': 'Multicast (EIGRP routers)',\n 'ff02::d/128': 'Multicast (PIM routers)',\n 'ff02::16/128': 'Multicast (MLDv2 reports)',\n 'ff01::fb/128': 'Multicast (mDNSv6)',\n 'ff02::fb/128': 'Multicast (mDNSv6)',\n 'ff05::fb/128': 'Multicast (mDNSv6)',\n 'ff02::1:2/128': 'Multicast (All DHCP servers and relay agents on this link)',\n 'ff05::1:2/128': 'Multicast (All DHCP servers and relay agents in this site)',\n 'ff02::1:3/128': 'Multicast (All DHCP servers on this link)',\n 'ff05::1:3/128': 'Multicast (All DHCP servers in this site)',\n '::/128': 'Unspecified',\n '::1/128': 'Loopback',\n '::ffff:0:0/96': 'IPv4-mapped',\n 'ff00::/8': 'Multicast',\n 'fe80::/10': 'Link-local unicast',\n 'fc00::/7': 'Unique local',\n '2001::/32': 'Teredo',\n '2001:2::/48': 'Benchmarking',\n '2002::/16': '6to4',\n '2001:db8::/32': 'Documentation',\n '3fff::/20': 'Documentation',\n '100::/64': 'Discard-only',\n 'fec0::/10': 'Site-local unicast (deprecated)',\n '::/96': 'IPv4-compatible (deprecated)',\n '64:ff9b::/96': 'NAT64 (well-known)',\n '64:ff9b:1::/48': 'NAT64 (local-use)',\n} as const;\n\n/**\n * A regular expression that matches bad characters in an IPv6 address\n * @memberof Address6\n * @static\n */\nexport const RE_BAD_CHARACTERS = /([^0-9a-f:/%])/gi;\n\n/**\n * A regular expression that matches an incorrect IPv6 address\n * @memberof Address6\n * @static\n */\nexport const RE_BAD_ADDRESS = /([0-9a-f]{5,}|:{3,}|[^:]:$|^:[^:]|\\/$)/gi;\n\n/**\n * A regular expression that matches an IPv6 subnet\n * @memberof Address6\n * @static\n */\nexport const RE_SUBNET_STRING = /\\/\\d{1,3}(?=%|$)/;\n\n/**\n * A regular expression that matches an IPv6 zone\n * @memberof Address6\n * @static\n * @deprecated Takes quadratic time on input holding many `%` characters\n * followed by a line terminator. The library finds the zone by index, as\n * `Address6`'s constructor shows, and 11.0.0 removes this export.\n */\nexport const RE_ZONE_STRING = /%.*$/;\n\nexport const RE_URL = /^(?:\\[([0-9a-f:.]+)\\]|([0-9a-f:.]+))(?:[/?#].*)?$/i;\nexport const RE_URL_WITH_PORT = /^\\[([0-9a-f:.]+)\\]:([0-9]{1,5})(?:[/?#].*)?$/i;\n\n/**\n * The IANA IPv6 Special-Purpose Address Registry\n * (https://www.iana.org/assignments/iana-ipv6-special-registry/), one entry\n * per block: `[cidr, name, globallyReachable]`. A `null` reachability means\n * the registry says N/A or leaves the column blank; N/A blocks (Teredo, 6to4)\n * are treated as not globally reachable, since a packet to one needs a relay,\n * and blank blocks inherit the answer of the block containing them.\n *\n * `Address6.isGlobal()` answers from the most specific entry containing the\n * address, after delegating IPv4-mapped and NAT64 well-known addresses to the\n * embedded IPv4 address. `test/data/iana-corpus.json` is generated from the\n * registry's CSV and pins this table to it.\n */\nexport const SPECIAL_PURPOSE: ReadonlyArray<readonly [string, string, boolean | null]> = [\n ['::1/128', 'Loopback Address', false],\n ['::/128', 'Unspecified Address', false],\n ['::ffff:0:0/96', 'IPv4-mapped Address', false],\n ['64:ff9b::/96', 'IPv4-IPv6 Translat.', true],\n ['64:ff9b:1::/48', 'IPv4-IPv6 Translat.', false],\n ['100::/64', 'Discard-Only Address Block', false],\n ['100:0:0:1::/64', 'Dummy IPv6 Prefix', false],\n ['2001::/23', 'IETF Protocol Assignments', false],\n ['2001::/32', 'TEREDO', false],\n ['2001:1::1/128', 'Port Control Protocol Anycast', true],\n ['2001:1::2/128', 'Traversal Using Relays around NAT Anycast', true],\n ['2001:1::3/128', 'DNS-SD Service Registration Protocol Anycast', true],\n ['2001:2::/48', 'Benchmarking', false],\n ['2001:3::/32', 'AMT', true],\n ['2001:4:112::/48', 'AS112-v6', true],\n ['2001:10::/28', 'Deprecated (previously ORCHID)', null],\n ['2001:20::/28', 'ORCHIDv2', true],\n ['2001:30::/28', 'Drone Remote ID Protocol Entity Tags (DETs) Prefix', true],\n ['2001:db8::/32', 'Documentation', false],\n ['2002::/16', '6to4', false],\n ['2620:4f:8000::/48', 'Direct Delegation AS112 Service', true],\n ['3fff::/20', 'Documentation', false],\n ['5f00::/16', 'Segment Routing (SRv6) SIDs', false],\n ['fc00::/7', 'Unique-Local', false],\n ['fe80::/10', 'Link-Local Unicast', false],\n];\n","export function escapeHtml(s: string): string {\n return s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/**\n * @returns {String} the string with all zeroes contained in a <span>\n */\nexport function spanAllZeroes(s: string): string {\n return escapeHtml(s).replace(/(0+)/g, '<span class=\"zero\">$1</span>');\n}\n\n/**\n * @returns {String} the string with each character contained in a <span>\n */\nexport function spanAll(s: string, offset: number = 0): string {\n const letters = s.split('');\n\n return letters\n .map(\n (n, i) =>\n `<span class=\"digit value-${escapeHtml(n)} position-${i + offset}\">${spanAllZeroes(n)}</span>`,\n )\n .join('');\n}\n\nfunction spanLeadingZeroesSimple(group: string): string {\n return escapeHtml(group).replace(/^(0+)/, '<span class=\"zero\">$1</span>');\n}\n\n/**\n * @returns {String} the string with leading zeroes contained in a <span>\n */\nexport function spanLeadingZeroes(address: string): string {\n const groups = address.split(':');\n\n return groups.map((g) => spanLeadingZeroesSimple(g)).join(':');\n}\n\n/**\n * Groups an address\n * @returns {String} a grouped address\n */\nexport function simpleGroup(addressString: string, offset: number = 0): string[] {\n const groups = addressString.split(':');\n\n return groups.map((g, i) => {\n if (/group-v4/.test(g)) {\n return g;\n }\n\n return `<span class=\"hover-group group-${i + offset}\">${spanLeadingZeroesSimple(g)}</span>`;\n });\n}\n","import * as v6 from './constants';\n\nexport function groupPossibilities(possibilities: string[]): string {\n return `(${possibilities.join('|')})`;\n}\n\nexport function padGroup(group: string): string {\n if (group.length < 4) {\n return `0{0,${4 - group.length}}${group}`;\n }\n\n return group;\n}\n\nexport const ADDRESS_BOUNDARY = '[^A-Fa-f0-9:]';\n\nexport function simpleRegularExpression(groups: string[]) {\n const zeroIndexes: number[] = [];\n\n groups.forEach((group, i) => {\n const groupInteger = parseInt(group, 16);\n\n if (groupInteger === 0) {\n zeroIndexes.push(i);\n }\n });\n\n // You can technically elide a single 0, this creates the regular expressions\n // to match that eventuality\n const possibilities = zeroIndexes.map((zeroIndex) =>\n groups\n .map((group, i) => {\n if (i === zeroIndex) {\n const elision = i === 0 || i === v6.GROUPS - 1 ? ':' : '';\n\n return groupPossibilities([padGroup(group), elision]);\n }\n\n return padGroup(group);\n })\n .join(':'),\n );\n\n // The simplest case\n possibilities.push(groups.map(padGroup).join(':'));\n\n return groupPossibilities(possibilities);\n}\n\nexport function possibleElisions(\n elidedGroups: number,\n moreLeft?: boolean,\n moreRight?: boolean,\n): string {\n const left = moreLeft ? '' : ':';\n const right = moreRight ? '' : ':';\n\n const possibilities = [];\n\n // 1. elision of everything (::)\n if (!moreLeft && !moreRight) {\n possibilities.push('::');\n }\n\n // 2. complete elision of the middle\n if (moreLeft && moreRight) {\n possibilities.push('');\n }\n\n if ((moreRight && !moreLeft) || (!moreRight && moreLeft)) {\n // 3. complete elision of one side\n possibilities.push(':');\n }\n\n // 4. elision from the left side\n possibilities.push(`${left}(:0{1,4}){1,${elidedGroups - 1}}`);\n\n // 5. elision from the right side\n possibilities.push(`(0{1,4}:){1,${elidedGroups - 1}}${right}`);\n\n // 6. no elision\n possibilities.push(`(0{1,4}:){${elidedGroups - 1}}0{1,4}`);\n\n // 7. elision (including sloppy elision) from the middle\n for (let groups = 1; groups < elidedGroups - 1; groups++) {\n for (let position = 1; position < elidedGroups - groups; position++) {\n possibilities.push(\n `(0{1,4}:){${position}}:(0{1,4}:){${elidedGroups - position - groups - 1}}0{1,4}`,\n );\n }\n }\n\n return groupPossibilities(possibilities);\n}\n","/* eslint-disable prefer-destructuring */\n/* eslint-disable no-param-reassign */\n\nimport * as common from './common';\nimport * as constants4 from './v4/constants';\nimport * as constants6 from './v6/constants';\nimport * as helpers from './v6/helpers';\nimport { Address4 } from './ipv4';\nimport {\n ADDRESS_BOUNDARY,\n possibleElisions,\n simpleRegularExpression,\n} from './v6/regular-expressions';\nimport { AddressError } from './address-error';\nimport { testBit } from './common';\n\nconst isCorrect6 = common.isCorrect(constants6.BITS);\n\nfunction assert(condition: any): asserts condition {\n if (!condition) {\n throw new Error('Assertion failed.');\n }\n}\n\nfunction addCommas(number: string): string {\n const r = /(\\d+)(\\d{3})/;\n\n while (r.test(number)) {\n number = number.replace(r, '$1,$2');\n }\n\n return number;\n}\n\nfunction spanLeadingZeroes4(n: string): string {\n n = n.replace(/^(0{1,})([1-9]+)$/, '<span class=\"parse-error\">$1</span>$2');\n n = n.replace(/^(0{1,})(0)$/, '<span class=\"parse-error\">$1</span>$2');\n\n return n;\n}\n\n/*\n * A helper function to compact an array\n */\nfunction compact(address: string[], slice: number[]) {\n const s1 = [];\n const s2 = [];\n let i;\n\n for (i = 0; i < address.length; i++) {\n if (i < slice[0]) {\n s1.push(address[i]);\n } else if (i > slice[1]) {\n s2.push(address[i]);\n }\n }\n\n return s1.concat(['compact']).concat(s2);\n}\n\nfunction paddedHex(octet: string): string {\n return parseInt(octet, 16).toString(16).padStart(4, '0');\n}\n\nfunction unsignByte(b: number) {\n return b & 0xff;\n}\n\ninterface SixToFourProperties {\n prefix: string;\n gateway: string;\n}\n\ninterface TeredoProperties {\n prefix: string;\n server4: string;\n client4: string;\n flags: string;\n coneNat: boolean;\n microsoft: {\n reserved: boolean;\n universalLocal: boolean;\n groupIndividual: boolean;\n nonce: string;\n };\n udpPort: string;\n}\n\n/**\n * Represents an IPv6 address\n * @param {string} address - An IPv6 address string\n * @param {number} [groups=8] - How many octets to parse\n * @example\n * var address = new Address6('2001::/32');\n */\nexport class Address6 {\n address4?: Address4;\n address: string;\n addressMinusSuffix: string = '';\n elidedGroups?: number;\n elisionBegin?: number;\n elisionEnd?: number;\n groups: number;\n parsedAddress4?: string;\n parsedAddress: string[];\n parsedSubnet: string = '';\n subnet: string = '/128';\n subnetMask: number = 128;\n v4: boolean = false;\n zone: string = '';\n private _binaryZeroPad?: string;\n\n constructor(address: string, optionalGroups?: number) {\n if (optionalGroups === undefined) {\n this.groups = constants6.GROUPS;\n } else {\n this.groups = optionalGroups;\n }\n\n this.address = address;\n\n const subnet = constants6.RE_SUBNET_STRING.exec(address);\n\n if (subnet) {\n this.parsedSubnet = subnet[0].replace('/', '');\n this.subnetMask = parseInt(this.parsedSubnet, 10);\n this.subnet = `/${this.subnetMask}`;\n\n if (\n Number.isNaN(this.subnetMask) ||\n this.subnetMask < 0 ||\n this.subnetMask > constants6.BITS\n ) {\n throw new AddressError('Invalid subnet mask.');\n }\n\n address = address.replace(constants6.RE_SUBNET_STRING, '');\n }\n\n // RE_SUBNET_STRING anchors on the end of the address, so it strips only\n // the trailing suffix. A second one left behind (`::/0/1`) is malformed\n // and must be rejected rather than parsed as an address group.\n if (/\\//.test(address)) {\n throw new AddressError('Invalid subnet mask.');\n }\n\n // A zone runs from the first `%` to the end of the input and holds no line\n // terminator. Finding it by index reads the input once, where matching\n // RE_ZONE_STRING retries from every `%` that a line terminator disqualifies.\n const zoneStart = address.indexOf('%');\n\n if (zoneStart !== -1 && /^.*$/.test(address.slice(zoneStart))) {\n this.zone = address.slice(zoneStart);\n\n address = address.slice(0, zoneStart);\n }\n\n // The longest well-formed address is all but the last two groups written\n // as four hex digits with their colons, then a 15-character dotted quad:\n // 5 * (groups - 2) + 15, which is 45 for eight groups, the same line\n // CPython's ipaddress module draws. Rejecting longer input here keeps the\n // parse diagnostics, which wrap every offending character in a span,\n // proportional to an address rather than to whatever was passed in.\n const longest = this.groups * 5 + 5;\n\n if (address.length > longest) {\n throw new AddressError(`IPv6 addresses are at most ${longest} characters.`);\n }\n\n this.addressMinusSuffix = address;\n\n this.parsedAddress = this.parse(this.addressMinusSuffix);\n }\n\n /**\n * Returns true if the given string is a valid IPv6 address (with optional\n * CIDR subnet and zone identifier), false otherwise. Host bits in the\n * subnet portion are allowed (e.g. `2001:db8::1/32` is valid); for strict\n * network-address validation compare `correctForm()` to\n * `startAddress().correctForm()`, or use `networkForm()`.\n */\n static isValid(address: string): boolean {\n try {\n // eslint-disable-next-line no-new\n new Address6(address);\n\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Convert a BigInt to a v6 address object. The value must be in the\n * range `[0, 2**128 - 1]`; otherwise `AddressError` is thrown.\n * @param {bigint} bigInt - a BigInt to convert\n * @returns {Address6}\n * @example\n * var bigInt = BigInt('1000000000000');\n * var address = Address6.fromBigInt(bigInt);\n * address.correctForm(); // '::e8:d4a5:1000'\n */\n static fromBigInt(bigInt: bigint): Address6 {\n if (bigInt < BigInt(0) || bigInt > (BigInt(1) << BigInt(constants6.BITS)) - BigInt(1)) {\n throw new AddressError('IPv6 BigInt must be in the range 0 to 2**128 - 1');\n }\n\n const hex = bigInt.toString(16).padStart(32, '0');\n const groups = [];\n\n for (let i = 0; i < constants6.GROUPS; i++) {\n groups.push(hex.slice(i * 4, (i + 1) * 4));\n }\n\n return new Address6(groups.join(':'));\n }\n\n /**\n * Parse a URL (with optional bracketed host and port) into an address and\n * port. Returns either `{ address, port }` on success or\n * `{ error, address: null, port: null }` if the URL could not be parsed.\n * Ports are returned as numbers (or `null` if absent or out of range).\n * @example\n * var addressAndPort = Address6.fromURL('http://[ffff::]:8080/foo/');\n * addressAndPort.address.correctForm(); // 'ffff::'\n * addressAndPort.port; // 8080\n */\n static fromURL(url: string) {\n let host: string;\n let port: string | number | null = null;\n let result: RegExpExecArray | null;\n let error: string;\n\n // Remove the protocol prefix, if any\n const stripped = url.replace(/^[a-z][a-z0-9+.-]*:\\/\\//i, '');\n\n // If we have brackets parse them and find a port\n if (stripped.indexOf('[') !== -1 && stripped.indexOf(']:') !== -1) {\n error = 'failed to parse address with port';\n result = constants6.RE_URL_WITH_PORT.exec(stripped);\n\n if (result === null) {\n return { error, address: null, port: null };\n }\n\n host = result[1];\n port = result[2];\n } else {\n error = 'failed to parse address from URL';\n result = constants6.RE_URL.exec(stripped);\n\n if (result === null) {\n return { error, address: null, port: null };\n }\n\n host = result[1] ?? result[2];\n }\n\n // If there's a port convert it to an integer\n if (port) {\n port = parseInt(port, 10);\n\n // squelch out of range ports (valid ports are 0-65535)\n if (port < 0 || port > 65535) {\n port = null;\n }\n } else {\n // Standardize `undefined` to `null`\n port = null;\n }\n\n // The URL character class is a superset of valid IPv6, so a host the\n // regex accepted (an IPv4 literal, bare punctuation, too many groups)\n // can still be rejected by the parser\n let address: Address6;\n\n try {\n address = new Address6(host);\n } catch {\n return { error, address: null, port: null };\n }\n\n return { address, port };\n }\n\n /**\n * Construct an `Address6` from an address and a hex subnet mask given as\n * separate strings (e.g. as returned by Node's `os.networkInterfaces()`).\n * Throws `AddressError` if the mask is non-contiguous (e.g.\n * `ffff::ffff`).\n * @example\n * var address = Address6.fromAddressAndMask('fe80::1', 'ffff:ffff:ffff:ffff::');\n * address.subnetMask; // 64\n */\n static fromAddressAndMask(address: string, mask: string): Address6 {\n const bits = common.prefixLengthFromMask(new Address6(mask).bigInt(), constants6.BITS);\n return new Address6(`${address}/${bits}`);\n }\n\n /**\n * Construct an `Address6` from an address and a Cisco-style wildcard mask\n * given as separate strings (e.g. `::ffff:ffff:ffff:ffff` for a `/64`).\n * The wildcard mask is the bitwise inverse of the subnet mask. Throws\n * `AddressError` if the mask is non-contiguous.\n * @example\n * var address = Address6.fromAddressAndWildcardMask('fe80::1', '::ffff:ffff:ffff:ffff');\n * address.subnetMask; // 64\n */\n static fromAddressAndWildcardMask(address: string, wildcardMask: string): Address6 {\n const wildcard = new Address6(wildcardMask).bigInt();\n const allOnes = (BigInt(1) << BigInt(constants6.BITS)) - BigInt(1);\n const mask = wildcard ^ allOnes;\n const bits = common.prefixLengthFromMask(mask, constants6.BITS);\n return new Address6(`${address}/${bits}`);\n }\n\n /**\n * Construct an `Address6` from a wildcard pattern with trailing `*`\n * groups. The number of trailing wildcards determines the prefix\n * length: each `*` represents 16 bits. `::` is expanded to zero groups\n * (not wildcards) before evaluating trailing wildcards.\n *\n * Only trailing whole-group wildcards are supported. Partial-group\n * wildcards (e.g. `2001:db8::0*`) and interior wildcards (e.g.\n * `*::1`) throw `AddressError`.\n * @example\n * Address6.fromWildcard('2001:db8:*:*:*:*:*:*').subnet; // '/32'\n * Address6.fromWildcard('2001:db8::*').subnet; // '/112'\n * Address6.fromWildcard('*:*:*:*:*:*:*:*').subnet; // '/0'\n */\n static fromWildcard(input: string): Address6 {\n if (input.includes('%') || input.includes('/')) {\n throw new AddressError('Wildcard pattern must not include a zone or CIDR suffix');\n }\n\n const halves = input.split('::');\n\n if (halves.length > 2) {\n throw new AddressError(\"Wildcard pattern cannot contain more than one '::'\");\n }\n\n let groups: string[];\n\n if (halves.length === 2) {\n const left = halves[0] === '' ? [] : halves[0].split(':');\n const right = halves[1] === '' ? [] : halves[1].split(':');\n const remaining = constants6.GROUPS - left.length - right.length;\n\n if (remaining < 1) {\n throw new AddressError(\"Wildcard pattern with '::' has too many groups\");\n }\n\n groups = [...left, ...new Array(remaining).fill('0'), ...right];\n } else {\n groups = input.split(':');\n }\n\n if (groups.length !== constants6.GROUPS) {\n throw new AddressError('Wildcard pattern must have 8 groups');\n }\n\n let firstWildcard = -1;\n\n for (let i = 0; i < groups.length; i++) {\n if (groups[i] === '*') {\n if (firstWildcard === -1) {\n firstWildcard = i;\n }\n } else if (firstWildcard !== -1) {\n throw new AddressError(\n 'Wildcard `*` must only appear in trailing groups (e.g. `2001:db8:*:*:*:*:*:*`)',\n );\n }\n }\n\n const trailing = firstWildcard === -1 ? 0 : groups.length - firstWildcard;\n const replaced = groups.map((g) => (g === '*' ? '0' : g));\n const subnetBits = constants6.BITS - trailing * 16;\n\n return new Address6(`${replaced.join(':')}/${subnetBits}`);\n }\n\n /**\n * Create an IPv6-mapped address given an IPv4 address\n * @param {string} address - An IPv4 address string\n * @returns {Address6}\n * @example\n * var address = Address6.fromAddress4('192.168.0.1');\n * address.correctForm(); // '::ffff:c0a8:1'\n * address.to4in6(); // '::ffff:192.168.0.1'\n */\n static fromAddress4(address: string): Address6 {\n const address4 = new Address4(address);\n\n const mask6 = constants6.BITS - (constants4.BITS - address4.subnetMask);\n\n return new Address6(`::ffff:${address4.correctForm()}/${mask6}`);\n }\n\n /**\n * Return an address from ip6.arpa form. A full 32-nibble name gives a /128\n * address; a shorter name, as used for a delegated reverse zone, gives the\n * network it covers, with a subnet mask of four bits per nibble, so\n * `fromArpa(x.reverseForm())` round-trips {@link reverseForm} for any prefix.\n * @param {string} arpaFormAddress - an 'ip6.arpa' form address\n * @returns {Adress6}\n * @example\n * var address = Address6.fromArpa(e.f.f.f.3.c.2.6.f.f.f.e.6.6.8.e.1.0.6.7.9.4.e.c.0.0.0.0.1.0.0.2.ip6.arpa.)\n * address.correctForm(); // '2001:0:ce49:7601:e866:efff:62c3:fffe'\n * Address6.fromArpa('8.b.d.0.1.0.0.2.ip6.arpa.').networkForm(); // '2001:db8::/32'\n */\n static fromArpa(arpaFormAddress: string): Address6 {\n // remove an ending \".ip6.arpa\", in any case and with or without the root\n // dot\n const nibbles = arpaFormAddress.replace(/(\\.ip6\\.arpa)?\\.?$/i, '');\n\n if (!/^[0-9a-f](\\.[0-9a-f]){0,31}$/i.test(nibbles)) {\n throw new AddressError(\"Invalid 'ip6.arpa' form.\");\n }\n\n const reversed = nibbles.split('.').reverse();\n const subnetMask = reversed.length * 4;\n const hex = reversed.join('').padEnd(32, '0');\n const groups = [];\n\n for (let i = 0; i < constants6.GROUPS; i++) {\n groups.push(hex.slice(i * 4, (i + 1) * 4));\n }\n\n return new Address6(`${groups.join(':')}/${subnetMask}`);\n }\n\n /**\n * Return the Microsoft UNC transcription of the address\n * @returns {String} the Microsoft UNC transcription of the address\n */\n microsoftTranscription(): string {\n return `${this.correctForm().replace(/:/g, '-')}.ipv6-literal.net`;\n }\n\n /**\n * Return the first n bits of the address, defaulting to the subnet mask\n * @param {number} [mask=subnet] - the number of bits to mask\n * @returns {String} the first n bits of the address as a string\n */\n mask(mask: number = this.subnetMask): string {\n return this.getBitsBase2(0, mask);\n }\n\n /**\n * Return the number of possible subnets of a given size in the address\n * @param {number} [subnetSize=128] - the subnet size\n * @returns {String}\n */\n // TODO: probably useful to have a numeric version of this too\n possibleSubnets(subnetSize: number = 128): string {\n const availableBits = constants6.BITS - this.subnetMask;\n const subnetBits = Math.abs(subnetSize - constants6.BITS);\n const subnetPowers = availableBits - subnetBits;\n\n if (subnetPowers < 0) {\n return '0';\n }\n\n return addCommas((BigInt('2') ** BigInt(subnetPowers)).toString(10));\n }\n\n /**\n * Helper function getting start address.\n * @returns {bigint}\n */\n _startAddress(): bigint {\n return BigInt(`0b${this.mask() + '0'.repeat(constants6.BITS - this.subnetMask)}`);\n }\n\n /**\n * The first address in the range given by this address' subnet\n * Often referred to as the Network Address.\n * @returns {Address6}\n */\n startAddress(): Address6 {\n return Address6.fromBigInt(this._startAddress());\n }\n\n /**\n * The first host address in the range given by this address's subnet ie\n * the first address after the Network Address\n * @returns {Address6}\n */\n startAddressExclusive(): Address6 {\n const adjust = BigInt('1');\n return Address6.fromBigInt(this._startAddress() + adjust);\n }\n\n /**\n * Helper function getting end address.\n * @returns {bigint}\n */\n _endAddress(): bigint {\n return BigInt(`0b${this.mask() + '1'.repeat(constants6.BITS - this.subnetMask)}`);\n }\n\n /**\n * The last address in the range given by this address's subnet. IPv6 has\n * no broadcast address, so this is an ordinary assignable address (in a\n * 64-bit-interface-identifier subnet it falls inside the reserved\n * subnet-anycast block of [RFC 2526](https://datatracker.ietf.org/doc/html/rfc2526)).\n * @returns {Address6}\n */\n endAddress(): Address6 {\n return Address6.fromBigInt(this._endAddress());\n }\n\n /**\n * The address one before {@link endAddress}. This is the IPv6 counterpart\n * of the IPv4 method that skips the broadcast address; IPv6 has no broadcast,\n * so it drops exactly one address and does not model the 128 reserved\n * subnet-anycast identifiers of [RFC 2526](https://datatracker.ietf.org/doc/html/rfc2526).\n * @returns {Address6}\n */\n endAddressExclusive(): Address6 {\n const adjust = BigInt('1');\n return Address6.fromBigInt(this._endAddress() - adjust);\n }\n\n /**\n * Returns the address `n` addresses after this one (or before, when `n` is\n * negative), keeping this address's subnet mask. Throws `AddressError` when\n * the result would fall outside the IPv6 address space or `n` is not an\n * integer.\n * @param {number | bigint} n\n * @returns {Address6}\n * @example\n * new Address6('2001:db8::/64').offset(1).correctForm(); // '2001:db8::1'\n */\n offset(n: number | bigint): Address6 {\n return Address6.fromBigInt(\n common.offsetBigInt(this.bigInt(), n, constants6.BITS, 'IPv6'),\n ).withSubnetMask(this.subnetMask);\n }\n\n /**\n * Returns the network that follows this address's network: the address after\n * {@link endAddress}, with the same subnet mask. Throws `AddressError` when\n * this network is the last one in the address space.\n * @returns {Address6}\n * @example\n * new Address6('2001:db8::/64').nextNetwork().networkForm(); // '2001:db8:0:1::/64'\n */\n nextNetwork(): Address6 {\n return Address6.fromBigInt(\n common.offsetBigInt(this._endAddress(), 1, constants6.BITS, 'IPv6'),\n ).withSubnetMask(this.subnetMask);\n }\n\n private withSubnetMask(subnetMask: number): Address6 {\n return new Address6(`${this.correctForm()}/${subnetMask}`);\n }\n\n /**\n * The hex form of the subnet mask, e.g. `ffff:ffff:ffff:ffff::` for a\n * `/64`. Returns an `Address6`; call `.correctForm()` for the string.\n * @returns {Address6}\n */\n subnetMaskAddress(): Address6 {\n return Address6.fromBigInt(\n BigInt(`0b${'1'.repeat(this.subnetMask)}${'0'.repeat(constants6.BITS - this.subnetMask)}`),\n );\n }\n\n /**\n * The Cisco-style wildcard mask, e.g. `::ffff:ffff:ffff:ffff` for a\n * `/64`. This is the bitwise inverse of `subnetMaskAddress()`. Returns\n * an `Address6`; call `.correctForm()` for the string.\n * @returns {Address6}\n */\n wildcardMask(): Address6 {\n return Address6.fromBigInt(\n BigInt(`0b${'0'.repeat(this.subnetMask)}${'1'.repeat(constants6.BITS - this.subnetMask)}`),\n );\n }\n\n /**\n * The network address in CIDR string form, e.g. `2001:db8::/32` for\n * `2001:db8::1/32`. For an address with no explicit subnet the prefix\n * is `/128`, e.g. `networkForm()` on `2001:db8::1` returns\n * `2001:db8::1/128`.\n * @returns {string}\n */\n networkForm(): string {\n return `${this.startAddress().correctForm()}/${this.subnetMask}`;\n }\n\n /**\n * Return the scope of the address. The 4-bit scope field\n * ([RFC 4291 §2.7](https://datatracker.ietf.org/doc/html/rfc4291#section-2.7))\n * is only defined for multicast addresses; for unicast addresses the scope\n * is derived from the address type per\n * [RFC 4007 §6](https://datatracker.ietf.org/doc/html/rfc4007#section-6).\n * @returns {String}\n */\n getScope(): string {\n const type = this.getType();\n\n if (type === 'Multicast' || type.startsWith('Multicast ')) {\n const scope = constants6.SCOPES[parseInt(this.getBits(12, 16).toString(10), 10)];\n return scope || 'Unknown';\n }\n\n // RFC 4291 §2.5.3: the loopback address is treated as having Link-Local\n // scope. (Multicast scope 1, \"Interface-Local\", is a different concept\n // used only for loopback transmission of multicast.)\n if (type === 'Link-local unicast' || type === 'Loopback') {\n return 'Link local';\n }\n\n // RFC 4007 §6: the unspecified address has no scope.\n if (type === 'Unspecified') {\n return 'Unknown';\n }\n\n return 'Global';\n }\n\n /**\n * Return the type of the address\n * @returns {String}\n */\n getType(): string {\n for (let i = 0; i < TYPE_SUBNETS.length; i++) {\n const entry = TYPE_SUBNETS[i];\n if (this.isHostInSubnet(entry[0])) {\n return entry[1];\n }\n }\n\n return 'Global unicast';\n }\n\n /**\n * Return the bits in the given range as a BigInt\n * @returns {bigint}\n */\n getBits(start: number, end: number): bigint {\n return BigInt(`0b${this.getBitsBase2(start, end)}`);\n }\n\n /**\n * Return the bits in the given range as a base-2 string\n * @returns {String}\n */\n getBitsBase2(start: number, end: number): string {\n return this.binaryZeroPad().slice(start, end);\n }\n\n /**\n * Return the bits in the given range as a base-16 string\n * @returns {String}\n */\n getBitsBase16(start: number, end: number): string {\n const length = end - start;\n\n if (length % 4 !== 0) {\n throw new Error('Length of bits to retrieve must be divisible by four');\n }\n\n return this.getBits(start, end)\n .toString(16)\n .padStart(length / 4, '0');\n }\n\n /**\n * Return the bits that are set past the subnet mask length\n * @returns {String}\n */\n getBitsPastSubnet(): string {\n return this.getBitsBase2(this.subnetMask, constants6.BITS);\n }\n\n /**\n * Return the reversed ip6.arpa form of the address\n * @param {Object} options\n * @param {boolean} options.omitSuffix - omit the \"ip6.arpa\" suffix\n * @returns {String}\n */\n reverseForm(options?: common.ReverseFormOptions): string {\n if (!options) {\n options = {};\n }\n\n const characters = Math.floor(this.subnetMask / 4);\n\n const reversed = this.canonicalForm()\n .replace(/:/g, '')\n .split('')\n .slice(0, characters)\n .reverse()\n .join('.');\n\n if (characters > 0) {\n if (options.omitSuffix) {\n return reversed;\n }\n\n return `${reversed}.ip6.arpa.`;\n }\n\n if (options.omitSuffix) {\n return '';\n }\n\n return 'ip6.arpa.';\n }\n\n /**\n * Returns the address in correct form, per\n * [RFC 5952](https://datatracker.ietf.org/doc/html/rfc5952): leading zeros\n * stripped, the longest run of zero groups collapsed to `::`, and hex digits\n * lowercased (e.g. `2001:db8::1`). This is the recommended form for display.\n */\n correctForm(): string {\n let i;\n let groups = [];\n\n let zeroCounter = 0;\n const zeroes = [];\n\n for (i = 0; i < this.parsedAddress.length; i++) {\n const value = parseInt(this.parsedAddress[i], 16);\n\n if (value === 0) {\n zeroCounter++;\n }\n\n if (value !== 0 && zeroCounter > 0) {\n if (zeroCounter > 1) {\n zeroes.push([i - zeroCounter, i - 1]);\n }\n\n zeroCounter = 0;\n }\n }\n\n // Do we end with a string of zeroes?\n if (zeroCounter > 1) {\n zeroes.push([this.parsedAddress.length - zeroCounter, this.parsedAddress.length - 1]);\n }\n\n const zeroLengths = zeroes.map((n) => n[1] - n[0] + 1);\n\n if (zeroes.length > 0) {\n const index = zeroLengths.indexOf(Math.max(...zeroLengths) as number);\n\n groups = compact(this.parsedAddress, zeroes[index]);\n } else {\n groups = this.parsedAddress;\n }\n\n for (i = 0; i < groups.length; i++) {\n if (groups[i] !== 'compact') {\n groups[i] = parseInt(groups[i], 16).toString(16);\n }\n }\n\n let correct = groups.join(':');\n\n correct = correct.replace(/^compact$/, '::');\n correct = correct.replace(/(^compact)|(compact$)/, ':');\n correct = correct.replace(/compact/, '');\n\n return correct;\n }\n\n /**\n * Return a zero-padded base-2 string representation of the address\n * @returns {String}\n * @example\n * var address = new Address6('2001:4860:4001:803::1011');\n * address.binaryZeroPad();\n * // '0010000000000001010010000110000001000000000000010000100000000011\n * // 0000000000000000000000000000000000000000000000000001000000010001'\n */\n binaryZeroPad(): string {\n if (this._binaryZeroPad === undefined) {\n this._binaryZeroPad = this.bigInt().toString(2).padStart(constants6.BITS, '0');\n }\n return this._binaryZeroPad;\n }\n\n /**\n * Parses a v4-in-v6 string (e.g. `::ffff:192.168.0.1`) by extracting the\n * trailing IPv4 address into `this.address4` / `this.parsedAddress4` and\n * returning the address with the v4 portion converted to two v6 groups.\n * Used internally by `parse()`.\n */\n // TODO: Improve the semantics of this helper function\n parse4in6(address: string): string {\n if (address.indexOf('.') === -1) {\n return address;\n }\n\n const groups = address.split(':');\n const lastGroup = groups.slice(-1)[0];\n\n // RE_ADDRESS rejects octets with a leading zero, so a dotted-quad tail is\n // matched permissively first: that way this notation still gets its own\n // message with the offending octet highlighted, rather than falling\n // through as an unrecognized group.\n const v4Octets = lastGroup.split('.');\n\n if (\n v4Octets.length === constants4.GROUPS &&\n v4Octets.every((octet) => /^\\d{1,3}$/.test(octet))\n ) {\n if (v4Octets.some((octet) => /^0\\d/.test(octet))) {\n // The prefix groups haven't been through the bad-character check\n // yet, so escape them before including in the error HTML.\n const highlighted = v4Octets.map(spanLeadingZeroes4).join('.');\n const prefix = groups.slice(0, -1).map(helpers.escapeHtml).join(':');\n const separator = groups.length > 1 ? ':' : '';\n\n throw new AddressError(\n \"IPv4 addresses can't have leading zeroes.\",\n `${prefix}${separator}${highlighted}`,\n );\n }\n }\n\n const address4 = lastGroup.match(constants4.RE_ADDRESS);\n\n if (address4) {\n this.parsedAddress4 = address4[0];\n const v4Suffix = this.subnetMask >= 96 ? `/${this.subnetMask - 96}` : '';\n this.address4 = new Address4(`${this.parsedAddress4}${v4Suffix}`);\n\n this.v4 = true;\n\n groups[groups.length - 1] = this.address4.toGroup6();\n\n address = groups.join(':');\n }\n\n return address;\n }\n\n /**\n * Parses an IPv6 address string into its 8 hexadecimal groups (expanding\n * any `::` elision and any trailing v4-in-v6 portion) and stores the result\n * on `this.parsedAddress`. Called automatically by the constructor; you\n * typically don't need to call it directly. Throws `AddressError` if the\n * input is malformed.\n */\n // TODO: Make private?\n parse(address: string): string[] {\n address = this.parse4in6(address);\n\n const badCharacters = address.match(constants6.RE_BAD_CHARACTERS);\n\n if (badCharacters) {\n throw new AddressError(\n `Bad character${\n badCharacters.length > 1 ? 's' : ''\n } detected in address: ${badCharacters.join('')}`,\n address.replace(constants6.RE_BAD_CHARACTERS, '<span class=\"parse-error\">$1</span>'),\n );\n }\n\n const badAddress = address.match(constants6.RE_BAD_ADDRESS);\n\n if (badAddress) {\n throw new AddressError(\n `Address failed regex: ${badAddress.join('')}`,\n address.replace(constants6.RE_BAD_ADDRESS, '<span class=\"parse-error\">$1</span>'),\n );\n }\n\n let groups: string[] = [];\n\n const halves = address.split('::');\n\n if (halves.length === 2) {\n let first = halves[0].split(':');\n let last = halves[1].split(':');\n\n if (first.length === 1 && first[0] === '') {\n first = [];\n }\n\n if (last.length === 1 && last[0] === '') {\n last = [];\n }\n\n const remaining = this.groups - (first.length + last.length);\n\n if (!remaining) {\n throw new AddressError('Error parsing groups');\n }\n\n this.elidedGroups = remaining;\n\n this.elisionBegin = first.length;\n this.elisionEnd = first.length + this.elidedGroups;\n\n groups = groups.concat(first);\n\n for (let i = 0; i < remaining; i++) {\n groups.push('0');\n }\n\n groups = groups.concat(last);\n } else if (halves.length === 1) {\n groups = address.split(':');\n\n this.elidedGroups = 0;\n } else {\n throw new AddressError('Too many :: groups found');\n }\n\n groups = groups.map((group: string) => parseInt(group, 16).toString(16));\n\n if (groups.length !== this.groups) {\n throw new AddressError('Incorrect number of groups found');\n }\n\n return groups;\n }\n\n /**\n * Returns the canonical (fully expanded) form of the address: all 8 groups,\n * each padded to 4 hex digits, with no `::` collapsing\n * (e.g. `2001:0db8:0000:0000:0000:0000:0000:0001`). Useful for sorting and\n * byte-exact comparison.\n */\n canonicalForm(): string {\n return this.parsedAddress.map(paddedHex).join(':');\n }\n\n /**\n * Return the decimal form of the address\n * @returns {String}\n */\n decimal(): string {\n return this.parsedAddress.map((n) => parseInt(n, 16).toString(10).padStart(5, '0')).join(':');\n }\n\n /**\n * Return the address as a BigInt\n * @returns {bigint}\n */\n bigInt(): bigint {\n return BigInt(`0x${this.parsedAddress.map(paddedHex).join('')}`);\n }\n\n /**\n * Return the last two groups of this address as an IPv4 address string.\n * If this address carries a CIDR prefix that covers the trailing 32 bits\n * (i.e. `subnetMask >= 96`), the resulting `Address4` inherits the\n * corresponding v4 prefix (`subnetMask - 96`); otherwise it defaults to\n * `/32`.\n * @returns {Address4}\n * @example\n * var address = new Address6('2001:4860:4001::1825:bf11');\n * address.to4().correctForm(); // '24.37.191.17'\n */\n to4(): Address4 {\n const binary = this.binaryZeroPad().split('');\n const hex = BigInt(`0b${binary.slice(96, 128).join('')}`)\n .toString(16)\n .padStart(8, '0');\n\n if (this.subnetMask >= 96) {\n const v4Mask = this.subnetMask - 96;\n const groups = [];\n\n for (let i = 0; i < 8; i += 2) {\n groups.push(parseInt(hex.slice(i, i + 2), 16));\n }\n\n return new Address4(`${groups.join('.')}/${v4Mask}`);\n }\n\n return Address4.fromHex(hex);\n }\n\n /**\n * Return the v4-in-v6 form of the address\n * @returns {String}\n */\n to4in6(): string {\n const address4 = this.to4();\n const address6 = new Address6(this.parsedAddress.slice(0, 6).join(':'), 6);\n\n const correct = address6.correctForm();\n\n let infix = '';\n\n if (!/:$/.test(correct)) {\n infix = ':';\n }\n\n return correct + infix + address4.correctForm();\n }\n\n /**\n * Decodes the Teredo tunneling fields embedded in this address. Returns the\n * Teredo prefix, server IPv4, client IPv4, raw flag bits, cone-NAT flag,\n * UDP port, and Microsoft-format flag breakdown (reserved, universal/local,\n * group/individual, nonce). Only meaningful for addresses in `2001::/32`.\n */\n inspectTeredo(): TeredoProperties {\n /*\n - Bits 0 to 31 are set to the Teredo prefix (normally 2001:0000::/32).\n - Bits 32 to 63 embed the primary IPv4 address of the Teredo server that\n is used.\n - Bits 64 to 79 can be used to define some flags. Currently only the\n higher order bit is used; it is set to 1 if the Teredo client is\n located behind a cone NAT, 0 otherwise. For Microsoft's Windows Vista\n and Windows Server 2008 implementations, more bits are used. In those\n implementations, the format for these 16 bits is \"CRAAAAUG AAAAAAAA\",\n where \"C\" remains the \"Cone\" flag. The \"R\" bit is reserved for future\n use. The \"U\" bit is for the Universal/Local flag (set to 0). The \"G\" bit\n is Individual/Group flag (set to 0). The A bits are set to a 12-bit\n randomly generated number chosen by the Teredo client to introduce\n additional protection for the Teredo node against IPv6-based scanning\n attacks.\n - Bits 80 to 95 contains the obfuscated UDP port number. This is the\n port number that is mapped by the NAT to the Teredo client with all\n bits inverted.\n - Bits 96 to 127 contains the obfuscated IPv4 address. This is the\n public IPv4 address of the NAT with all bits inverted.\n */\n const prefix = this.getBitsBase16(0, 32);\n\n const bitsForUdpPort: bigint = this.getBits(80, 96);\n const udpPort = (bitsForUdpPort ^ BigInt('0xffff')).toString();\n\n const server4 = Address4.fromHex(this.getBitsBase16(32, 64));\n\n const bitsForClient4 = this.getBits(96, 128);\n const client4 = Address4.fromHex(\n (bitsForClient4 ^ BigInt('0xffffffff')).toString(16).padStart(8, '0'),\n );\n\n const flagsBase2 = this.getBitsBase2(64, 80);\n\n const coneNat = testBit(flagsBase2, 15);\n const reserved = testBit(flagsBase2, 14);\n const groupIndividual = testBit(flagsBase2, 8);\n const universalLocal = testBit(flagsBase2, 9);\n const nonce = BigInt(`0b${flagsBase2.slice(2, 6) + flagsBase2.slice(8, 16)}`).toString(10);\n\n return {\n prefix: `${prefix.slice(0, 4)}:${prefix.slice(4, 8)}`,\n server4: server4.address,\n client4: client4.address,\n flags: flagsBase2,\n coneNat,\n microsoft: {\n reserved,\n universalLocal,\n groupIndividual,\n nonce,\n },\n udpPort,\n };\n }\n\n /**\n * Decodes the 6to4 tunneling fields embedded in this address. Returns the\n * 6to4 prefix and the embedded IPv4 gateway address. Only meaningful for\n * addresses in `2002::/16`.\n */\n inspect6to4(): SixToFourProperties {\n /*\n - Bits 0 to 15 are set to the 6to4 prefix (2002::/16).\n - Bits 16 to 48 embed the IPv4 address of the 6to4 gateway that is used.\n */\n\n const prefix = this.getBitsBase16(0, 16);\n\n const gateway = Address4.fromHex(this.getBitsBase16(16, 48));\n\n return {\n prefix: prefix.slice(0, 4),\n gateway: gateway.address,\n };\n }\n\n /**\n * Return a v6 6to4 address from a v6 v4inv6 address\n * @returns {Address6}\n */\n to6to4(): Address6 | null {\n if (!this.is4()) {\n return null;\n }\n\n const addr6to4 = [\n '2002',\n this.getBitsBase16(96, 112),\n this.getBitsBase16(112, 128),\n '',\n '/16',\n ].join(':');\n\n return new Address6(addr6to4);\n }\n\n /**\n * Embed an IPv4 address into a NAT64 IPv6 address using the encoding\n * defined by [RFC 6052](https://datatracker.ietf.org/doc/html/rfc6052).\n * The default prefix is the well-known prefix `64:ff9b::/96`. The prefix\n * length must be one of 32, 40, 48, 56, 64, or 96; for prefixes shorter\n * than /64 the IPv4 octets are split around the reserved bits 64–71.\n * @example\n * Address6.fromAddress4Nat64('192.0.2.33').correctForm(); // '64:ff9b::c000:221'\n * Address6.fromAddress4Nat64('192.0.2.33', '2001:db8::/32').correctForm(); // '2001:db8:c000:221::'\n */\n static fromAddress4Nat64(address: string, prefix: string = '64:ff9b::/96'): Address6 {\n const v4 = new Address4(address);\n const prefix6 = new Address6(prefix);\n const pl = prefix6.subnetMask;\n\n if (pl !== 32 && pl !== 40 && pl !== 48 && pl !== 56 && pl !== 64 && pl !== 96) {\n throw new AddressError('NAT64 prefix length must be 32, 40, 48, 56, 64, or 96');\n }\n\n const prefixBits = prefix6.binaryZeroPad();\n const v4Bits = v4.binaryZeroPad();\n\n let bits: string;\n if (pl === 96) {\n bits = prefixBits.slice(0, 96) + v4Bits;\n } else {\n const beforeU = 64 - pl;\n bits = [\n prefixBits.slice(0, pl),\n v4Bits.slice(0, beforeU),\n // Bits 64 to 71 are the reserved u octet and are always zero.\n '00000000',\n v4Bits.slice(beforeU),\n '0'.repeat(128 - 72 - (32 - beforeU)),\n ].join('');\n }\n\n const hex = BigInt(`0b${bits}`).toString(16).padStart(32, '0');\n const groups: string[] = [];\n for (let i = 0; i < 8; i++) {\n groups.push(hex.slice(i * 4, (i + 1) * 4));\n }\n return new Address6(groups.join(':'));\n }\n\n /**\n * Extract the embedded IPv4 address from a NAT64 IPv6 address using the\n * encoding defined by [RFC 6052](https://datatracker.ietf.org/doc/html/rfc6052).\n * The default prefix is the well-known prefix `64:ff9b::/96`. Returns\n * `null` if this address is not contained within the given prefix.\n * @example\n * new Address6('64:ff9b::c000:221').toAddress4Nat64()!.correctForm(); // '192.0.2.33'\n */\n toAddress4Nat64(prefix: string = '64:ff9b::/96'): Address4 | null {\n const prefix6 = new Address6(prefix);\n const pl = prefix6.subnetMask;\n\n if (pl !== 32 && pl !== 40 && pl !== 48 && pl !== 56 && pl !== 64 && pl !== 96) {\n throw new AddressError('NAT64 prefix length must be 32, 40, 48, 56, 64, or 96');\n }\n\n if (!this.isHostInSubnet(prefix6)) {\n return null;\n }\n\n const bits = this.binaryZeroPad();\n let v4Bits: string;\n\n if (pl === 96) {\n v4Bits = bits.slice(96, 128);\n } else {\n const beforeU = 64 - pl;\n v4Bits = bits.slice(pl, pl + beforeU) + bits.slice(72, 72 + (32 - beforeU));\n }\n\n const octets: string[] = [];\n for (let i = 0; i < 4; i++) {\n octets.push(parseInt(v4Bits.slice(i * 8, (i + 1) * 8), 2).toString());\n }\n return new Address4(octets.join('.'));\n }\n\n /**\n * Return a byte array.\n *\n * To get a Node.js `Buffer`, wrap the result: `Buffer.from(address.toByteArray())`.\n * @returns {Array}\n */\n toByteArray(): number[] {\n const value = this.bigInt()\n .toString(16)\n .padStart(constants6.BITS / 4, '0');\n\n const bytes = [];\n for (let i = 0, length = value.length; i < length; i += 2) {\n bytes.push(parseInt(value.substring(i, i + 2), 16));\n }\n\n return bytes;\n }\n\n /**\n * Return an unsigned byte array.\n *\n * To get a Node.js `Buffer`, wrap the result: `Buffer.from(address.toUnsignedByteArray())`.\n * @returns {Array}\n */\n toUnsignedByteArray(): number[] {\n // toByteArray() emits 0 to 255, so unsigning it is an identity mapping and\n // the two methods return equal arrays. 11.0.0 keeps one of them and makes\n // this a deprecated alias; test/common-test.ts fails at that version.\n return this.toByteArray().map(unsignByte);\n }\n\n /**\n * Convert a byte array to an Address6 object.\n *\n * Accepts unsigned bytes (0 to 255) or signed bytes (-128 to 127, as an\n * `Int8Array` or a Java `byte[]` holds them), folding signed values to their\n * unsigned equivalent. Throws `AddressError` unless given exactly 16\n * integers from -128 to 255.\n *\n * To convert from a Node.js `Buffer`, spread it: `Address6.fromByteArray([...buf])`.\n * @returns {Address6}\n */\n static fromByteArray(bytes: Array<number>): Address6 {\n // Address4.fromByteArray takes unsigned bytes only. 11.0.0 aligns this\n // method with it, at which point the -128 floor here, unsignByte, and the\n // mapping below all go; test/common-test.ts fails at that version.\n common.assertByteArray(bytes, 16, 'IPv6', -128);\n\n return this.fromUnsignedByteArray(bytes.map(unsignByte));\n }\n\n /**\n * Convert an unsigned byte array to an Address6 object.\n *\n * Throws `AddressError` unless given exactly 16 integers from 0 to 255.\n *\n * To convert from a Node.js `Buffer`, spread it: `Address6.fromUnsignedByteArray([...buf])`.\n * @returns {Address6}\n */\n static fromUnsignedByteArray(bytes: Array<number>): Address6 {\n common.assertByteArray(bytes, 16, 'IPv6', 0);\n\n const BYTE_MAX = BigInt('256');\n let result = BigInt('0');\n let multiplier = BigInt('1');\n\n for (let i = bytes.length - 1; i >= 0; i--) {\n result += multiplier * BigInt(bytes[i].toString(10));\n\n multiplier *= BYTE_MAX;\n }\n\n return Address6.fromBigInt(result);\n }\n\n // #region Attributes\n /**\n * Returns true if the given address is in the subnet of the current address.\n * An `Address4` is never in the subnet of an `Address6`; convert with\n * `Address6.fromAddress4()` or `to4()` to compare across families.\n * @returns {boolean}\n */\n isInSubnet = common.isInSubnet;\n\n /**\n * Returns true if this address's host bits fall inside the given subnet,\n * ignoring this address's own subnet mask. Prefer this over `isInSubnet`\n * when classifying a single address, so the answer doesn't change with the\n * CIDR suffix the caller happened to write — notably when the address came\n * from untrusted input and the result backs a trust-boundary decision.\n * An `Address4` is never in the subnet of an `Address6`; convert with\n * `Address6.fromAddress4()` or `to4()` to compare across families.\n * @returns {boolean}\n */\n isHostInSubnet = common.isHostInSubnet;\n\n /**\n * Returns true if the address is correct, false otherwise\n * @returns {boolean}\n */\n isCorrect = isCorrect6;\n\n /**\n * Returns true if the address is in the canonical form, false otherwise\n * @returns {boolean}\n */\n isCanonical(): boolean {\n return this.addressMinusSuffix === this.canonicalForm();\n }\n\n /**\n * Returns true if the address is a link-local unicast address in `fe80::/10`\n * ([RFC 4291 §2.4](https://datatracker.ietf.org/doc/html/rfc4291#section-2.4))\n * or an IPv4-mapped / NAT64 address whose embedded IPv4 address is link-local\n * (`169.254.0.0/16`, e.g. `::ffff:169.254.169.254`), false otherwise.\n * @returns {boolean}\n */\n isLinkLocal(): boolean {\n const embedded = this.embeddedIPv4();\n if (embedded) {\n return embedded.isLinkLocal();\n }\n\n return this.isHostInSubnet(LINK_LOCAL_SUBNET);\n }\n\n /**\n * Returns true if the address is a multicast address, false otherwise\n * @returns {boolean}\n */\n isMulticast(): boolean {\n const embedded = this.embeddedIPv4();\n if (embedded) {\n return embedded.isMulticast();\n }\n\n const type = this.getType();\n return type === 'Multicast' || type.startsWith('Multicast ');\n }\n\n /**\n * Returns true if the address was written in v4-in-v6 dotted-quad notation\n * (e.g. `::ffff:127.0.0.1`), false otherwise. This is a notation-level flag\n * and does not reflect whether the address bits lie in the IPv4-mapped\n * (`::ffff:0:0/96`) subnet — for that, see {@link isMapped4}.\n * @returns {boolean}\n */\n is4(): boolean {\n return this.v4;\n }\n\n /**\n * Returns true if the address is an IPv4-mapped IPv6 address in\n * `::ffff:0:0/96` ([RFC 4291 §2.5.5.2](https://datatracker.ietf.org/doc/html/rfc4291#section-2.5.5.2)),\n * false otherwise. Unlike {@link is4}, this checks the underlying address\n * bits rather than the textual notation, so `::ffff:127.0.0.1` and\n * `::ffff:7f00:1` both return true.\n * @returns {boolean}\n */\n isMapped4(): boolean {\n return this.isHostInSubnet(IPV4_MAPPED_SUBNET);\n }\n\n /**\n * If this address embeds a routable IPv4 address — i.e. it is IPv4-mapped\n * (`::ffff:0:0/96`) or sits in the NAT64 well-known prefix (`64:ff9b::/96`,\n * [RFC 6052](https://datatracker.ietf.org/doc/html/rfc6052)) — return that\n * embedded address as an {@link Address4}; otherwise return null.\n *\n * The special-property checks (`isLoopback`, `isLinkLocal`, `isMulticast`,\n * `isUnspecified`, `isPrivate`, `isCGNAT`, `isBroadcast`) call this first and\n * delegate to the embedded {@link Address4} when present, so a literal such as\n * `::ffff:127.0.0.1` is classified by what it actually reaches (loopback)\n * rather than by its IPv6 wrapper (which `getType()` reports as IPv4-mapped).\n * This matters wherever the checks back a trust-boundary decision (e.g. an\n * SSRF allow/deny filter): without normalization, `::ffff:10.0.0.1`,\n * `::ffff:169.254.169.254`, `64:ff9b::7f00:1`, etc. would all read as\n * non-internal.\n * @returns {Address4 | null}\n */\n embeddedIPv4(): Address4 | null {\n if (this.isMapped4() || this.isHostInSubnet(NAT64_WELL_KNOWN_SUBNET)) {\n return this.to4();\n }\n\n return null;\n }\n\n /**\n * Returns true if the address is a Teredo address, false otherwise\n * @returns {boolean}\n */\n isTeredo(): boolean {\n return this.isHostInSubnet(TEREDO_SUBNET);\n }\n\n /**\n * Returns true if the address is a 6to4 address, false otherwise\n * @returns {boolean}\n */\n is6to4(): boolean {\n return this.isHostInSubnet(SIX_TO_FOUR_SUBNET);\n }\n\n /**\n * Returns true if the address is a loopback address, false otherwise\n * @returns {boolean}\n */\n isLoopback(): boolean {\n const embedded = this.embeddedIPv4();\n if (embedded) {\n return embedded.isLoopback();\n }\n\n return this.getType() === 'Loopback';\n }\n\n /**\n * Returns true if the address is a Unique Local Address in `fc00::/7` ([RFC 4193](https://datatracker.ietf.org/doc/html/rfc4193)). ULAs are the IPv6 equivalent of IPv4 [RFC 1918](https://datatracker.ietf.org/doc/html/rfc1918) private addresses.\n * @returns {boolean}\n */\n isULA(): boolean {\n return this.isHostInSubnet(ULA_SUBNET);\n }\n\n /**\n * Returns true if the address is private, i.e. a Unique Local Address in\n * `fc00::/7` ([RFC 4193](https://datatracker.ietf.org/doc/html/rfc4193)), an\n * address in the NAT64 local-use range `64:ff9b:1::/48`\n * ([RFC 8215](https://datatracker.ietf.org/doc/html/rfc8215)), or an\n * IPv4-mapped / NAT64 well-known address whose embedded IPv4 address is in\n * one of the [RFC 1918](https://datatracker.ietf.org/doc/html/rfc1918)\n * private ranges (e.g. `::ffff:10.0.0.1`). This is the IPv6 counterpart to\n * {@link Address4.isPrivate}; use it instead of {@link isULA} when you need to\n * catch mapped RFC 1918 addresses as well as native ULAs.\n *\n * The local-use NAT64 range is reported private as a whole rather than by\n * its embedded IPv4 address: an operator may carve a prefix of any RFC 6052\n * length out of `64:ff9b:1::/48`, so the same bits decode to different IPv4\n * addresses under different deployments and no single decoding is correct.\n * Use {@link toAddress4Nat64} with the deployment's prefix to decode one.\n * @returns {boolean}\n */\n isPrivate(): boolean {\n const embedded = this.embeddedIPv4();\n if (embedded) {\n return embedded.isPrivate();\n }\n\n return this.isULA() || this.isHostInSubnet(NAT64_LOCAL_USE_SUBNET);\n }\n\n /**\n * Returns true if the address is an IPv4-mapped / NAT64 address whose embedded\n * IPv4 address is in the carrier-grade NAT range `100.64.0.0/10`\n * ([RFC 6598](https://datatracker.ietf.org/doc/html/rfc6598)), false\n * otherwise. There is no native IPv6 CGNAT range, so this only ever returns\n * true for an embedded IPv4 address (e.g. `::ffff:100.64.0.1`).\n * @returns {boolean}\n */\n isCGNAT(): boolean {\n const embedded = this.embeddedIPv4();\n if (embedded) {\n return embedded.isCGNAT();\n }\n\n return false;\n }\n\n /**\n * Returns true if the address is an IPv4-mapped / NAT64 address whose embedded\n * IPv4 address is the limited broadcast address `255.255.255.255`\n * ([RFC 919](https://datatracker.ietf.org/doc/html/rfc919)), false otherwise.\n * There is no IPv6 broadcast, so this only ever returns true for an embedded\n * IPv4 address (e.g. `::ffff:255.255.255.255`).\n * @returns {boolean}\n */\n isBroadcast(): boolean {\n const embedded = this.embeddedIPv4();\n if (embedded) {\n return embedded.isBroadcast();\n }\n\n return false;\n }\n\n /**\n * Returns true if the address is the unspecified address `::`.\n * @returns {boolean}\n */\n isUnspecified(): boolean {\n const embedded = this.embeddedIPv4();\n if (embedded) {\n return embedded.isUnspecified();\n }\n\n return this.getType() === 'Unspecified';\n }\n\n /**\n * Returns true if the address is in the documentation prefix `2001:db8::/32` ([RFC 3849](https://datatracker.ietf.org/doc/html/rfc3849)).\n * @returns {boolean}\n */\n isDocumentation(): boolean {\n return DOCUMENTATION_SUBNETS.some((subnet) => this.isHostInSubnet(subnet));\n }\n\n /**\n * Returns true if the address is in the benchmarking range `2001:2::/48`\n * ([RFC 5180](https://datatracker.ietf.org/doc/html/rfc5180)) or is an\n * IPv4-mapped / NAT64 address whose embedded IPv4 address is in\n * `198.18.0.0/15`, false otherwise.\n * @returns {boolean}\n */\n isBenchmarking(): boolean {\n const embedded = this.embeddedIPv4();\n if (embedded) {\n return embedded.isBenchmarking();\n }\n\n return this.isHostInSubnet(BENCHMARKING_SUBNET);\n }\n\n /**\n * Returns true if the address is globally reachable: inside the global\n * unicast allocation `2000::/3` (the only range the [IANA IPv6 Address Space\n * Registry](https://www.iana.org/assignments/ipv6-address-space/) assigns\n * for global unicast; everything else is reserved, ULA, link-local, or\n * multicast) and not in any block the [IANA IPv6 Special-Purpose Address Registry](https://www.iana.org/assignments/iana-ipv6-special-registry/)\n * marks as not globally reachable. An IPv4-mapped or NAT64 well-known\n * address answers for its embedded IPv4 address, so `::ffff:10.0.0.1` and\n * `64:ff9b::7f00:1` are not global. Teredo (`2001::/32`) and 6to4\n * (`2002::/16`) are not global either: the registry lists them as N/A and a\n * packet to one needs a relay.\n *\n * This covers everything the individual classifiers name and the blocks they\n * do not: the discard-only prefix `100::/64`, the IETF protocol assignments\n * in `2001::/23`, the deprecated site-local `fec0::/10` and IPv4-compatible\n * `::/96` ranges, and unallocated space such as `4000::/3`. It is the single\n * predicate to use where a request must not reach an internal or\n * special-purpose destination; see SECURITY.md.\n * @returns {boolean}\n */\n isGlobal(): boolean {\n const embedded = this.embeddedIPv4();\n if (embedded) {\n return embedded.isGlobal();\n }\n\n return (\n this.isHostInSubnet(GLOBAL_UNICAST_SUBNET) &&\n common.isGloballyReachable.call(this, SPECIAL_PURPOSE_V6)\n );\n }\n // #endregion\n\n // #region HTML\n /**\n * Returns the address as an HTTP URL with the host bracketed, e.g.\n * `http://[2001:db8::1]/`. If `optionalPort` is provided it is appended,\n * e.g. `http://[2001:db8::1]:8080/`.\n */\n href(optionalPort?: number | string): string {\n if (optionalPort === undefined) {\n optionalPort = '';\n } else {\n optionalPort = `:${optionalPort}`;\n }\n\n return `http://[${this.correctForm()}]${optionalPort}/`;\n }\n\n /**\n * Returns an HTML `<a>` element whose `href` encodes the address in a URL\n * hash fragment (default prefix `/#address=`). Useful for linking between\n * pages of an address-inspector UI.\n * @param options.className - CSS class for the rendered `<a>` element\n * @param options.prefix - hash prefix prepended to the address (default `/#address=`)\n * @param options.v4 - when true, render the address in v4-in-v6 form\n */\n link(options?: { className?: string; prefix?: string; v4?: boolean }): string {\n if (!options) {\n options = {};\n }\n\n if (options.className === undefined) {\n options.className = '';\n }\n\n if (options.prefix === undefined) {\n options.prefix = '/#address=';\n }\n\n if (options.v4 === undefined) {\n options.v4 = false;\n }\n\n let formFunction = this.correctForm;\n\n if (options.v4) {\n formFunction = this.to4in6;\n }\n\n const form = formFunction.call(this);\n const safeHref = helpers.escapeHtml(`${options.prefix}${form}`);\n const safeForm = helpers.escapeHtml(form);\n\n if (options.className) {\n const safeClass = helpers.escapeHtml(options.className);\n\n return `<a href=\"${safeHref}\" class=\"${safeClass}\">${safeForm}</a>`;\n }\n\n return `<a href=\"${safeHref}\">${safeForm}</a>`;\n }\n\n /**\n * Groups an address.\n *\n * Returns an HTML fragment: each group is wrapped in a `<span>` carrying\n * the group classes an address-inspector UI hovers on. The address content\n * is HTML-escaped; anything you concatenate around it is your\n * responsibility.\n * @returns {String}\n */\n group(): string {\n if (this.elidedGroups === 0) {\n // The simple case\n return helpers.simpleGroup(this.addressMinusSuffix).join(':');\n }\n\n assert(typeof this.elidedGroups === 'number');\n assert(typeof this.elisionBegin === 'number');\n\n // The elided case\n const output = [];\n\n const [left, right] = this.addressMinusSuffix.split('::');\n\n if (left.length) {\n output.push(...helpers.simpleGroup(left));\n } else {\n output.push('');\n }\n\n const classes = ['hover-group'];\n\n for (let i = this.elisionBegin; i < this.elisionBegin + this.elidedGroups; i++) {\n classes.push(`group-${i}`);\n }\n\n output.push(`<span class=\"${classes.join(' ')}\"></span>`);\n\n if (right.length) {\n output.push(...helpers.simpleGroup(right, this.elisionEnd));\n } else {\n output.push('');\n }\n\n if (this.is4()) {\n assert(this.address4 instanceof Address4);\n\n output.pop();\n output.push(this.address4.groupForV6());\n }\n\n return output.join(':');\n }\n // #endregion\n\n // #region Regular expressions\n /**\n * Generate a regular expression string that can be used to find or validate\n * all variations of this address\n * @param {boolean} substringSearch\n * @returns {string}\n */\n regularExpressionString(this: Address6, substringSearch: boolean = false): string {\n let output: string[] = [];\n\n // TODO: revisit why this is necessary\n const address6 = new Address6(this.correctForm());\n\n if (address6.elidedGroups === 0) {\n // The simple case\n output.push(simpleRegularExpression(address6.parsedAddress));\n } else if (address6.elidedGroups === constants6.GROUPS) {\n // A completely elided address\n output.push(possibleElisions(constants6.GROUPS));\n } else {\n // A partially elided address\n const halves = address6.address.split('::');\n\n if (halves[0].length) {\n output.push(simpleRegularExpression(halves[0].split(':')));\n }\n\n assert(typeof address6.elidedGroups === 'number');\n\n output.push(\n possibleElisions(address6.elidedGroups, halves[0].length !== 0, halves[1].length !== 0),\n );\n\n if (halves[1].length) {\n output.push(simpleRegularExpression(halves[1].split(':')));\n }\n\n output = [output.join(':')];\n }\n\n if (!substringSearch) {\n output = [\n '(?=^|',\n ADDRESS_BOUNDARY,\n '|[^\\\\w\\\\:])(',\n ...output,\n ')(?=[^\\\\w\\\\:]|',\n ADDRESS_BOUNDARY,\n '|$)',\n ];\n }\n\n return output.join('');\n }\n\n /**\n * Generate a regular expression that can be used to find or validate all\n * variations of this address.\n * @param {boolean} substringSearch\n * @returns {RegExp}\n */\n regularExpression(this: Address6, substringSearch: boolean = false): RegExp {\n return new RegExp(this.regularExpressionString(substringSearch), 'i');\n }\n // #endregion\n}\n\nconst TYPE_SUBNETS: Array<[Address6, string]> = Object.keys(constants6.TYPES).map((subnet) => [\n new Address6(subnet),\n constants6.TYPES[subnet] as string,\n]);\nconst TEREDO_SUBNET = new Address6('2001::/32');\nconst SIX_TO_FOUR_SUBNET = new Address6('2002::/16');\nconst ULA_SUBNET = new Address6('fc00::/7');\nconst LINK_LOCAL_SUBNET = new Address6('fe80::/10');\nconst DOCUMENTATION_SUBNETS = [new Address6('2001:db8::/32'), new Address6('3fff::/20')];\nconst BENCHMARKING_SUBNET = new Address6('2001:2::/48');\nconst GLOBAL_UNICAST_SUBNET = new Address6('2000::/3');\nconst SPECIAL_PURPOSE_V6 = constants6.SPECIAL_PURPOSE.map(([cidr, , reachable]) => ({\n subnet: new Address6(cidr),\n reachable,\n}));\nconst IPV4_MAPPED_SUBNET = new Address6('::ffff:0:0/96');\nconst NAT64_WELL_KNOWN_SUBNET = new Address6('64:ff9b::/96');\nconst NAT64_LOCAL_USE_SUBNET = new Address6('64:ff9b:1::/48');\n","export { Address4 } from './ipv4';\nexport { Address6 } from './ipv6';\nexport { AddressError } from './address-error';\n\nimport * as helpers from './v6/helpers';\n\nexport const v6 = { helpers };\n",null,null,null,null,null,"'use strict';\n\nconst ALIAS = Symbol.for('yaml.alias');\nconst DOC = Symbol.for('yaml.document');\nconst MAP = Symbol.for('yaml.map');\nconst PAIR = Symbol.for('yaml.pair');\nconst SCALAR = Symbol.for('yaml.scalar');\nconst SEQ = Symbol.for('yaml.seq');\nconst NODE_TYPE = Symbol.for('yaml.node.type');\nconst isAlias = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === ALIAS;\nconst isDocument = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === DOC;\nconst isMap = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === MAP;\nconst isPair = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === PAIR;\nconst isScalar = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === SCALAR;\nconst isSeq = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === SEQ;\nfunction isCollection(node) {\n if (node && typeof node === 'object')\n switch (node[NODE_TYPE]) {\n case MAP:\n case SEQ:\n return true;\n }\n return false;\n}\nfunction isNode(node) {\n if (node && typeof node === 'object')\n switch (node[NODE_TYPE]) {\n case ALIAS:\n case MAP:\n case SCALAR:\n case SEQ:\n return true;\n }\n return false;\n}\nconst hasAnchor = (node) => (isScalar(node) || isCollection(node)) && !!node.anchor;\n\nexports.ALIAS = ALIAS;\nexports.DOC = DOC;\nexports.MAP = MAP;\nexports.NODE_TYPE = NODE_TYPE;\nexports.PAIR = PAIR;\nexports.SCALAR = SCALAR;\nexports.SEQ = SEQ;\nexports.hasAnchor = hasAnchor;\nexports.isAlias = isAlias;\nexports.isCollection = isCollection;\nexports.isDocument = isDocument;\nexports.isMap = isMap;\nexports.isNode = isNode;\nexports.isPair = isPair;\nexports.isScalar = isScalar;\nexports.isSeq = isSeq;\n","'use strict';\n\nvar identity = require('./nodes/identity.js');\n\nconst BREAK = Symbol('break visit');\nconst SKIP = Symbol('skip children');\nconst REMOVE = Symbol('remove node');\n/**\n * Apply a visitor to an AST node or document.\n *\n * Walks through the tree (depth-first) starting from `node`, calling a\n * `visitor` function with three arguments:\n * - `key`: For sequence values and map `Pair`, the node's index in the\n * collection. Within a `Pair`, `'key'` or `'value'`, correspondingly.\n * `null` for the root node.\n * - `node`: The current node.\n * - `path`: The ancestry of the current node.\n *\n * The return value of the visitor may be used to control the traversal:\n * - `undefined` (default): Do nothing and continue\n * - `visit.SKIP`: Do not visit the children of this node, continue with next\n * sibling\n * - `visit.BREAK`: Terminate traversal completely\n * - `visit.REMOVE`: Remove the current node, then continue with the next one\n * - `Node`: Replace the current node, then continue by visiting it\n * - `number`: While iterating the items of a sequence or map, set the index\n * of the next step. This is useful especially if the index of the current\n * node has changed.\n *\n * If `visitor` is a single function, it will be called with all values\n * encountered in the tree, including e.g. `null` values. Alternatively,\n * separate visitor functions may be defined for each `Map`, `Pair`, `Seq`,\n * `Alias` and `Scalar` node. To define the same visitor function for more than\n * one node type, use the `Collection` (map and seq), `Value` (map, seq & scalar)\n * and `Node` (alias, map, seq & scalar) targets. Of all these, only the most\n * specific defined one will be used for each node.\n */\nfunction visit(node, visitor) {\n const visitor_ = initVisitor(visitor);\n if (identity.isDocument(node)) {\n const cd = visit_(null, node.contents, visitor_, Object.freeze([node]));\n if (cd === REMOVE)\n node.contents = null;\n }\n else\n visit_(null, node, visitor_, Object.freeze([]));\n}\n// Without the `as symbol` casts, TS declares these in the `visit`\n// namespace using `var`, but then complains about that because\n// `unique symbol` must be `const`.\n/** Terminate visit traversal completely */\nvisit.BREAK = BREAK;\n/** Do not visit the children of the current node */\nvisit.SKIP = SKIP;\n/** Remove the current node */\nvisit.REMOVE = REMOVE;\nfunction visit_(key, node, visitor, path) {\n const ctrl = callVisitor(key, node, visitor, path);\n if (identity.isNode(ctrl) || identity.isPair(ctrl)) {\n replaceNode(key, path, ctrl);\n return visit_(key, ctrl, visitor, path);\n }\n if (typeof ctrl !== 'symbol') {\n if (identity.isCollection(node)) {\n path = Object.freeze(path.concat(node));\n for (let i = 0; i < node.items.length; ++i) {\n const ci = visit_(i, node.items[i], visitor, path);\n if (typeof ci === 'number')\n i = ci - 1;\n else if (ci === BREAK)\n return BREAK;\n else if (ci === REMOVE) {\n node.items.splice(i, 1);\n i -= 1;\n }\n }\n }\n else if (identity.isPair(node)) {\n path = Object.freeze(path.concat(node));\n const ck = visit_('key', node.key, visitor, path);\n if (ck === BREAK)\n return BREAK;\n else if (ck === REMOVE)\n node.key = null;\n const cv = visit_('value', node.value, visitor, path);\n if (cv === BREAK)\n return BREAK;\n else if (cv === REMOVE)\n node.value = null;\n }\n }\n return ctrl;\n}\n/**\n * Apply an async visitor to an AST node or document.\n *\n * Walks through the tree (depth-first) starting from `node`, calling a\n * `visitor` function with three arguments:\n * - `key`: For sequence values and map `Pair`, the node's index in the\n * collection. Within a `Pair`, `'key'` or `'value'`, correspondingly.\n * `null` for the root node.\n * - `node`: The current node.\n * - `path`: The ancestry of the current node.\n *\n * The return value of the visitor may be used to control the traversal:\n * - `Promise`: Must resolve to one of the following values\n * - `undefined` (default): Do nothing and continue\n * - `visit.SKIP`: Do not visit the children of this node, continue with next\n * sibling\n * - `visit.BREAK`: Terminate traversal completely\n * - `visit.REMOVE`: Remove the current node, then continue with the next one\n * - `Node`: Replace the current node, then continue by visiting it\n * - `number`: While iterating the items of a sequence or map, set the index\n * of the next step. This is useful especially if the index of the current\n * node has changed.\n *\n * If `visitor` is a single function, it will be called with all values\n * encountered in the tree, including e.g. `null` values. Alternatively,\n * separate visitor functions may be defined for each `Map`, `Pair`, `Seq`,\n * `Alias` and `Scalar` node. To define the same visitor function for more than\n * one node type, use the `Collection` (map and seq), `Value` (map, seq & scalar)\n * and `Node` (alias, map, seq & scalar) targets. Of all these, only the most\n * specific defined one will be used for each node.\n */\nasync function visitAsync(node, visitor) {\n const visitor_ = initVisitor(visitor);\n if (identity.isDocument(node)) {\n const cd = await visitAsync_(null, node.contents, visitor_, Object.freeze([node]));\n if (cd === REMOVE)\n node.contents = null;\n }\n else\n await visitAsync_(null, node, visitor_, Object.freeze([]));\n}\n// Without the `as symbol` casts, TS declares these in the `visit`\n// namespace using `var`, but then complains about that because\n// `unique symbol` must be `const`.\n/** Terminate visit traversal completely */\nvisitAsync.BREAK = BREAK;\n/** Do not visit the children of the current node */\nvisitAsync.SKIP = SKIP;\n/** Remove the current node */\nvisitAsync.REMOVE = REMOVE;\nasync function visitAsync_(key, node, visitor, path) {\n const ctrl = await callVisitor(key, node, visitor, path);\n if (identity.isNode(ctrl) || identity.isPair(ctrl)) {\n replaceNode(key, path, ctrl);\n return visitAsync_(key, ctrl, visitor, path);\n }\n if (typeof ctrl !== 'symbol') {\n if (identity.isCollection(node)) {\n path = Object.freeze(path.concat(node));\n for (let i = 0; i < node.items.length; ++i) {\n const ci = await visitAsync_(i, node.items[i], visitor, path);\n if (typeof ci === 'number')\n i = ci - 1;\n else if (ci === BREAK)\n return BREAK;\n else if (ci === REMOVE) {\n node.items.splice(i, 1);\n i -= 1;\n }\n }\n }\n else if (identity.isPair(node)) {\n path = Object.freeze(path.concat(node));\n const ck = await visitAsync_('key', node.key, visitor, path);\n if (ck === BREAK)\n return BREAK;\n else if (ck === REMOVE)\n node.key = null;\n const cv = await visitAsync_('value', node.value, visitor, path);\n if (cv === BREAK)\n return BREAK;\n else if (cv === REMOVE)\n node.value = null;\n }\n }\n return ctrl;\n}\nfunction initVisitor(visitor) {\n if (typeof visitor === 'object' &&\n (visitor.Collection || visitor.Node || visitor.Value)) {\n return Object.assign({\n Alias: visitor.Node,\n Map: visitor.Node,\n Scalar: visitor.Node,\n Seq: visitor.Node\n }, visitor.Value && {\n Map: visitor.Value,\n Scalar: visitor.Value,\n Seq: visitor.Value\n }, visitor.Collection && {\n Map: visitor.Collection,\n Seq: visitor.Collection\n }, visitor);\n }\n return visitor;\n}\nfunction callVisitor(key, node, visitor, path) {\n if (typeof visitor === 'function')\n return visitor(key, node, path);\n if (identity.isMap(node))\n return visitor.Map?.(key, node, path);\n if (identity.isSeq(node))\n return visitor.Seq?.(key, node, path);\n if (identity.isPair(node))\n return visitor.Pair?.(key, node, path);\n if (identity.isScalar(node))\n return visitor.Scalar?.(key, node, path);\n if (identity.isAlias(node))\n return visitor.Alias?.(key, node, path);\n return undefined;\n}\nfunction replaceNode(key, path, node) {\n const parent = path[path.length - 1];\n if (identity.isCollection(parent)) {\n parent.items[key] = node;\n }\n else if (identity.isPair(parent)) {\n if (key === 'key')\n parent.key = node;\n else\n parent.value = node;\n }\n else if (identity.isDocument(parent)) {\n parent.contents = node;\n }\n else {\n const pt = identity.isAlias(parent) ? 'alias' : 'scalar';\n throw new Error(`Cannot replace node with ${pt} parent`);\n }\n}\n\nexports.visit = visit;\nexports.visitAsync = visitAsync;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar visit = require('../visit.js');\n\nconst escapeChars = {\n '!': '%21',\n ',': '%2C',\n '[': '%5B',\n ']': '%5D',\n '{': '%7B',\n '}': '%7D'\n};\nconst escapeTagName = (tn) => tn.replace(/[!,[\\]{}]/g, ch => escapeChars[ch]);\nclass Directives {\n constructor(yaml, tags) {\n /**\n * The directives-end/doc-start marker `---`. If `null`, a marker may still be\n * included in the document's stringified representation.\n */\n this.docStart = null;\n /** The doc-end marker `...`. */\n this.docEnd = false;\n this.yaml = Object.assign({}, Directives.defaultYaml, yaml);\n this.tags = Object.assign({}, Directives.defaultTags, tags);\n }\n clone() {\n const copy = new Directives(this.yaml, this.tags);\n copy.docStart = this.docStart;\n return copy;\n }\n /**\n * During parsing, get a Directives instance for the current document and\n * update the stream state according to the current version's spec.\n */\n atDocument() {\n const res = new Directives(this.yaml, this.tags);\n switch (this.yaml.version) {\n case '1.1':\n this.atNextDocument = true;\n break;\n case '1.2':\n this.atNextDocument = false;\n this.yaml = {\n explicit: Directives.defaultYaml.explicit,\n version: '1.2'\n };\n this.tags = Object.assign({}, Directives.defaultTags);\n break;\n }\n return res;\n }\n /**\n * @param onError - May be called even if the action was successful\n * @returns `true` on success\n */\n add(line, onError) {\n if (this.atNextDocument) {\n this.yaml = { explicit: Directives.defaultYaml.explicit, version: '1.1' };\n this.tags = Object.assign({}, Directives.defaultTags);\n this.atNextDocument = false;\n }\n const parts = line.trim().split(/[ \\t]+/);\n const name = parts.shift();\n switch (name) {\n case '%TAG': {\n if (parts.length !== 2) {\n onError(0, '%TAG directive should contain exactly two parts');\n if (parts.length < 2)\n return false;\n }\n const [handle, prefix] = parts;\n this.tags[handle] = prefix;\n return true;\n }\n case '%YAML': {\n this.yaml.explicit = true;\n if (parts.length !== 1) {\n onError(0, '%YAML directive should contain exactly one part');\n return false;\n }\n const [version] = parts;\n if (version === '1.1' || version === '1.2') {\n this.yaml.version = version;\n return true;\n }\n else {\n const isValid = /^\\d+\\.\\d+$/.test(version);\n onError(6, `Unsupported YAML version ${version}`, isValid);\n return false;\n }\n }\n default:\n onError(0, `Unknown directive ${name}`, true);\n return false;\n }\n }\n /**\n * Resolves a tag, matching handles to those defined in %TAG directives.\n *\n * @returns Resolved tag, which may also be the non-specific tag `'!'` or a\n * `'!local'` tag, or `null` if unresolvable.\n */\n tagName(source, onError) {\n if (source === '!')\n return '!'; // non-specific tag\n if (source[0] !== '!') {\n onError(`Not a valid tag: ${source}`);\n return null;\n }\n if (source[1] === '<') {\n const verbatim = source.slice(2, -1);\n if (verbatim === '!' || verbatim === '!!') {\n onError(`Verbatim tags aren't resolved, so ${source} is invalid.`);\n return null;\n }\n if (source[source.length - 1] !== '>')\n onError('Verbatim tags must end with a >');\n return verbatim;\n }\n const [, handle, suffix] = source.match(/^(.*!)([^!]*)$/s);\n if (!suffix)\n onError(`The ${source} tag has no suffix`);\n const prefix = this.tags[handle];\n if (prefix) {\n try {\n return prefix + decodeURIComponent(suffix);\n }\n catch (error) {\n onError(String(error));\n return null;\n }\n }\n if (handle === '!')\n return source; // local tag\n onError(`Could not resolve tag: ${source}`);\n return null;\n }\n /**\n * Given a fully resolved tag, returns its printable string form,\n * taking into account current tag prefixes and defaults.\n */\n tagString(tag) {\n for (const [handle, prefix] of Object.entries(this.tags)) {\n if (tag.startsWith(prefix))\n return handle + escapeTagName(tag.substring(prefix.length));\n }\n return tag[0] === '!' ? tag : `!<${tag}>`;\n }\n toString(doc) {\n const lines = this.yaml.explicit\n ? [`%YAML ${this.yaml.version || '1.2'}`]\n : [];\n const tagEntries = Object.entries(this.tags);\n let tagNames;\n if (doc && tagEntries.length > 0 && identity.isNode(doc.contents)) {\n const tags = {};\n visit.visit(doc.contents, (_key, node) => {\n if (identity.isNode(node) && node.tag)\n tags[node.tag] = true;\n });\n tagNames = Object.keys(tags);\n }\n else\n tagNames = [];\n for (const [handle, prefix] of tagEntries) {\n if (handle === '!!' && prefix === 'tag:yaml.org,2002:')\n continue;\n if (!doc || tagNames.some(tn => tn.startsWith(prefix)))\n lines.push(`%TAG ${handle} ${prefix}`);\n }\n return lines.join('\\n');\n }\n}\nDirectives.defaultYaml = { explicit: false, version: '1.2' };\nDirectives.defaultTags = { '!!': 'tag:yaml.org,2002:' };\n\nexports.Directives = Directives;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar visit = require('../visit.js');\n\n/**\n * Verify that the input string is a valid anchor.\n *\n * Will throw on errors.\n */\nfunction anchorIsValid(anchor) {\n if (/[\\x00-\\x19\\s,[\\]{}]/.test(anchor)) {\n const sa = JSON.stringify(anchor);\n const msg = `Anchor must not contain whitespace or control characters: ${sa}`;\n throw new Error(msg);\n }\n return true;\n}\nfunction anchorNames(root) {\n const anchors = new Set();\n visit.visit(root, {\n Value(_key, node) {\n if (node.anchor)\n anchors.add(node.anchor);\n }\n });\n return anchors;\n}\n/** Find a new anchor name with the given `prefix` and a one-indexed suffix. */\nfunction findNewAnchor(prefix, exclude) {\n for (let i = 1; true; ++i) {\n const name = `${prefix}${i}`;\n if (!exclude.has(name))\n return name;\n }\n}\nfunction createNodeAnchors(doc, prefix) {\n const aliasObjects = [];\n const sourceObjects = new Map();\n let prevAnchors = null;\n return {\n onAnchor: (source) => {\n aliasObjects.push(source);\n prevAnchors ?? (prevAnchors = anchorNames(doc));\n const anchor = findNewAnchor(prefix, prevAnchors);\n prevAnchors.add(anchor);\n return anchor;\n },\n /**\n * With circular references, the source node is only resolved after all\n * of its child nodes are. This is why anchors are set only after all of\n * the nodes have been created.\n */\n setAnchors: () => {\n for (const source of aliasObjects) {\n const ref = sourceObjects.get(source);\n if (typeof ref === 'object' &&\n ref.anchor &&\n (identity.isScalar(ref.node) || identity.isCollection(ref.node))) {\n ref.node.anchor = ref.anchor;\n }\n else {\n const error = new Error('Failed to resolve repeated object (this should not happen)');\n error.source = source;\n throw error;\n }\n }\n },\n sourceObjects\n };\n}\n\nexports.anchorIsValid = anchorIsValid;\nexports.anchorNames = anchorNames;\nexports.createNodeAnchors = createNodeAnchors;\nexports.findNewAnchor = findNewAnchor;\n","'use strict';\n\n/**\n * Applies the JSON.parse reviver algorithm as defined in the ECMA-262 spec,\n * in section 24.5.1.1 \"Runtime Semantics: InternalizeJSONProperty\" of the\n * 2021 edition: https://tc39.es/ecma262/#sec-json.parse\n *\n * Includes extensions for handling Map and Set objects.\n */\nfunction applyReviver(reviver, obj, key, val) {\n if (val && typeof val === 'object') {\n if (Array.isArray(val)) {\n for (let i = 0, len = val.length; i < len; ++i) {\n const v0 = val[i];\n const v1 = applyReviver(reviver, val, String(i), v0);\n // eslint-disable-next-line @typescript-eslint/no-array-delete\n if (v1 === undefined)\n delete val[i];\n else if (v1 !== v0)\n val[i] = v1;\n }\n }\n else if (val instanceof Map) {\n for (const k of Array.from(val.keys())) {\n const v0 = val.get(k);\n const v1 = applyReviver(reviver, val, k, v0);\n if (v1 === undefined)\n val.delete(k);\n else if (v1 !== v0)\n val.set(k, v1);\n }\n }\n else if (val instanceof Set) {\n for (const v0 of Array.from(val)) {\n const v1 = applyReviver(reviver, val, v0, v0);\n if (v1 === undefined)\n val.delete(v0);\n else if (v1 !== v0) {\n val.delete(v0);\n val.add(v1);\n }\n }\n }\n else {\n for (const [k, v0] of Object.entries(val)) {\n const v1 = applyReviver(reviver, val, k, v0);\n if (v1 === undefined)\n delete val[k];\n else if (v1 !== v0)\n val[k] = v1;\n }\n }\n }\n return reviver.call(obj, key, val);\n}\n\nexports.applyReviver = applyReviver;\n","'use strict';\n\nvar identity = require('./identity.js');\n\n/**\n * Recursively convert any node or its contents to native JavaScript\n *\n * @param value - The input value\n * @param arg - If `value` defines a `toJSON()` method, use this\n * as its first argument\n * @param ctx - Conversion context, originally set in Document#toJS(). If\n * `{ keep: true }` is not set, output should be suitable for JSON\n * stringification.\n */\nfunction toJS(value, arg, ctx) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n if (Array.isArray(value))\n return value.map((v, i) => toJS(v, String(i), ctx));\n if (value && typeof value.toJSON === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n if (!ctx || !identity.hasAnchor(value))\n return value.toJSON(arg, ctx);\n const data = { aliasCount: 0, count: 1, res: undefined };\n ctx.anchors.set(value, data);\n ctx.onCreate = res => {\n data.res = res;\n delete ctx.onCreate;\n };\n const res = value.toJSON(arg, ctx);\n if (ctx.onCreate)\n ctx.onCreate(res);\n return res;\n }\n if (typeof value === 'bigint' && !ctx?.keep)\n return Number(value);\n return value;\n}\n\nexports.toJS = toJS;\n","'use strict';\n\nvar applyReviver = require('../doc/applyReviver.js');\nvar identity = require('./identity.js');\nvar toJS = require('./toJS.js');\n\nclass NodeBase {\n constructor(type) {\n Object.defineProperty(this, identity.NODE_TYPE, { value: type });\n }\n /** Create a copy of this node. */\n clone() {\n const copy = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this));\n if (this.range)\n copy.range = this.range.slice();\n return copy;\n }\n /** A plain JavaScript representation of this node. */\n toJS(doc, { mapAsMap, maxAliasCount, onAnchor, reviver } = {}) {\n if (!identity.isDocument(doc))\n throw new TypeError('A document argument is required');\n const ctx = {\n anchors: new Map(),\n doc,\n keep: true,\n mapAsMap: mapAsMap === true,\n mapKeyWarned: false,\n maxAliasCount: typeof maxAliasCount === 'number' ? maxAliasCount : 100\n };\n const res = toJS.toJS(this, '', ctx);\n if (typeof onAnchor === 'function')\n for (const { count, res } of ctx.anchors.values())\n onAnchor(res, count);\n return typeof reviver === 'function'\n ? applyReviver.applyReviver(reviver, { '': res }, '', res)\n : res;\n }\n}\n\nexports.NodeBase = NodeBase;\n","'use strict';\n\nvar anchors = require('../doc/anchors.js');\nvar visit = require('../visit.js');\nvar identity = require('./identity.js');\nvar Node = require('./Node.js');\nvar toJS = require('./toJS.js');\n\nclass Alias extends Node.NodeBase {\n constructor(source) {\n super(identity.ALIAS);\n this.source = source;\n Object.defineProperty(this, 'tag', {\n set() {\n throw new Error('Alias nodes cannot have tags');\n }\n });\n }\n /**\n * Resolve the value of this alias within `doc`, finding the last\n * instance of the `source` anchor before this node.\n */\n resolve(doc, ctx) {\n if (ctx?.maxAliasCount === 0)\n throw new ReferenceError('Alias resolution is disabled');\n let nodes;\n if (ctx?.aliasResolveCache) {\n nodes = ctx.aliasResolveCache;\n }\n else {\n nodes = [];\n visit.visit(doc, {\n Node: (_key, node) => {\n if (identity.isAlias(node) || identity.hasAnchor(node))\n nodes.push(node);\n }\n });\n if (ctx)\n ctx.aliasResolveCache = nodes;\n }\n let found = undefined;\n for (const node of nodes) {\n if (node === this)\n break;\n if (node.anchor === this.source)\n found = node;\n }\n if (found && ctx) {\n const { anchors, doc, maxAliasCount } = ctx;\n let data = anchors.get(found);\n if (!data) {\n // Resolve anchors for Node.prototype.toJS()\n toJS.toJS(found, null, ctx);\n data = anchors.get(found);\n }\n /* istanbul ignore if */\n if (data?.res === undefined) {\n const msg = 'This should not happen: Alias anchor was not resolved?';\n throw new ReferenceError(msg);\n }\n if (maxAliasCount >= 0) {\n data.count += 1;\n if (data.aliasCount === 0)\n data.aliasCount = getAliasCount(doc, found, anchors);\n if (data.count * data.aliasCount > maxAliasCount) {\n const msg = 'Excessive alias count indicates a resource exhaustion attack';\n throw new ReferenceError(msg);\n }\n }\n }\n return found;\n }\n toJSON(_arg, ctx) {\n if (!ctx)\n return { source: this.source };\n const source = this.resolve(ctx.doc, ctx);\n if (!source) {\n const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`;\n throw new ReferenceError(msg);\n }\n return ctx.anchors.get(source).res;\n }\n toString(ctx, _onComment, _onChompKeep) {\n const src = `*${this.source}`;\n if (ctx) {\n anchors.anchorIsValid(this.source);\n if (ctx.options.verifyAliasOrder && !ctx.anchors.has(this.source)) {\n const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`;\n throw new Error(msg);\n }\n if (ctx.implicitKey)\n return `${src} `;\n }\n return src;\n }\n}\nfunction getAliasCount(doc, node, anchors) {\n if (identity.isAlias(node)) {\n const source = node.resolve(doc);\n const anchor = anchors && source && anchors.get(source);\n return anchor ? anchor.count * anchor.aliasCount : 0;\n }\n else if (identity.isCollection(node)) {\n let count = 0;\n for (const item of node.items) {\n const c = getAliasCount(doc, item, anchors);\n if (c > count)\n count = c;\n }\n return count;\n }\n else if (identity.isPair(node)) {\n const kc = getAliasCount(doc, node.key, anchors);\n const vc = getAliasCount(doc, node.value, anchors);\n return Math.max(kc, vc);\n }\n return 1;\n}\n\nexports.Alias = Alias;\n","'use strict';\n\nvar identity = require('./identity.js');\nvar Node = require('./Node.js');\nvar toJS = require('./toJS.js');\n\nconst isScalarValue = (value) => !value || (typeof value !== 'function' && typeof value !== 'object');\nclass Scalar extends Node.NodeBase {\n constructor(value) {\n super(identity.SCALAR);\n this.value = value;\n }\n toJSON(arg, ctx) {\n return ctx?.keep ? this.value : toJS.toJS(this.value, arg, ctx);\n }\n toString() {\n return String(this.value);\n }\n}\nScalar.BLOCK_FOLDED = 'BLOCK_FOLDED';\nScalar.BLOCK_LITERAL = 'BLOCK_LITERAL';\nScalar.PLAIN = 'PLAIN';\nScalar.QUOTE_DOUBLE = 'QUOTE_DOUBLE';\nScalar.QUOTE_SINGLE = 'QUOTE_SINGLE';\n\nexports.Scalar = Scalar;\nexports.isScalarValue = isScalarValue;\n","'use strict';\n\nvar Alias = require('../nodes/Alias.js');\nvar identity = require('../nodes/identity.js');\nvar Scalar = require('../nodes/Scalar.js');\n\nconst defaultTagPrefix = 'tag:yaml.org,2002:';\nfunction findTagObject(value, tagName, tags) {\n if (tagName) {\n const match = tags.filter(t => t.tag === tagName);\n const tagObj = match.find(t => !t.format) ?? match[0];\n if (!tagObj)\n throw new Error(`Tag ${tagName} not found`);\n return tagObj;\n }\n return tags.find(t => t.identify?.(value) && !t.format);\n}\nfunction createNode(value, tagName, ctx) {\n if (identity.isDocument(value))\n value = value.contents;\n if (identity.isNode(value))\n return value;\n if (identity.isPair(value)) {\n const map = ctx.schema[identity.MAP].createNode?.(ctx.schema, null, ctx);\n map.items.push(value);\n return map;\n }\n if (value instanceof String ||\n value instanceof Number ||\n value instanceof Boolean ||\n (typeof BigInt !== 'undefined' && value instanceof BigInt) // not supported everywhere\n ) {\n // https://tc39.es/ecma262/#sec-serializejsonproperty\n value = value.valueOf();\n }\n const { aliasDuplicateObjects, onAnchor, onTagObj, schema, sourceObjects } = ctx;\n // Detect duplicate references to the same object & use Alias nodes for all\n // after first. The `ref` wrapper allows for circular references to resolve.\n let ref = undefined;\n if (aliasDuplicateObjects && value && typeof value === 'object') {\n ref = sourceObjects.get(value);\n if (ref) {\n ref.anchor ?? (ref.anchor = onAnchor(value));\n return new Alias.Alias(ref.anchor);\n }\n else {\n ref = { anchor: null, node: null };\n sourceObjects.set(value, ref);\n }\n }\n if (tagName?.startsWith('!!'))\n tagName = defaultTagPrefix + tagName.slice(2);\n let tagObj = findTagObject(value, tagName, schema.tags);\n if (!tagObj) {\n if (value && typeof value.toJSON === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n value = value.toJSON();\n }\n if (!value || typeof value !== 'object') {\n const node = new Scalar.Scalar(value);\n if (ref)\n ref.node = node;\n return node;\n }\n tagObj =\n value instanceof Map\n ? schema[identity.MAP]\n : Symbol.iterator in Object(value)\n ? schema[identity.SEQ]\n : schema[identity.MAP];\n }\n if (onTagObj) {\n onTagObj(tagObj);\n delete ctx.onTagObj;\n }\n const node = tagObj?.createNode\n ? tagObj.createNode(ctx.schema, value, ctx)\n : typeof tagObj?.nodeClass?.from === 'function'\n ? tagObj.nodeClass.from(ctx.schema, value, ctx)\n : new Scalar.Scalar(value);\n if (tagName)\n node.tag = tagName;\n else if (!tagObj.default)\n node.tag = tagObj.tag;\n if (ref)\n ref.node = node;\n return node;\n}\n\nexports.createNode = createNode;\n","'use strict';\n\nvar createNode = require('../doc/createNode.js');\nvar identity = require('./identity.js');\nvar Node = require('./Node.js');\n\nfunction collectionFromPath(schema, path, value) {\n let v = value;\n for (let i = path.length - 1; i >= 0; --i) {\n const k = path[i];\n if (typeof k === 'number' && Number.isInteger(k) && k >= 0) {\n const a = [];\n a[k] = v;\n v = a;\n }\n else {\n v = new Map([[k, v]]);\n }\n }\n return createNode.createNode(v, undefined, {\n aliasDuplicateObjects: false,\n keepUndefined: false,\n onAnchor: () => {\n throw new Error('This should not happen, please report a bug.');\n },\n schema,\n sourceObjects: new Map()\n });\n}\n// Type guard is intentionally a little wrong so as to be more useful,\n// as it does not cover untypable empty non-string iterables (e.g. []).\nconst isEmptyPath = (path) => path == null ||\n (typeof path === 'object' && !!path[Symbol.iterator]().next().done);\nclass Collection extends Node.NodeBase {\n constructor(type, schema) {\n super(type);\n Object.defineProperty(this, 'schema', {\n value: schema,\n configurable: true,\n enumerable: false,\n writable: true\n });\n }\n /**\n * Create a copy of this collection.\n *\n * @param schema - If defined, overwrites the original's schema\n */\n clone(schema) {\n const copy = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this));\n if (schema)\n copy.schema = schema;\n copy.items = copy.items.map(it => identity.isNode(it) || identity.isPair(it) ? it.clone(schema) : it);\n if (this.range)\n copy.range = this.range.slice();\n return copy;\n }\n /**\n * Adds a value to the collection. For `!!map` and `!!omap` the value must\n * be a Pair instance or a `{ key, value }` object, which may not have a key\n * that already exists in the map.\n */\n addIn(path, value) {\n if (isEmptyPath(path))\n this.add(value);\n else {\n const [key, ...rest] = path;\n const node = this.get(key, true);\n if (identity.isCollection(node))\n node.addIn(rest, value);\n else if (node === undefined && this.schema)\n this.set(key, collectionFromPath(this.schema, rest, value));\n else\n throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`);\n }\n }\n /**\n * Removes a value from the collection.\n * @returns `true` if the item was found and removed.\n */\n deleteIn(path) {\n const [key, ...rest] = path;\n if (rest.length === 0)\n return this.delete(key);\n const node = this.get(key, true);\n if (identity.isCollection(node))\n return node.deleteIn(rest);\n else\n throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`);\n }\n /**\n * Returns item at `key`, or `undefined` if not found. By default unwraps\n * scalar values from their surrounding node; to disable set `keepScalar` to\n * `true` (collections are always returned intact).\n */\n getIn(path, keepScalar) {\n const [key, ...rest] = path;\n const node = this.get(key, true);\n if (rest.length === 0)\n return !keepScalar && identity.isScalar(node) ? node.value : node;\n else\n return identity.isCollection(node) ? node.getIn(rest, keepScalar) : undefined;\n }\n hasAllNullValues(allowScalar) {\n return this.items.every(node => {\n if (!identity.isPair(node))\n return false;\n const n = node.value;\n return (n == null ||\n (allowScalar &&\n identity.isScalar(n) &&\n n.value == null &&\n !n.commentBefore &&\n !n.comment &&\n !n.tag));\n });\n }\n /**\n * Checks if the collection includes a value with the key `key`.\n */\n hasIn(path) {\n const [key, ...rest] = path;\n if (rest.length === 0)\n return this.has(key);\n const node = this.get(key, true);\n return identity.isCollection(node) ? node.hasIn(rest) : false;\n }\n /**\n * Sets a value in this collection. For `!!set`, `value` needs to be a\n * boolean to add/remove the item from the set.\n */\n setIn(path, value) {\n const [key, ...rest] = path;\n if (rest.length === 0) {\n this.set(key, value);\n }\n else {\n const node = this.get(key, true);\n if (identity.isCollection(node))\n node.setIn(rest, value);\n else if (node === undefined && this.schema)\n this.set(key, collectionFromPath(this.schema, rest, value));\n else\n throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`);\n }\n }\n}\n\nexports.Collection = Collection;\nexports.collectionFromPath = collectionFromPath;\nexports.isEmptyPath = isEmptyPath;\n","'use strict';\n\n/**\n * Stringifies a comment.\n *\n * Empty comment lines are left empty,\n * lines consisting of a single space are replaced by `#`,\n * and all other lines are prefixed with a `#`.\n */\nconst stringifyComment = (str) => str.replace(/^(?!$)(?: $)?/gm, '#');\nfunction indentComment(comment, indent) {\n if (/^\\n+$/.test(comment))\n return comment.substring(1);\n return indent ? comment.replace(/^(?! *$)/gm, indent) : comment;\n}\nconst lineComment = (str, indent, comment) => str.endsWith('\\n')\n ? indentComment(comment, indent)\n : comment.includes('\\n')\n ? '\\n' + indentComment(comment, indent)\n : (str.endsWith(' ') ? '' : ' ') + comment;\n\nexports.indentComment = indentComment;\nexports.lineComment = lineComment;\nexports.stringifyComment = stringifyComment;\n","'use strict';\n\nconst FOLD_FLOW = 'flow';\nconst FOLD_BLOCK = 'block';\nconst FOLD_QUOTED = 'quoted';\n/**\n * Tries to keep input at up to `lineWidth` characters, splitting only on spaces\n * not followed by newlines or spaces unless `mode` is `'quoted'`. Lines are\n * terminated with `\\n` and started with `indent`.\n */\nfunction foldFlowLines(text, indent, mode = 'flow', { indentAtStart, lineWidth = 80, minContentWidth = 20, onFold, onOverflow } = {}) {\n if (!lineWidth || lineWidth < 0)\n return text;\n if (lineWidth < minContentWidth)\n minContentWidth = 0;\n const endStep = Math.max(1 + minContentWidth, 1 + lineWidth - indent.length);\n if (text.length <= endStep)\n return text;\n const folds = [];\n const escapedFolds = {};\n let end = lineWidth - indent.length;\n if (typeof indentAtStart === 'number') {\n if (indentAtStart > lineWidth - Math.max(2, minContentWidth))\n folds.push(0);\n else\n end = lineWidth - indentAtStart;\n }\n let split = undefined;\n let prev = undefined;\n let overflow = false;\n let i = -1;\n let escStart = -1;\n let escEnd = -1;\n if (mode === FOLD_BLOCK) {\n i = consumeMoreIndentedLines(text, i, indent.length);\n if (i !== -1)\n end = i + endStep;\n }\n for (let ch; (ch = text[(i += 1)]);) {\n if (mode === FOLD_QUOTED && ch === '\\\\') {\n escStart = i;\n switch (text[i + 1]) {\n case 'x':\n i += 3;\n break;\n case 'u':\n i += 5;\n break;\n case 'U':\n i += 9;\n break;\n default:\n i += 1;\n }\n escEnd = i;\n }\n if (ch === '\\n') {\n if (mode === FOLD_BLOCK)\n i = consumeMoreIndentedLines(text, i, indent.length);\n end = i + indent.length + endStep;\n split = undefined;\n }\n else {\n if (ch === ' ' &&\n prev &&\n prev !== ' ' &&\n prev !== '\\n' &&\n prev !== '\\t') {\n // space surrounded by non-space can be replaced with newline + indent\n const next = text[i + 1];\n if (next && next !== ' ' && next !== '\\n' && next !== '\\t')\n split = i;\n }\n if (i >= end) {\n if (split) {\n folds.push(split);\n end = split + endStep;\n split = undefined;\n }\n else if (mode === FOLD_QUOTED) {\n // white-space collected at end may stretch past lineWidth\n while (prev === ' ' || prev === '\\t') {\n prev = ch;\n ch = text[(i += 1)];\n overflow = true;\n }\n // Account for newline escape, but don't break preceding escape\n const j = i > escEnd + 1 ? i - 2 : escStart - 1;\n // Bail out if lineWidth & minContentWidth are shorter than an escape string\n if (escapedFolds[j])\n return text;\n folds.push(j);\n escapedFolds[j] = true;\n end = j + endStep;\n split = undefined;\n }\n else {\n overflow = true;\n }\n }\n }\n prev = ch;\n }\n if (overflow && onOverflow)\n onOverflow();\n if (folds.length === 0)\n return text;\n if (onFold)\n onFold();\n let res = text.slice(0, folds[0]);\n for (let i = 0; i < folds.length; ++i) {\n const fold = folds[i];\n const end = folds[i + 1] || text.length;\n if (fold === 0)\n res = `\\n${indent}${text.slice(0, end)}`;\n else {\n if (mode === FOLD_QUOTED && escapedFolds[fold])\n res += `${text[fold]}\\\\`;\n res += `\\n${indent}${text.slice(fold + 1, end)}`;\n }\n }\n return res;\n}\n/**\n * Presumes `i + 1` is at the start of a line\n * @returns index of last newline in more-indented block\n */\nfunction consumeMoreIndentedLines(text, i, indent) {\n let end = i;\n let start = i + 1;\n let ch = text[start];\n while (ch === ' ' || ch === '\\t') {\n if (i < start + indent) {\n ch = text[++i];\n }\n else {\n do {\n ch = text[++i];\n } while (ch && ch !== '\\n');\n end = i;\n start = i + 1;\n ch = text[start];\n }\n }\n return end;\n}\n\nexports.FOLD_BLOCK = FOLD_BLOCK;\nexports.FOLD_FLOW = FOLD_FLOW;\nexports.FOLD_QUOTED = FOLD_QUOTED;\nexports.foldFlowLines = foldFlowLines;\n","'use strict';\n\nvar Scalar = require('../nodes/Scalar.js');\nvar foldFlowLines = require('./foldFlowLines.js');\n\nconst getFoldOptions = (ctx, isBlock) => ({\n indentAtStart: isBlock ? ctx.indent.length : ctx.indentAtStart,\n lineWidth: ctx.options.lineWidth,\n minContentWidth: ctx.options.minContentWidth\n});\n// Also checks for lines starting with %, as parsing the output as YAML 1.1 will\n// presume that's starting a new document.\nconst containsDocumentMarker = (str) => /^(%|---|\\.\\.\\.)/m.test(str);\nfunction lineLengthOverLimit(str, lineWidth, indentLength) {\n if (!lineWidth || lineWidth < 0)\n return false;\n const limit = lineWidth - indentLength;\n const strLen = str.length;\n if (strLen <= limit)\n return false;\n for (let i = 0, start = 0; i < strLen; ++i) {\n if (str[i] === '\\n') {\n if (i - start > limit)\n return true;\n start = i + 1;\n if (strLen - start <= limit)\n return false;\n }\n }\n return true;\n}\nfunction doubleQuotedString(value, ctx) {\n const json = JSON.stringify(value);\n if (ctx.options.doubleQuotedAsJSON)\n return json;\n const { implicitKey } = ctx;\n const minMultiLineLength = ctx.options.doubleQuotedMinMultiLineLength;\n const indent = ctx.indent || (containsDocumentMarker(value) ? ' ' : '');\n let str = '';\n let start = 0;\n for (let i = 0, ch = json[i]; ch; ch = json[++i]) {\n if (ch === ' ' && json[i + 1] === '\\\\' && json[i + 2] === 'n') {\n // space before newline needs to be escaped to not be folded\n str += json.slice(start, i) + '\\\\ ';\n i += 1;\n start = i;\n ch = '\\\\';\n }\n if (ch === '\\\\')\n switch (json[i + 1]) {\n case 'u':\n {\n str += json.slice(start, i);\n const code = json.substr(i + 2, 4);\n switch (code) {\n case '0000':\n str += '\\\\0';\n break;\n case '0007':\n str += '\\\\a';\n break;\n case '000b':\n str += '\\\\v';\n break;\n case '001b':\n str += '\\\\e';\n break;\n case '0085':\n str += '\\\\N';\n break;\n case '00a0':\n str += '\\\\_';\n break;\n case '2028':\n str += '\\\\L';\n break;\n case '2029':\n str += '\\\\P';\n break;\n default:\n if (code.substr(0, 2) === '00')\n str += '\\\\x' + code.substr(2);\n else\n str += json.substr(i, 6);\n }\n i += 5;\n start = i + 1;\n }\n break;\n case 'n':\n if (implicitKey ||\n json[i + 2] === '\"' ||\n json.length < minMultiLineLength) {\n i += 1;\n }\n else {\n // folding will eat first newline\n str += json.slice(start, i) + '\\n\\n';\n while (json[i + 2] === '\\\\' &&\n json[i + 3] === 'n' &&\n json[i + 4] !== '\"') {\n str += '\\n';\n i += 2;\n }\n str += indent;\n // space after newline needs to be escaped to not be folded\n if (json[i + 2] === ' ')\n str += '\\\\';\n i += 1;\n start = i + 1;\n }\n break;\n default:\n i += 1;\n }\n }\n str = start ? str + json.slice(start) : json;\n return implicitKey\n ? str\n : foldFlowLines.foldFlowLines(str, indent, foldFlowLines.FOLD_QUOTED, getFoldOptions(ctx, false));\n}\nfunction singleQuotedString(value, ctx) {\n if (ctx.options.singleQuote === false ||\n (ctx.implicitKey && value.includes('\\n')) ||\n /[ \\t]\\n|\\n[ \\t]/.test(value) // single quoted string can't have leading or trailing whitespace around newline\n )\n return doubleQuotedString(value, ctx);\n const indent = ctx.indent || (containsDocumentMarker(value) ? ' ' : '');\n const res = \"'\" + value.replace(/'/g, \"''\").replace(/\\n+/g, `$&\\n${indent}`) + \"'\";\n return ctx.implicitKey\n ? res\n : foldFlowLines.foldFlowLines(res, indent, foldFlowLines.FOLD_FLOW, getFoldOptions(ctx, false));\n}\nfunction quotedString(value, ctx) {\n const { singleQuote } = ctx.options;\n let qs;\n if (singleQuote === false)\n qs = doubleQuotedString;\n else {\n const hasDouble = value.includes('\"');\n const hasSingle = value.includes(\"'\");\n if (hasDouble && !hasSingle)\n qs = singleQuotedString;\n else if (hasSingle && !hasDouble)\n qs = doubleQuotedString;\n else\n qs = singleQuote ? singleQuotedString : doubleQuotedString;\n }\n return qs(value, ctx);\n}\n// The negative lookbehind avoids a polynomial search,\n// but isn't supported yet on Safari: https://caniuse.com/js-regexp-lookbehind\nlet blockEndNewlines;\ntry {\n blockEndNewlines = new RegExp('(^|(?<!\\n))\\n+(?!\\n|$)', 'g');\n}\ncatch {\n blockEndNewlines = /\\n+(?!\\n|$)/g;\n}\nfunction blockString({ comment, type, value }, ctx, onComment, onChompKeep) {\n const { blockQuote, commentString, lineWidth } = ctx.options;\n // 1. Block can't end in whitespace unless the last line is non-empty.\n // 2. Strings consisting of only whitespace are best rendered explicitly.\n if (!blockQuote || /\\n[\\t ]+$/.test(value)) {\n return quotedString(value, ctx);\n }\n const indent = ctx.indent ||\n (ctx.forceBlockIndent || containsDocumentMarker(value) ? ' ' : '');\n const literal = blockQuote === 'literal'\n ? true\n : blockQuote === 'folded' || type === Scalar.Scalar.BLOCK_FOLDED\n ? false\n : type === Scalar.Scalar.BLOCK_LITERAL\n ? true\n : !lineLengthOverLimit(value, lineWidth, indent.length);\n if (!value)\n return literal ? '|\\n' : '>\\n';\n // determine chomping from whitespace at value end\n let chomp;\n let endStart;\n for (endStart = value.length; endStart > 0; --endStart) {\n const ch = value[endStart - 1];\n if (ch !== '\\n' && ch !== '\\t' && ch !== ' ')\n break;\n }\n let end = value.substring(endStart);\n const endNlPos = end.indexOf('\\n');\n if (endNlPos === -1) {\n chomp = '-'; // strip\n }\n else if (value === end || endNlPos !== end.length - 1) {\n chomp = '+'; // keep\n if (onChompKeep)\n onChompKeep();\n }\n else {\n chomp = ''; // clip\n }\n if (end) {\n value = value.slice(0, -end.length);\n if (end[end.length - 1] === '\\n')\n end = end.slice(0, -1);\n end = end.replace(blockEndNewlines, `$&${indent}`);\n }\n // determine indent indicator from whitespace at value start\n let startWithSpace = false;\n let startEnd;\n let startNlPos = -1;\n for (startEnd = 0; startEnd < value.length; ++startEnd) {\n const ch = value[startEnd];\n if (ch === ' ')\n startWithSpace = true;\n else if (ch === '\\n')\n startNlPos = startEnd;\n else\n break;\n }\n let start = value.substring(0, startNlPos < startEnd ? startNlPos + 1 : startEnd);\n if (start) {\n value = value.substring(start.length);\n start = start.replace(/\\n+/g, `$&${indent}`);\n }\n const indentSize = indent ? '2' : '1'; // root is at -1\n // Leading | or > is added later\n let header = (startWithSpace ? indentSize : '') + chomp;\n if (comment) {\n header += ' ' + commentString(comment.replace(/ ?[\\r\\n]+/g, ' '));\n if (onComment)\n onComment();\n }\n if (!literal) {\n const foldedValue = value\n .replace(/\\n+/g, '\\n$&')\n .replace(/(?:^|\\n)([\\t ].*)(?:([\\n\\t ]*)\\n(?![\\n\\t ]))?/g, '$1$2') // more-indented lines aren't folded\n // ^ more-ind. ^ empty ^ capture next empty lines only at end of indent\n .replace(/\\n+/g, `$&${indent}`);\n let literalFallback = false;\n const foldOptions = getFoldOptions(ctx, true);\n if (blockQuote !== 'folded' && type !== Scalar.Scalar.BLOCK_FOLDED) {\n foldOptions.onOverflow = () => {\n literalFallback = true;\n };\n }\n const body = foldFlowLines.foldFlowLines(`${start}${foldedValue}${end}`, indent, foldFlowLines.FOLD_BLOCK, foldOptions);\n if (!literalFallback)\n return `>${header}\\n${indent}${body}`;\n }\n value = value.replace(/\\n+/g, `$&${indent}`);\n return `|${header}\\n${indent}${start}${value}${end}`;\n}\nfunction plainString(item, ctx, onComment, onChompKeep) {\n const { type, value } = item;\n const { actualString, implicitKey, indent, indentStep, inFlow } = ctx;\n if ((implicitKey && value.includes('\\n')) ||\n (inFlow && /[[\\]{},]/.test(value))) {\n return quotedString(value, ctx);\n }\n if (/^[\\n\\t ,[\\]{}#&*!|>'\"%@`]|^[?-]$|^[?-][ \\t]|[\\n:][ \\t]|[ \\t]\\n|[\\n\\t ]#|[\\n\\t :]$/.test(value)) {\n // not allowed:\n // - '-' or '?'\n // - start with an indicator character (except [?:-]) or /[?-] /\n // - '\\n ', ': ' or ' \\n' anywhere\n // - '#' not preceded by a non-space char\n // - end with ' ' or ':'\n return implicitKey || inFlow || !value.includes('\\n')\n ? quotedString(value, ctx)\n : blockString(item, ctx, onComment, onChompKeep);\n }\n if (!implicitKey &&\n !inFlow &&\n type !== Scalar.Scalar.PLAIN &&\n value.includes('\\n')) {\n // Where allowed & type not set explicitly, prefer block style for multiline strings\n return blockString(item, ctx, onComment, onChompKeep);\n }\n if (containsDocumentMarker(value)) {\n if (indent === '') {\n ctx.forceBlockIndent = true;\n return blockString(item, ctx, onComment, onChompKeep);\n }\n else if (implicitKey && indent === indentStep) {\n return quotedString(value, ctx);\n }\n }\n const str = value.replace(/\\n+/g, `$&\\n${indent}`);\n // Verify that output will be parsed as a string, as e.g. plain numbers and\n // booleans get parsed with those types in v1.2 (e.g. '42', 'true' & '0.9e-3'),\n // and others in v1.1.\n if (actualString) {\n const test = (tag) => tag.default && tag.tag !== 'tag:yaml.org,2002:str' && tag.test?.test(str);\n const { compat, tags } = ctx.doc.schema;\n if (tags.some(test) || compat?.some(test))\n return quotedString(value, ctx);\n }\n return implicitKey\n ? str\n : foldFlowLines.foldFlowLines(str, indent, foldFlowLines.FOLD_FLOW, getFoldOptions(ctx, false));\n}\nfunction stringifyString(item, ctx, onComment, onChompKeep) {\n const { implicitKey, inFlow } = ctx;\n const ss = typeof item.value === 'string'\n ? item\n : Object.assign({}, item, { value: String(item.value) });\n let { type } = item;\n if (type !== Scalar.Scalar.QUOTE_DOUBLE) {\n // force double quotes on control characters & unpaired surrogates\n if (/[\\x00-\\x08\\x0b-\\x1f\\x7f-\\x9f\\u{D800}-\\u{DFFF}]/u.test(ss.value))\n type = Scalar.Scalar.QUOTE_DOUBLE;\n }\n const _stringify = (_type) => {\n switch (_type) {\n case Scalar.Scalar.BLOCK_FOLDED:\n case Scalar.Scalar.BLOCK_LITERAL:\n return implicitKey || inFlow\n ? quotedString(ss.value, ctx) // blocks are not valid inside flow containers\n : blockString(ss, ctx, onComment, onChompKeep);\n case Scalar.Scalar.QUOTE_DOUBLE:\n return doubleQuotedString(ss.value, ctx);\n case Scalar.Scalar.QUOTE_SINGLE:\n return singleQuotedString(ss.value, ctx);\n case Scalar.Scalar.PLAIN:\n return plainString(ss, ctx, onComment, onChompKeep);\n default:\n return null;\n }\n };\n let res = _stringify(type);\n if (res === null) {\n const { defaultKeyType, defaultStringType } = ctx.options;\n const t = (implicitKey && defaultKeyType) || defaultStringType;\n res = _stringify(t);\n if (res === null)\n throw new Error(`Unsupported default string type ${t}`);\n }\n return res;\n}\n\nexports.stringifyString = stringifyString;\n","'use strict';\n\nvar anchors = require('../doc/anchors.js');\nvar identity = require('../nodes/identity.js');\nvar stringifyComment = require('./stringifyComment.js');\nvar stringifyString = require('./stringifyString.js');\n\nfunction createStringifyContext(doc, options) {\n const opt = Object.assign({\n blockQuote: true,\n commentString: stringifyComment.stringifyComment,\n defaultKeyType: null,\n defaultStringType: 'PLAIN',\n directives: null,\n doubleQuotedAsJSON: false,\n doubleQuotedMinMultiLineLength: 40,\n falseStr: 'false',\n flowCollectionPadding: true,\n indentSeq: true,\n lineWidth: 80,\n minContentWidth: 20,\n nullStr: 'null',\n simpleKeys: false,\n singleQuote: null,\n trailingComma: false,\n trueStr: 'true',\n verifyAliasOrder: true\n }, doc.schema.toStringOptions, options);\n let inFlow;\n switch (opt.collectionStyle) {\n case 'block':\n inFlow = false;\n break;\n case 'flow':\n inFlow = true;\n break;\n default:\n inFlow = null;\n }\n return {\n anchors: new Set(),\n doc,\n flowCollectionPadding: opt.flowCollectionPadding ? ' ' : '',\n indent: '',\n indentStep: typeof opt.indent === 'number' ? ' '.repeat(opt.indent) : ' ',\n inFlow,\n options: opt\n };\n}\nfunction getTagObject(tags, item) {\n if (item.tag) {\n const match = tags.filter(t => t.tag === item.tag);\n if (match.length > 0)\n return match.find(t => t.format === item.format) ?? match[0];\n }\n let tagObj = undefined;\n let obj;\n if (identity.isScalar(item)) {\n obj = item.value;\n let match = tags.filter(t => t.identify?.(obj));\n if (match.length > 1) {\n const testMatch = match.filter(t => t.test);\n if (testMatch.length > 0)\n match = testMatch;\n }\n tagObj =\n match.find(t => t.format === item.format) ?? match.find(t => !t.format);\n }\n else {\n obj = item;\n tagObj = tags.find(t => t.nodeClass && obj instanceof t.nodeClass);\n }\n if (!tagObj) {\n const name = obj?.constructor?.name ?? (obj === null ? 'null' : typeof obj);\n throw new Error(`Tag not resolved for ${name} value`);\n }\n return tagObj;\n}\n// needs to be called before value stringifier to allow for circular anchor refs\nfunction stringifyProps(node, tagObj, { anchors: anchors$1, doc }) {\n if (!doc.directives)\n return '';\n const props = [];\n const anchor = (identity.isScalar(node) || identity.isCollection(node)) && node.anchor;\n if (anchor && anchors.anchorIsValid(anchor)) {\n anchors$1.add(anchor);\n props.push(`&${anchor}`);\n }\n const tag = node.tag ?? (tagObj.default ? null : tagObj.tag);\n if (tag)\n props.push(doc.directives.tagString(tag));\n return props.join(' ');\n}\nfunction stringify(item, ctx, onComment, onChompKeep) {\n if (identity.isPair(item))\n return item.toString(ctx, onComment, onChompKeep);\n if (identity.isAlias(item)) {\n if (ctx.doc.directives)\n return item.toString(ctx);\n if (ctx.resolvedAliases?.has(item)) {\n throw new TypeError(`Cannot stringify circular structure without alias nodes`);\n }\n else {\n if (ctx.resolvedAliases)\n ctx.resolvedAliases.add(item);\n else\n ctx.resolvedAliases = new Set([item]);\n item = item.resolve(ctx.doc);\n }\n }\n let tagObj = undefined;\n const node = identity.isNode(item)\n ? item\n : ctx.doc.createNode(item, { onTagObj: o => (tagObj = o) });\n tagObj ?? (tagObj = getTagObject(ctx.doc.schema.tags, node));\n const props = stringifyProps(node, tagObj, ctx);\n if (props.length > 0)\n ctx.indentAtStart = (ctx.indentAtStart ?? 0) + props.length + 1;\n const str = typeof tagObj.stringify === 'function'\n ? tagObj.stringify(node, ctx, onComment, onChompKeep)\n : identity.isScalar(node)\n ? stringifyString.stringifyString(node, ctx, onComment, onChompKeep)\n : node.toString(ctx, onComment, onChompKeep);\n if (!props)\n return str;\n return identity.isScalar(node) || str[0] === '{' || str[0] === '['\n ? `${props} ${str}`\n : `${props}\\n${ctx.indent}${str}`;\n}\n\nexports.createStringifyContext = createStringifyContext;\nexports.stringify = stringify;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar Scalar = require('../nodes/Scalar.js');\nvar stringify = require('./stringify.js');\nvar stringifyComment = require('./stringifyComment.js');\n\nfunction stringifyPair({ key, value }, ctx, onComment, onChompKeep) {\n const { allNullValues, doc, indent, indentStep, options: { commentString, indentSeq, simpleKeys } } = ctx;\n let keyComment = (identity.isNode(key) && key.comment) || null;\n if (simpleKeys) {\n if (keyComment) {\n throw new Error('With simple keys, key nodes cannot have comments');\n }\n if (identity.isCollection(key) || (!identity.isNode(key) && typeof key === 'object')) {\n const msg = 'With simple keys, collection cannot be used as a key value';\n throw new Error(msg);\n }\n }\n let explicitKey = !simpleKeys &&\n (!key ||\n (keyComment && value == null && !ctx.inFlow) ||\n identity.isCollection(key) ||\n (identity.isScalar(key)\n ? key.type === Scalar.Scalar.BLOCK_FOLDED || key.type === Scalar.Scalar.BLOCK_LITERAL\n : typeof key === 'object'));\n ctx = Object.assign({}, ctx, {\n allNullValues: false,\n implicitKey: !explicitKey && (simpleKeys || !allNullValues),\n indent: indent + indentStep\n });\n let keyCommentDone = false;\n let chompKeep = false;\n let str = stringify.stringify(key, ctx, () => (keyCommentDone = true), () => (chompKeep = true));\n if (!explicitKey && !ctx.inFlow && str.length > 1024) {\n if (simpleKeys)\n throw new Error('With simple keys, single line scalar must not span more than 1024 characters');\n explicitKey = true;\n }\n if (ctx.inFlow) {\n if (allNullValues || value == null) {\n if (keyCommentDone && onComment)\n onComment();\n return str === '' ? '?' : explicitKey ? `? ${str}` : str;\n }\n }\n else if ((allNullValues && !simpleKeys) || (value == null && explicitKey)) {\n str = `? ${str}`;\n if (keyComment && !keyCommentDone) {\n str += stringifyComment.lineComment(str, ctx.indent, commentString(keyComment));\n }\n else if (chompKeep && onChompKeep)\n onChompKeep();\n return str;\n }\n if (keyCommentDone)\n keyComment = null;\n if (explicitKey) {\n if (keyComment)\n str += stringifyComment.lineComment(str, ctx.indent, commentString(keyComment));\n str = `? ${str}\\n${indent}:`;\n }\n else {\n str = `${str}:`;\n if (keyComment)\n str += stringifyComment.lineComment(str, ctx.indent, commentString(keyComment));\n }\n let vsb, vcb, valueComment;\n if (identity.isNode(value)) {\n vsb = !!value.spaceBefore;\n vcb = value.commentBefore;\n valueComment = value.comment;\n }\n else {\n vsb = false;\n vcb = null;\n valueComment = null;\n if (value && typeof value === 'object')\n value = doc.createNode(value);\n }\n ctx.implicitKey = false;\n if (!explicitKey && !keyComment && identity.isScalar(value))\n ctx.indentAtStart = str.length + 1;\n chompKeep = false;\n if (!indentSeq &&\n indentStep.length >= 2 &&\n !ctx.inFlow &&\n !explicitKey &&\n identity.isSeq(value) &&\n !value.flow &&\n !value.tag &&\n !value.anchor) {\n // If indentSeq === false, consider '- ' as part of indentation where possible\n ctx.indent = ctx.indent.substring(2);\n }\n let valueCommentDone = false;\n const valueStr = stringify.stringify(value, ctx, () => (valueCommentDone = true), () => (chompKeep = true));\n let ws = ' ';\n if (keyComment || vsb || vcb) {\n ws = vsb ? '\\n' : '';\n if (vcb) {\n const cs = commentString(vcb);\n ws += `\\n${stringifyComment.indentComment(cs, ctx.indent)}`;\n }\n if (valueStr === '' && !ctx.inFlow) {\n if (ws === '\\n' && valueComment)\n ws = '\\n\\n';\n }\n else {\n ws += `\\n${ctx.indent}`;\n }\n }\n else if (!explicitKey && identity.isCollection(value)) {\n const vs0 = valueStr[0];\n const nl0 = valueStr.indexOf('\\n');\n const hasNewline = nl0 !== -1;\n const flow = ctx.inFlow ?? value.flow ?? value.items.length === 0;\n if (hasNewline || !flow) {\n let hasPropsLine = false;\n if (hasNewline && (vs0 === '&' || vs0 === '!')) {\n let sp0 = valueStr.indexOf(' ');\n if (vs0 === '&' &&\n sp0 !== -1 &&\n sp0 < nl0 &&\n valueStr[sp0 + 1] === '!') {\n sp0 = valueStr.indexOf(' ', sp0 + 1);\n }\n if (sp0 === -1 || nl0 < sp0)\n hasPropsLine = true;\n }\n if (!hasPropsLine)\n ws = `\\n${ctx.indent}`;\n }\n }\n else if (valueStr === '' || valueStr[0] === '\\n') {\n ws = '';\n }\n str += ws + valueStr;\n if (ctx.inFlow) {\n if (valueCommentDone && onComment)\n onComment();\n }\n else if (valueComment && !valueCommentDone) {\n str += stringifyComment.lineComment(str, ctx.indent, commentString(valueComment));\n }\n else if (chompKeep && onChompKeep) {\n onChompKeep();\n }\n return str;\n}\n\nexports.stringifyPair = stringifyPair;\n","'use strict';\n\nvar node_process = require('process');\n\nfunction debug(logLevel, ...messages) {\n if (logLevel === 'debug')\n console.log(...messages);\n}\nfunction warn(logLevel, warning) {\n if (logLevel === 'debug' || logLevel === 'warn') {\n if (typeof node_process.emitWarning === 'function')\n node_process.emitWarning(warning);\n else\n console.warn(warning);\n }\n}\n\nexports.debug = debug;\nexports.warn = warn;\n","'use strict';\n\nvar identity = require('../../nodes/identity.js');\nvar Scalar = require('../../nodes/Scalar.js');\n\n// If the value associated with a merge key is a single mapping node, each of\n// its key/value pairs is inserted into the current mapping, unless the key\n// already exists in it. If the value associated with the merge key is a\n// sequence, then this sequence is expected to contain mapping nodes and each\n// of these nodes is merged in turn according to its order in the sequence.\n// Keys in mapping nodes earlier in the sequence override keys specified in\n// later mapping nodes. -- http://yaml.org/type/merge.html\nconst MERGE_KEY = '<<';\nconst merge = {\n identify: value => value === MERGE_KEY ||\n (typeof value === 'symbol' && value.description === MERGE_KEY),\n default: 'key',\n tag: 'tag:yaml.org,2002:merge',\n test: /^<<$/,\n resolve: () => Object.assign(new Scalar.Scalar(Symbol(MERGE_KEY)), {\n addToJSMap: addMergeToJSMap\n }),\n stringify: () => MERGE_KEY\n};\nconst isMergeKey = (ctx, key) => (merge.identify(key) ||\n (identity.isScalar(key) &&\n (!key.type || key.type === Scalar.Scalar.PLAIN) &&\n merge.identify(key.value))) &&\n ctx?.doc.schema.tags.some(tag => tag.tag === merge.tag && tag.default);\nfunction addMergeToJSMap(ctx, map, value) {\n const source = resolveAliasValue(ctx, value);\n if (identity.isSeq(source))\n for (const it of source.items)\n mergeValue(ctx, map, it);\n else if (Array.isArray(source))\n for (const it of source)\n mergeValue(ctx, map, it);\n else\n mergeValue(ctx, map, source);\n}\nfunction mergeValue(ctx, map, value) {\n const source = resolveAliasValue(ctx, value);\n if (!identity.isMap(source))\n throw new Error('Merge sources must be maps or map aliases');\n const srcMap = source.toJSON(null, ctx, Map);\n for (const [key, value] of srcMap) {\n if (map instanceof Map) {\n if (!map.has(key))\n map.set(key, value);\n }\n else if (map instanceof Set) {\n map.add(key);\n }\n else if (!Object.prototype.hasOwnProperty.call(map, key)) {\n Object.defineProperty(map, key, {\n value,\n writable: true,\n enumerable: true,\n configurable: true\n });\n }\n }\n return map;\n}\nfunction resolveAliasValue(ctx, value) {\n return ctx && identity.isAlias(value) ? value.resolve(ctx.doc, ctx) : value;\n}\n\nexports.addMergeToJSMap = addMergeToJSMap;\nexports.isMergeKey = isMergeKey;\nexports.merge = merge;\n","'use strict';\n\nvar log = require('../log.js');\nvar merge = require('../schema/yaml-1.1/merge.js');\nvar stringify = require('../stringify/stringify.js');\nvar identity = require('./identity.js');\nvar toJS = require('./toJS.js');\n\nfunction addPairToJSMap(ctx, map, { key, value }) {\n if (identity.isNode(key) && key.addToJSMap)\n key.addToJSMap(ctx, map, value);\n // TODO: Should drop this special case for bare << handling\n else if (merge.isMergeKey(ctx, key))\n merge.addMergeToJSMap(ctx, map, value);\n else {\n const jsKey = toJS.toJS(key, '', ctx);\n if (map instanceof Map) {\n map.set(jsKey, toJS.toJS(value, jsKey, ctx));\n }\n else if (map instanceof Set) {\n map.add(jsKey);\n }\n else {\n const stringKey = stringifyKey(key, jsKey, ctx);\n const jsValue = toJS.toJS(value, stringKey, ctx);\n if (stringKey in map)\n Object.defineProperty(map, stringKey, {\n value: jsValue,\n writable: true,\n enumerable: true,\n configurable: true\n });\n else\n map[stringKey] = jsValue;\n }\n }\n return map;\n}\nfunction stringifyKey(key, jsKey, ctx) {\n if (jsKey === null)\n return '';\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n if (typeof jsKey !== 'object')\n return String(jsKey);\n if (identity.isNode(key) && ctx?.doc) {\n const strCtx = stringify.createStringifyContext(ctx.doc, {});\n strCtx.anchors = new Set();\n for (const node of ctx.anchors.keys())\n strCtx.anchors.add(node.anchor);\n strCtx.inFlow = true;\n strCtx.inStringifyKey = true;\n const strKey = key.toString(strCtx);\n if (!ctx.mapKeyWarned) {\n let jsonStr = JSON.stringify(strKey);\n if (jsonStr.length > 40)\n jsonStr = jsonStr.substring(0, 36) + '...\"';\n log.warn(ctx.doc.options.logLevel, `Keys with collection values will be stringified due to JS Object restrictions: ${jsonStr}. Set mapAsMap: true to use object keys.`);\n ctx.mapKeyWarned = true;\n }\n return strKey;\n }\n return JSON.stringify(jsKey);\n}\n\nexports.addPairToJSMap = addPairToJSMap;\n","'use strict';\n\nvar createNode = require('../doc/createNode.js');\nvar stringifyPair = require('../stringify/stringifyPair.js');\nvar addPairToJSMap = require('./addPairToJSMap.js');\nvar identity = require('./identity.js');\n\nfunction createPair(key, value, ctx) {\n const k = createNode.createNode(key, undefined, ctx);\n const v = createNode.createNode(value, undefined, ctx);\n return new Pair(k, v);\n}\nclass Pair {\n constructor(key, value = null) {\n Object.defineProperty(this, identity.NODE_TYPE, { value: identity.PAIR });\n this.key = key;\n this.value = value;\n }\n clone(schema) {\n let { key, value } = this;\n if (identity.isNode(key))\n key = key.clone(schema);\n if (identity.isNode(value))\n value = value.clone(schema);\n return new Pair(key, value);\n }\n toJSON(_, ctx) {\n const pair = ctx?.mapAsMap ? new Map() : {};\n return addPairToJSMap.addPairToJSMap(ctx, pair, this);\n }\n toString(ctx, onComment, onChompKeep) {\n return ctx?.doc\n ? stringifyPair.stringifyPair(this, ctx, onComment, onChompKeep)\n : JSON.stringify(this);\n }\n}\n\nexports.Pair = Pair;\nexports.createPair = createPair;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar stringify = require('./stringify.js');\nvar stringifyComment = require('./stringifyComment.js');\n\nfunction stringifyCollection(collection, ctx, options) {\n const flow = ctx.inFlow ?? collection.flow;\n const stringify = flow ? stringifyFlowCollection : stringifyBlockCollection;\n return stringify(collection, ctx, options);\n}\nfunction stringifyBlockCollection({ comment, items }, ctx, { blockItemPrefix, flowChars, itemIndent, onChompKeep, onComment }) {\n const { indent, options: { commentString } } = ctx;\n const itemCtx = Object.assign({}, ctx, { indent: itemIndent, type: null });\n let chompKeep = false; // flag for the preceding node's status\n const lines = [];\n for (let i = 0; i < items.length; ++i) {\n const item = items[i];\n let comment = null;\n if (identity.isNode(item)) {\n if (!chompKeep && item.spaceBefore)\n lines.push('');\n addCommentBefore(ctx, lines, item.commentBefore, chompKeep);\n if (item.comment)\n comment = item.comment;\n }\n else if (identity.isPair(item)) {\n const ik = identity.isNode(item.key) ? item.key : null;\n if (ik) {\n if (!chompKeep && ik.spaceBefore)\n lines.push('');\n addCommentBefore(ctx, lines, ik.commentBefore, chompKeep);\n }\n }\n chompKeep = false;\n let str = stringify.stringify(item, itemCtx, () => (comment = null), () => (chompKeep = true));\n if (comment)\n str += stringifyComment.lineComment(str, itemIndent, commentString(comment));\n if (chompKeep && comment)\n chompKeep = false;\n lines.push(blockItemPrefix + str);\n }\n let str;\n if (lines.length === 0) {\n str = flowChars.start + flowChars.end;\n }\n else {\n str = lines[0];\n for (let i = 1; i < lines.length; ++i) {\n const line = lines[i];\n str += line ? `\\n${indent}${line}` : '\\n';\n }\n }\n if (comment) {\n str += '\\n' + stringifyComment.indentComment(commentString(comment), indent);\n if (onComment)\n onComment();\n }\n else if (chompKeep && onChompKeep)\n onChompKeep();\n return str;\n}\nfunction stringifyFlowCollection({ items }, ctx, { flowChars, itemIndent }) {\n const { indent, indentStep, flowCollectionPadding: fcPadding, options: { commentString } } = ctx;\n itemIndent += indentStep;\n const itemCtx = Object.assign({}, ctx, {\n indent: itemIndent,\n inFlow: true,\n type: null\n });\n let reqNewline = false;\n let linesAtValue = 0;\n const lines = [];\n for (let i = 0; i < items.length; ++i) {\n const item = items[i];\n let comment = null;\n if (identity.isNode(item)) {\n if (item.spaceBefore)\n lines.push('');\n addCommentBefore(ctx, lines, item.commentBefore, false);\n if (item.comment)\n comment = item.comment;\n }\n else if (identity.isPair(item)) {\n const ik = identity.isNode(item.key) ? item.key : null;\n if (ik) {\n if (ik.spaceBefore)\n lines.push('');\n addCommentBefore(ctx, lines, ik.commentBefore, false);\n if (ik.comment)\n reqNewline = true;\n }\n const iv = identity.isNode(item.value) ? item.value : null;\n if (iv) {\n if (iv.comment)\n comment = iv.comment;\n if (iv.commentBefore)\n reqNewline = true;\n }\n else if (item.value == null && ik?.comment) {\n comment = ik.comment;\n }\n }\n if (comment)\n reqNewline = true;\n let str = stringify.stringify(item, itemCtx, () => (comment = null));\n reqNewline || (reqNewline = lines.length > linesAtValue || str.includes('\\n'));\n if (i < items.length - 1) {\n str += ',';\n }\n else if (ctx.options.trailingComma) {\n if (ctx.options.lineWidth > 0) {\n reqNewline || (reqNewline = lines.reduce((sum, line) => sum + line.length + 2, 2) +\n (str.length + 2) >\n ctx.options.lineWidth);\n }\n if (reqNewline) {\n str += ',';\n }\n }\n if (comment)\n str += stringifyComment.lineComment(str, itemIndent, commentString(comment));\n lines.push(str);\n linesAtValue = lines.length;\n }\n const { start, end } = flowChars;\n if (lines.length === 0) {\n return start + end;\n }\n else {\n if (!reqNewline) {\n const len = lines.reduce((sum, line) => sum + line.length + 2, 2);\n reqNewline = ctx.options.lineWidth > 0 && len > ctx.options.lineWidth;\n }\n if (reqNewline) {\n let str = start;\n for (const line of lines)\n str += line ? `\\n${indentStep}${indent}${line}` : '\\n';\n return `${str}\\n${indent}${end}`;\n }\n else {\n return `${start}${fcPadding}${lines.join(' ')}${fcPadding}${end}`;\n }\n }\n}\nfunction addCommentBefore({ indent, options: { commentString } }, lines, comment, chompKeep) {\n if (comment && chompKeep)\n comment = comment.replace(/^\\n+/, '');\n if (comment) {\n const ic = stringifyComment.indentComment(commentString(comment), indent);\n lines.push(ic.trimStart()); // Avoid double indent on first line\n }\n}\n\nexports.stringifyCollection = stringifyCollection;\n","'use strict';\n\nvar stringifyCollection = require('../stringify/stringifyCollection.js');\nvar addPairToJSMap = require('./addPairToJSMap.js');\nvar Collection = require('./Collection.js');\nvar identity = require('./identity.js');\nvar Pair = require('./Pair.js');\nvar Scalar = require('./Scalar.js');\n\nfunction findPair(items, key) {\n const k = identity.isScalar(key) ? key.value : key;\n for (const it of items) {\n if (identity.isPair(it)) {\n if (it.key === key || it.key === k)\n return it;\n if (identity.isScalar(it.key) && it.key.value === k)\n return it;\n }\n }\n return undefined;\n}\nclass YAMLMap extends Collection.Collection {\n static get tagName() {\n return 'tag:yaml.org,2002:map';\n }\n constructor(schema) {\n super(identity.MAP, schema);\n this.items = [];\n }\n /**\n * A generic collection parsing method that can be extended\n * to other node classes that inherit from YAMLMap\n */\n static from(schema, obj, ctx) {\n const { keepUndefined, replacer } = ctx;\n const map = new this(schema);\n const add = (key, value) => {\n if (typeof replacer === 'function')\n value = replacer.call(obj, key, value);\n else if (Array.isArray(replacer) && !replacer.includes(key))\n return;\n if (value !== undefined || keepUndefined)\n map.items.push(Pair.createPair(key, value, ctx));\n };\n if (obj instanceof Map) {\n for (const [key, value] of obj)\n add(key, value);\n }\n else if (obj && typeof obj === 'object') {\n for (const key of Object.keys(obj))\n add(key, obj[key]);\n }\n if (typeof schema.sortMapEntries === 'function') {\n map.items.sort(schema.sortMapEntries);\n }\n return map;\n }\n /**\n * Adds a value to the collection.\n *\n * @param overwrite - If not set `true`, using a key that is already in the\n * collection will throw. Otherwise, overwrites the previous value.\n */\n add(pair, overwrite) {\n let _pair;\n if (identity.isPair(pair))\n _pair = pair;\n else if (!pair || typeof pair !== 'object' || !('key' in pair)) {\n // In TypeScript, this never happens.\n _pair = new Pair.Pair(pair, pair?.value);\n }\n else\n _pair = new Pair.Pair(pair.key, pair.value);\n const prev = findPair(this.items, _pair.key);\n const sortEntries = this.schema?.sortMapEntries;\n if (prev) {\n if (!overwrite)\n throw new Error(`Key ${_pair.key} already set`);\n // For scalars, keep the old node & its comments and anchors\n if (identity.isScalar(prev.value) && Scalar.isScalarValue(_pair.value))\n prev.value.value = _pair.value;\n else\n prev.value = _pair.value;\n }\n else if (sortEntries) {\n const i = this.items.findIndex(item => sortEntries(_pair, item) < 0);\n if (i === -1)\n this.items.push(_pair);\n else\n this.items.splice(i, 0, _pair);\n }\n else {\n this.items.push(_pair);\n }\n }\n delete(key) {\n const it = findPair(this.items, key);\n if (!it)\n return false;\n const del = this.items.splice(this.items.indexOf(it), 1);\n return del.length > 0;\n }\n get(key, keepScalar) {\n const it = findPair(this.items, key);\n const node = it?.value;\n return (!keepScalar && identity.isScalar(node) ? node.value : node) ?? undefined;\n }\n has(key) {\n return !!findPair(this.items, key);\n }\n set(key, value) {\n this.add(new Pair.Pair(key, value), true);\n }\n /**\n * @param ctx - Conversion context, originally set in Document#toJS()\n * @param {Class} Type - If set, forces the returned collection type\n * @returns Instance of Type, Map, or Object\n */\n toJSON(_, ctx, Type) {\n const map = Type ? new Type() : ctx?.mapAsMap ? new Map() : {};\n if (ctx?.onCreate)\n ctx.onCreate(map);\n for (const item of this.items)\n addPairToJSMap.addPairToJSMap(ctx, map, item);\n return map;\n }\n toString(ctx, onComment, onChompKeep) {\n if (!ctx)\n return JSON.stringify(this);\n for (const item of this.items) {\n if (!identity.isPair(item))\n throw new Error(`Map items must all be pairs; found ${JSON.stringify(item)} instead`);\n }\n if (!ctx.allNullValues && this.hasAllNullValues(false))\n ctx = Object.assign({}, ctx, { allNullValues: true });\n return stringifyCollection.stringifyCollection(this, ctx, {\n blockItemPrefix: '',\n flowChars: { start: '{', end: '}' },\n itemIndent: ctx.indent || '',\n onChompKeep,\n onComment\n });\n }\n}\n\nexports.YAMLMap = YAMLMap;\nexports.findPair = findPair;\n","'use strict';\n\nvar identity = require('../../nodes/identity.js');\nvar YAMLMap = require('../../nodes/YAMLMap.js');\n\nconst map = {\n collection: 'map',\n default: true,\n nodeClass: YAMLMap.YAMLMap,\n tag: 'tag:yaml.org,2002:map',\n resolve(map, onError) {\n if (!identity.isMap(map))\n onError('Expected a mapping for this tag');\n return map;\n },\n createNode: (schema, obj, ctx) => YAMLMap.YAMLMap.from(schema, obj, ctx)\n};\n\nexports.map = map;\n","'use strict';\n\nvar createNode = require('../doc/createNode.js');\nvar stringifyCollection = require('../stringify/stringifyCollection.js');\nvar Collection = require('./Collection.js');\nvar identity = require('./identity.js');\nvar Scalar = require('./Scalar.js');\nvar toJS = require('./toJS.js');\n\nclass YAMLSeq extends Collection.Collection {\n static get tagName() {\n return 'tag:yaml.org,2002:seq';\n }\n constructor(schema) {\n super(identity.SEQ, schema);\n this.items = [];\n }\n add(value) {\n this.items.push(value);\n }\n /**\n * Removes a value from the collection.\n *\n * `key` must contain a representation of an integer for this to succeed.\n * It may be wrapped in a `Scalar`.\n *\n * @returns `true` if the item was found and removed.\n */\n delete(key) {\n const idx = asItemIndex(key);\n if (typeof idx !== 'number')\n return false;\n const del = this.items.splice(idx, 1);\n return del.length > 0;\n }\n get(key, keepScalar) {\n const idx = asItemIndex(key);\n if (typeof idx !== 'number')\n return undefined;\n const it = this.items[idx];\n return !keepScalar && identity.isScalar(it) ? it.value : it;\n }\n /**\n * Checks if the collection includes a value with the key `key`.\n *\n * `key` must contain a representation of an integer for this to succeed.\n * It may be wrapped in a `Scalar`.\n */\n has(key) {\n const idx = asItemIndex(key);\n return typeof idx === 'number' && idx < this.items.length;\n }\n /**\n * Sets a value in this collection. For `!!set`, `value` needs to be a\n * boolean to add/remove the item from the set.\n *\n * If `key` does not contain a representation of an integer, this will throw.\n * It may be wrapped in a `Scalar`.\n */\n set(key, value) {\n const idx = asItemIndex(key);\n if (typeof idx !== 'number')\n throw new Error(`Expected a valid index, not ${key}.`);\n const prev = this.items[idx];\n if (identity.isScalar(prev) && Scalar.isScalarValue(value))\n prev.value = value;\n else\n this.items[idx] = value;\n }\n toJSON(_, ctx) {\n const seq = [];\n if (ctx?.onCreate)\n ctx.onCreate(seq);\n let i = 0;\n for (const item of this.items)\n seq.push(toJS.toJS(item, String(i++), ctx));\n return seq;\n }\n toString(ctx, onComment, onChompKeep) {\n if (!ctx)\n return JSON.stringify(this);\n return stringifyCollection.stringifyCollection(this, ctx, {\n blockItemPrefix: '- ',\n flowChars: { start: '[', end: ']' },\n itemIndent: (ctx.indent || '') + ' ',\n onChompKeep,\n onComment\n });\n }\n static from(schema, obj, ctx) {\n const { replacer } = ctx;\n const seq = new this(schema);\n if (obj && Symbol.iterator in Object(obj)) {\n let i = 0;\n for (let it of obj) {\n if (typeof replacer === 'function') {\n const key = obj instanceof Set ? it : String(i++);\n it = replacer.call(obj, key, it);\n }\n seq.items.push(createNode.createNode(it, undefined, ctx));\n }\n }\n return seq;\n }\n}\nfunction asItemIndex(key) {\n let idx = identity.isScalar(key) ? key.value : key;\n if (idx && typeof idx === 'string')\n idx = Number(idx);\n return typeof idx === 'number' && Number.isInteger(idx) && idx >= 0\n ? idx\n : null;\n}\n\nexports.YAMLSeq = YAMLSeq;\n","'use strict';\n\nvar identity = require('../../nodes/identity.js');\nvar YAMLSeq = require('../../nodes/YAMLSeq.js');\n\nconst seq = {\n collection: 'seq',\n default: true,\n nodeClass: YAMLSeq.YAMLSeq,\n tag: 'tag:yaml.org,2002:seq',\n resolve(seq, onError) {\n if (!identity.isSeq(seq))\n onError('Expected a sequence for this tag');\n return seq;\n },\n createNode: (schema, obj, ctx) => YAMLSeq.YAMLSeq.from(schema, obj, ctx)\n};\n\nexports.seq = seq;\n","'use strict';\n\nvar stringifyString = require('../../stringify/stringifyString.js');\n\nconst string = {\n identify: value => typeof value === 'string',\n default: true,\n tag: 'tag:yaml.org,2002:str',\n resolve: str => str,\n stringify(item, ctx, onComment, onChompKeep) {\n ctx = Object.assign({ actualString: true }, ctx);\n return stringifyString.stringifyString(item, ctx, onComment, onChompKeep);\n }\n};\n\nexports.string = string;\n","'use strict';\n\nvar Scalar = require('../../nodes/Scalar.js');\n\nconst nullTag = {\n identify: value => value == null,\n createNode: () => new Scalar.Scalar(null),\n default: true,\n tag: 'tag:yaml.org,2002:null',\n test: /^(?:~|[Nn]ull|NULL)?$/,\n resolve: () => new Scalar.Scalar(null),\n stringify: ({ source }, ctx) => typeof source === 'string' && nullTag.test.test(source)\n ? source\n : ctx.options.nullStr\n};\n\nexports.nullTag = nullTag;\n","'use strict';\n\nvar Scalar = require('../../nodes/Scalar.js');\n\nconst boolTag = {\n identify: value => typeof value === 'boolean',\n default: true,\n tag: 'tag:yaml.org,2002:bool',\n test: /^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,\n resolve: str => new Scalar.Scalar(str[0] === 't' || str[0] === 'T'),\n stringify({ source, value }, ctx) {\n if (source && boolTag.test.test(source)) {\n const sv = source[0] === 't' || source[0] === 'T';\n if (value === sv)\n return source;\n }\n return value ? ctx.options.trueStr : ctx.options.falseStr;\n }\n};\n\nexports.boolTag = boolTag;\n","'use strict';\n\nfunction stringifyNumber({ format, minFractionDigits, tag, value }) {\n if (typeof value === 'bigint')\n return String(value);\n const num = typeof value === 'number' ? value : Number(value);\n if (!isFinite(num))\n return isNaN(num) ? '.nan' : num < 0 ? '-.inf' : '.inf';\n let n = Object.is(value, -0) ? '-0' : JSON.stringify(value);\n if (!format &&\n minFractionDigits &&\n (!tag || tag === 'tag:yaml.org,2002:float') &&\n /^-?\\d/.test(n) &&\n !n.includes('e')) {\n let i = n.indexOf('.');\n if (i < 0) {\n i = n.length;\n n += '.';\n }\n let d = minFractionDigits - (n.length - i - 1);\n while (d-- > 0)\n n += '0';\n }\n return n;\n}\n\nexports.stringifyNumber = stringifyNumber;\n","'use strict';\n\nvar Scalar = require('../../nodes/Scalar.js');\nvar stringifyNumber = require('../../stringify/stringifyNumber.js');\n\nconst floatNaN = {\n identify: value => typeof value === 'number',\n default: true,\n tag: 'tag:yaml.org,2002:float',\n test: /^(?:[-+]?\\.(?:inf|Inf|INF)|\\.nan|\\.NaN|\\.NAN)$/,\n resolve: str => str.slice(-3).toLowerCase() === 'nan'\n ? NaN\n : str[0] === '-'\n ? Number.NEGATIVE_INFINITY\n : Number.POSITIVE_INFINITY,\n stringify: stringifyNumber.stringifyNumber\n};\nconst floatExp = {\n identify: value => typeof value === 'number',\n default: true,\n tag: 'tag:yaml.org,2002:float',\n format: 'EXP',\n test: /^[-+]?(?:\\.[0-9]+|[0-9]+(?:\\.[0-9]*)?)[eE][-+]?[0-9]+$/,\n resolve: str => parseFloat(str),\n stringify(node) {\n const num = Number(node.value);\n return isFinite(num) ? num.toExponential() : stringifyNumber.stringifyNumber(node);\n }\n};\nconst float = {\n identify: value => typeof value === 'number',\n default: true,\n tag: 'tag:yaml.org,2002:float',\n test: /^[-+]?(?:\\.[0-9]+|[0-9]+\\.[0-9]*)$/,\n resolve(str) {\n const node = new Scalar.Scalar(parseFloat(str));\n const dot = str.indexOf('.');\n if (dot !== -1 && str[str.length - 1] === '0')\n node.minFractionDigits = str.length - dot - 1;\n return node;\n },\n stringify: stringifyNumber.stringifyNumber\n};\n\nexports.float = float;\nexports.floatExp = floatExp;\nexports.floatNaN = floatNaN;\n","'use strict';\n\nvar stringifyNumber = require('../../stringify/stringifyNumber.js');\n\nconst intIdentify = (value) => typeof value === 'bigint' || Number.isInteger(value);\nconst intResolve = (str, offset, radix, { intAsBigInt }) => (intAsBigInt ? BigInt(str) : parseInt(str.substring(offset), radix));\nfunction intStringify(node, radix, prefix) {\n const { value } = node;\n if (intIdentify(value) && value >= 0)\n return prefix + value.toString(radix);\n return stringifyNumber.stringifyNumber(node);\n}\nconst intOct = {\n identify: value => intIdentify(value) && value >= 0,\n default: true,\n tag: 'tag:yaml.org,2002:int',\n format: 'OCT',\n test: /^0o[0-7]+$/,\n resolve: (str, _onError, opt) => intResolve(str, 2, 8, opt),\n stringify: node => intStringify(node, 8, '0o')\n};\nconst int = {\n identify: intIdentify,\n default: true,\n tag: 'tag:yaml.org,2002:int',\n test: /^[-+]?[0-9]+$/,\n resolve: (str, _onError, opt) => intResolve(str, 0, 10, opt),\n stringify: stringifyNumber.stringifyNumber\n};\nconst intHex = {\n identify: value => intIdentify(value) && value >= 0,\n default: true,\n tag: 'tag:yaml.org,2002:int',\n format: 'HEX',\n test: /^0x[0-9a-fA-F]+$/,\n resolve: (str, _onError, opt) => intResolve(str, 2, 16, opt),\n stringify: node => intStringify(node, 16, '0x')\n};\n\nexports.int = int;\nexports.intHex = intHex;\nexports.intOct = intOct;\n","'use strict';\n\nvar map = require('../common/map.js');\nvar _null = require('../common/null.js');\nvar seq = require('../common/seq.js');\nvar string = require('../common/string.js');\nvar bool = require('./bool.js');\nvar float = require('./float.js');\nvar int = require('./int.js');\n\nconst schema = [\n map.map,\n seq.seq,\n string.string,\n _null.nullTag,\n bool.boolTag,\n int.intOct,\n int.int,\n int.intHex,\n float.floatNaN,\n float.floatExp,\n float.float\n];\n\nexports.schema = schema;\n","'use strict';\n\nvar Scalar = require('../../nodes/Scalar.js');\nvar map = require('../common/map.js');\nvar seq = require('../common/seq.js');\n\nfunction intIdentify(value) {\n return typeof value === 'bigint' || Number.isInteger(value);\n}\nconst stringifyJSON = ({ value }) => JSON.stringify(value);\nconst jsonScalars = [\n {\n identify: value => typeof value === 'string',\n default: true,\n tag: 'tag:yaml.org,2002:str',\n resolve: str => str,\n stringify: stringifyJSON\n },\n {\n identify: value => value == null,\n createNode: () => new Scalar.Scalar(null),\n default: true,\n tag: 'tag:yaml.org,2002:null',\n test: /^null$/,\n resolve: () => null,\n stringify: stringifyJSON\n },\n {\n identify: value => typeof value === 'boolean',\n default: true,\n tag: 'tag:yaml.org,2002:bool',\n test: /^true$|^false$/,\n resolve: str => str === 'true',\n stringify: stringifyJSON\n },\n {\n identify: intIdentify,\n default: true,\n tag: 'tag:yaml.org,2002:int',\n test: /^-?(?:0|[1-9][0-9]*)$/,\n resolve: (str, _onError, { intAsBigInt }) => intAsBigInt ? BigInt(str) : parseInt(str, 10),\n stringify: ({ value }) => intIdentify(value) ? value.toString() : JSON.stringify(value)\n },\n {\n identify: value => typeof value === 'number',\n default: true,\n tag: 'tag:yaml.org,2002:float',\n test: /^-?(?:0|[1-9][0-9]*)(?:\\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,\n resolve: str => parseFloat(str),\n stringify: stringifyJSON\n }\n];\nconst jsonError = {\n default: true,\n tag: '',\n test: /^/,\n resolve(str, onError) {\n onError(`Unresolved plain scalar ${JSON.stringify(str)}`);\n return str;\n }\n};\nconst schema = [map.map, seq.seq].concat(jsonScalars, jsonError);\n\nexports.schema = schema;\n","'use strict';\n\nvar node_buffer = require('buffer');\nvar Scalar = require('../../nodes/Scalar.js');\nvar stringifyString = require('../../stringify/stringifyString.js');\n\nconst binary = {\n identify: value => value instanceof Uint8Array, // Buffer inherits from Uint8Array\n default: false,\n tag: 'tag:yaml.org,2002:binary',\n /**\n * Returns a Buffer in node and an Uint8Array in browsers\n *\n * To use the resulting buffer as an image, you'll want to do something like:\n *\n * const blob = new Blob([buffer], { type: 'image/jpeg' })\n * document.querySelector('#photo').src = URL.createObjectURL(blob)\n */\n resolve(src, onError) {\n if (typeof node_buffer.Buffer === 'function') {\n return node_buffer.Buffer.from(src, 'base64');\n }\n else if (typeof atob === 'function') {\n // On IE 11, atob() can't handle newlines\n const str = atob(src.replace(/[\\n\\r]/g, ''));\n const buffer = new Uint8Array(str.length);\n for (let i = 0; i < str.length; ++i)\n buffer[i] = str.charCodeAt(i);\n return buffer;\n }\n else {\n onError('This environment does not support reading binary tags; either Buffer or atob is required');\n return src;\n }\n },\n stringify({ comment, type, value }, ctx, onComment, onChompKeep) {\n if (!value)\n return '';\n const buf = value; // checked earlier by binary.identify()\n let str;\n if (typeof node_buffer.Buffer === 'function') {\n str =\n buf instanceof node_buffer.Buffer\n ? buf.toString('base64')\n : node_buffer.Buffer.from(buf.buffer).toString('base64');\n }\n else if (typeof btoa === 'function') {\n let s = '';\n for (let i = 0; i < buf.length; ++i)\n s += String.fromCharCode(buf[i]);\n str = btoa(s);\n }\n else {\n throw new Error('This environment does not support writing binary tags; either Buffer or btoa is required');\n }\n type ?? (type = Scalar.Scalar.BLOCK_LITERAL);\n if (type !== Scalar.Scalar.QUOTE_DOUBLE) {\n const lineWidth = Math.max(ctx.options.lineWidth - ctx.indent.length, ctx.options.minContentWidth);\n const n = Math.ceil(str.length / lineWidth);\n const lines = new Array(n);\n for (let i = 0, o = 0; i < n; ++i, o += lineWidth) {\n lines[i] = str.substr(o, lineWidth);\n }\n str = lines.join(type === Scalar.Scalar.BLOCK_LITERAL ? '\\n' : ' ');\n }\n return stringifyString.stringifyString({ comment, type, value: str }, ctx, onComment, onChompKeep);\n }\n};\n\nexports.binary = binary;\n","'use strict';\n\nvar identity = require('../../nodes/identity.js');\nvar Pair = require('../../nodes/Pair.js');\nvar Scalar = require('../../nodes/Scalar.js');\nvar YAMLSeq = require('../../nodes/YAMLSeq.js');\n\nfunction resolvePairs(seq, onError) {\n if (identity.isSeq(seq)) {\n for (let i = 0; i < seq.items.length; ++i) {\n let item = seq.items[i];\n if (identity.isPair(item))\n continue;\n else if (identity.isMap(item)) {\n if (item.items.length > 1)\n onError('Each pair must have its own sequence indicator');\n const pair = item.items[0] || new Pair.Pair(new Scalar.Scalar(null));\n if (item.commentBefore)\n pair.key.commentBefore = pair.key.commentBefore\n ? `${item.commentBefore}\\n${pair.key.commentBefore}`\n : item.commentBefore;\n if (item.comment) {\n const cn = pair.value ?? pair.key;\n cn.comment = cn.comment\n ? `${item.comment}\\n${cn.comment}`\n : item.comment;\n }\n item = pair;\n }\n seq.items[i] = identity.isPair(item) ? item : new Pair.Pair(item);\n }\n }\n else\n onError('Expected a sequence for this tag');\n return seq;\n}\nfunction createPairs(schema, iterable, ctx) {\n const { replacer } = ctx;\n const pairs = new YAMLSeq.YAMLSeq(schema);\n pairs.tag = 'tag:yaml.org,2002:pairs';\n let i = 0;\n if (iterable && Symbol.iterator in Object(iterable))\n for (let it of iterable) {\n if (typeof replacer === 'function')\n it = replacer.call(iterable, String(i++), it);\n let key, value;\n if (Array.isArray(it)) {\n if (it.length === 2) {\n key = it[0];\n value = it[1];\n }\n else\n throw new TypeError(`Expected [key, value] tuple: ${it}`);\n }\n else if (it && it instanceof Object) {\n const keys = Object.keys(it);\n if (keys.length === 1) {\n key = keys[0];\n value = it[key];\n }\n else {\n throw new TypeError(`Expected tuple with one key, not ${keys.length} keys`);\n }\n }\n else {\n key = it;\n }\n pairs.items.push(Pair.createPair(key, value, ctx));\n }\n return pairs;\n}\nconst pairs = {\n collection: 'seq',\n default: false,\n tag: 'tag:yaml.org,2002:pairs',\n resolve: resolvePairs,\n createNode: createPairs\n};\n\nexports.createPairs = createPairs;\nexports.pairs = pairs;\nexports.resolvePairs = resolvePairs;\n","'use strict';\n\nvar identity = require('../../nodes/identity.js');\nvar toJS = require('../../nodes/toJS.js');\nvar YAMLMap = require('../../nodes/YAMLMap.js');\nvar YAMLSeq = require('../../nodes/YAMLSeq.js');\nvar pairs = require('./pairs.js');\n\nclass YAMLOMap extends YAMLSeq.YAMLSeq {\n constructor() {\n super();\n this.add = YAMLMap.YAMLMap.prototype.add.bind(this);\n this.delete = YAMLMap.YAMLMap.prototype.delete.bind(this);\n this.get = YAMLMap.YAMLMap.prototype.get.bind(this);\n this.has = YAMLMap.YAMLMap.prototype.has.bind(this);\n this.set = YAMLMap.YAMLMap.prototype.set.bind(this);\n this.tag = YAMLOMap.tag;\n }\n /**\n * If `ctx` is given, the return type is actually `Map<unknown, unknown>`,\n * but TypeScript won't allow widening the signature of a child method.\n */\n toJSON(_, ctx) {\n if (!ctx)\n return super.toJSON(_);\n const map = new Map();\n if (ctx?.onCreate)\n ctx.onCreate(map);\n for (const pair of this.items) {\n let key, value;\n if (identity.isPair(pair)) {\n key = toJS.toJS(pair.key, '', ctx);\n value = toJS.toJS(pair.value, key, ctx);\n }\n else {\n key = toJS.toJS(pair, '', ctx);\n }\n if (map.has(key))\n throw new Error('Ordered maps must not include duplicate keys');\n map.set(key, value);\n }\n return map;\n }\n static from(schema, iterable, ctx) {\n const pairs$1 = pairs.createPairs(schema, iterable, ctx);\n const omap = new this();\n omap.items = pairs$1.items;\n return omap;\n }\n}\nYAMLOMap.tag = 'tag:yaml.org,2002:omap';\nconst omap = {\n collection: 'seq',\n identify: value => value instanceof Map,\n nodeClass: YAMLOMap,\n default: false,\n tag: 'tag:yaml.org,2002:omap',\n resolve(seq, onError) {\n const pairs$1 = pairs.resolvePairs(seq, onError);\n const seenKeys = [];\n for (const { key } of pairs$1.items) {\n if (identity.isScalar(key)) {\n if (seenKeys.includes(key.value)) {\n onError(`Ordered maps must not include duplicate keys: ${key.value}`);\n }\n else {\n seenKeys.push(key.value);\n }\n }\n }\n return Object.assign(new YAMLOMap(), pairs$1);\n },\n createNode: (schema, iterable, ctx) => YAMLOMap.from(schema, iterable, ctx)\n};\n\nexports.YAMLOMap = YAMLOMap;\nexports.omap = omap;\n","'use strict';\n\nvar Scalar = require('../../nodes/Scalar.js');\n\nfunction boolStringify({ value, source }, ctx) {\n const boolObj = value ? trueTag : falseTag;\n if (source && boolObj.test.test(source))\n return source;\n return value ? ctx.options.trueStr : ctx.options.falseStr;\n}\nconst trueTag = {\n identify: value => value === true,\n default: true,\n tag: 'tag:yaml.org,2002:bool',\n test: /^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,\n resolve: () => new Scalar.Scalar(true),\n stringify: boolStringify\n};\nconst falseTag = {\n identify: value => value === false,\n default: true,\n tag: 'tag:yaml.org,2002:bool',\n test: /^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/,\n resolve: () => new Scalar.Scalar(false),\n stringify: boolStringify\n};\n\nexports.falseTag = falseTag;\nexports.trueTag = trueTag;\n","'use strict';\n\nvar Scalar = require('../../nodes/Scalar.js');\nvar stringifyNumber = require('../../stringify/stringifyNumber.js');\n\nconst floatNaN = {\n identify: value => typeof value === 'number',\n default: true,\n tag: 'tag:yaml.org,2002:float',\n test: /^(?:[-+]?\\.(?:inf|Inf|INF)|\\.nan|\\.NaN|\\.NAN)$/,\n resolve: (str) => str.slice(-3).toLowerCase() === 'nan'\n ? NaN\n : str[0] === '-'\n ? Number.NEGATIVE_INFINITY\n : Number.POSITIVE_INFINITY,\n stringify: stringifyNumber.stringifyNumber\n};\nconst floatExp = {\n identify: value => typeof value === 'number',\n default: true,\n tag: 'tag:yaml.org,2002:float',\n format: 'EXP',\n test: /^[-+]?(?:[0-9][0-9_]*)?(?:\\.[0-9_]*)?[eE][-+]?[0-9]+$/,\n resolve: (str) => parseFloat(str.replace(/_/g, '')),\n stringify(node) {\n const num = Number(node.value);\n return isFinite(num) ? num.toExponential() : stringifyNumber.stringifyNumber(node);\n }\n};\nconst float = {\n identify: value => typeof value === 'number',\n default: true,\n tag: 'tag:yaml.org,2002:float',\n test: /^[-+]?(?:[0-9][0-9_]*)?\\.[0-9_]*$/,\n resolve(str) {\n const node = new Scalar.Scalar(parseFloat(str.replace(/_/g, '')));\n const dot = str.indexOf('.');\n if (dot !== -1) {\n const f = str.substring(dot + 1).replace(/_/g, '');\n if (f[f.length - 1] === '0')\n node.minFractionDigits = f.length;\n }\n return node;\n },\n stringify: stringifyNumber.stringifyNumber\n};\n\nexports.float = float;\nexports.floatExp = floatExp;\nexports.floatNaN = floatNaN;\n","'use strict';\n\nvar stringifyNumber = require('../../stringify/stringifyNumber.js');\n\nconst intIdentify = (value) => typeof value === 'bigint' || Number.isInteger(value);\nfunction intResolve(str, offset, radix, { intAsBigInt }) {\n const sign = str[0];\n if (sign === '-' || sign === '+')\n offset += 1;\n str = str.substring(offset).replace(/_/g, '');\n if (intAsBigInt) {\n switch (radix) {\n case 2:\n str = `0b${str}`;\n break;\n case 8:\n str = `0o${str}`;\n break;\n case 16:\n str = `0x${str}`;\n break;\n }\n const n = BigInt(str);\n return sign === '-' ? BigInt(-1) * n : n;\n }\n const n = parseInt(str, radix);\n return sign === '-' ? -1 * n : n;\n}\nfunction intStringify(node, radix, prefix) {\n const { value } = node;\n if (intIdentify(value)) {\n const str = value.toString(radix);\n return value < 0 ? '-' + prefix + str.substr(1) : prefix + str;\n }\n return stringifyNumber.stringifyNumber(node);\n}\nconst intBin = {\n identify: intIdentify,\n default: true,\n tag: 'tag:yaml.org,2002:int',\n format: 'BIN',\n test: /^[-+]?0b[0-1_]+$/,\n resolve: (str, _onError, opt) => intResolve(str, 2, 2, opt),\n stringify: node => intStringify(node, 2, '0b')\n};\nconst intOct = {\n identify: intIdentify,\n default: true,\n tag: 'tag:yaml.org,2002:int',\n format: 'OCT',\n test: /^[-+]?0[0-7_]+$/,\n resolve: (str, _onError, opt) => intResolve(str, 1, 8, opt),\n stringify: node => intStringify(node, 8, '0')\n};\nconst int = {\n identify: intIdentify,\n default: true,\n tag: 'tag:yaml.org,2002:int',\n test: /^[-+]?[0-9][0-9_]*$/,\n resolve: (str, _onError, opt) => intResolve(str, 0, 10, opt),\n stringify: stringifyNumber.stringifyNumber\n};\nconst intHex = {\n identify: intIdentify,\n default: true,\n tag: 'tag:yaml.org,2002:int',\n format: 'HEX',\n test: /^[-+]?0x[0-9a-fA-F_]+$/,\n resolve: (str, _onError, opt) => intResolve(str, 2, 16, opt),\n stringify: node => intStringify(node, 16, '0x')\n};\n\nexports.int = int;\nexports.intBin = intBin;\nexports.intHex = intHex;\nexports.intOct = intOct;\n","'use strict';\n\nvar identity = require('../../nodes/identity.js');\nvar Pair = require('../../nodes/Pair.js');\nvar YAMLMap = require('../../nodes/YAMLMap.js');\n\nclass YAMLSet extends YAMLMap.YAMLMap {\n constructor(schema) {\n super(schema);\n this.tag = YAMLSet.tag;\n }\n add(key) {\n let pair;\n if (identity.isPair(key))\n pair = key;\n else if (key &&\n typeof key === 'object' &&\n 'key' in key &&\n 'value' in key &&\n key.value === null)\n pair = new Pair.Pair(key.key, null);\n else\n pair = new Pair.Pair(key, null);\n const prev = YAMLMap.findPair(this.items, pair.key);\n if (!prev)\n this.items.push(pair);\n }\n /**\n * If `keepPair` is `true`, returns the Pair matching `key`.\n * Otherwise, returns the value of that Pair's key.\n */\n get(key, keepPair) {\n const pair = YAMLMap.findPair(this.items, key);\n return !keepPair && identity.isPair(pair)\n ? identity.isScalar(pair.key)\n ? pair.key.value\n : pair.key\n : pair;\n }\n set(key, value) {\n if (typeof value !== 'boolean')\n throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof value}`);\n const prev = YAMLMap.findPair(this.items, key);\n if (prev && !value) {\n this.items.splice(this.items.indexOf(prev), 1);\n }\n else if (!prev && value) {\n this.items.push(new Pair.Pair(key));\n }\n }\n toJSON(_, ctx) {\n return super.toJSON(_, ctx, Set);\n }\n toString(ctx, onComment, onChompKeep) {\n if (!ctx)\n return JSON.stringify(this);\n if (this.hasAllNullValues(true))\n return super.toString(Object.assign({}, ctx, { allNullValues: true }), onComment, onChompKeep);\n else\n throw new Error('Set items must all have null values');\n }\n static from(schema, iterable, ctx) {\n const { replacer } = ctx;\n const set = new this(schema);\n if (iterable && Symbol.iterator in Object(iterable))\n for (let value of iterable) {\n if (typeof replacer === 'function')\n value = replacer.call(iterable, value, value);\n set.items.push(Pair.createPair(value, null, ctx));\n }\n return set;\n }\n}\nYAMLSet.tag = 'tag:yaml.org,2002:set';\nconst set = {\n collection: 'map',\n identify: value => value instanceof Set,\n nodeClass: YAMLSet,\n default: false,\n tag: 'tag:yaml.org,2002:set',\n createNode: (schema, iterable, ctx) => YAMLSet.from(schema, iterable, ctx),\n resolve(map, onError) {\n if (identity.isMap(map)) {\n if (map.hasAllNullValues(true))\n return Object.assign(new YAMLSet(), map);\n else\n onError('Set items must all have null values');\n }\n else\n onError('Expected a mapping for this tag');\n return map;\n }\n};\n\nexports.YAMLSet = YAMLSet;\nexports.set = set;\n","'use strict';\n\nvar stringifyNumber = require('../../stringify/stringifyNumber.js');\n\n/** Internal types handle bigint as number, because TS can't figure it out. */\nfunction parseSexagesimal(str, asBigInt) {\n const sign = str[0];\n const parts = sign === '-' || sign === '+' ? str.substring(1) : str;\n const num = (n) => asBigInt ? BigInt(n) : Number(n);\n const res = parts\n .replace(/_/g, '')\n .split(':')\n .reduce((res, p) => res * num(60) + num(p), num(0));\n return (sign === '-' ? num(-1) * res : res);\n}\n/**\n * hhhh:mm:ss.sss\n *\n * Internal types handle bigint as number, because TS can't figure it out.\n */\nfunction stringifySexagesimal(node) {\n let { value } = node;\n let num = (n) => n;\n if (typeof value === 'bigint')\n num = n => BigInt(n);\n else if (isNaN(value) || !isFinite(value))\n return stringifyNumber.stringifyNumber(node);\n let sign = '';\n if (value < 0) {\n sign = '-';\n value *= num(-1);\n }\n const _60 = num(60);\n const parts = [value % _60]; // seconds, including ms\n if (value < 60) {\n parts.unshift(0); // at least one : is required\n }\n else {\n value = (value - parts[0]) / _60;\n parts.unshift(value % _60); // minutes\n if (value >= 60) {\n value = (value - parts[0]) / _60;\n parts.unshift(value); // hours\n }\n }\n return (sign +\n parts\n .map(n => String(n).padStart(2, '0'))\n .join(':')\n .replace(/000000\\d*$/, '') // % 60 may introduce error\n );\n}\nconst intTime = {\n identify: value => typeof value === 'bigint' || Number.isInteger(value),\n default: true,\n tag: 'tag:yaml.org,2002:int',\n format: 'TIME',\n test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/,\n resolve: (str, _onError, { intAsBigInt }) => parseSexagesimal(str, intAsBigInt),\n stringify: stringifySexagesimal\n};\nconst floatTime = {\n identify: value => typeof value === 'number',\n default: true,\n tag: 'tag:yaml.org,2002:float',\n format: 'TIME',\n test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*$/,\n resolve: str => parseSexagesimal(str, false),\n stringify: stringifySexagesimal\n};\nconst timestamp = {\n identify: value => value instanceof Date,\n default: true,\n tag: 'tag:yaml.org,2002:timestamp',\n // If the time zone is omitted, the timestamp is assumed to be specified in UTC. The time part\n // may be omitted altogether, resulting in a date format. In such a case, the time part is\n // assumed to be 00:00:00Z (start of day, UTC).\n test: RegExp('^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})' + // YYYY-Mm-Dd\n '(?:' + // time is optional\n '(?:t|T|[ \\\\t]+)' + // t | T | whitespace\n '([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\\\.[0-9]+)?)' + // Hh:Mm:Ss(.ss)?\n '(?:[ \\\\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?' + // Z | +5 | -03:30\n ')?$'),\n resolve(str) {\n const match = str.match(timestamp.test);\n if (!match)\n throw new Error('!!timestamp expects a date, starting with yyyy-mm-dd');\n const [, year, month, day, hour, minute, second] = match.map(Number);\n const millisec = match[7] ? Number((match[7] + '00').substr(1, 3)) : 0;\n let date = Date.UTC(year, month - 1, day, hour || 0, minute || 0, second || 0, millisec);\n const tz = match[8];\n if (tz && tz !== 'Z') {\n let d = parseSexagesimal(tz, false);\n if (Math.abs(d) < 30)\n d *= 60;\n date -= 60000 * d;\n }\n return new Date(date);\n },\n stringify: ({ value }) => value?.toISOString().replace(/(T00:00:00)?\\.000Z$/, '') ?? ''\n};\n\nexports.floatTime = floatTime;\nexports.intTime = intTime;\nexports.timestamp = timestamp;\n","'use strict';\n\nvar map = require('../common/map.js');\nvar _null = require('../common/null.js');\nvar seq = require('../common/seq.js');\nvar string = require('../common/string.js');\nvar binary = require('./binary.js');\nvar bool = require('./bool.js');\nvar float = require('./float.js');\nvar int = require('./int.js');\nvar merge = require('./merge.js');\nvar omap = require('./omap.js');\nvar pairs = require('./pairs.js');\nvar set = require('./set.js');\nvar timestamp = require('./timestamp.js');\n\nconst schema = [\n map.map,\n seq.seq,\n string.string,\n _null.nullTag,\n bool.trueTag,\n bool.falseTag,\n int.intBin,\n int.intOct,\n int.int,\n int.intHex,\n float.floatNaN,\n float.floatExp,\n float.float,\n binary.binary,\n merge.merge,\n omap.omap,\n pairs.pairs,\n set.set,\n timestamp.intTime,\n timestamp.floatTime,\n timestamp.timestamp\n];\n\nexports.schema = schema;\n","'use strict';\n\nvar map = require('./common/map.js');\nvar _null = require('./common/null.js');\nvar seq = require('./common/seq.js');\nvar string = require('./common/string.js');\nvar bool = require('./core/bool.js');\nvar float = require('./core/float.js');\nvar int = require('./core/int.js');\nvar schema = require('./core/schema.js');\nvar schema$1 = require('./json/schema.js');\nvar binary = require('./yaml-1.1/binary.js');\nvar merge = require('./yaml-1.1/merge.js');\nvar omap = require('./yaml-1.1/omap.js');\nvar pairs = require('./yaml-1.1/pairs.js');\nvar schema$2 = require('./yaml-1.1/schema.js');\nvar set = require('./yaml-1.1/set.js');\nvar timestamp = require('./yaml-1.1/timestamp.js');\n\nconst schemas = new Map([\n ['core', schema.schema],\n ['failsafe', [map.map, seq.seq, string.string]],\n ['json', schema$1.schema],\n ['yaml11', schema$2.schema],\n ['yaml-1.1', schema$2.schema]\n]);\nconst tagsByName = {\n binary: binary.binary,\n bool: bool.boolTag,\n float: float.float,\n floatExp: float.floatExp,\n floatNaN: float.floatNaN,\n floatTime: timestamp.floatTime,\n int: int.int,\n intHex: int.intHex,\n intOct: int.intOct,\n intTime: timestamp.intTime,\n map: map.map,\n merge: merge.merge,\n null: _null.nullTag,\n omap: omap.omap,\n pairs: pairs.pairs,\n seq: seq.seq,\n set: set.set,\n timestamp: timestamp.timestamp\n};\nconst coreKnownTags = {\n 'tag:yaml.org,2002:binary': binary.binary,\n 'tag:yaml.org,2002:merge': merge.merge,\n 'tag:yaml.org,2002:omap': omap.omap,\n 'tag:yaml.org,2002:pairs': pairs.pairs,\n 'tag:yaml.org,2002:set': set.set,\n 'tag:yaml.org,2002:timestamp': timestamp.timestamp\n};\nfunction getTags(customTags, schemaName, addMergeTag) {\n const schemaTags = schemas.get(schemaName);\n if (schemaTags && !customTags) {\n return addMergeTag && !schemaTags.includes(merge.merge)\n ? schemaTags.concat(merge.merge)\n : schemaTags.slice();\n }\n let tags = schemaTags;\n if (!tags) {\n if (Array.isArray(customTags))\n tags = [];\n else {\n const keys = Array.from(schemas.keys())\n .filter(key => key !== 'yaml11')\n .map(key => JSON.stringify(key))\n .join(', ');\n throw new Error(`Unknown schema \"${schemaName}\"; use one of ${keys} or define customTags array`);\n }\n }\n if (Array.isArray(customTags)) {\n for (const tag of customTags)\n tags = tags.concat(tag);\n }\n else if (typeof customTags === 'function') {\n tags = customTags(tags.slice());\n }\n if (addMergeTag)\n tags = tags.concat(merge.merge);\n return tags.reduce((tags, tag) => {\n const tagObj = typeof tag === 'string' ? tagsByName[tag] : tag;\n if (!tagObj) {\n const tagName = JSON.stringify(tag);\n const keys = Object.keys(tagsByName)\n .map(key => JSON.stringify(key))\n .join(', ');\n throw new Error(`Unknown custom tag ${tagName}; use one of ${keys}`);\n }\n if (!tags.includes(tagObj))\n tags.push(tagObj);\n return tags;\n }, []);\n}\n\nexports.coreKnownTags = coreKnownTags;\nexports.getTags = getTags;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar map = require('./common/map.js');\nvar seq = require('./common/seq.js');\nvar string = require('./common/string.js');\nvar tags = require('./tags.js');\n\nconst sortMapEntriesByKey = (a, b) => a.key < b.key ? -1 : a.key > b.key ? 1 : 0;\nclass Schema {\n constructor({ compat, customTags, merge, resolveKnownTags, schema, sortMapEntries, toStringDefaults }) {\n this.compat = Array.isArray(compat)\n ? tags.getTags(compat, 'compat')\n : compat\n ? tags.getTags(null, compat)\n : null;\n this.name = (typeof schema === 'string' && schema) || 'core';\n this.knownTags = resolveKnownTags ? tags.coreKnownTags : {};\n this.tags = tags.getTags(customTags, this.name, merge);\n this.toStringOptions = toStringDefaults ?? null;\n Object.defineProperty(this, identity.MAP, { value: map.map });\n Object.defineProperty(this, identity.SCALAR, { value: string.string });\n Object.defineProperty(this, identity.SEQ, { value: seq.seq });\n // Used by createMap()\n this.sortMapEntries =\n typeof sortMapEntries === 'function'\n ? sortMapEntries\n : sortMapEntries === true\n ? sortMapEntriesByKey\n : null;\n }\n clone() {\n const copy = Object.create(Schema.prototype, Object.getOwnPropertyDescriptors(this));\n copy.tags = this.tags.slice();\n return copy;\n }\n}\n\nexports.Schema = Schema;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar stringify = require('./stringify.js');\nvar stringifyComment = require('./stringifyComment.js');\n\nfunction stringifyDocument(doc, options) {\n const lines = [];\n let hasDirectives = options.directives === true;\n if (options.directives !== false && doc.directives) {\n const dir = doc.directives.toString(doc);\n if (dir) {\n lines.push(dir);\n hasDirectives = true;\n }\n else if (doc.directives.docStart)\n hasDirectives = true;\n }\n if (hasDirectives)\n lines.push('---');\n const ctx = stringify.createStringifyContext(doc, options);\n const { commentString } = ctx.options;\n if (doc.commentBefore) {\n if (lines.length !== 1)\n lines.unshift('');\n const cs = commentString(doc.commentBefore);\n lines.unshift(stringifyComment.indentComment(cs, ''));\n }\n let chompKeep = false;\n let contentComment = null;\n if (doc.contents) {\n if (identity.isNode(doc.contents)) {\n if (doc.contents.spaceBefore && hasDirectives)\n lines.push('');\n if (doc.contents.commentBefore) {\n const cs = commentString(doc.contents.commentBefore);\n lines.push(stringifyComment.indentComment(cs, ''));\n }\n // top-level block scalars need to be indented if followed by a comment\n ctx.forceBlockIndent = !!doc.comment;\n contentComment = doc.contents.comment;\n }\n const onChompKeep = contentComment ? undefined : () => (chompKeep = true);\n let body = stringify.stringify(doc.contents, ctx, () => (contentComment = null), onChompKeep);\n if (contentComment)\n body += stringifyComment.lineComment(body, '', commentString(contentComment));\n if ((body[0] === '|' || body[0] === '>') &&\n lines[lines.length - 1] === '---') {\n // Top-level block scalars with a preceding doc marker ought to use the\n // same line for their header.\n lines[lines.length - 1] = `--- ${body}`;\n }\n else\n lines.push(body);\n }\n else {\n lines.push(stringify.stringify(doc.contents, ctx));\n }\n if (doc.directives?.docEnd) {\n if (doc.comment) {\n const cs = commentString(doc.comment);\n if (cs.includes('\\n')) {\n lines.push('...');\n lines.push(stringifyComment.indentComment(cs, ''));\n }\n else {\n lines.push(`... ${cs}`);\n }\n }\n else {\n lines.push('...');\n }\n }\n else {\n let dc = doc.comment;\n if (dc && chompKeep)\n dc = dc.replace(/^\\n+/, '');\n if (dc) {\n if ((!chompKeep || contentComment) && lines[lines.length - 1] !== '')\n lines.push('');\n lines.push(stringifyComment.indentComment(commentString(dc), ''));\n }\n }\n return lines.join('\\n') + '\\n';\n}\n\nexports.stringifyDocument = stringifyDocument;\n","'use strict';\n\nvar Alias = require('../nodes/Alias.js');\nvar Collection = require('../nodes/Collection.js');\nvar identity = require('../nodes/identity.js');\nvar Pair = require('../nodes/Pair.js');\nvar toJS = require('../nodes/toJS.js');\nvar Schema = require('../schema/Schema.js');\nvar stringifyDocument = require('../stringify/stringifyDocument.js');\nvar anchors = require('./anchors.js');\nvar applyReviver = require('./applyReviver.js');\nvar createNode = require('./createNode.js');\nvar directives = require('./directives.js');\n\nclass Document {\n constructor(value, replacer, options) {\n /** A comment before this Document */\n this.commentBefore = null;\n /** A comment immediately after this Document */\n this.comment = null;\n /** Errors encountered during parsing. */\n this.errors = [];\n /** Warnings encountered during parsing. */\n this.warnings = [];\n Object.defineProperty(this, identity.NODE_TYPE, { value: identity.DOC });\n let _replacer = null;\n if (typeof replacer === 'function' || Array.isArray(replacer)) {\n _replacer = replacer;\n }\n else if (options === undefined && replacer) {\n options = replacer;\n replacer = undefined;\n }\n const opt = Object.assign({\n intAsBigInt: false,\n keepSourceTokens: false,\n logLevel: 'warn',\n prettyErrors: true,\n strict: true,\n stringKeys: false,\n uniqueKeys: true,\n version: '1.2'\n }, options);\n this.options = opt;\n let { version } = opt;\n if (options?._directives) {\n this.directives = options._directives.atDocument();\n if (this.directives.yaml.explicit)\n version = this.directives.yaml.version;\n }\n else\n this.directives = new directives.Directives({ version });\n this.setSchema(version, options);\n // @ts-expect-error We can't really know that this matches Contents.\n this.contents =\n value === undefined ? null : this.createNode(value, _replacer, options);\n }\n /**\n * Create a deep copy of this Document and its contents.\n *\n * Custom Node values that inherit from `Object` still refer to their original instances.\n */\n clone() {\n const copy = Object.create(Document.prototype, {\n [identity.NODE_TYPE]: { value: identity.DOC }\n });\n copy.commentBefore = this.commentBefore;\n copy.comment = this.comment;\n copy.errors = this.errors.slice();\n copy.warnings = this.warnings.slice();\n copy.options = Object.assign({}, this.options);\n if (this.directives)\n copy.directives = this.directives.clone();\n copy.schema = this.schema.clone();\n // @ts-expect-error We can't really know that this matches Contents.\n copy.contents = identity.isNode(this.contents)\n ? this.contents.clone(copy.schema)\n : this.contents;\n if (this.range)\n copy.range = this.range.slice();\n return copy;\n }\n /** Adds a value to the document. */\n add(value) {\n if (assertCollection(this.contents))\n this.contents.add(value);\n }\n /** Adds a value to the document. */\n addIn(path, value) {\n if (assertCollection(this.contents))\n this.contents.addIn(path, value);\n }\n /**\n * Create a new `Alias` node, ensuring that the target `node` has the required anchor.\n *\n * If `node` already has an anchor, `name` is ignored.\n * Otherwise, the `node.anchor` value will be set to `name`,\n * or if an anchor with that name is already present in the document,\n * `name` will be used as a prefix for a new unique anchor.\n * If `name` is undefined, the generated anchor will use 'a' as a prefix.\n */\n createAlias(node, name) {\n if (!node.anchor) {\n const prev = anchors.anchorNames(this);\n node.anchor =\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n !name || prev.has(name) ? anchors.findNewAnchor(name || 'a', prev) : name;\n }\n return new Alias.Alias(node.anchor);\n }\n createNode(value, replacer, options) {\n let _replacer = undefined;\n if (typeof replacer === 'function') {\n value = replacer.call({ '': value }, '', value);\n _replacer = replacer;\n }\n else if (Array.isArray(replacer)) {\n const keyToStr = (v) => typeof v === 'number' || v instanceof String || v instanceof Number;\n const asStr = replacer.filter(keyToStr).map(String);\n if (asStr.length > 0)\n replacer = replacer.concat(asStr);\n _replacer = replacer;\n }\n else if (options === undefined && replacer) {\n options = replacer;\n replacer = undefined;\n }\n const { aliasDuplicateObjects, anchorPrefix, flow, keepUndefined, onTagObj, tag } = options ?? {};\n const { onAnchor, setAnchors, sourceObjects } = anchors.createNodeAnchors(this, \n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n anchorPrefix || 'a');\n const ctx = {\n aliasDuplicateObjects: aliasDuplicateObjects ?? true,\n keepUndefined: keepUndefined ?? false,\n onAnchor,\n onTagObj,\n replacer: _replacer,\n schema: this.schema,\n sourceObjects\n };\n const node = createNode.createNode(value, tag, ctx);\n if (flow && identity.isCollection(node))\n node.flow = true;\n setAnchors();\n return node;\n }\n /**\n * Convert a key and a value into a `Pair` using the current schema,\n * recursively wrapping all values as `Scalar` or `Collection` nodes.\n */\n createPair(key, value, options = {}) {\n const k = this.createNode(key, null, options);\n const v = this.createNode(value, null, options);\n return new Pair.Pair(k, v);\n }\n /**\n * Removes a value from the document.\n * @returns `true` if the item was found and removed.\n */\n delete(key) {\n return assertCollection(this.contents) ? this.contents.delete(key) : false;\n }\n /**\n * Removes a value from the document.\n * @returns `true` if the item was found and removed.\n */\n deleteIn(path) {\n if (Collection.isEmptyPath(path)) {\n if (this.contents == null)\n return false;\n // @ts-expect-error Presumed impossible if Strict extends false\n this.contents = null;\n return true;\n }\n return assertCollection(this.contents)\n ? this.contents.deleteIn(path)\n : false;\n }\n /**\n * Returns item at `key`, or `undefined` if not found. By default unwraps\n * scalar values from their surrounding node; to disable set `keepScalar` to\n * `true` (collections are always returned intact).\n */\n get(key, keepScalar) {\n return identity.isCollection(this.contents)\n ? this.contents.get(key, keepScalar)\n : undefined;\n }\n /**\n * Returns item at `path`, or `undefined` if not found. By default unwraps\n * scalar values from their surrounding node; to disable set `keepScalar` to\n * `true` (collections are always returned intact).\n */\n getIn(path, keepScalar) {\n if (Collection.isEmptyPath(path))\n return !keepScalar && identity.isScalar(this.contents)\n ? this.contents.value\n : this.contents;\n return identity.isCollection(this.contents)\n ? this.contents.getIn(path, keepScalar)\n : undefined;\n }\n /**\n * Checks if the document includes a value with the key `key`.\n */\n has(key) {\n return identity.isCollection(this.contents) ? this.contents.has(key) : false;\n }\n /**\n * Checks if the document includes a value at `path`.\n */\n hasIn(path) {\n if (Collection.isEmptyPath(path))\n return this.contents !== undefined;\n return identity.isCollection(this.contents) ? this.contents.hasIn(path) : false;\n }\n /**\n * Sets a value in this document. For `!!set`, `value` needs to be a\n * boolean to add/remove the item from the set.\n */\n set(key, value) {\n if (this.contents == null) {\n // @ts-expect-error We can't really know that this matches Contents.\n this.contents = Collection.collectionFromPath(this.schema, [key], value);\n }\n else if (assertCollection(this.contents)) {\n this.contents.set(key, value);\n }\n }\n /**\n * Sets a value in this document. For `!!set`, `value` needs to be a\n * boolean to add/remove the item from the set.\n */\n setIn(path, value) {\n if (Collection.isEmptyPath(path)) {\n // @ts-expect-error We can't really know that this matches Contents.\n this.contents = value;\n }\n else if (this.contents == null) {\n // @ts-expect-error We can't really know that this matches Contents.\n this.contents = Collection.collectionFromPath(this.schema, Array.from(path), value);\n }\n else if (assertCollection(this.contents)) {\n this.contents.setIn(path, value);\n }\n }\n /**\n * Change the YAML version and schema used by the document.\n * A `null` version disables support for directives, explicit tags, anchors, and aliases.\n * It also requires the `schema` option to be given as a `Schema` instance value.\n *\n * Overrides all previously set schema options.\n */\n setSchema(version, options = {}) {\n if (typeof version === 'number')\n version = String(version);\n let opt;\n switch (version) {\n case '1.1':\n if (this.directives)\n this.directives.yaml.version = '1.1';\n else\n this.directives = new directives.Directives({ version: '1.1' });\n opt = { resolveKnownTags: false, schema: 'yaml-1.1' };\n break;\n case '1.2':\n case 'next':\n if (this.directives)\n this.directives.yaml.version = version;\n else\n this.directives = new directives.Directives({ version });\n opt = { resolveKnownTags: true, schema: 'core' };\n break;\n case null:\n if (this.directives)\n delete this.directives;\n opt = null;\n break;\n default: {\n const sv = JSON.stringify(version);\n throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${sv}`);\n }\n }\n // Not using `instanceof Schema` to allow for duck typing\n if (options.schema instanceof Object)\n this.schema = options.schema;\n else if (opt)\n this.schema = new Schema.Schema(Object.assign(opt, options));\n else\n throw new Error(`With a null YAML version, the { schema: Schema } option is required`);\n }\n // json & jsonArg are only used from toJSON()\n toJS({ json, jsonArg, mapAsMap, maxAliasCount, onAnchor, reviver } = {}) {\n const ctx = {\n anchors: new Map(),\n doc: this,\n keep: !json,\n mapAsMap: mapAsMap === true,\n mapKeyWarned: false,\n maxAliasCount: typeof maxAliasCount === 'number' ? maxAliasCount : 100\n };\n const res = toJS.toJS(this.contents, jsonArg ?? '', ctx);\n if (typeof onAnchor === 'function')\n for (const { count, res } of ctx.anchors.values())\n onAnchor(res, count);\n return typeof reviver === 'function'\n ? applyReviver.applyReviver(reviver, { '': res }, '', res)\n : res;\n }\n /**\n * A JSON representation of the document `contents`.\n *\n * @param jsonArg Used by `JSON.stringify` to indicate the array index or\n * property name.\n */\n toJSON(jsonArg, onAnchor) {\n return this.toJS({ json: true, jsonArg, mapAsMap: false, onAnchor });\n }\n /** A YAML representation of the document. */\n toString(options = {}) {\n if (this.errors.length > 0)\n throw new Error('Document with errors cannot be stringified');\n if ('indent' in options &&\n (!Number.isInteger(options.indent) || Number(options.indent) <= 0)) {\n const s = JSON.stringify(options.indent);\n throw new Error(`\"indent\" option must be a positive integer, not ${s}`);\n }\n return stringifyDocument.stringifyDocument(this, options);\n }\n}\nfunction assertCollection(contents) {\n if (identity.isCollection(contents))\n return true;\n throw new Error('Expected a YAML collection as document contents');\n}\n\nexports.Document = Document;\n","'use strict';\n\nclass YAMLError extends Error {\n constructor(name, pos, code, message) {\n super();\n this.name = name;\n this.code = code;\n this.message = message;\n this.pos = pos;\n }\n}\nclass YAMLParseError extends YAMLError {\n constructor(pos, code, message) {\n super('YAMLParseError', pos, code, message);\n }\n}\nclass YAMLWarning extends YAMLError {\n constructor(pos, code, message) {\n super('YAMLWarning', pos, code, message);\n }\n}\nconst prettifyError = (src, lc) => (error) => {\n if (error.pos[0] === -1)\n return;\n error.linePos = error.pos.map(pos => lc.linePos(pos));\n const { line, col } = error.linePos[0];\n error.message += ` at line ${line}, column ${col}`;\n let ci = col - 1;\n let lineStr = src\n .substring(lc.lineStarts[line - 1], lc.lineStarts[line])\n .replace(/[\\n\\r]+$/, '');\n // Trim to max 80 chars, keeping col position near the middle\n if (ci >= 60 && lineStr.length > 80) {\n const trimStart = Math.min(ci - 39, lineStr.length - 79);\n lineStr = '…' + lineStr.substring(trimStart);\n ci -= trimStart - 1;\n }\n if (lineStr.length > 80)\n lineStr = lineStr.substring(0, 79) + '…';\n // Include previous line in context if pointing at line start\n if (line > 1 && /^ *$/.test(lineStr.substring(0, ci))) {\n // Regexp won't match if start is trimmed\n let prev = src.substring(lc.lineStarts[line - 2], lc.lineStarts[line - 1]);\n if (prev.length > 80)\n prev = prev.substring(0, 79) + '…\\n';\n lineStr = prev + lineStr;\n }\n if (/[^ ]/.test(lineStr)) {\n let count = 1;\n const end = error.linePos[1];\n if (end?.line === line && end.col > col) {\n count = Math.max(1, Math.min(end.col - col, 80 - ci));\n }\n const pointer = ' '.repeat(ci) + '^'.repeat(count);\n error.message += `:\\n\\n${lineStr}\\n${pointer}\\n`;\n }\n};\n\nexports.YAMLError = YAMLError;\nexports.YAMLParseError = YAMLParseError;\nexports.YAMLWarning = YAMLWarning;\nexports.prettifyError = prettifyError;\n","'use strict';\n\nfunction resolveProps(tokens, { flow, indicator, next, offset, onError, parentIndent, startOnNewline }) {\n let spaceBefore = false;\n let atNewline = startOnNewline;\n let hasSpace = startOnNewline;\n let comment = '';\n let commentSep = '';\n let hasNewline = false;\n let reqSpace = false;\n let tab = null;\n let anchor = null;\n let tag = null;\n let newlineAfterProp = null;\n let comma = null;\n let found = null;\n let start = null;\n for (const token of tokens) {\n if (reqSpace) {\n if (token.type !== 'space' &&\n token.type !== 'newline' &&\n token.type !== 'comma')\n onError(token.offset, 'MISSING_CHAR', 'Tags and anchors must be separated from the next token by white space');\n reqSpace = false;\n }\n if (tab) {\n if (atNewline && token.type !== 'comment' && token.type !== 'newline') {\n onError(tab, 'TAB_AS_INDENT', 'Tabs are not allowed as indentation');\n }\n tab = null;\n }\n switch (token.type) {\n case 'space':\n // At the doc level, tabs at line start may be parsed\n // as leading white space rather than indentation.\n // In a flow collection, only the parser handles indent.\n if (!flow &&\n (indicator !== 'doc-start' || next?.type !== 'flow-collection') &&\n token.source.includes('\\t')) {\n tab = token;\n }\n hasSpace = true;\n break;\n case 'comment': {\n if (!hasSpace)\n onError(token, 'MISSING_CHAR', 'Comments must be separated from other tokens by white space characters');\n const cb = token.source.substring(1) || ' ';\n if (!comment)\n comment = cb;\n else\n comment += commentSep + cb;\n commentSep = '';\n atNewline = false;\n break;\n }\n case 'newline':\n if (atNewline) {\n if (comment)\n comment += token.source;\n else if (!found || indicator !== 'seq-item-ind')\n spaceBefore = true;\n }\n else\n commentSep += token.source;\n atNewline = true;\n hasNewline = true;\n if (anchor || tag)\n newlineAfterProp = token;\n hasSpace = true;\n break;\n case 'anchor':\n if (anchor)\n onError(token, 'MULTIPLE_ANCHORS', 'A node can have at most one anchor');\n if (token.source.endsWith(':'))\n onError(token.offset + token.source.length - 1, 'BAD_ALIAS', 'Anchor ending in : is ambiguous', true);\n anchor = token;\n start ?? (start = token.offset);\n atNewline = false;\n hasSpace = false;\n reqSpace = true;\n break;\n case 'tag': {\n if (tag)\n onError(token, 'MULTIPLE_TAGS', 'A node can have at most one tag');\n tag = token;\n start ?? (start = token.offset);\n atNewline = false;\n hasSpace = false;\n reqSpace = true;\n break;\n }\n case indicator:\n // Could here handle preceding comments differently\n if (anchor || tag)\n onError(token, 'BAD_PROP_ORDER', `Anchors and tags must be after the ${token.source} indicator`);\n if (found)\n onError(token, 'UNEXPECTED_TOKEN', `Unexpected ${token.source} in ${flow ?? 'collection'}`);\n found = token;\n atNewline =\n indicator === 'seq-item-ind' || indicator === 'explicit-key-ind';\n hasSpace = false;\n break;\n case 'comma':\n if (flow) {\n if (comma)\n onError(token, 'UNEXPECTED_TOKEN', `Unexpected , in ${flow}`);\n comma = token;\n atNewline = false;\n hasSpace = false;\n break;\n }\n // else fallthrough\n default:\n onError(token, 'UNEXPECTED_TOKEN', `Unexpected ${token.type} token`);\n atNewline = false;\n hasSpace = false;\n }\n }\n const last = tokens[tokens.length - 1];\n const end = last ? last.offset + last.source.length : offset;\n if (reqSpace &&\n next &&\n next.type !== 'space' &&\n next.type !== 'newline' &&\n next.type !== 'comma' &&\n (next.type !== 'scalar' || next.source !== '')) {\n onError(next.offset, 'MISSING_CHAR', 'Tags and anchors must be separated from the next token by white space');\n }\n if (tab &&\n ((atNewline && tab.indent <= parentIndent) ||\n next?.type === 'block-map' ||\n next?.type === 'block-seq'))\n onError(tab, 'TAB_AS_INDENT', 'Tabs are not allowed as indentation');\n return {\n comma,\n found,\n spaceBefore,\n comment,\n hasNewline,\n anchor,\n tag,\n newlineAfterProp,\n end,\n start: start ?? end\n };\n}\n\nexports.resolveProps = resolveProps;\n","'use strict';\n\nfunction containsNewline(key) {\n if (!key)\n return null;\n switch (key.type) {\n case 'alias':\n case 'scalar':\n case 'double-quoted-scalar':\n case 'single-quoted-scalar':\n if (key.source.includes('\\n'))\n return true;\n if (key.end)\n for (const st of key.end)\n if (st.type === 'newline')\n return true;\n return false;\n case 'flow-collection':\n for (const it of key.items) {\n for (const st of it.start)\n if (st.type === 'newline')\n return true;\n if (it.sep)\n for (const st of it.sep)\n if (st.type === 'newline')\n return true;\n if (containsNewline(it.key) || containsNewline(it.value))\n return true;\n }\n return false;\n default:\n return true;\n }\n}\n\nexports.containsNewline = containsNewline;\n","'use strict';\n\nvar utilContainsNewline = require('./util-contains-newline.js');\n\nfunction flowIndentCheck(indent, fc, onError) {\n if (fc?.type === 'flow-collection') {\n const end = fc.end[0];\n if (end.indent === indent &&\n (end.source === ']' || end.source === '}') &&\n utilContainsNewline.containsNewline(fc)) {\n const msg = 'Flow end indicator should be more indented than parent';\n onError(end, 'BAD_INDENT', msg, true);\n }\n }\n}\n\nexports.flowIndentCheck = flowIndentCheck;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\n\nfunction mapIncludes(ctx, items, search) {\n const { uniqueKeys } = ctx.options;\n if (uniqueKeys === false)\n return false;\n const isEqual = typeof uniqueKeys === 'function'\n ? uniqueKeys\n : (a, b) => a === b || (identity.isScalar(a) && identity.isScalar(b) && a.value === b.value);\n return items.some(pair => isEqual(pair.key, search));\n}\n\nexports.mapIncludes = mapIncludes;\n","'use strict';\n\nvar Pair = require('../nodes/Pair.js');\nvar YAMLMap = require('../nodes/YAMLMap.js');\nvar resolveProps = require('./resolve-props.js');\nvar utilContainsNewline = require('./util-contains-newline.js');\nvar utilFlowIndentCheck = require('./util-flow-indent-check.js');\nvar utilMapIncludes = require('./util-map-includes.js');\n\nconst startColMsg = 'All mapping items must start at the same column';\nfunction resolveBlockMap({ composeNode, composeEmptyNode }, ctx, bm, onError, tag) {\n const NodeClass = tag?.nodeClass ?? YAMLMap.YAMLMap;\n const map = new NodeClass(ctx.schema);\n if (ctx.atRoot)\n ctx.atRoot = false;\n let offset = bm.offset;\n let commentEnd = null;\n for (const collItem of bm.items) {\n const { start, key, sep, value } = collItem;\n // key properties\n const keyProps = resolveProps.resolveProps(start, {\n indicator: 'explicit-key-ind',\n next: key ?? sep?.[0],\n offset,\n onError,\n parentIndent: bm.indent,\n startOnNewline: true\n });\n const implicitKey = !keyProps.found;\n if (implicitKey) {\n if (key) {\n if (key.type === 'block-seq')\n onError(offset, 'BLOCK_AS_IMPLICIT_KEY', 'A block sequence may not be used as an implicit map key');\n else if ('indent' in key && key.indent !== bm.indent)\n onError(offset, 'BAD_INDENT', startColMsg);\n }\n if (!keyProps.anchor && !keyProps.tag && !sep) {\n commentEnd = keyProps.end;\n if (keyProps.comment) {\n if (map.comment)\n map.comment += '\\n' + keyProps.comment;\n else\n map.comment = keyProps.comment;\n }\n continue;\n }\n if (keyProps.newlineAfterProp || utilContainsNewline.containsNewline(key)) {\n onError(key ?? start[start.length - 1], 'MULTILINE_IMPLICIT_KEY', 'Implicit keys need to be on a single line');\n }\n }\n else if (keyProps.found?.indent !== bm.indent) {\n onError(offset, 'BAD_INDENT', startColMsg);\n }\n // key value\n ctx.atKey = true;\n const keyStart = keyProps.end;\n const keyNode = key\n ? composeNode(ctx, key, keyProps, onError)\n : composeEmptyNode(ctx, keyStart, start, null, keyProps, onError);\n if (ctx.schema.compat)\n utilFlowIndentCheck.flowIndentCheck(bm.indent, key, onError);\n ctx.atKey = false;\n if (utilMapIncludes.mapIncludes(ctx, map.items, keyNode))\n onError(keyStart, 'DUPLICATE_KEY', 'Map keys must be unique');\n // value properties\n const valueProps = resolveProps.resolveProps(sep ?? [], {\n indicator: 'map-value-ind',\n next: value,\n offset: keyNode.range[2],\n onError,\n parentIndent: bm.indent,\n startOnNewline: !key || key.type === 'block-scalar'\n });\n offset = valueProps.end;\n if (valueProps.found) {\n if (implicitKey) {\n if (value?.type === 'block-map' && !valueProps.hasNewline)\n onError(offset, 'BLOCK_AS_IMPLICIT_KEY', 'Nested mappings are not allowed in compact mappings');\n if (ctx.options.strict &&\n keyProps.start < valueProps.found.offset - 1024)\n onError(keyNode.range, 'KEY_OVER_1024_CHARS', 'The : indicator must be at most 1024 chars after the start of an implicit block mapping key');\n }\n // value value\n const valueNode = value\n ? composeNode(ctx, value, valueProps, onError)\n : composeEmptyNode(ctx, offset, sep, null, valueProps, onError);\n if (ctx.schema.compat)\n utilFlowIndentCheck.flowIndentCheck(bm.indent, value, onError);\n offset = valueNode.range[2];\n const pair = new Pair.Pair(keyNode, valueNode);\n if (ctx.options.keepSourceTokens)\n pair.srcToken = collItem;\n map.items.push(pair);\n }\n else {\n // key with no value\n if (implicitKey)\n onError(keyNode.range, 'MISSING_CHAR', 'Implicit map keys need to be followed by map values');\n if (valueProps.comment) {\n if (keyNode.comment)\n keyNode.comment += '\\n' + valueProps.comment;\n else\n keyNode.comment = valueProps.comment;\n }\n const pair = new Pair.Pair(keyNode);\n if (ctx.options.keepSourceTokens)\n pair.srcToken = collItem;\n map.items.push(pair);\n }\n }\n if (commentEnd && commentEnd < offset)\n onError(commentEnd, 'IMPOSSIBLE', 'Map comment with trailing content');\n map.range = [bm.offset, offset, commentEnd ?? offset];\n return map;\n}\n\nexports.resolveBlockMap = resolveBlockMap;\n","'use strict';\n\nvar YAMLSeq = require('../nodes/YAMLSeq.js');\nvar resolveProps = require('./resolve-props.js');\nvar utilFlowIndentCheck = require('./util-flow-indent-check.js');\n\nfunction resolveBlockSeq({ composeNode, composeEmptyNode }, ctx, bs, onError, tag) {\n const NodeClass = tag?.nodeClass ?? YAMLSeq.YAMLSeq;\n const seq = new NodeClass(ctx.schema);\n if (ctx.atRoot)\n ctx.atRoot = false;\n if (ctx.atKey)\n ctx.atKey = false;\n let offset = bs.offset;\n let commentEnd = null;\n for (const { start, value } of bs.items) {\n const props = resolveProps.resolveProps(start, {\n indicator: 'seq-item-ind',\n next: value,\n offset,\n onError,\n parentIndent: bs.indent,\n startOnNewline: true\n });\n if (!props.found) {\n if (props.anchor || props.tag || value) {\n if (value?.type === 'block-seq')\n onError(props.end, 'BAD_INDENT', 'All sequence items must start at the same column');\n else\n onError(offset, 'MISSING_CHAR', 'Sequence item without - indicator');\n }\n else {\n commentEnd = props.end;\n if (props.comment)\n seq.comment = props.comment;\n continue;\n }\n }\n const node = value\n ? composeNode(ctx, value, props, onError)\n : composeEmptyNode(ctx, props.end, start, null, props, onError);\n if (ctx.schema.compat)\n utilFlowIndentCheck.flowIndentCheck(bs.indent, value, onError);\n offset = node.range[2];\n seq.items.push(node);\n }\n seq.range = [bs.offset, offset, commentEnd ?? offset];\n return seq;\n}\n\nexports.resolveBlockSeq = resolveBlockSeq;\n","'use strict';\n\nfunction resolveEnd(end, offset, reqSpace, onError) {\n let comment = '';\n if (end) {\n let hasSpace = false;\n let sep = '';\n for (const token of end) {\n const { source, type } = token;\n switch (type) {\n case 'space':\n hasSpace = true;\n break;\n case 'comment': {\n if (reqSpace && !hasSpace)\n onError(token, 'MISSING_CHAR', 'Comments must be separated from other tokens by white space characters');\n const cb = source.substring(1) || ' ';\n if (!comment)\n comment = cb;\n else\n comment += sep + cb;\n sep = '';\n break;\n }\n case 'newline':\n if (comment)\n sep += source;\n hasSpace = true;\n break;\n default:\n onError(token, 'UNEXPECTED_TOKEN', `Unexpected ${type} at node end`);\n }\n offset += source.length;\n }\n }\n return { comment, offset };\n}\n\nexports.resolveEnd = resolveEnd;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar Pair = require('../nodes/Pair.js');\nvar YAMLMap = require('../nodes/YAMLMap.js');\nvar YAMLSeq = require('../nodes/YAMLSeq.js');\nvar resolveEnd = require('./resolve-end.js');\nvar resolveProps = require('./resolve-props.js');\nvar utilContainsNewline = require('./util-contains-newline.js');\nvar utilMapIncludes = require('./util-map-includes.js');\n\nconst blockMsg = 'Block collections are not allowed within flow collections';\nconst isBlock = (token) => token && (token.type === 'block-map' || token.type === 'block-seq');\nfunction resolveFlowCollection({ composeNode, composeEmptyNode }, ctx, fc, onError, tag) {\n const isMap = fc.start.source === '{';\n const fcName = isMap ? 'flow map' : 'flow sequence';\n const NodeClass = (tag?.nodeClass ?? (isMap ? YAMLMap.YAMLMap : YAMLSeq.YAMLSeq));\n const coll = new NodeClass(ctx.schema);\n coll.flow = true;\n const atRoot = ctx.atRoot;\n if (atRoot)\n ctx.atRoot = false;\n if (ctx.atKey)\n ctx.atKey = false;\n let offset = fc.offset + fc.start.source.length;\n for (let i = 0; i < fc.items.length; ++i) {\n const collItem = fc.items[i];\n const { start, key, sep, value } = collItem;\n const props = resolveProps.resolveProps(start, {\n flow: fcName,\n indicator: 'explicit-key-ind',\n next: key ?? sep?.[0],\n offset,\n onError,\n parentIndent: fc.indent,\n startOnNewline: false\n });\n if (!props.found) {\n if (!props.anchor && !props.tag && !sep && !value) {\n if (i === 0 && props.comma)\n onError(props.comma, 'UNEXPECTED_TOKEN', `Unexpected , in ${fcName}`);\n else if (i < fc.items.length - 1)\n onError(props.start, 'UNEXPECTED_TOKEN', `Unexpected empty item in ${fcName}`);\n if (props.comment) {\n if (coll.comment)\n coll.comment += '\\n' + props.comment;\n else\n coll.comment = props.comment;\n }\n offset = props.end;\n continue;\n }\n if (!isMap && ctx.options.strict && utilContainsNewline.containsNewline(key))\n onError(key, // checked by containsNewline()\n 'MULTILINE_IMPLICIT_KEY', 'Implicit keys of flow sequence pairs need to be on a single line');\n }\n if (i === 0) {\n if (props.comma)\n onError(props.comma, 'UNEXPECTED_TOKEN', `Unexpected , in ${fcName}`);\n }\n else {\n if (!props.comma)\n onError(props.start, 'MISSING_CHAR', `Missing , between ${fcName} items`);\n if (props.comment) {\n let prevItemComment = '';\n loop: for (const st of start) {\n switch (st.type) {\n case 'comma':\n case 'space':\n break;\n case 'comment':\n prevItemComment = st.source.substring(1);\n break loop;\n default:\n break loop;\n }\n }\n if (prevItemComment) {\n let prev = coll.items[coll.items.length - 1];\n if (identity.isPair(prev))\n prev = prev.value ?? prev.key;\n if (prev.comment)\n prev.comment += '\\n' + prevItemComment;\n else\n prev.comment = prevItemComment;\n props.comment = props.comment.substring(prevItemComment.length + 1);\n }\n }\n }\n if (!isMap && !sep && !props.found) {\n // item is a value in a seq\n // → key & sep are empty, start does not include ? or :\n const valueNode = value\n ? composeNode(ctx, value, props, onError)\n : composeEmptyNode(ctx, props.end, sep, null, props, onError);\n coll.items.push(valueNode);\n offset = valueNode.range[2];\n if (isBlock(value))\n onError(valueNode.range, 'BLOCK_IN_FLOW', blockMsg);\n }\n else {\n // item is a key+value pair\n // key value\n ctx.atKey = true;\n const keyStart = props.end;\n const keyNode = key\n ? composeNode(ctx, key, props, onError)\n : composeEmptyNode(ctx, keyStart, start, null, props, onError);\n if (isBlock(key))\n onError(keyNode.range, 'BLOCK_IN_FLOW', blockMsg);\n ctx.atKey = false;\n // value properties\n const valueProps = resolveProps.resolveProps(sep ?? [], {\n flow: fcName,\n indicator: 'map-value-ind',\n next: value,\n offset: keyNode.range[2],\n onError,\n parentIndent: fc.indent,\n startOnNewline: false\n });\n if (valueProps.found) {\n if (!isMap && !props.found && ctx.options.strict) {\n if (sep)\n for (const st of sep) {\n if (st === valueProps.found)\n break;\n if (st.type === 'newline') {\n onError(st, 'MULTILINE_IMPLICIT_KEY', 'Implicit keys of flow sequence pairs need to be on a single line');\n break;\n }\n }\n if (props.start < valueProps.found.offset - 1024)\n onError(valueProps.found, 'KEY_OVER_1024_CHARS', 'The : indicator must be at most 1024 chars after the start of an implicit flow sequence key');\n }\n }\n else if (value) {\n if ('source' in value && value.source?.[0] === ':')\n onError(value, 'MISSING_CHAR', `Missing space after : in ${fcName}`);\n else\n onError(valueProps.start, 'MISSING_CHAR', `Missing , or : between ${fcName} items`);\n }\n // value value\n const valueNode = value\n ? composeNode(ctx, value, valueProps, onError)\n : valueProps.found\n ? composeEmptyNode(ctx, valueProps.end, sep, null, valueProps, onError)\n : null;\n if (valueNode) {\n if (isBlock(value))\n onError(valueNode.range, 'BLOCK_IN_FLOW', blockMsg);\n }\n else if (valueProps.comment) {\n if (keyNode.comment)\n keyNode.comment += '\\n' + valueProps.comment;\n else\n keyNode.comment = valueProps.comment;\n }\n const pair = new Pair.Pair(keyNode, valueNode);\n if (ctx.options.keepSourceTokens)\n pair.srcToken = collItem;\n if (isMap) {\n const map = coll;\n if (utilMapIncludes.mapIncludes(ctx, map.items, keyNode))\n onError(keyStart, 'DUPLICATE_KEY', 'Map keys must be unique');\n map.items.push(pair);\n }\n else {\n const map = new YAMLMap.YAMLMap(ctx.schema);\n map.flow = true;\n map.items.push(pair);\n const endRange = (valueNode ?? keyNode).range;\n map.range = [keyNode.range[0], endRange[1], endRange[2]];\n coll.items.push(map);\n }\n offset = valueNode ? valueNode.range[2] : valueProps.end;\n }\n }\n const expectedEnd = isMap ? '}' : ']';\n const [ce, ...ee] = fc.end;\n let cePos = offset;\n if (ce?.source === expectedEnd)\n cePos = ce.offset + ce.source.length;\n else {\n const name = fcName[0].toUpperCase() + fcName.substring(1);\n const msg = atRoot\n ? `${name} must end with a ${expectedEnd}`\n : `${name} in block collection must be sufficiently indented and end with a ${expectedEnd}`;\n onError(offset, atRoot ? 'MISSING_CHAR' : 'BAD_INDENT', msg);\n if (ce && ce.source.length !== 1)\n ee.unshift(ce);\n }\n if (ee.length > 0) {\n const end = resolveEnd.resolveEnd(ee, cePos, ctx.options.strict, onError);\n if (end.comment) {\n if (coll.comment)\n coll.comment += '\\n' + end.comment;\n else\n coll.comment = end.comment;\n }\n coll.range = [fc.offset, cePos, end.offset];\n }\n else {\n coll.range = [fc.offset, cePos, cePos];\n }\n return coll;\n}\n\nexports.resolveFlowCollection = resolveFlowCollection;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar Scalar = require('../nodes/Scalar.js');\nvar YAMLMap = require('../nodes/YAMLMap.js');\nvar YAMLSeq = require('../nodes/YAMLSeq.js');\nvar resolveBlockMap = require('./resolve-block-map.js');\nvar resolveBlockSeq = require('./resolve-block-seq.js');\nvar resolveFlowCollection = require('./resolve-flow-collection.js');\n\nfunction resolveCollection(CN, ctx, token, onError, tagName, tag) {\n const coll = token.type === 'block-map'\n ? resolveBlockMap.resolveBlockMap(CN, ctx, token, onError, tag)\n : token.type === 'block-seq'\n ? resolveBlockSeq.resolveBlockSeq(CN, ctx, token, onError, tag)\n : resolveFlowCollection.resolveFlowCollection(CN, ctx, token, onError, tag);\n const Coll = coll.constructor;\n // If we got a tagName matching the class, or the tag name is '!',\n // then use the tagName from the node class used to create it.\n if (tagName === '!' || tagName === Coll.tagName) {\n coll.tag = Coll.tagName;\n return coll;\n }\n if (tagName)\n coll.tag = tagName;\n return coll;\n}\nfunction composeCollection(CN, ctx, token, props, onError) {\n const tagToken = props.tag;\n const tagName = !tagToken\n ? null\n : ctx.directives.tagName(tagToken.source, msg => onError(tagToken, 'TAG_RESOLVE_FAILED', msg));\n if (token.type === 'block-seq') {\n const { anchor, newlineAfterProp: nl } = props;\n const lastProp = anchor && tagToken\n ? anchor.offset > tagToken.offset\n ? anchor\n : tagToken\n : (anchor ?? tagToken);\n if (lastProp && (!nl || nl.offset < lastProp.offset)) {\n const message = 'Missing newline after block sequence props';\n onError(lastProp, 'MISSING_CHAR', message);\n }\n }\n const expType = token.type === 'block-map'\n ? 'map'\n : token.type === 'block-seq'\n ? 'seq'\n : token.start.source === '{'\n ? 'map'\n : 'seq';\n // shortcut: check if it's a generic YAMLMap or YAMLSeq\n // before jumping into the custom tag logic.\n if (!tagToken ||\n !tagName ||\n tagName === '!' ||\n (tagName === YAMLMap.YAMLMap.tagName && expType === 'map') ||\n (tagName === YAMLSeq.YAMLSeq.tagName && expType === 'seq')) {\n return resolveCollection(CN, ctx, token, onError, tagName);\n }\n let tag = ctx.schema.tags.find(t => t.tag === tagName && t.collection === expType);\n if (!tag) {\n const kt = ctx.schema.knownTags[tagName];\n if (kt?.collection === expType) {\n ctx.schema.tags.push(Object.assign({}, kt, { default: false }));\n tag = kt;\n }\n else {\n if (kt) {\n onError(tagToken, 'BAD_COLLECTION_TYPE', `${kt.tag} used for ${expType} collection, but expects ${kt.collection ?? 'scalar'}`, true);\n }\n else {\n onError(tagToken, 'TAG_RESOLVE_FAILED', `Unresolved tag: ${tagName}`, true);\n }\n return resolveCollection(CN, ctx, token, onError, tagName);\n }\n }\n const coll = resolveCollection(CN, ctx, token, onError, tagName, tag);\n const res = tag.resolve?.(coll, msg => onError(tagToken, 'TAG_RESOLVE_FAILED', msg), ctx.options) ?? coll;\n const node = identity.isNode(res)\n ? res\n : new Scalar.Scalar(res);\n node.range = coll.range;\n node.tag = tagName;\n if (tag?.format)\n node.format = tag.format;\n return node;\n}\n\nexports.composeCollection = composeCollection;\n","'use strict';\n\nvar Scalar = require('../nodes/Scalar.js');\n\nfunction resolveBlockScalar(ctx, scalar, onError) {\n const start = scalar.offset;\n const header = parseBlockScalarHeader(scalar, ctx.options.strict, onError);\n if (!header)\n return { value: '', type: null, comment: '', range: [start, start, start] };\n const type = header.mode === '>' ? Scalar.Scalar.BLOCK_FOLDED : Scalar.Scalar.BLOCK_LITERAL;\n const lines = scalar.source ? splitLines(scalar.source) : [];\n // determine the end of content & start of chomping\n let chompStart = lines.length;\n for (let i = lines.length - 1; i >= 0; --i) {\n const content = lines[i][1];\n if (content === '' || content === '\\r')\n chompStart = i;\n else\n break;\n }\n // shortcut for empty contents\n if (chompStart === 0) {\n const value = header.chomp === '+' && lines.length > 0\n ? '\\n'.repeat(Math.max(1, lines.length - 1))\n : '';\n let end = start + header.length;\n if (scalar.source)\n end += scalar.source.length;\n return { value, type, comment: header.comment, range: [start, end, end] };\n }\n // find the indentation level to trim from start\n let trimIndent = scalar.indent + header.indent;\n let offset = scalar.offset + header.length;\n let contentStart = 0;\n for (let i = 0; i < chompStart; ++i) {\n const [indent, content] = lines[i];\n if (content === '' || content === '\\r') {\n if (header.indent === 0 && indent.length > trimIndent)\n trimIndent = indent.length;\n }\n else {\n if (indent.length < trimIndent) {\n const message = 'Block scalars with more-indented leading empty lines must use an explicit indentation indicator';\n onError(offset + indent.length, 'MISSING_CHAR', message);\n }\n if (header.indent === 0)\n trimIndent = indent.length;\n contentStart = i;\n if (trimIndent === 0 && !ctx.atRoot) {\n const message = 'Block scalar values in collections must be indented';\n onError(offset, 'BAD_INDENT', message);\n }\n break;\n }\n offset += indent.length + content.length + 1;\n }\n // include trailing more-indented empty lines in content\n for (let i = lines.length - 1; i >= chompStart; --i) {\n if (lines[i][0].length > trimIndent)\n chompStart = i + 1;\n }\n let value = '';\n let sep = '';\n let prevMoreIndented = false;\n // leading whitespace is kept intact\n for (let i = 0; i < contentStart; ++i)\n value += lines[i][0].slice(trimIndent) + '\\n';\n for (let i = contentStart; i < chompStart; ++i) {\n let [indent, content] = lines[i];\n offset += indent.length + content.length + 1;\n const crlf = content[content.length - 1] === '\\r';\n if (crlf)\n content = content.slice(0, -1);\n /* istanbul ignore if already caught in lexer */\n if (content && indent.length < trimIndent) {\n const src = header.indent\n ? 'explicit indentation indicator'\n : 'first line';\n const message = `Block scalar lines must not be less indented than their ${src}`;\n onError(offset - content.length - (crlf ? 2 : 1), 'BAD_INDENT', message);\n indent = '';\n }\n if (type === Scalar.Scalar.BLOCK_LITERAL) {\n value += sep + indent.slice(trimIndent) + content;\n sep = '\\n';\n }\n else if (indent.length > trimIndent || content[0] === '\\t') {\n // more-indented content within a folded block\n if (sep === ' ')\n sep = '\\n';\n else if (!prevMoreIndented && sep === '\\n')\n sep = '\\n\\n';\n value += sep + indent.slice(trimIndent) + content;\n sep = '\\n';\n prevMoreIndented = true;\n }\n else if (content === '') {\n // empty line\n if (sep === '\\n')\n value += '\\n';\n else\n sep = '\\n';\n }\n else {\n value += sep + content;\n sep = ' ';\n prevMoreIndented = false;\n }\n }\n switch (header.chomp) {\n case '-':\n break;\n case '+':\n for (let i = chompStart; i < lines.length; ++i)\n value += '\\n' + lines[i][0].slice(trimIndent);\n if (value[value.length - 1] !== '\\n')\n value += '\\n';\n break;\n default:\n value += '\\n';\n }\n const end = start + header.length + scalar.source.length;\n return { value, type, comment: header.comment, range: [start, end, end] };\n}\nfunction parseBlockScalarHeader({ offset, props }, strict, onError) {\n /* istanbul ignore if should not happen */\n if (props[0].type !== 'block-scalar-header') {\n onError(props[0], 'IMPOSSIBLE', 'Block scalar header not found');\n return null;\n }\n const { source } = props[0];\n const mode = source[0];\n let indent = 0;\n let chomp = '';\n let error = -1;\n for (let i = 1; i < source.length; ++i) {\n const ch = source[i];\n if (!chomp && (ch === '-' || ch === '+'))\n chomp = ch;\n else {\n const n = Number(ch);\n if (!indent && n)\n indent = n;\n else if (error === -1)\n error = offset + i;\n }\n }\n if (error !== -1)\n onError(error, 'UNEXPECTED_TOKEN', `Block scalar header includes extra characters: ${source}`);\n let hasSpace = false;\n let comment = '';\n let length = source.length;\n for (let i = 1; i < props.length; ++i) {\n const token = props[i];\n switch (token.type) {\n case 'space':\n hasSpace = true;\n // fallthrough\n case 'newline':\n length += token.source.length;\n break;\n case 'comment':\n if (strict && !hasSpace) {\n const message = 'Comments must be separated from other tokens by white space characters';\n onError(token, 'MISSING_CHAR', message);\n }\n length += token.source.length;\n comment = token.source.substring(1);\n break;\n case 'error':\n onError(token, 'UNEXPECTED_TOKEN', token.message);\n length += token.source.length;\n break;\n /* istanbul ignore next should not happen */\n default: {\n const message = `Unexpected token in block scalar header: ${token.type}`;\n onError(token, 'UNEXPECTED_TOKEN', message);\n const ts = token.source;\n if (ts && typeof ts === 'string')\n length += ts.length;\n }\n }\n }\n return { mode, indent, chomp, comment, length };\n}\n/** @returns Array of lines split up as `[indent, content]` */\nfunction splitLines(source) {\n const split = source.split(/\\n( *)/);\n const first = split[0];\n const m = first.match(/^( *)/);\n const line0 = m?.[1]\n ? [m[1], first.slice(m[1].length)]\n : ['', first];\n const lines = [line0];\n for (let i = 1; i < split.length; i += 2)\n lines.push([split[i], split[i + 1]]);\n return lines;\n}\n\nexports.resolveBlockScalar = resolveBlockScalar;\n","'use strict';\n\nvar Scalar = require('../nodes/Scalar.js');\nvar resolveEnd = require('./resolve-end.js');\n\nfunction resolveFlowScalar(scalar, strict, onError) {\n const { offset, type, source, end } = scalar;\n let _type;\n let value;\n const _onError = (rel, code, msg) => onError(offset + rel, code, msg);\n switch (type) {\n case 'scalar':\n _type = Scalar.Scalar.PLAIN;\n value = plainValue(source, _onError);\n break;\n case 'single-quoted-scalar':\n _type = Scalar.Scalar.QUOTE_SINGLE;\n value = singleQuotedValue(source, _onError);\n break;\n case 'double-quoted-scalar':\n _type = Scalar.Scalar.QUOTE_DOUBLE;\n value = doubleQuotedValue(source, _onError);\n break;\n /* istanbul ignore next should not happen */\n default:\n onError(scalar, 'UNEXPECTED_TOKEN', `Expected a flow scalar value, but found: ${type}`);\n return {\n value: '',\n type: null,\n comment: '',\n range: [offset, offset + source.length, offset + source.length]\n };\n }\n const valueEnd = offset + source.length;\n const re = resolveEnd.resolveEnd(end, valueEnd, strict, onError);\n return {\n value,\n type: _type,\n comment: re.comment,\n range: [offset, valueEnd, re.offset]\n };\n}\nfunction plainValue(source, onError) {\n let badChar = '';\n switch (source[0]) {\n /* istanbul ignore next should not happen */\n case '\\t':\n badChar = 'a tab character';\n break;\n case ',':\n badChar = 'flow indicator character ,';\n break;\n case '%':\n badChar = 'directive indicator character %';\n break;\n case '|':\n case '>': {\n badChar = `block scalar indicator ${source[0]}`;\n break;\n }\n case '@':\n case '`': {\n badChar = `reserved character ${source[0]}`;\n break;\n }\n }\n if (badChar)\n onError(0, 'BAD_SCALAR_START', `Plain value cannot start with ${badChar}`);\n return unfoldLines(source);\n}\nfunction singleQuotedValue(source, onError) {\n if (source[source.length - 1] !== \"'\" || source.length === 1)\n onError(source.length, 'MISSING_CHAR', \"Missing closing 'quote\");\n return unfoldLines(source.slice(1, -1)).replace(/''/g, \"'\");\n}\nfunction unfoldLines(source) {\n const line = /(.*?)\\r?\\n/sy;\n let match = line.exec(source);\n if (!match)\n return source;\n /**\n * The negative lookbehinds in these RegExps are to\n * prevent causing a polynomial search time in certain cases.\n *\n * The try-catch is for Safari < 16.4 and other old browsers:\n * https://caniuse.com/js-regexp-lookbehind\n */\n let trimEnd, trimBoth;\n try {\n trimEnd = new RegExp('(?<![ \\t])[ \\t]+$');\n trimBoth = new RegExp('^[ \\t]+|(?<![ \\t])[ \\t]+$', 'g');\n }\n catch {\n trimEnd = /[ \\t]+$/;\n trimBoth = /^[ \\t]+|[ \\t]+$/g;\n }\n let res = match[1].replace(trimEnd, '');\n let sep = ' ';\n let pos = line.lastIndex;\n while ((match = line.exec(source))) {\n const lm = match[1].replace(trimBoth, '');\n if (lm === '') {\n if (sep === '\\n')\n res += sep;\n else\n sep = '\\n';\n }\n else {\n res += sep + lm;\n sep = ' ';\n }\n pos = line.lastIndex;\n }\n const last = /[ \\t]*(.*)/sy;\n last.lastIndex = pos;\n match = last.exec(source);\n return res + sep + (match?.[1] ?? '');\n}\nfunction doubleQuotedValue(source, onError) {\n let res = '';\n for (let i = 1; i < source.length - 1; ++i) {\n const ch = source[i];\n if (ch === '\\r' && source[i + 1] === '\\n')\n continue;\n if (ch === '\\n') {\n const { fold, offset } = foldNewline(source, i);\n res += fold;\n i = offset;\n }\n else if (ch === '\\\\') {\n let next = source[++i];\n const cc = escapeCodes[next];\n if (cc)\n res += cc;\n else if (next === '\\n') {\n // skip escaped newlines, but still trim the following line\n next = source[i + 1];\n while (next === ' ' || next === '\\t')\n next = source[++i + 1];\n }\n else if (next === '\\r' && source[i + 1] === '\\n') {\n // skip escaped CRLF newlines, but still trim the following line\n next = source[++i + 1];\n while (next === ' ' || next === '\\t')\n next = source[++i + 1];\n }\n else if (next === 'x' || next === 'u' || next === 'U') {\n const length = next === 'x' ? 2 : next === 'u' ? 4 : 8;\n res += parseCharCode(source, i + 1, length, onError);\n i += length;\n }\n else {\n const raw = source.substr(i - 1, 2);\n onError(i - 1, 'BAD_DQ_ESCAPE', `Invalid escape sequence ${raw}`);\n res += raw;\n }\n }\n else if (ch === ' ' || ch === '\\t') {\n // trim trailing whitespace\n const wsStart = i;\n let next = source[i + 1];\n while (next === ' ' || next === '\\t')\n next = source[++i + 1];\n if (next !== '\\n' && !(next === '\\r' && source[i + 2] === '\\n'))\n res += i > wsStart ? source.slice(wsStart, i + 1) : ch;\n }\n else {\n res += ch;\n }\n }\n if (source[source.length - 1] !== '\"' || source.length === 1)\n onError(source.length, 'MISSING_CHAR', 'Missing closing \"quote');\n return res;\n}\n/**\n * Fold a single newline into a space, multiple newlines to N - 1 newlines.\n * Presumes `source[offset] === '\\n'`\n */\nfunction foldNewline(source, offset) {\n let fold = '';\n let ch = source[offset + 1];\n while (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r') {\n if (ch === '\\r' && source[offset + 2] !== '\\n')\n break;\n if (ch === '\\n')\n fold += '\\n';\n offset += 1;\n ch = source[offset + 1];\n }\n if (!fold)\n fold = ' ';\n return { fold, offset };\n}\nconst escapeCodes = {\n '0': '\\0', // null character\n a: '\\x07', // bell character\n b: '\\b', // backspace\n e: '\\x1b', // escape character\n f: '\\f', // form feed\n n: '\\n', // line feed\n r: '\\r', // carriage return\n t: '\\t', // horizontal tab\n v: '\\v', // vertical tab\n N: '\\u0085', // Unicode next line\n _: '\\u00a0', // Unicode non-breaking space\n L: '\\u2028', // Unicode line separator\n P: '\\u2029', // Unicode paragraph separator\n ' ': ' ',\n '\"': '\"',\n '/': '/',\n '\\\\': '\\\\',\n '\\t': '\\t'\n};\nfunction parseCharCode(source, offset, length, onError) {\n const cc = source.substr(offset, length);\n const ok = cc.length === length && /^[0-9a-fA-F]+$/.test(cc);\n const code = ok ? parseInt(cc, 16) : NaN;\n try {\n return String.fromCodePoint(code);\n }\n catch {\n const raw = source.substr(offset - 2, length + 2);\n onError(offset - 2, 'BAD_DQ_ESCAPE', `Invalid escape sequence ${raw}`);\n return raw;\n }\n}\n\nexports.resolveFlowScalar = resolveFlowScalar;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar Scalar = require('../nodes/Scalar.js');\nvar resolveBlockScalar = require('./resolve-block-scalar.js');\nvar resolveFlowScalar = require('./resolve-flow-scalar.js');\n\nfunction composeScalar(ctx, token, tagToken, onError) {\n const { value, type, comment, range } = token.type === 'block-scalar'\n ? resolveBlockScalar.resolveBlockScalar(ctx, token, onError)\n : resolveFlowScalar.resolveFlowScalar(token, ctx.options.strict, onError);\n const tagName = tagToken\n ? ctx.directives.tagName(tagToken.source, msg => onError(tagToken, 'TAG_RESOLVE_FAILED', msg))\n : null;\n let tag;\n if (ctx.options.stringKeys && ctx.atKey) {\n tag = ctx.schema[identity.SCALAR];\n }\n else if (tagName)\n tag = findScalarTagByName(ctx.schema, value, tagName, tagToken, onError);\n else if (token.type === 'scalar')\n tag = findScalarTagByTest(ctx, value, token, onError);\n else\n tag = ctx.schema[identity.SCALAR];\n let scalar;\n try {\n const res = tag.resolve(value, msg => onError(tagToken ?? token, 'TAG_RESOLVE_FAILED', msg), ctx.options);\n scalar = identity.isScalar(res) ? res : new Scalar.Scalar(res);\n }\n catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n onError(tagToken ?? token, 'TAG_RESOLVE_FAILED', msg);\n scalar = new Scalar.Scalar(value);\n }\n scalar.range = range;\n scalar.source = value;\n if (type)\n scalar.type = type;\n if (tagName)\n scalar.tag = tagName;\n if (tag.format)\n scalar.format = tag.format;\n if (comment)\n scalar.comment = comment;\n return scalar;\n}\nfunction findScalarTagByName(schema, value, tagName, tagToken, onError) {\n if (tagName === '!')\n return schema[identity.SCALAR]; // non-specific tag\n const matchWithTest = [];\n for (const tag of schema.tags) {\n if (!tag.collection && tag.tag === tagName) {\n if (tag.default && tag.test)\n matchWithTest.push(tag);\n else\n return tag;\n }\n }\n for (const tag of matchWithTest)\n if (tag.test?.test(value))\n return tag;\n const kt = schema.knownTags[tagName];\n if (kt && !kt.collection) {\n // Ensure that the known tag is available for stringifying,\n // but does not get used by default.\n schema.tags.push(Object.assign({}, kt, { default: false, test: undefined }));\n return kt;\n }\n onError(tagToken, 'TAG_RESOLVE_FAILED', `Unresolved tag: ${tagName}`, tagName !== 'tag:yaml.org,2002:str');\n return schema[identity.SCALAR];\n}\nfunction findScalarTagByTest({ atKey, directives, schema }, value, token, onError) {\n const tag = schema.tags.find(tag => (tag.default === true || (atKey && tag.default === 'key')) &&\n tag.test?.test(value)) || schema[identity.SCALAR];\n if (schema.compat) {\n const compat = schema.compat.find(tag => tag.default && tag.test?.test(value)) ??\n schema[identity.SCALAR];\n if (tag.tag !== compat.tag) {\n const ts = directives.tagString(tag.tag);\n const cs = directives.tagString(compat.tag);\n const msg = `Value may be parsed as either ${ts} or ${cs}`;\n onError(token, 'TAG_RESOLVE_FAILED', msg, true);\n }\n }\n return tag;\n}\n\nexports.composeScalar = composeScalar;\n","'use strict';\n\nfunction emptyScalarPosition(offset, before, pos) {\n if (before) {\n pos ?? (pos = before.length);\n for (let i = pos - 1; i >= 0; --i) {\n let st = before[i];\n switch (st.type) {\n case 'space':\n case 'comment':\n case 'newline':\n offset -= st.source.length;\n continue;\n }\n // Technically, an empty scalar is immediately after the last non-empty\n // node, but it's more useful to place it after any whitespace.\n st = before[++i];\n while (st?.type === 'space') {\n offset += st.source.length;\n st = before[++i];\n }\n break;\n }\n }\n return offset;\n}\n\nexports.emptyScalarPosition = emptyScalarPosition;\n","'use strict';\n\nvar Alias = require('../nodes/Alias.js');\nvar identity = require('../nodes/identity.js');\nvar composeCollection = require('./compose-collection.js');\nvar composeScalar = require('./compose-scalar.js');\nvar resolveEnd = require('./resolve-end.js');\nvar utilEmptyScalarPosition = require('./util-empty-scalar-position.js');\n\nconst CN = { composeNode, composeEmptyNode };\nfunction composeNode(ctx, token, props, onError) {\n const atKey = ctx.atKey;\n const { spaceBefore, comment, anchor, tag } = props;\n let node;\n let isSrcToken = true;\n switch (token.type) {\n case 'alias':\n node = composeAlias(ctx, token, onError);\n if (anchor || tag)\n onError(token, 'ALIAS_PROPS', 'An alias node must not specify any properties');\n break;\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar':\n case 'block-scalar':\n node = composeScalar.composeScalar(ctx, token, tag, onError);\n if (anchor)\n node.anchor = anchor.source.substring(1);\n break;\n case 'block-map':\n case 'block-seq':\n case 'flow-collection':\n try {\n node = composeCollection.composeCollection(CN, ctx, token, props, onError);\n if (anchor)\n node.anchor = anchor.source.substring(1);\n }\n catch (error) {\n // Almost certainly here due to a stack overflow\n const message = error instanceof Error ? error.message : String(error);\n onError(token, 'RESOURCE_EXHAUSTION', message);\n }\n break;\n default: {\n const message = token.type === 'error'\n ? token.message\n : `Unsupported token (type: ${token.type})`;\n onError(token, 'UNEXPECTED_TOKEN', message);\n isSrcToken = false;\n }\n }\n node ?? (node = composeEmptyNode(ctx, token.offset, undefined, null, props, onError));\n if (anchor && node.anchor === '')\n onError(anchor, 'BAD_ALIAS', 'Anchor cannot be an empty string');\n if (atKey &&\n ctx.options.stringKeys &&\n (!identity.isScalar(node) ||\n typeof node.value !== 'string' ||\n (node.tag && node.tag !== 'tag:yaml.org,2002:str'))) {\n const msg = 'With stringKeys, all keys must be strings';\n onError(tag ?? token, 'NON_STRING_KEY', msg);\n }\n if (spaceBefore)\n node.spaceBefore = true;\n if (comment) {\n if (token.type === 'scalar' && token.source === '')\n node.comment = comment;\n else\n node.commentBefore = comment;\n }\n // @ts-expect-error Type checking misses meaning of isSrcToken\n if (ctx.options.keepSourceTokens && isSrcToken)\n node.srcToken = token;\n return node;\n}\nfunction composeEmptyNode(ctx, offset, before, pos, { spaceBefore, comment, anchor, tag, end }, onError) {\n const token = {\n type: 'scalar',\n offset: utilEmptyScalarPosition.emptyScalarPosition(offset, before, pos),\n indent: -1,\n source: ''\n };\n const node = composeScalar.composeScalar(ctx, token, tag, onError);\n if (anchor) {\n node.anchor = anchor.source.substring(1);\n if (node.anchor === '')\n onError(anchor, 'BAD_ALIAS', 'Anchor cannot be an empty string');\n }\n if (spaceBefore)\n node.spaceBefore = true;\n if (comment) {\n node.comment = comment;\n node.range[2] = end;\n }\n return node;\n}\nfunction composeAlias({ options }, { offset, source, end }, onError) {\n const alias = new Alias.Alias(source.substring(1));\n if (alias.source === '')\n onError(offset, 'BAD_ALIAS', 'Alias cannot be an empty string');\n if (alias.source.endsWith(':'))\n onError(offset + source.length - 1, 'BAD_ALIAS', 'Alias ending in : is ambiguous', true);\n const valueEnd = offset + source.length;\n const re = resolveEnd.resolveEnd(end, valueEnd, options.strict, onError);\n alias.range = [offset, valueEnd, re.offset];\n if (re.comment)\n alias.comment = re.comment;\n return alias;\n}\n\nexports.composeEmptyNode = composeEmptyNode;\nexports.composeNode = composeNode;\n","'use strict';\n\nvar Document = require('../doc/Document.js');\nvar composeNode = require('./compose-node.js');\nvar resolveEnd = require('./resolve-end.js');\nvar resolveProps = require('./resolve-props.js');\n\nfunction composeDoc(options, directives, { offset, start, value, end }, onError) {\n const opts = Object.assign({ _directives: directives }, options);\n const doc = new Document.Document(undefined, opts);\n const ctx = {\n atKey: false,\n atRoot: true,\n directives: doc.directives,\n options: doc.options,\n schema: doc.schema\n };\n const props = resolveProps.resolveProps(start, {\n indicator: 'doc-start',\n next: value ?? end?.[0],\n offset,\n onError,\n parentIndent: 0,\n startOnNewline: true\n });\n if (props.found) {\n doc.directives.docStart = true;\n if (value &&\n (value.type === 'block-map' || value.type === 'block-seq') &&\n !props.hasNewline)\n onError(props.end, 'MISSING_CHAR', 'Block collection cannot start on same line with directives-end marker');\n }\n // @ts-expect-error If Contents is set, let's trust the user\n doc.contents = value\n ? composeNode.composeNode(ctx, value, props, onError)\n : composeNode.composeEmptyNode(ctx, props.end, start, null, props, onError);\n const contentEnd = doc.contents.range[2];\n const re = resolveEnd.resolveEnd(end, contentEnd, false, onError);\n if (re.comment)\n doc.comment = re.comment;\n doc.range = [offset, contentEnd, re.offset];\n return doc;\n}\n\nexports.composeDoc = composeDoc;\n","'use strict';\n\nvar node_process = require('process');\nvar directives = require('../doc/directives.js');\nvar Document = require('../doc/Document.js');\nvar errors = require('../errors.js');\nvar identity = require('../nodes/identity.js');\nvar composeDoc = require('./compose-doc.js');\nvar resolveEnd = require('./resolve-end.js');\n\nfunction getErrorPos(src) {\n if (typeof src === 'number')\n return [src, src + 1];\n if (Array.isArray(src))\n return src.length === 2 ? src : [src[0], src[1]];\n const { offset, source } = src;\n return [offset, offset + (typeof source === 'string' ? source.length : 1)];\n}\nfunction parsePrelude(prelude) {\n let comment = '';\n let atComment = false;\n let afterEmptyLine = false;\n for (let i = 0; i < prelude.length; ++i) {\n const source = prelude[i];\n switch (source[0]) {\n case '#':\n comment +=\n (comment === '' ? '' : afterEmptyLine ? '\\n\\n' : '\\n') +\n (source.substring(1) || ' ');\n atComment = true;\n afterEmptyLine = false;\n break;\n case '%':\n if (prelude[i + 1]?.[0] !== '#')\n i += 1;\n atComment = false;\n break;\n default:\n // This may be wrong after doc-end, but in that case it doesn't matter\n if (!atComment)\n afterEmptyLine = true;\n atComment = false;\n }\n }\n return { comment, afterEmptyLine };\n}\n/**\n * Compose a stream of CST nodes into a stream of YAML Documents.\n *\n * ```ts\n * import { Composer, Parser } from 'yaml'\n *\n * const src: string = ...\n * const tokens = new Parser().parse(src)\n * const docs = new Composer().compose(tokens)\n * ```\n */\nclass Composer {\n constructor(options = {}) {\n this.doc = null;\n this.atDirectives = false;\n this.prelude = [];\n this.errors = [];\n this.warnings = [];\n this.onError = (source, code, message, warning) => {\n const pos = getErrorPos(source);\n if (warning)\n this.warnings.push(new errors.YAMLWarning(pos, code, message));\n else\n this.errors.push(new errors.YAMLParseError(pos, code, message));\n };\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n this.directives = new directives.Directives({ version: options.version || '1.2' });\n this.options = options;\n }\n decorate(doc, afterDoc) {\n const { comment, afterEmptyLine } = parsePrelude(this.prelude);\n //console.log({ dc: doc.comment, prelude, comment })\n if (comment) {\n const dc = doc.contents;\n if (afterDoc) {\n doc.comment = doc.comment ? `${doc.comment}\\n${comment}` : comment;\n }\n else if (afterEmptyLine || doc.directives.docStart || !dc) {\n doc.commentBefore = comment;\n }\n else if (identity.isCollection(dc) && !dc.flow && dc.items.length > 0) {\n let it = dc.items[0];\n if (identity.isPair(it))\n it = it.key;\n const cb = it.commentBefore;\n it.commentBefore = cb ? `${comment}\\n${cb}` : comment;\n }\n else {\n const cb = dc.commentBefore;\n dc.commentBefore = cb ? `${comment}\\n${cb}` : comment;\n }\n }\n if (afterDoc) {\n for (let i = 0; i < this.errors.length; ++i)\n doc.errors.push(this.errors[i]);\n for (let i = 0; i < this.warnings.length; ++i)\n doc.warnings.push(this.warnings[i]);\n }\n else {\n doc.errors = this.errors;\n doc.warnings = this.warnings;\n }\n this.prelude = [];\n this.errors = [];\n this.warnings = [];\n }\n /**\n * Current stream status information.\n *\n * Mostly useful at the end of input for an empty stream.\n */\n streamInfo() {\n return {\n comment: parsePrelude(this.prelude).comment,\n directives: this.directives,\n errors: this.errors,\n warnings: this.warnings\n };\n }\n /**\n * Compose tokens into documents.\n *\n * @param forceDoc - If the stream contains no document, still emit a final document including any comments and directives that would be applied to a subsequent document.\n * @param endOffset - Should be set if `forceDoc` is also set, to set the document range end and to indicate errors correctly.\n */\n *compose(tokens, forceDoc = false, endOffset = -1) {\n for (const token of tokens)\n yield* this.next(token);\n yield* this.end(forceDoc, endOffset);\n }\n /** Advance the composer by one CST token. */\n *next(token) {\n if (node_process.env.LOG_STREAM)\n console.dir(token, { depth: null });\n switch (token.type) {\n case 'directive':\n this.directives.add(token.source, (offset, message, warning) => {\n const pos = getErrorPos(token);\n pos[0] += offset;\n this.onError(pos, 'BAD_DIRECTIVE', message, warning);\n });\n this.prelude.push(token.source);\n this.atDirectives = true;\n break;\n case 'document': {\n const doc = composeDoc.composeDoc(this.options, this.directives, token, this.onError);\n if (this.atDirectives && !doc.directives.docStart)\n this.onError(token, 'MISSING_CHAR', 'Missing directives-end/doc-start indicator line');\n this.decorate(doc, false);\n if (this.doc)\n yield this.doc;\n this.doc = doc;\n this.atDirectives = false;\n break;\n }\n case 'byte-order-mark':\n case 'space':\n break;\n case 'comment':\n case 'newline':\n this.prelude.push(token.source);\n break;\n case 'error': {\n const msg = token.source\n ? `${token.message}: ${JSON.stringify(token.source)}`\n : token.message;\n const error = new errors.YAMLParseError(getErrorPos(token), 'UNEXPECTED_TOKEN', msg);\n if (this.atDirectives || !this.doc)\n this.errors.push(error);\n else\n this.doc.errors.push(error);\n break;\n }\n case 'doc-end': {\n if (!this.doc) {\n const msg = 'Unexpected doc-end without preceding document';\n this.errors.push(new errors.YAMLParseError(getErrorPos(token), 'UNEXPECTED_TOKEN', msg));\n break;\n }\n this.doc.directives.docEnd = true;\n const end = resolveEnd.resolveEnd(token.end, token.offset + token.source.length, this.doc.options.strict, this.onError);\n this.decorate(this.doc, true);\n if (end.comment) {\n const dc = this.doc.comment;\n this.doc.comment = dc ? `${dc}\\n${end.comment}` : end.comment;\n }\n this.doc.range[2] = end.offset;\n break;\n }\n default:\n this.errors.push(new errors.YAMLParseError(getErrorPos(token), 'UNEXPECTED_TOKEN', `Unsupported token ${token.type}`));\n }\n }\n /**\n * Call at end of input to yield any remaining document.\n *\n * @param forceDoc - If the stream contains no document, still emit a final document including any comments and directives that would be applied to a subsequent document.\n * @param endOffset - Should be set if `forceDoc` is also set, to set the document range end and to indicate errors correctly.\n */\n *end(forceDoc = false, endOffset = -1) {\n if (this.doc) {\n this.decorate(this.doc, true);\n yield this.doc;\n this.doc = null;\n }\n else if (forceDoc) {\n const opts = Object.assign({ _directives: this.directives }, this.options);\n const doc = new Document.Document(undefined, opts);\n if (this.atDirectives)\n this.onError(endOffset, 'MISSING_CHAR', 'Missing directives-end indicator line');\n doc.range = [0, endOffset, endOffset];\n this.decorate(doc, false);\n yield doc;\n }\n }\n}\n\nexports.Composer = Composer;\n","'use strict';\n\nvar resolveBlockScalar = require('../compose/resolve-block-scalar.js');\nvar resolveFlowScalar = require('../compose/resolve-flow-scalar.js');\nvar errors = require('../errors.js');\nvar stringifyString = require('../stringify/stringifyString.js');\n\nfunction resolveAsScalar(token, strict = true, onError) {\n if (token) {\n const _onError = (pos, code, message) => {\n const offset = typeof pos === 'number' ? pos : Array.isArray(pos) ? pos[0] : pos.offset;\n if (onError)\n onError(offset, code, message);\n else\n throw new errors.YAMLParseError([offset, offset + 1], code, message);\n };\n switch (token.type) {\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar':\n return resolveFlowScalar.resolveFlowScalar(token, strict, _onError);\n case 'block-scalar':\n return resolveBlockScalar.resolveBlockScalar({ options: { strict } }, token, _onError);\n }\n }\n return null;\n}\n/**\n * Create a new scalar token with `value`\n *\n * Values that represent an actual string but may be parsed as a different type should use a `type` other than `'PLAIN'`,\n * as this function does not support any schema operations and won't check for such conflicts.\n *\n * @param value The string representation of the value, which will have its content properly indented.\n * @param context.end Comments and whitespace after the end of the value, or after the block scalar header. If undefined, a newline will be added.\n * @param context.implicitKey Being within an implicit key may affect the resolved type of the token's value.\n * @param context.indent The indent level of the token.\n * @param context.inFlow Is this scalar within a flow collection? This may affect the resolved type of the token's value.\n * @param context.offset The offset position of the token.\n * @param context.type The preferred type of the scalar token. If undefined, the previous type of the `token` will be used, defaulting to `'PLAIN'`.\n */\nfunction createScalarToken(value, context) {\n const { implicitKey = false, indent, inFlow = false, offset = -1, type = 'PLAIN' } = context;\n const source = stringifyString.stringifyString({ type, value }, {\n implicitKey,\n indent: indent > 0 ? ' '.repeat(indent) : '',\n inFlow,\n options: { blockQuote: true, lineWidth: -1 }\n });\n const end = context.end ?? [\n { type: 'newline', offset: -1, indent, source: '\\n' }\n ];\n switch (source[0]) {\n case '|':\n case '>': {\n const he = source.indexOf('\\n');\n const head = source.substring(0, he);\n const body = source.substring(he + 1) + '\\n';\n const props = [\n { type: 'block-scalar-header', offset, indent, source: head }\n ];\n if (!addEndtoBlockProps(props, end))\n props.push({ type: 'newline', offset: -1, indent, source: '\\n' });\n return { type: 'block-scalar', offset, indent, props, source: body };\n }\n case '\"':\n return { type: 'double-quoted-scalar', offset, indent, source, end };\n case \"'\":\n return { type: 'single-quoted-scalar', offset, indent, source, end };\n default:\n return { type: 'scalar', offset, indent, source, end };\n }\n}\n/**\n * Set the value of `token` to the given string `value`, overwriting any previous contents and type that it may have.\n *\n * Best efforts are made to retain any comments previously associated with the `token`,\n * though all contents within a collection's `items` will be overwritten.\n *\n * Values that represent an actual string but may be parsed as a different type should use a `type` other than `'PLAIN'`,\n * as this function does not support any schema operations and won't check for such conflicts.\n *\n * @param token Any token. If it does not include an `indent` value, the value will be stringified as if it were an implicit key.\n * @param value The string representation of the value, which will have its content properly indented.\n * @param context.afterKey In most cases, values after a key should have an additional level of indentation.\n * @param context.implicitKey Being within an implicit key may affect the resolved type of the token's value.\n * @param context.inFlow Being within a flow collection may affect the resolved type of the token's value.\n * @param context.type The preferred type of the scalar token. If undefined, the previous type of the `token` will be used, defaulting to `'PLAIN'`.\n */\nfunction setScalarValue(token, value, context = {}) {\n let { afterKey = false, implicitKey = false, inFlow = false, type } = context;\n let indent = 'indent' in token ? token.indent : null;\n if (afterKey && typeof indent === 'number')\n indent += 2;\n if (!type)\n switch (token.type) {\n case 'single-quoted-scalar':\n type = 'QUOTE_SINGLE';\n break;\n case 'double-quoted-scalar':\n type = 'QUOTE_DOUBLE';\n break;\n case 'block-scalar': {\n const header = token.props[0];\n if (header.type !== 'block-scalar-header')\n throw new Error('Invalid block scalar header');\n type = header.source[0] === '>' ? 'BLOCK_FOLDED' : 'BLOCK_LITERAL';\n break;\n }\n default:\n type = 'PLAIN';\n }\n const source = stringifyString.stringifyString({ type, value }, {\n implicitKey: implicitKey || indent === null,\n indent: indent !== null && indent > 0 ? ' '.repeat(indent) : '',\n inFlow,\n options: { blockQuote: true, lineWidth: -1 }\n });\n switch (source[0]) {\n case '|':\n case '>':\n setBlockScalarValue(token, source);\n break;\n case '\"':\n setFlowScalarValue(token, source, 'double-quoted-scalar');\n break;\n case \"'\":\n setFlowScalarValue(token, source, 'single-quoted-scalar');\n break;\n default:\n setFlowScalarValue(token, source, 'scalar');\n }\n}\nfunction setBlockScalarValue(token, source) {\n const he = source.indexOf('\\n');\n const head = source.substring(0, he);\n const body = source.substring(he + 1) + '\\n';\n if (token.type === 'block-scalar') {\n const header = token.props[0];\n if (header.type !== 'block-scalar-header')\n throw new Error('Invalid block scalar header');\n header.source = head;\n token.source = body;\n }\n else {\n const { offset } = token;\n const indent = 'indent' in token ? token.indent : -1;\n const props = [\n { type: 'block-scalar-header', offset, indent, source: head }\n ];\n if (!addEndtoBlockProps(props, 'end' in token ? token.end : undefined))\n props.push({ type: 'newline', offset: -1, indent, source: '\\n' });\n for (const key of Object.keys(token))\n if (key !== 'type' && key !== 'offset')\n delete token[key];\n Object.assign(token, { type: 'block-scalar', indent, props, source: body });\n }\n}\n/** @returns `true` if last token is a newline */\nfunction addEndtoBlockProps(props, end) {\n if (end)\n for (const st of end)\n switch (st.type) {\n case 'space':\n case 'comment':\n props.push(st);\n break;\n case 'newline':\n props.push(st);\n return true;\n }\n return false;\n}\nfunction setFlowScalarValue(token, source, type) {\n switch (token.type) {\n case 'scalar':\n case 'double-quoted-scalar':\n case 'single-quoted-scalar':\n token.type = type;\n token.source = source;\n break;\n case 'block-scalar': {\n const end = token.props.slice(1);\n let oa = source.length;\n if (token.props[0].type === 'block-scalar-header')\n oa -= token.props[0].source.length;\n for (const tok of end)\n tok.offset += oa;\n delete token.props;\n Object.assign(token, { type, source, end });\n break;\n }\n case 'block-map':\n case 'block-seq': {\n const offset = token.offset + source.length;\n const nl = { type: 'newline', offset, indent: token.indent, source: '\\n' };\n delete token.items;\n Object.assign(token, { type, source, end: [nl] });\n break;\n }\n default: {\n const indent = 'indent' in token ? token.indent : -1;\n const end = 'end' in token && Array.isArray(token.end)\n ? token.end.filter(st => st.type === 'space' ||\n st.type === 'comment' ||\n st.type === 'newline')\n : [];\n for (const key of Object.keys(token))\n if (key !== 'type' && key !== 'offset')\n delete token[key];\n Object.assign(token, { type, indent, source, end });\n }\n }\n}\n\nexports.createScalarToken = createScalarToken;\nexports.resolveAsScalar = resolveAsScalar;\nexports.setScalarValue = setScalarValue;\n","'use strict';\n\n/**\n * Stringify a CST document, token, or collection item\n *\n * Fair warning: This applies no validation whatsoever, and\n * simply concatenates the sources in their logical order.\n */\nconst stringify = (cst) => 'type' in cst ? stringifyToken(cst) : stringifyItem(cst);\nfunction stringifyToken(token) {\n switch (token.type) {\n case 'block-scalar': {\n let res = '';\n for (const tok of token.props)\n res += stringifyToken(tok);\n return res + token.source;\n }\n case 'block-map':\n case 'block-seq': {\n let res = '';\n for (const item of token.items)\n res += stringifyItem(item);\n return res;\n }\n case 'flow-collection': {\n let res = token.start.source;\n for (const item of token.items)\n res += stringifyItem(item);\n for (const st of token.end)\n res += st.source;\n return res;\n }\n case 'document': {\n let res = stringifyItem(token);\n if (token.end)\n for (const st of token.end)\n res += st.source;\n return res;\n }\n default: {\n let res = token.source;\n if ('end' in token && token.end)\n for (const st of token.end)\n res += st.source;\n return res;\n }\n }\n}\nfunction stringifyItem({ start, key, sep, value }) {\n let res = '';\n for (const st of start)\n res += st.source;\n if (key)\n res += stringifyToken(key);\n if (sep)\n for (const st of sep)\n res += st.source;\n if (value)\n res += stringifyToken(value);\n return res;\n}\n\nexports.stringify = stringify;\n","'use strict';\n\nconst BREAK = Symbol('break visit');\nconst SKIP = Symbol('skip children');\nconst REMOVE = Symbol('remove item');\n/**\n * Apply a visitor to a CST document or item.\n *\n * Walks through the tree (depth-first) starting from the root, calling a\n * `visitor` function with two arguments when entering each item:\n * - `item`: The current item, which included the following members:\n * - `start: SourceToken[]` – Source tokens before the key or value,\n * possibly including its anchor or tag.\n * - `key?: Token | null` – Set for pair values. May then be `null`, if\n * the key before the `:` separator is empty.\n * - `sep?: SourceToken[]` – Source tokens between the key and the value,\n * which should include the `:` map value indicator if `value` is set.\n * - `value?: Token` – The value of a sequence item, or of a map pair.\n * - `path`: The steps from the root to the current node, as an array of\n * `['key' | 'value', number]` tuples.\n *\n * The return value of the visitor may be used to control the traversal:\n * - `undefined` (default): Do nothing and continue\n * - `visit.SKIP`: Do not visit the children of this token, continue with\n * next sibling\n * - `visit.BREAK`: Terminate traversal completely\n * - `visit.REMOVE`: Remove the current item, then continue with the next one\n * - `number`: Set the index of the next step. This is useful especially if\n * the index of the current token has changed.\n * - `function`: Define the next visitor for this item. After the original\n * visitor is called on item entry, next visitors are called after handling\n * a non-empty `key` and when exiting the item.\n */\nfunction visit(cst, visitor) {\n if ('type' in cst && cst.type === 'document')\n cst = { start: cst.start, value: cst.value };\n _visit(Object.freeze([]), cst, visitor);\n}\n// Without the `as symbol` casts, TS declares these in the `visit`\n// namespace using `var`, but then complains about that because\n// `unique symbol` must be `const`.\n/** Terminate visit traversal completely */\nvisit.BREAK = BREAK;\n/** Do not visit the children of the current item */\nvisit.SKIP = SKIP;\n/** Remove the current item */\nvisit.REMOVE = REMOVE;\n/** Find the item at `path` from `cst` as the root */\nvisit.itemAtPath = (cst, path) => {\n let item = cst;\n for (const [field, index] of path) {\n const tok = item?.[field];\n if (tok && 'items' in tok) {\n item = tok.items[index];\n }\n else\n return undefined;\n }\n return item;\n};\n/**\n * Get the immediate parent collection of the item at `path` from `cst` as the root.\n *\n * Throws an error if the collection is not found, which should never happen if the item itself exists.\n */\nvisit.parentCollection = (cst, path) => {\n const parent = visit.itemAtPath(cst, path.slice(0, -1));\n const field = path[path.length - 1][0];\n const coll = parent?.[field];\n if (coll && 'items' in coll)\n return coll;\n throw new Error('Parent collection not found');\n};\nfunction _visit(path, item, visitor) {\n let ctrl = visitor(item, path);\n if (typeof ctrl === 'symbol')\n return ctrl;\n for (const field of ['key', 'value']) {\n const token = item[field];\n if (token && 'items' in token) {\n for (let i = 0; i < token.items.length; ++i) {\n const ci = _visit(Object.freeze(path.concat([[field, i]])), token.items[i], visitor);\n if (typeof ci === 'number')\n i = ci - 1;\n else if (ci === BREAK)\n return BREAK;\n else if (ci === REMOVE) {\n token.items.splice(i, 1);\n i -= 1;\n }\n }\n if (typeof ctrl === 'function' && field === 'key')\n ctrl = ctrl(item, path);\n }\n }\n return typeof ctrl === 'function' ? ctrl(item, path) : ctrl;\n}\n\nexports.visit = visit;\n","'use strict';\n\nvar cstScalar = require('./cst-scalar.js');\nvar cstStringify = require('./cst-stringify.js');\nvar cstVisit = require('./cst-visit.js');\n\n/** The byte order mark */\nconst BOM = '\\u{FEFF}';\n/** Start of doc-mode */\nconst DOCUMENT = '\\x02'; // C0: Start of Text\n/** Unexpected end of flow-mode */\nconst FLOW_END = '\\x18'; // C0: Cancel\n/** Next token is a scalar value */\nconst SCALAR = '\\x1f'; // C0: Unit Separator\n/** @returns `true` if `token` is a flow or block collection */\nconst isCollection = (token) => !!token && 'items' in token;\n/** @returns `true` if `token` is a flow or block scalar; not an alias */\nconst isScalar = (token) => !!token &&\n (token.type === 'scalar' ||\n token.type === 'single-quoted-scalar' ||\n token.type === 'double-quoted-scalar' ||\n token.type === 'block-scalar');\n/* istanbul ignore next */\n/** Get a printable representation of a lexer token */\nfunction prettyToken(token) {\n switch (token) {\n case BOM:\n return '<BOM>';\n case DOCUMENT:\n return '<DOC>';\n case FLOW_END:\n return '<FLOW_END>';\n case SCALAR:\n return '<SCALAR>';\n default:\n return JSON.stringify(token);\n }\n}\n/** Identify the type of a lexer token. May return `null` for unknown tokens. */\nfunction tokenType(source) {\n switch (source) {\n case BOM:\n return 'byte-order-mark';\n case DOCUMENT:\n return 'doc-mode';\n case FLOW_END:\n return 'flow-error-end';\n case SCALAR:\n return 'scalar';\n case '---':\n return 'doc-start';\n case '...':\n return 'doc-end';\n case '':\n case '\\n':\n case '\\r\\n':\n return 'newline';\n case '-':\n return 'seq-item-ind';\n case '?':\n return 'explicit-key-ind';\n case ':':\n return 'map-value-ind';\n case '{':\n return 'flow-map-start';\n case '}':\n return 'flow-map-end';\n case '[':\n return 'flow-seq-start';\n case ']':\n return 'flow-seq-end';\n case ',':\n return 'comma';\n }\n switch (source[0]) {\n case ' ':\n case '\\t':\n return 'space';\n case '#':\n return 'comment';\n case '%':\n return 'directive-line';\n case '*':\n return 'alias';\n case '&':\n return 'anchor';\n case '!':\n return 'tag';\n case \"'\":\n return 'single-quoted-scalar';\n case '\"':\n return 'double-quoted-scalar';\n case '|':\n case '>':\n return 'block-scalar-header';\n }\n return null;\n}\n\nexports.createScalarToken = cstScalar.createScalarToken;\nexports.resolveAsScalar = cstScalar.resolveAsScalar;\nexports.setScalarValue = cstScalar.setScalarValue;\nexports.stringify = cstStringify.stringify;\nexports.visit = cstVisit.visit;\nexports.BOM = BOM;\nexports.DOCUMENT = DOCUMENT;\nexports.FLOW_END = FLOW_END;\nexports.SCALAR = SCALAR;\nexports.isCollection = isCollection;\nexports.isScalar = isScalar;\nexports.prettyToken = prettyToken;\nexports.tokenType = tokenType;\n","'use strict';\n\nvar cst = require('./cst.js');\n\n/*\nSTART -> stream\n\nstream\n directive -> line-end -> stream\n indent + line-end -> stream\n [else] -> line-start\n\nline-end\n comment -> line-end\n newline -> .\n input-end -> END\n\nline-start\n doc-start -> doc\n doc-end -> stream\n [else] -> indent -> block-start\n\nblock-start\n seq-item-start -> block-start\n explicit-key-start -> block-start\n map-value-start -> block-start\n [else] -> doc\n\ndoc\n line-end -> line-start\n spaces -> doc\n anchor -> doc\n tag -> doc\n flow-start -> flow -> doc\n flow-end -> error -> doc\n seq-item-start -> error -> doc\n explicit-key-start -> error -> doc\n map-value-start -> doc\n alias -> doc\n quote-start -> quoted-scalar -> doc\n block-scalar-header -> line-end -> block-scalar(min) -> line-start\n [else] -> plain-scalar(false, min) -> doc\n\nflow\n line-end -> flow\n spaces -> flow\n anchor -> flow\n tag -> flow\n flow-start -> flow -> flow\n flow-end -> .\n seq-item-start -> error -> flow\n explicit-key-start -> flow\n map-value-start -> flow\n alias -> flow\n quote-start -> quoted-scalar -> flow\n comma -> flow\n [else] -> plain-scalar(true, 0) -> flow\n\nquoted-scalar\n quote-end -> .\n [else] -> quoted-scalar\n\nblock-scalar(min)\n newline + peek(indent < min) -> .\n [else] -> block-scalar(min)\n\nplain-scalar(is-flow, min)\n scalar-end(is-flow) -> .\n peek(newline + (indent < min)) -> .\n [else] -> plain-scalar(min)\n*/\nfunction isEmpty(ch) {\n switch (ch) {\n case undefined:\n case ' ':\n case '\\n':\n case '\\r':\n case '\\t':\n return true;\n default:\n return false;\n }\n}\nconst hexDigits = new Set('0123456789ABCDEFabcdef');\nconst tagChars = new Set(\"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()\");\nconst flowIndicatorChars = new Set(',[]{}');\nconst invalidAnchorChars = new Set(' ,[]{}\\n\\r\\t');\nconst isNotAnchorChar = (ch) => !ch || invalidAnchorChars.has(ch);\n/**\n * Splits an input string into lexical tokens, i.e. smaller strings that are\n * easily identifiable by `tokens.tokenType()`.\n *\n * Lexing starts always in a \"stream\" context. Incomplete input may be buffered\n * until a complete token can be emitted.\n *\n * In addition to slices of the original input, the following control characters\n * may also be emitted:\n *\n * - `\\x02` (Start of Text): A document starts with the next token\n * - `\\x18` (Cancel): Unexpected end of flow-mode (indicates an error)\n * - `\\x1f` (Unit Separator): Next token is a scalar value\n * - `\\u{FEFF}` (Byte order mark): Emitted separately outside documents\n */\nclass Lexer {\n constructor() {\n /**\n * Flag indicating whether the end of the current buffer marks the end of\n * all input\n */\n this.atEnd = false;\n /**\n * Explicit indent set in block scalar header, as an offset from the current\n * minimum indent, so e.g. set to 1 from a header `|2+`. Set to -1 if not\n * explicitly set.\n */\n this.blockScalarIndent = -1;\n /**\n * Block scalars that include a + (keep) chomping indicator in their header\n * include trailing empty lines, which are otherwise excluded from the\n * scalar's contents.\n */\n this.blockScalarKeep = false;\n /** Current input */\n this.buffer = '';\n /**\n * Flag noting whether the map value indicator : can immediately follow this\n * node within a flow context.\n */\n this.flowKey = false;\n /** Count of surrounding flow collection levels. */\n this.flowLevel = 0;\n /**\n * Minimum level of indentation required for next lines to be parsed as a\n * part of the current scalar value.\n */\n this.indentNext = 0;\n /** Indentation level of the current line. */\n this.indentValue = 0;\n /** Position of the next \\n character. */\n this.lineEndPos = null;\n /** Stores the state of the lexer if reaching the end of incpomplete input */\n this.next = null;\n /** A pointer to `buffer`; the current position of the lexer. */\n this.pos = 0;\n }\n /**\n * Generate YAML tokens from the `source` string. If `incomplete`,\n * a part of the last line may be left as a buffer for the next call.\n *\n * @returns A generator of lexical tokens\n */\n *lex(source, incomplete = false) {\n if (source) {\n if (typeof source !== 'string')\n throw TypeError('source is not a string');\n this.buffer = this.buffer ? this.buffer + source : source;\n this.lineEndPos = null;\n }\n this.atEnd = !incomplete;\n let next = this.next ?? 'stream';\n while (next && (incomplete || this.hasChars(1)))\n next = yield* this.parseNext(next);\n }\n atLineEnd() {\n let i = this.pos;\n let ch = this.buffer[i];\n while (ch === ' ' || ch === '\\t')\n ch = this.buffer[++i];\n if (!ch || ch === '#' || ch === '\\n')\n return true;\n if (ch === '\\r')\n return this.buffer[i + 1] === '\\n';\n return false;\n }\n charAt(n) {\n return this.buffer[this.pos + n];\n }\n continueScalar(offset) {\n let ch = this.buffer[offset];\n if (this.indentNext > 0) {\n let indent = 0;\n while (ch === ' ')\n ch = this.buffer[++indent + offset];\n if (ch === '\\r') {\n const next = this.buffer[indent + offset + 1];\n if (next === '\\n' || (!next && !this.atEnd))\n return offset + indent + 1;\n }\n return ch === '\\n' || indent >= this.indentNext || (!ch && !this.atEnd)\n ? offset + indent\n : -1;\n }\n if (ch === '-' || ch === '.') {\n const dt = this.buffer.substr(offset, 3);\n if ((dt === '---' || dt === '...') && isEmpty(this.buffer[offset + 3]))\n return -1;\n }\n return offset;\n }\n getLine() {\n let end = this.lineEndPos;\n if (typeof end !== 'number' || (end !== -1 && end < this.pos)) {\n end = this.buffer.indexOf('\\n', this.pos);\n this.lineEndPos = end;\n }\n if (end === -1)\n return this.atEnd ? this.buffer.substring(this.pos) : null;\n if (this.buffer[end - 1] === '\\r')\n end -= 1;\n return this.buffer.substring(this.pos, end);\n }\n hasChars(n) {\n return this.pos + n <= this.buffer.length;\n }\n setNext(state) {\n this.buffer = this.buffer.substring(this.pos);\n this.pos = 0;\n this.lineEndPos = null;\n this.next = state;\n return null;\n }\n peek(n) {\n return this.buffer.substr(this.pos, n);\n }\n *parseNext(next) {\n switch (next) {\n case 'stream':\n return yield* this.parseStream();\n case 'line-start':\n return yield* this.parseLineStart();\n case 'block-start':\n return yield* this.parseBlockStart();\n case 'doc':\n return yield* this.parseDocument();\n case 'flow':\n return yield* this.parseFlowCollection();\n case 'quoted-scalar':\n return yield* this.parseQuotedScalar();\n case 'block-scalar':\n return yield* this.parseBlockScalar();\n case 'plain-scalar':\n return yield* this.parsePlainScalar();\n }\n }\n *parseStream() {\n let line = this.getLine();\n if (line === null)\n return this.setNext('stream');\n if (line[0] === cst.BOM) {\n yield* this.pushCount(1);\n line = line.substring(1);\n }\n if (line[0] === '%') {\n let dirEnd = line.length;\n let cs = line.indexOf('#');\n while (cs !== -1) {\n const ch = line[cs - 1];\n if (ch === ' ' || ch === '\\t') {\n dirEnd = cs - 1;\n break;\n }\n else {\n cs = line.indexOf('#', cs + 1);\n }\n }\n while (true) {\n const ch = line[dirEnd - 1];\n if (ch === ' ' || ch === '\\t')\n dirEnd -= 1;\n else\n break;\n }\n const n = (yield* this.pushCount(dirEnd)) + (yield* this.pushSpaces(true));\n yield* this.pushCount(line.length - n); // possible comment\n this.pushNewline();\n return 'stream';\n }\n if (this.atLineEnd()) {\n const sp = yield* this.pushSpaces(true);\n yield* this.pushCount(line.length - sp);\n yield* this.pushNewline();\n return 'stream';\n }\n yield cst.DOCUMENT;\n return yield* this.parseLineStart();\n }\n *parseLineStart() {\n const ch = this.charAt(0);\n if (!ch && !this.atEnd)\n return this.setNext('line-start');\n if (ch === '-' || ch === '.') {\n if (!this.atEnd && !this.hasChars(4))\n return this.setNext('line-start');\n const s = this.peek(3);\n if ((s === '---' || s === '...') && isEmpty(this.charAt(3))) {\n yield* this.pushCount(3);\n this.indentValue = 0;\n this.indentNext = 0;\n return s === '---' ? 'doc' : 'stream';\n }\n }\n this.indentValue = yield* this.pushSpaces(false);\n if (this.indentNext > this.indentValue && !isEmpty(this.charAt(1)))\n this.indentNext = this.indentValue;\n return yield* this.parseBlockStart();\n }\n *parseBlockStart() {\n const [ch0, ch1] = this.peek(2);\n if (!ch1 && !this.atEnd)\n return this.setNext('block-start');\n if ((ch0 === '-' || ch0 === '?' || ch0 === ':') && isEmpty(ch1)) {\n const n = (yield* this.pushCount(1)) + (yield* this.pushSpaces(true));\n this.indentNext = this.indentValue + 1;\n this.indentValue += n;\n return 'block-start';\n }\n return 'doc';\n }\n *parseDocument() {\n yield* this.pushSpaces(true);\n const line = this.getLine();\n if (line === null)\n return this.setNext('doc');\n let n = yield* this.pushIndicators();\n switch (line[n]) {\n case '#':\n yield* this.pushCount(line.length - n);\n // fallthrough\n case undefined:\n yield* this.pushNewline();\n return yield* this.parseLineStart();\n case '{':\n case '[':\n yield* this.pushCount(1);\n this.flowKey = false;\n this.flowLevel = 1;\n return 'flow';\n case '}':\n case ']':\n // this is an error\n yield* this.pushCount(1);\n return 'doc';\n case '*':\n yield* this.pushUntil(isNotAnchorChar);\n return 'doc';\n case '\"':\n case \"'\":\n return yield* this.parseQuotedScalar();\n case '|':\n case '>':\n n += yield* this.parseBlockScalarHeader();\n n += yield* this.pushSpaces(true);\n yield* this.pushCount(line.length - n);\n yield* this.pushNewline();\n return yield* this.parseBlockScalar();\n default:\n return yield* this.parsePlainScalar();\n }\n }\n *parseFlowCollection() {\n let nl, sp;\n let indent = -1;\n do {\n nl = yield* this.pushNewline();\n if (nl > 0) {\n sp = yield* this.pushSpaces(false);\n this.indentValue = indent = sp;\n }\n else {\n sp = 0;\n }\n sp += yield* this.pushSpaces(true);\n } while (nl + sp > 0);\n const line = this.getLine();\n if (line === null)\n return this.setNext('flow');\n if ((indent !== -1 && indent < this.indentNext && line[0] !== '#') ||\n (indent === 0 &&\n (line.startsWith('---') || line.startsWith('...')) &&\n isEmpty(line[3]))) {\n // Allowing for the terminal ] or } at the same (rather than greater)\n // indent level as the initial [ or { is technically invalid, but\n // failing here would be surprising to users.\n const atFlowEndMarker = indent === this.indentNext - 1 &&\n this.flowLevel === 1 &&\n (line[0] === ']' || line[0] === '}');\n if (!atFlowEndMarker) {\n // this is an error\n this.flowLevel = 0;\n yield cst.FLOW_END;\n return yield* this.parseLineStart();\n }\n }\n let n = 0;\n while (line[n] === ',') {\n n += yield* this.pushCount(1);\n n += yield* this.pushSpaces(true);\n this.flowKey = false;\n }\n n += yield* this.pushIndicators();\n switch (line[n]) {\n case undefined:\n return 'flow';\n case '#':\n yield* this.pushCount(line.length - n);\n return 'flow';\n case '{':\n case '[':\n yield* this.pushCount(1);\n this.flowKey = false;\n this.flowLevel += 1;\n return 'flow';\n case '}':\n case ']':\n yield* this.pushCount(1);\n this.flowKey = true;\n this.flowLevel -= 1;\n return this.flowLevel ? 'flow' : 'doc';\n case '*':\n yield* this.pushUntil(isNotAnchorChar);\n return 'flow';\n case '\"':\n case \"'\":\n this.flowKey = true;\n return yield* this.parseQuotedScalar();\n case ':': {\n const next = this.charAt(1);\n if (this.flowKey || isEmpty(next) || next === ',') {\n this.flowKey = false;\n yield* this.pushCount(1);\n yield* this.pushSpaces(true);\n return 'flow';\n }\n }\n // fallthrough\n default:\n this.flowKey = false;\n return yield* this.parsePlainScalar();\n }\n }\n *parseQuotedScalar() {\n const quote = this.charAt(0);\n let end = this.buffer.indexOf(quote, this.pos + 1);\n if (quote === \"'\") {\n while (end !== -1 && this.buffer[end + 1] === \"'\")\n end = this.buffer.indexOf(\"'\", end + 2);\n }\n else {\n // double-quote\n while (end !== -1) {\n let n = 0;\n while (this.buffer[end - 1 - n] === '\\\\')\n n += 1;\n if (n % 2 === 0)\n break;\n end = this.buffer.indexOf('\"', end + 1);\n }\n }\n // Only looking for newlines within the quotes\n const qb = this.buffer.substring(0, end);\n let nl = qb.indexOf('\\n', this.pos);\n if (nl !== -1) {\n while (nl !== -1) {\n const cs = this.continueScalar(nl + 1);\n if (cs === -1)\n break;\n nl = qb.indexOf('\\n', cs);\n }\n if (nl !== -1) {\n // this is an error caused by an unexpected unindent\n end = nl - (qb[nl - 1] === '\\r' ? 2 : 1);\n }\n }\n if (end === -1) {\n if (!this.atEnd)\n return this.setNext('quoted-scalar');\n end = this.buffer.length;\n }\n yield* this.pushToIndex(end + 1, false);\n return this.flowLevel ? 'flow' : 'doc';\n }\n *parseBlockScalarHeader() {\n this.blockScalarIndent = -1;\n this.blockScalarKeep = false;\n let i = this.pos;\n while (true) {\n const ch = this.buffer[++i];\n if (ch === '+')\n this.blockScalarKeep = true;\n else if (ch > '0' && ch <= '9')\n this.blockScalarIndent = Number(ch) - 1;\n else if (ch !== '-')\n break;\n }\n return yield* this.pushUntil(ch => isEmpty(ch) || ch === '#');\n }\n *parseBlockScalar() {\n let nl = this.pos - 1; // may be -1 if this.pos === 0\n let indent = 0;\n let ch;\n loop: for (let i = this.pos; (ch = this.buffer[i]); ++i) {\n switch (ch) {\n case ' ':\n indent += 1;\n break;\n case '\\n':\n nl = i;\n indent = 0;\n break;\n case '\\r': {\n const next = this.buffer[i + 1];\n if (!next && !this.atEnd)\n return this.setNext('block-scalar');\n if (next === '\\n')\n break;\n } // fallthrough\n default:\n break loop;\n }\n }\n if (!ch && !this.atEnd)\n return this.setNext('block-scalar');\n if (indent >= this.indentNext) {\n if (this.blockScalarIndent === -1)\n this.indentNext = indent;\n else {\n this.indentNext =\n this.blockScalarIndent + (this.indentNext === 0 ? 1 : this.indentNext);\n }\n do {\n const cs = this.continueScalar(nl + 1);\n if (cs === -1)\n break;\n nl = this.buffer.indexOf('\\n', cs);\n } while (nl !== -1);\n if (nl === -1) {\n if (!this.atEnd)\n return this.setNext('block-scalar');\n nl = this.buffer.length;\n }\n }\n // Trailing insufficiently indented tabs are invalid.\n // To catch that during parsing, we include them in the block scalar value.\n let i = nl + 1;\n ch = this.buffer[i];\n while (ch === ' ')\n ch = this.buffer[++i];\n if (ch === '\\t') {\n while (ch === '\\t' || ch === ' ' || ch === '\\r' || ch === '\\n')\n ch = this.buffer[++i];\n nl = i - 1;\n }\n else if (!this.blockScalarKeep) {\n do {\n let i = nl - 1;\n let ch = this.buffer[i];\n if (ch === '\\r')\n ch = this.buffer[--i];\n const lastChar = i; // Drop the line if last char not more indented\n while (ch === ' ')\n ch = this.buffer[--i];\n if (ch === '\\n' && i >= this.pos && i + 1 + indent > lastChar)\n nl = i;\n else\n break;\n } while (true);\n }\n yield cst.SCALAR;\n yield* this.pushToIndex(nl + 1, true);\n return yield* this.parseLineStart();\n }\n *parsePlainScalar() {\n const inFlow = this.flowLevel > 0;\n let end = this.pos - 1;\n let i = this.pos - 1;\n let ch;\n while ((ch = this.buffer[++i])) {\n if (ch === ':') {\n const next = this.buffer[i + 1];\n if (isEmpty(next) || (inFlow && flowIndicatorChars.has(next)))\n break;\n end = i;\n }\n else if (isEmpty(ch)) {\n let next = this.buffer[i + 1];\n if (ch === '\\r') {\n if (next === '\\n') {\n i += 1;\n ch = '\\n';\n next = this.buffer[i + 1];\n }\n else\n end = i;\n }\n if (next === '#' || (inFlow && flowIndicatorChars.has(next)))\n break;\n if (ch === '\\n') {\n const cs = this.continueScalar(i + 1);\n if (cs === -1)\n break;\n i = Math.max(i, cs - 2); // to advance, but still account for ' #'\n }\n }\n else {\n if (inFlow && flowIndicatorChars.has(ch))\n break;\n end = i;\n }\n }\n if (!ch && !this.atEnd)\n return this.setNext('plain-scalar');\n yield cst.SCALAR;\n yield* this.pushToIndex(end + 1, true);\n return inFlow ? 'flow' : 'doc';\n }\n *pushCount(n) {\n if (n > 0) {\n yield this.buffer.substr(this.pos, n);\n this.pos += n;\n return n;\n }\n return 0;\n }\n *pushToIndex(i, allowEmpty) {\n const s = this.buffer.slice(this.pos, i);\n if (s) {\n yield s;\n this.pos += s.length;\n return s.length;\n }\n else if (allowEmpty)\n yield '';\n return 0;\n }\n *pushIndicators() {\n let n = 0;\n loop: while (true) {\n switch (this.charAt(0)) {\n case '!':\n n += yield* this.pushTag();\n n += yield* this.pushSpaces(true);\n continue loop;\n case '&':\n n += yield* this.pushUntil(isNotAnchorChar);\n n += yield* this.pushSpaces(true);\n continue loop;\n case '-': // this is an error\n case '?': // this is an error outside flow collections\n case ':': {\n const inFlow = this.flowLevel > 0;\n const ch1 = this.charAt(1);\n if (isEmpty(ch1) || (inFlow && flowIndicatorChars.has(ch1))) {\n if (!inFlow)\n this.indentNext = this.indentValue + 1;\n else if (this.flowKey)\n this.flowKey = false;\n n += yield* this.pushCount(1);\n n += yield* this.pushSpaces(true);\n continue loop;\n }\n }\n }\n break loop;\n }\n return n;\n }\n *pushTag() {\n if (this.charAt(1) === '<') {\n let i = this.pos + 2;\n let ch = this.buffer[i];\n while (!isEmpty(ch) && ch !== '>')\n ch = this.buffer[++i];\n return yield* this.pushToIndex(ch === '>' ? i + 1 : i, false);\n }\n else {\n let i = this.pos + 1;\n let ch = this.buffer[i];\n while (ch) {\n if (tagChars.has(ch))\n ch = this.buffer[++i];\n else if (ch === '%' &&\n hexDigits.has(this.buffer[i + 1]) &&\n hexDigits.has(this.buffer[i + 2])) {\n ch = this.buffer[(i += 3)];\n }\n else\n break;\n }\n return yield* this.pushToIndex(i, false);\n }\n }\n *pushNewline() {\n const ch = this.buffer[this.pos];\n if (ch === '\\n')\n return yield* this.pushCount(1);\n else if (ch === '\\r' && this.charAt(1) === '\\n')\n return yield* this.pushCount(2);\n else\n return 0;\n }\n *pushSpaces(allowTabs) {\n let i = this.pos - 1;\n let ch;\n do {\n ch = this.buffer[++i];\n } while (ch === ' ' || (allowTabs && ch === '\\t'));\n const n = i - this.pos;\n if (n > 0) {\n yield this.buffer.substr(this.pos, n);\n this.pos = i;\n }\n return n;\n }\n *pushUntil(test) {\n let i = this.pos;\n let ch = this.buffer[i];\n while (!test(ch))\n ch = this.buffer[++i];\n return yield* this.pushToIndex(i, false);\n }\n}\n\nexports.Lexer = Lexer;\n","'use strict';\n\n/**\n * Tracks newlines during parsing in order to provide an efficient API for\n * determining the one-indexed `{ line, col }` position for any offset\n * within the input.\n */\nclass LineCounter {\n constructor() {\n this.lineStarts = [];\n /**\n * Should be called in ascending order. Otherwise, call\n * `lineCounter.lineStarts.sort()` before calling `linePos()`.\n */\n this.addNewLine = (offset) => this.lineStarts.push(offset);\n /**\n * Performs a binary search and returns the 1-indexed { line, col }\n * position of `offset`. If `line === 0`, `addNewLine` has never been\n * called or `offset` is before the first known newline.\n */\n this.linePos = (offset) => {\n let low = 0;\n let high = this.lineStarts.length;\n while (low < high) {\n const mid = (low + high) >> 1; // Math.floor((low + high) / 2)\n if (this.lineStarts[mid] < offset)\n low = mid + 1;\n else\n high = mid;\n }\n if (this.lineStarts[low] === offset)\n return { line: low + 1, col: 1 };\n if (low === 0)\n return { line: 0, col: offset };\n const start = this.lineStarts[low - 1];\n return { line: low, col: offset - start + 1 };\n };\n }\n}\n\nexports.LineCounter = LineCounter;\n","'use strict';\n\nvar node_process = require('process');\nvar cst = require('./cst.js');\nvar lexer = require('./lexer.js');\n\nfunction includesToken(list, type) {\n for (let i = 0; i < list.length; ++i)\n if (list[i].type === type)\n return true;\n return false;\n}\nfunction findNonEmptyIndex(list) {\n for (let i = 0; i < list.length; ++i) {\n switch (list[i].type) {\n case 'space':\n case 'comment':\n case 'newline':\n break;\n default:\n return i;\n }\n }\n return -1;\n}\nfunction isFlowToken(token) {\n switch (token?.type) {\n case 'alias':\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar':\n case 'flow-collection':\n return true;\n default:\n return false;\n }\n}\nfunction getPrevProps(parent) {\n switch (parent.type) {\n case 'document':\n return parent.start;\n case 'block-map': {\n const it = parent.items[parent.items.length - 1];\n return it.sep ?? it.start;\n }\n case 'block-seq':\n return parent.items[parent.items.length - 1].start;\n /* istanbul ignore next should not happen */\n default:\n return [];\n }\n}\n/** Note: May modify input array */\nfunction getFirstKeyStartProps(prev) {\n if (prev.length === 0)\n return [];\n let i = prev.length;\n loop: while (--i >= 0) {\n switch (prev[i].type) {\n case 'doc-start':\n case 'explicit-key-ind':\n case 'map-value-ind':\n case 'seq-item-ind':\n case 'newline':\n break loop;\n }\n }\n while (prev[++i]?.type === 'space') {\n /* loop */\n }\n return prev.splice(i, prev.length);\n}\nfunction arrayPushArray(target, source) {\n // May exhaust call stack with large `source` array\n if (source.length < 1e5)\n Array.prototype.push.apply(target, source);\n else\n for (let i = 0; i < source.length; ++i)\n target.push(source[i]);\n}\nfunction fixFlowSeqItems(fc) {\n if (fc.start.type === 'flow-seq-start') {\n for (const it of fc.items) {\n if (it.sep &&\n !it.value &&\n !includesToken(it.start, 'explicit-key-ind') &&\n !includesToken(it.sep, 'map-value-ind')) {\n if (it.key)\n it.value = it.key;\n delete it.key;\n if (isFlowToken(it.value)) {\n if (it.value.end)\n arrayPushArray(it.value.end, it.sep);\n else\n it.value.end = it.sep;\n }\n else\n arrayPushArray(it.start, it.sep);\n delete it.sep;\n }\n }\n }\n}\n/**\n * A YAML concrete syntax tree (CST) parser\n *\n * ```ts\n * const src: string = ...\n * for (const token of new Parser().parse(src)) {\n * // token: Token\n * }\n * ```\n *\n * To use the parser with a user-provided lexer:\n *\n * ```ts\n * function* parse(source: string, lexer: Lexer) {\n * const parser = new Parser()\n * for (const lexeme of lexer.lex(source))\n * yield* parser.next(lexeme)\n * yield* parser.end()\n * }\n *\n * const src: string = ...\n * const lexer = new Lexer()\n * for (const token of parse(src, lexer)) {\n * // token: Token\n * }\n * ```\n */\nclass Parser {\n /**\n * @param onNewLine - If defined, called separately with the start position of\n * each new line (in `parse()`, including the start of input).\n */\n constructor(onNewLine) {\n /** If true, space and sequence indicators count as indentation */\n this.atNewLine = true;\n /** If true, next token is a scalar value */\n this.atScalar = false;\n /** Current indentation level */\n this.indent = 0;\n /** Current offset since the start of parsing */\n this.offset = 0;\n /** On the same line with a block map key */\n this.onKeyLine = false;\n /** Top indicates the node that's currently being built */\n this.stack = [];\n /** The source of the current token, set in parse() */\n this.source = '';\n /** The type of the current token, set in parse() */\n this.type = '';\n // Must be defined after `next()`\n this.lexer = new lexer.Lexer();\n this.onNewLine = onNewLine;\n }\n /**\n * Parse `source` as a YAML stream.\n * If `incomplete`, a part of the last line may be left as a buffer for the next call.\n *\n * Errors are not thrown, but yielded as `{ type: 'error', message }` tokens.\n *\n * @returns A generator of tokens representing each directive, document, and other structure.\n */\n *parse(source, incomplete = false) {\n if (this.onNewLine && this.offset === 0)\n this.onNewLine(0);\n for (const lexeme of this.lexer.lex(source, incomplete))\n yield* this.next(lexeme);\n if (!incomplete)\n yield* this.end();\n }\n /**\n * Advance the parser by the `source` of one lexical token.\n */\n *next(source) {\n this.source = source;\n if (node_process.env.LOG_TOKENS)\n console.log('|', cst.prettyToken(source));\n if (this.atScalar) {\n this.atScalar = false;\n yield* this.step();\n this.offset += source.length;\n return;\n }\n const type = cst.tokenType(source);\n if (!type) {\n const message = `Not a YAML token: ${source}`;\n yield* this.pop({ type: 'error', offset: this.offset, message, source });\n this.offset += source.length;\n }\n else if (type === 'scalar') {\n this.atNewLine = false;\n this.atScalar = true;\n this.type = 'scalar';\n }\n else {\n this.type = type;\n yield* this.step();\n switch (type) {\n case 'newline':\n this.atNewLine = true;\n this.indent = 0;\n if (this.onNewLine)\n this.onNewLine(this.offset + source.length);\n break;\n case 'space':\n if (this.atNewLine && source[0] === ' ')\n this.indent += source.length;\n break;\n case 'explicit-key-ind':\n case 'map-value-ind':\n case 'seq-item-ind':\n if (this.atNewLine)\n this.indent += source.length;\n break;\n case 'doc-mode':\n case 'flow-error-end':\n return;\n default:\n this.atNewLine = false;\n }\n this.offset += source.length;\n }\n }\n /** Call at end of input to push out any remaining constructions */\n *end() {\n while (this.stack.length > 0)\n yield* this.pop();\n }\n get sourceToken() {\n const st = {\n type: this.type,\n offset: this.offset,\n indent: this.indent,\n source: this.source\n };\n return st;\n }\n *step() {\n const top = this.peek(1);\n if (this.type === 'doc-end' && top?.type !== 'doc-end') {\n while (this.stack.length > 0)\n yield* this.pop();\n this.stack.push({\n type: 'doc-end',\n offset: this.offset,\n source: this.source\n });\n return;\n }\n if (!top)\n return yield* this.stream();\n switch (top.type) {\n case 'document':\n return yield* this.document(top);\n case 'alias':\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar':\n return yield* this.scalar(top);\n case 'block-scalar':\n return yield* this.blockScalar(top);\n case 'block-map':\n return yield* this.blockMap(top);\n case 'block-seq':\n return yield* this.blockSequence(top);\n case 'flow-collection':\n return yield* this.flowCollection(top);\n case 'doc-end':\n return yield* this.documentEnd(top);\n }\n /* istanbul ignore next should not happen */\n yield* this.pop();\n }\n peek(n) {\n return this.stack[this.stack.length - n];\n }\n *pop(error) {\n const token = error ?? this.stack.pop();\n /* istanbul ignore if should not happen */\n if (!token) {\n const message = 'Tried to pop an empty stack';\n yield { type: 'error', offset: this.offset, source: '', message };\n }\n else if (this.stack.length === 0) {\n yield token;\n }\n else {\n const top = this.peek(1);\n if (token.type === 'block-scalar') {\n // Block scalars use their parent rather than header indent\n token.indent = 'indent' in top ? top.indent : 0;\n }\n else if (token.type === 'flow-collection' && top.type === 'document') {\n // Ignore all indent for top-level flow collections\n token.indent = 0;\n }\n if (token.type === 'flow-collection')\n fixFlowSeqItems(token);\n switch (top.type) {\n case 'document':\n top.value = token;\n break;\n case 'block-scalar':\n top.props.push(token); // error\n break;\n case 'block-map': {\n const it = top.items[top.items.length - 1];\n if (it.value) {\n top.items.push({ start: [], key: token, sep: [] });\n this.onKeyLine = true;\n return;\n }\n else if (it.sep) {\n it.value = token;\n }\n else {\n Object.assign(it, { key: token, sep: [] });\n this.onKeyLine = !it.explicitKey;\n return;\n }\n break;\n }\n case 'block-seq': {\n const it = top.items[top.items.length - 1];\n if (it.value)\n top.items.push({ start: [], value: token });\n else\n it.value = token;\n break;\n }\n case 'flow-collection': {\n const it = top.items[top.items.length - 1];\n if (!it || it.value)\n top.items.push({ start: [], key: token, sep: [] });\n else if (it.sep)\n it.value = token;\n else\n Object.assign(it, { key: token, sep: [] });\n return;\n }\n /* istanbul ignore next should not happen */\n default:\n yield* this.pop();\n yield* this.pop(token);\n }\n if ((top.type === 'document' ||\n top.type === 'block-map' ||\n top.type === 'block-seq') &&\n (token.type === 'block-map' || token.type === 'block-seq')) {\n const last = token.items[token.items.length - 1];\n if (last &&\n !last.sep &&\n !last.value &&\n last.start.length > 0 &&\n findNonEmptyIndex(last.start) === -1 &&\n (token.indent === 0 ||\n last.start.every(st => st.type !== 'comment' || st.indent < token.indent))) {\n if (top.type === 'document')\n top.end = last.start;\n else\n top.items.push({ start: last.start });\n token.items.splice(-1, 1);\n }\n }\n }\n }\n *stream() {\n switch (this.type) {\n case 'directive-line':\n yield { type: 'directive', offset: this.offset, source: this.source };\n return;\n case 'byte-order-mark':\n case 'space':\n case 'comment':\n case 'newline':\n yield this.sourceToken;\n return;\n case 'doc-mode':\n case 'doc-start': {\n const doc = {\n type: 'document',\n offset: this.offset,\n start: []\n };\n if (this.type === 'doc-start')\n doc.start.push(this.sourceToken);\n this.stack.push(doc);\n return;\n }\n }\n yield {\n type: 'error',\n offset: this.offset,\n message: `Unexpected ${this.type} token in YAML stream`,\n source: this.source\n };\n }\n *document(doc) {\n if (doc.value)\n return yield* this.lineEnd(doc);\n switch (this.type) {\n case 'doc-start': {\n if (findNonEmptyIndex(doc.start) !== -1) {\n yield* this.pop();\n yield* this.step();\n }\n else\n doc.start.push(this.sourceToken);\n return;\n }\n case 'anchor':\n case 'tag':\n case 'space':\n case 'comment':\n case 'newline':\n doc.start.push(this.sourceToken);\n return;\n }\n const bv = this.startBlockValue(doc);\n if (bv)\n this.stack.push(bv);\n else {\n yield {\n type: 'error',\n offset: this.offset,\n message: `Unexpected ${this.type} token in YAML document`,\n source: this.source\n };\n }\n }\n *scalar(scalar) {\n if (this.type === 'map-value-ind') {\n const prev = getPrevProps(this.peek(2));\n const start = getFirstKeyStartProps(prev);\n let sep;\n if (scalar.end) {\n sep = scalar.end;\n sep.push(this.sourceToken);\n delete scalar.end;\n }\n else\n sep = [this.sourceToken];\n const map = {\n type: 'block-map',\n offset: scalar.offset,\n indent: scalar.indent,\n items: [{ start, key: scalar, sep }]\n };\n this.onKeyLine = true;\n this.stack[this.stack.length - 1] = map;\n }\n else\n yield* this.lineEnd(scalar);\n }\n *blockScalar(scalar) {\n switch (this.type) {\n case 'space':\n case 'comment':\n case 'newline':\n scalar.props.push(this.sourceToken);\n return;\n case 'scalar':\n scalar.source = this.source;\n // block-scalar source includes trailing newline\n this.atNewLine = true;\n this.indent = 0;\n if (this.onNewLine) {\n let nl = this.source.indexOf('\\n') + 1;\n while (nl !== 0) {\n this.onNewLine(this.offset + nl);\n nl = this.source.indexOf('\\n', nl) + 1;\n }\n }\n yield* this.pop();\n break;\n /* istanbul ignore next should not happen */\n default:\n yield* this.pop();\n yield* this.step();\n }\n }\n *blockMap(map) {\n const it = map.items[map.items.length - 1];\n // it.sep is true-ish if pair already has key or : separator\n switch (this.type) {\n case 'newline':\n this.onKeyLine = false;\n if (it.value) {\n const end = 'end' in it.value ? it.value.end : undefined;\n const last = Array.isArray(end) ? end[end.length - 1] : undefined;\n if (last?.type === 'comment')\n end?.push(this.sourceToken);\n else\n map.items.push({ start: [this.sourceToken] });\n }\n else if (it.sep) {\n it.sep.push(this.sourceToken);\n }\n else {\n it.start.push(this.sourceToken);\n }\n return;\n case 'space':\n case 'comment':\n if (it.value) {\n map.items.push({ start: [this.sourceToken] });\n }\n else if (it.sep) {\n it.sep.push(this.sourceToken);\n }\n else {\n if (this.atIndentedComment(it.start, map.indent)) {\n const prev = map.items[map.items.length - 2];\n const end = prev?.value?.end;\n if (Array.isArray(end)) {\n arrayPushArray(end, it.start);\n end.push(this.sourceToken);\n map.items.pop();\n return;\n }\n }\n it.start.push(this.sourceToken);\n }\n return;\n }\n if (this.indent >= map.indent) {\n const atMapIndent = !this.onKeyLine && this.indent === map.indent;\n const atNextItem = atMapIndent &&\n (it.sep || it.explicitKey) &&\n this.type !== 'seq-item-ind';\n // For empty nodes, assign newline-separated not indented empty tokens to following node\n let start = [];\n if (atNextItem && it.sep && !it.value) {\n const nl = [];\n for (let i = 0; i < it.sep.length; ++i) {\n const st = it.sep[i];\n switch (st.type) {\n case 'newline':\n nl.push(i);\n break;\n case 'space':\n break;\n case 'comment':\n if (st.indent > map.indent)\n nl.length = 0;\n break;\n default:\n nl.length = 0;\n }\n }\n if (nl.length >= 2)\n start = it.sep.splice(nl[1]);\n }\n switch (this.type) {\n case 'anchor':\n case 'tag':\n if (atNextItem || it.value) {\n start.push(this.sourceToken);\n map.items.push({ start });\n this.onKeyLine = true;\n }\n else if (it.sep) {\n it.sep.push(this.sourceToken);\n }\n else {\n it.start.push(this.sourceToken);\n }\n return;\n case 'explicit-key-ind':\n if (!it.sep && !it.explicitKey) {\n it.start.push(this.sourceToken);\n it.explicitKey = true;\n }\n else if (atNextItem || it.value) {\n start.push(this.sourceToken);\n map.items.push({ start, explicitKey: true });\n }\n else {\n this.stack.push({\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start: [this.sourceToken], explicitKey: true }]\n });\n }\n this.onKeyLine = true;\n return;\n case 'map-value-ind':\n if (it.explicitKey) {\n if (!it.sep) {\n if (includesToken(it.start, 'newline')) {\n Object.assign(it, { key: null, sep: [this.sourceToken] });\n }\n else {\n const start = getFirstKeyStartProps(it.start);\n this.stack.push({\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start, key: null, sep: [this.sourceToken] }]\n });\n }\n }\n else if (it.value) {\n map.items.push({ start: [], key: null, sep: [this.sourceToken] });\n }\n else if (includesToken(it.sep, 'map-value-ind')) {\n this.stack.push({\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start, key: null, sep: [this.sourceToken] }]\n });\n }\n else if (isFlowToken(it.key) &&\n !includesToken(it.sep, 'newline')) {\n const start = getFirstKeyStartProps(it.start);\n const key = it.key;\n const sep = it.sep;\n sep.push(this.sourceToken);\n // @ts-expect-error type guard is wrong here\n delete it.key;\n // @ts-expect-error type guard is wrong here\n delete it.sep;\n this.stack.push({\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start, key, sep }]\n });\n }\n else if (start.length > 0) {\n // Not actually at next item\n it.sep = it.sep.concat(start, this.sourceToken);\n }\n else {\n it.sep.push(this.sourceToken);\n }\n }\n else {\n if (!it.sep) {\n Object.assign(it, { key: null, sep: [this.sourceToken] });\n }\n else if (it.value || atNextItem) {\n map.items.push({ start, key: null, sep: [this.sourceToken] });\n }\n else if (includesToken(it.sep, 'map-value-ind')) {\n this.stack.push({\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start: [], key: null, sep: [this.sourceToken] }]\n });\n }\n else {\n it.sep.push(this.sourceToken);\n }\n }\n this.onKeyLine = true;\n return;\n case 'alias':\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar': {\n const fs = this.flowScalar(this.type);\n if (atNextItem || it.value) {\n map.items.push({ start, key: fs, sep: [] });\n this.onKeyLine = true;\n }\n else if (it.sep) {\n this.stack.push(fs);\n }\n else {\n Object.assign(it, { key: fs, sep: [] });\n this.onKeyLine = true;\n }\n return;\n }\n default: {\n const bv = this.startBlockValue(map);\n if (bv) {\n if (bv.type === 'block-seq') {\n if (!it.explicitKey &&\n it.sep &&\n !includesToken(it.sep, 'newline')) {\n yield* this.pop({\n type: 'error',\n offset: this.offset,\n message: 'Unexpected block-seq-ind on same line with key',\n source: this.source\n });\n return;\n }\n }\n else if (atMapIndent) {\n map.items.push({ start });\n }\n this.stack.push(bv);\n return;\n }\n }\n }\n }\n yield* this.pop();\n yield* this.step();\n }\n *blockSequence(seq) {\n const it = seq.items[seq.items.length - 1];\n switch (this.type) {\n case 'newline':\n if (it.value) {\n const end = 'end' in it.value ? it.value.end : undefined;\n const last = Array.isArray(end) ? end[end.length - 1] : undefined;\n if (last?.type === 'comment')\n end?.push(this.sourceToken);\n else\n seq.items.push({ start: [this.sourceToken] });\n }\n else\n it.start.push(this.sourceToken);\n return;\n case 'space':\n case 'comment':\n if (it.value)\n seq.items.push({ start: [this.sourceToken] });\n else {\n if (this.atIndentedComment(it.start, seq.indent)) {\n const prev = seq.items[seq.items.length - 2];\n const end = prev?.value?.end;\n if (Array.isArray(end)) {\n arrayPushArray(end, it.start);\n end.push(this.sourceToken);\n seq.items.pop();\n return;\n }\n }\n it.start.push(this.sourceToken);\n }\n return;\n case 'anchor':\n case 'tag':\n if (it.value || this.indent <= seq.indent)\n break;\n it.start.push(this.sourceToken);\n return;\n case 'seq-item-ind':\n if (this.indent !== seq.indent)\n break;\n if (it.value || includesToken(it.start, 'seq-item-ind'))\n seq.items.push({ start: [this.sourceToken] });\n else\n it.start.push(this.sourceToken);\n return;\n }\n if (this.indent > seq.indent) {\n const bv = this.startBlockValue(seq);\n if (bv) {\n this.stack.push(bv);\n return;\n }\n }\n yield* this.pop();\n yield* this.step();\n }\n *flowCollection(fc) {\n const it = fc.items[fc.items.length - 1];\n if (this.type === 'flow-error-end') {\n let top;\n do {\n yield* this.pop();\n top = this.peek(1);\n } while (top?.type === 'flow-collection');\n }\n else if (fc.end.length === 0) {\n switch (this.type) {\n case 'comma':\n case 'explicit-key-ind':\n if (!it || it.sep)\n fc.items.push({ start: [this.sourceToken] });\n else\n it.start.push(this.sourceToken);\n return;\n case 'map-value-ind':\n if (!it || it.value)\n fc.items.push({ start: [], key: null, sep: [this.sourceToken] });\n else if (it.sep)\n it.sep.push(this.sourceToken);\n else\n Object.assign(it, { key: null, sep: [this.sourceToken] });\n return;\n case 'space':\n case 'comment':\n case 'newline':\n case 'anchor':\n case 'tag':\n if (!it || it.value)\n fc.items.push({ start: [this.sourceToken] });\n else if (it.sep)\n it.sep.push(this.sourceToken);\n else\n it.start.push(this.sourceToken);\n return;\n case 'alias':\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar': {\n const fs = this.flowScalar(this.type);\n if (!it || it.value)\n fc.items.push({ start: [], key: fs, sep: [] });\n else if (it.sep)\n this.stack.push(fs);\n else\n Object.assign(it, { key: fs, sep: [] });\n return;\n }\n case 'flow-map-end':\n case 'flow-seq-end':\n fc.end.push(this.sourceToken);\n return;\n }\n const bv = this.startBlockValue(fc);\n /* istanbul ignore else should not happen */\n if (bv)\n this.stack.push(bv);\n else {\n yield* this.pop();\n yield* this.step();\n }\n }\n else {\n const parent = this.peek(2);\n if (parent.type === 'block-map' &&\n ((this.type === 'map-value-ind' && parent.indent === fc.indent) ||\n (this.type === 'newline' &&\n !parent.items[parent.items.length - 1].sep))) {\n yield* this.pop();\n yield* this.step();\n }\n else if (this.type === 'map-value-ind' &&\n parent.type !== 'flow-collection') {\n const prev = getPrevProps(parent);\n const start = getFirstKeyStartProps(prev);\n fixFlowSeqItems(fc);\n const sep = fc.end.splice(1, fc.end.length);\n sep.push(this.sourceToken);\n const map = {\n type: 'block-map',\n offset: fc.offset,\n indent: fc.indent,\n items: [{ start, key: fc, sep }]\n };\n this.onKeyLine = true;\n this.stack[this.stack.length - 1] = map;\n }\n else {\n yield* this.lineEnd(fc);\n }\n }\n }\n flowScalar(type) {\n if (this.onNewLine) {\n let nl = this.source.indexOf('\\n') + 1;\n while (nl !== 0) {\n this.onNewLine(this.offset + nl);\n nl = this.source.indexOf('\\n', nl) + 1;\n }\n }\n return {\n type,\n offset: this.offset,\n indent: this.indent,\n source: this.source\n };\n }\n startBlockValue(parent) {\n switch (this.type) {\n case 'alias':\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar':\n return this.flowScalar(this.type);\n case 'block-scalar-header':\n return {\n type: 'block-scalar',\n offset: this.offset,\n indent: this.indent,\n props: [this.sourceToken],\n source: ''\n };\n case 'flow-map-start':\n case 'flow-seq-start':\n return {\n type: 'flow-collection',\n offset: this.offset,\n indent: this.indent,\n start: this.sourceToken,\n items: [],\n end: []\n };\n case 'seq-item-ind':\n return {\n type: 'block-seq',\n offset: this.offset,\n indent: this.indent,\n items: [{ start: [this.sourceToken] }]\n };\n case 'explicit-key-ind': {\n this.onKeyLine = true;\n const prev = getPrevProps(parent);\n const start = getFirstKeyStartProps(prev);\n start.push(this.sourceToken);\n return {\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start, explicitKey: true }]\n };\n }\n case 'map-value-ind': {\n this.onKeyLine = true;\n const prev = getPrevProps(parent);\n const start = getFirstKeyStartProps(prev);\n return {\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start, key: null, sep: [this.sourceToken] }]\n };\n }\n }\n return null;\n }\n atIndentedComment(start, indent) {\n if (this.type !== 'comment')\n return false;\n if (this.indent <= indent)\n return false;\n return start.every(st => st.type === 'newline' || st.type === 'space');\n }\n *documentEnd(docEnd) {\n if (this.type !== 'doc-mode') {\n if (docEnd.end)\n docEnd.end.push(this.sourceToken);\n else\n docEnd.end = [this.sourceToken];\n if (this.type === 'newline')\n yield* this.pop();\n }\n }\n *lineEnd(token) {\n switch (this.type) {\n case 'comma':\n case 'doc-start':\n case 'doc-end':\n case 'flow-seq-end':\n case 'flow-map-end':\n case 'map-value-ind':\n yield* this.pop();\n yield* this.step();\n break;\n case 'newline':\n this.onKeyLine = false;\n // fallthrough\n case 'space':\n case 'comment':\n default:\n // all other values are errors\n if (token.end)\n token.end.push(this.sourceToken);\n else\n token.end = [this.sourceToken];\n if (this.type === 'newline')\n yield* this.pop();\n }\n }\n}\n\nexports.Parser = Parser;\n","'use strict';\n\nvar composer = require('./compose/composer.js');\nvar Document = require('./doc/Document.js');\nvar errors = require('./errors.js');\nvar log = require('./log.js');\nvar identity = require('./nodes/identity.js');\nvar lineCounter = require('./parse/line-counter.js');\nvar parser = require('./parse/parser.js');\n\nfunction parseOptions(options) {\n const prettyErrors = options.prettyErrors !== false;\n const lineCounter$1 = options.lineCounter || (prettyErrors && new lineCounter.LineCounter()) || null;\n return { lineCounter: lineCounter$1, prettyErrors };\n}\n/**\n * Parse the input as a stream of YAML documents.\n *\n * Documents should be separated from each other by `...` or `---` marker lines.\n *\n * @returns If an empty `docs` array is returned, it will be of type\n * EmptyStream and contain additional stream information. In\n * TypeScript, you should use `'empty' in docs` as a type guard for it.\n */\nfunction parseAllDocuments(source, options = {}) {\n const { lineCounter, prettyErrors } = parseOptions(options);\n const parser$1 = new parser.Parser(lineCounter?.addNewLine);\n const composer$1 = new composer.Composer(options);\n const docs = Array.from(composer$1.compose(parser$1.parse(source)));\n if (prettyErrors && lineCounter)\n for (const doc of docs) {\n doc.errors.forEach(errors.prettifyError(source, lineCounter));\n doc.warnings.forEach(errors.prettifyError(source, lineCounter));\n }\n if (docs.length > 0)\n return docs;\n return Object.assign([], { empty: true }, composer$1.streamInfo());\n}\n/** Parse an input string into a single YAML.Document */\nfunction parseDocument(source, options = {}) {\n const { lineCounter, prettyErrors } = parseOptions(options);\n const parser$1 = new parser.Parser(lineCounter?.addNewLine);\n const composer$1 = new composer.Composer(options);\n // `doc` is always set by compose.end(true) at the very latest\n let doc = null;\n for (const _doc of composer$1.compose(parser$1.parse(source), true, source.length)) {\n if (!doc)\n doc = _doc;\n else if (doc.options.logLevel !== 'silent') {\n doc.errors.push(new errors.YAMLParseError(_doc.range.slice(0, 2), 'MULTIPLE_DOCS', 'Source contains multiple documents; please use YAML.parseAllDocuments()'));\n break;\n }\n }\n if (prettyErrors && lineCounter) {\n doc.errors.forEach(errors.prettifyError(source, lineCounter));\n doc.warnings.forEach(errors.prettifyError(source, lineCounter));\n }\n return doc;\n}\nfunction parse(src, reviver, options) {\n let _reviver = undefined;\n if (typeof reviver === 'function') {\n _reviver = reviver;\n }\n else if (options === undefined && reviver && typeof reviver === 'object') {\n options = reviver;\n }\n const doc = parseDocument(src, options);\n if (!doc)\n return null;\n doc.warnings.forEach(warning => log.warn(doc.options.logLevel, warning));\n if (doc.errors.length > 0) {\n if (doc.options.logLevel !== 'silent')\n throw doc.errors[0];\n else\n doc.errors = [];\n }\n return doc.toJS(Object.assign({ reviver: _reviver }, options));\n}\nfunction stringify(value, replacer, options) {\n let _replacer = null;\n if (typeof replacer === 'function' || Array.isArray(replacer)) {\n _replacer = replacer;\n }\n else if (options === undefined && replacer) {\n options = replacer;\n }\n if (typeof options === 'string')\n options = options.length;\n if (typeof options === 'number') {\n const indent = Math.round(options);\n options = indent < 1 ? undefined : indent > 8 ? { indent: 8 } : { indent };\n }\n if (value === undefined) {\n const { keepUndefined } = options ?? replacer ?? {};\n if (!keepUndefined)\n return undefined;\n }\n if (identity.isDocument(value) && !_replacer)\n return value.toString(options);\n return new Document.Document(value, _replacer, options).toString(options);\n}\n\nexports.parse = parse;\nexports.parseAllDocuments = parseAllDocuments;\nexports.parseDocument = parseDocument;\nexports.stringify = stringify;\n","'use strict';\n\nvar composer = require('./compose/composer.js');\nvar Document = require('./doc/Document.js');\nvar Schema = require('./schema/Schema.js');\nvar errors = require('./errors.js');\nvar Alias = require('./nodes/Alias.js');\nvar identity = require('./nodes/identity.js');\nvar Pair = require('./nodes/Pair.js');\nvar Scalar = require('./nodes/Scalar.js');\nvar YAMLMap = require('./nodes/YAMLMap.js');\nvar YAMLSeq = require('./nodes/YAMLSeq.js');\nvar cst = require('./parse/cst.js');\nvar lexer = require('./parse/lexer.js');\nvar lineCounter = require('./parse/line-counter.js');\nvar parser = require('./parse/parser.js');\nvar publicApi = require('./public-api.js');\nvar visit = require('./visit.js');\n\n\n\nexports.Composer = composer.Composer;\nexports.Document = Document.Document;\nexports.Schema = Schema.Schema;\nexports.YAMLError = errors.YAMLError;\nexports.YAMLParseError = errors.YAMLParseError;\nexports.YAMLWarning = errors.YAMLWarning;\nexports.Alias = Alias.Alias;\nexports.isAlias = identity.isAlias;\nexports.isCollection = identity.isCollection;\nexports.isDocument = identity.isDocument;\nexports.isMap = identity.isMap;\nexports.isNode = identity.isNode;\nexports.isPair = identity.isPair;\nexports.isScalar = identity.isScalar;\nexports.isSeq = identity.isSeq;\nexports.Pair = Pair.Pair;\nexports.Scalar = Scalar.Scalar;\nexports.YAMLMap = YAMLMap.YAMLMap;\nexports.YAMLSeq = YAMLSeq.YAMLSeq;\nexports.CST = cst;\nexports.Lexer = lexer.Lexer;\nexports.LineCounter = lineCounter.LineCounter;\nexports.Parser = parser.Parser;\nexports.parse = publicApi.parse;\nexports.parseAllDocuments = publicApi.parseAllDocuments;\nexports.parseDocument = publicApi.parseDocument;\nexports.stringify = publicApi.stringify;\nexports.visit = visit.visit;\nexports.visitAsync = visit.visitAsync;\n","/**\n * @author shaozilee\n *\n * BMP format encoder,encode 24bit BMP\n * Not support quality compression\n *\n */\n\nfunction BmpEncoder(imgData){\n\tthis.buffer = imgData.data;\n\tthis.width = imgData.width;\n\tthis.height = imgData.height;\n\tthis.extraBytes = this.width%4;\n\tthis.rgbSize = this.height*(3*this.width+this.extraBytes);\n\tthis.headerInfoSize = 40;\n\n\tthis.data = [];\n\t/******************header***********************/\n\tthis.flag = \"BM\";\n\tthis.reserved = 0;\n\tthis.offset = 54;\n\tthis.fileSize = this.rgbSize+this.offset;\n\tthis.planes = 1;\n\tthis.bitPP = 24;\n\tthis.compress = 0;\n\tthis.hr = 0;\n\tthis.vr = 0;\n\tthis.colors = 0;\n\tthis.importantColors = 0;\n}\n\nBmpEncoder.prototype.encode = function() {\n\tvar tempBuffer = new Buffer(this.offset+this.rgbSize);\n\tthis.pos = 0;\n\ttempBuffer.write(this.flag,this.pos,2);this.pos+=2;\n\ttempBuffer.writeUInt32LE(this.fileSize,this.pos);this.pos+=4;\n\ttempBuffer.writeUInt32LE(this.reserved,this.pos);this.pos+=4;\n\ttempBuffer.writeUInt32LE(this.offset,this.pos);this.pos+=4;\n\n\ttempBuffer.writeUInt32LE(this.headerInfoSize,this.pos);this.pos+=4;\n\ttempBuffer.writeUInt32LE(this.width,this.pos);this.pos+=4;\n\ttempBuffer.writeInt32LE(-this.height,this.pos);this.pos+=4;\n\ttempBuffer.writeUInt16LE(this.planes,this.pos);this.pos+=2;\n\ttempBuffer.writeUInt16LE(this.bitPP,this.pos);this.pos+=2;\n\ttempBuffer.writeUInt32LE(this.compress,this.pos);this.pos+=4;\n\ttempBuffer.writeUInt32LE(this.rgbSize,this.pos);this.pos+=4;\n\ttempBuffer.writeUInt32LE(this.hr,this.pos);this.pos+=4;\n\ttempBuffer.writeUInt32LE(this.vr,this.pos);this.pos+=4;\n\ttempBuffer.writeUInt32LE(this.colors,this.pos);this.pos+=4;\n\ttempBuffer.writeUInt32LE(this.importantColors,this.pos);this.pos+=4;\n\n\tvar i=0;\n\tvar rowBytes = 3*this.width+this.extraBytes;\n\n\tfor (var y = 0; y <this.height; y++){\n\t\tfor (var x = 0; x < this.width; x++){\n\t\t\tvar p = this.pos+y*rowBytes+x*3;\n\t\t\ti++;//a\n\t\t\ttempBuffer[p]= this.buffer[i++];//b\n\t\t\ttempBuffer[p+1] = this.buffer[i++];//g\n\t\t\ttempBuffer[p+2] = this.buffer[i++];//r\n\t\t}\n\t\tif(this.extraBytes>0){\n\t\t\tvar fillOffset = this.pos+y*rowBytes+this.width*3;\n\t\t\ttempBuffer.fill(0,fillOffset,fillOffset+this.extraBytes);\n\t\t}\n\t}\n\n\treturn tempBuffer;\n};\n\nmodule.exports = function(imgData, quality) {\n if (typeof quality === 'undefined') quality = 100;\n \tvar encoder = new BmpEncoder(imgData);\n\tvar data = encoder.encode();\n return {\n data: data,\n width: imgData.width,\n height: imgData.height\n };\n};\n","/**\n * @author shaozilee\n *\n * Bmp format decoder,support 1bit 4bit 8bit 24bit bmp\n *\n */\n\nfunction BmpDecoder(buffer,is_with_alpha) {\n this.pos = 0;\n this.buffer = buffer;\n this.is_with_alpha = !!is_with_alpha;\n this.bottom_up = true;\n this.flag = this.buffer.toString(\"utf-8\", 0, this.pos += 2);\n if (this.flag != \"BM\") throw new Error(\"Invalid BMP File\");\n this.parseHeader();\n this.parseRGBA();\n}\n\nBmpDecoder.prototype.parseHeader = function() {\n this.fileSize = this.buffer.readUInt32LE(this.pos);\n this.pos += 4;\n this.reserved = this.buffer.readUInt32LE(this.pos);\n this.pos += 4;\n this.offset = this.buffer.readUInt32LE(this.pos);\n this.pos += 4;\n this.headerSize = this.buffer.readUInt32LE(this.pos);\n this.pos += 4;\n this.width = this.buffer.readUInt32LE(this.pos);\n this.pos += 4;\n this.height = this.buffer.readInt32LE(this.pos);\n this.pos += 4;\n this.planes = this.buffer.readUInt16LE(this.pos);\n this.pos += 2;\n this.bitPP = this.buffer.readUInt16LE(this.pos);\n this.pos += 2;\n this.compress = this.buffer.readUInt32LE(this.pos);\n this.pos += 4;\n this.rawSize = this.buffer.readUInt32LE(this.pos);\n this.pos += 4;\n this.hr = this.buffer.readUInt32LE(this.pos);\n this.pos += 4;\n this.vr = this.buffer.readUInt32LE(this.pos);\n this.pos += 4;\n this.colors = this.buffer.readUInt32LE(this.pos);\n this.pos += 4;\n this.importantColors = this.buffer.readUInt32LE(this.pos);\n this.pos += 4;\n\n if(this.bitPP === 16 && this.is_with_alpha){\n this.bitPP = 15\n }\n if (this.bitPP < 15) {\n var len = this.colors === 0 ? 1 << this.bitPP : this.colors;\n this.palette = new Array(len);\n for (var i = 0; i < len; i++) {\n var blue = this.buffer.readUInt8(this.pos++);\n var green = this.buffer.readUInt8(this.pos++);\n var red = this.buffer.readUInt8(this.pos++);\n var quad = this.buffer.readUInt8(this.pos++);\n this.palette[i] = {\n red: red,\n green: green,\n blue: blue,\n quad: quad\n };\n }\n }\n if(this.height < 0) {\n this.height *= -1;\n this.bottom_up = false;\n }\n\n}\n\nBmpDecoder.prototype.parseRGBA = function() {\n var bitn = \"bit\" + this.bitPP;\n var len = this.width * this.height * 4;\n this.data = new Buffer(len);\n this[bitn]();\n};\n\nBmpDecoder.prototype.bit1 = function() {\n var xlen = Math.ceil(this.width / 8);\n var mode = xlen%4;\n var y = this.height >= 0 ? this.height - 1 : -this.height\n for (var y = this.height - 1; y >= 0; y--) {\n var line = this.bottom_up ? y : this.height - 1 - y\n for (var x = 0; x < xlen; x++) {\n var b = this.buffer.readUInt8(this.pos++);\n var location = line * this.width * 4 + x*8*4;\n for (var i = 0; i < 8; i++) {\n if(x*8+i<this.width){\n var rgb = this.palette[((b>>(7-i))&0x1)];\n\n this.data[location+i*4] = 0;\n this.data[location+i*4 + 1] = rgb.blue;\n this.data[location+i*4 + 2] = rgb.green;\n this.data[location+i*4 + 3] = rgb.red;\n\n }else{\n break;\n }\n }\n }\n\n if (mode != 0){\n this.pos+=(4 - mode);\n }\n }\n};\n\nBmpDecoder.prototype.bit4 = function() {\n //RLE-4\n if(this.compress == 2){\n this.data.fill(0xff);\n\n var location = 0;\n var lines = this.bottom_up?this.height-1:0;\n var low_nibble = false;//for all count of pixel\n\n while(location<this.data.length){\n var a = this.buffer.readUInt8(this.pos++);\n var b = this.buffer.readUInt8(this.pos++);\n //absolute mode\n if(a == 0){\n if(b == 0){//line end\n if(this.bottom_up){\n lines--;\n }else{\n lines++;\n }\n location = lines*this.width*4;\n low_nibble = false;\n continue;\n }else if(b == 1){//image end\n break;\n }else if(b ==2){\n //offset x,y\n var x = this.buffer.readUInt8(this.pos++);\n var y = this.buffer.readUInt8(this.pos++);\n if(this.bottom_up){\n lines-=y;\n }else{\n lines+=y;\n }\n\n location +=(y*this.width*4+x*4);\n }else{\n var c = this.buffer.readUInt8(this.pos++);\n for(var i=0;i<b;i++){\n if (low_nibble) {\n setPixelData.call(this, (c & 0x0f));\n } else {\n setPixelData.call(this, (c & 0xf0)>>4);\n }\n\n if ((i & 1) && (i+1 < b)){\n c = this.buffer.readUInt8(this.pos++);\n }\n\n low_nibble = !low_nibble;\n }\n\n if ((((b+1) >> 1) & 1 ) == 1){\n this.pos++\n }\n }\n\n }else{//encoded mode\n for (var i = 0; i < a; i++) {\n if (low_nibble) {\n setPixelData.call(this, (b & 0x0f));\n } else {\n setPixelData.call(this, (b & 0xf0)>>4);\n }\n low_nibble = !low_nibble;\n }\n }\n\n }\n\n\n\n\n function setPixelData(rgbIndex){\n var rgb = this.palette[rgbIndex];\n this.data[location] = 0;\n this.data[location + 1] = rgb.blue;\n this.data[location + 2] = rgb.green;\n this.data[location + 3] = rgb.red;\n location+=4;\n }\n }else{\n\n var xlen = Math.ceil(this.width/2);\n var mode = xlen%4;\n for (var y = this.height - 1; y >= 0; y--) {\n var line = this.bottom_up ? y : this.height - 1 - y\n for (var x = 0; x < xlen; x++) {\n var b = this.buffer.readUInt8(this.pos++);\n var location = line * this.width * 4 + x*2*4;\n\n var before = b>>4;\n var after = b&0x0F;\n\n var rgb = this.palette[before];\n this.data[location] = 0;\n this.data[location + 1] = rgb.blue;\n this.data[location + 2] = rgb.green;\n this.data[location + 3] = rgb.red;\n\n\n if(x*2+1>=this.width)break;\n\n rgb = this.palette[after];\n\n this.data[location+4] = 0;\n this.data[location+4 + 1] = rgb.blue;\n this.data[location+4 + 2] = rgb.green;\n this.data[location+4 + 3] = rgb.red;\n\n }\n\n if (mode != 0){\n this.pos+=(4 - mode);\n }\n }\n\n }\n\n};\n\nBmpDecoder.prototype.bit8 = function() {\n //RLE-8\n if(this.compress == 1){\n this.data.fill(0xff);\n\n var location = 0;\n var lines = this.bottom_up?this.height-1:0;\n\n while(location<this.data.length){\n var a = this.buffer.readUInt8(this.pos++);\n var b = this.buffer.readUInt8(this.pos++);\n //absolute mode\n if(a == 0){\n if(b == 0){//line end\n if(this.bottom_up){\n lines--;\n }else{\n lines++;\n }\n location = lines*this.width*4;\n continue;\n }else if(b == 1){//image end\n break;\n }else if(b ==2){\n //offset x,y\n var x = this.buffer.readUInt8(this.pos++);\n var y = this.buffer.readUInt8(this.pos++);\n if(this.bottom_up){\n lines-=y;\n }else{\n lines+=y;\n }\n\n location +=(y*this.width*4+x*4);\n }else{\n for(var i=0;i<b;i++){\n var c = this.buffer.readUInt8(this.pos++);\n setPixelData.call(this, c);\n }\n if(b&1 == 1){\n this.pos++;\n }\n\n }\n\n }else{//encoded mode\n for (var i = 0; i < a; i++) {\n setPixelData.call(this, b);\n }\n }\n\n }\n\n\n\n\n function setPixelData(rgbIndex){\n var rgb = this.palette[rgbIndex];\n this.data[location] = 0;\n this.data[location + 1] = rgb.blue;\n this.data[location + 2] = rgb.green;\n this.data[location + 3] = rgb.red;\n location+=4;\n }\n }else {\n var mode = this.width % 4;\n for (var y = this.height - 1; y >= 0; y--) {\n var line = this.bottom_up ? y : this.height - 1 - y\n for (var x = 0; x < this.width; x++) {\n var b = this.buffer.readUInt8(this.pos++);\n var location = line * this.width * 4 + x * 4;\n if (b < this.palette.length) {\n var rgb = this.palette[b];\n\n this.data[location] = 0;\n this.data[location + 1] = rgb.blue;\n this.data[location + 2] = rgb.green;\n this.data[location + 3] = rgb.red;\n\n } else {\n this.data[location] = 0;\n this.data[location + 1] = 0xFF;\n this.data[location + 2] = 0xFF;\n this.data[location + 3] = 0xFF;\n }\n }\n if (mode != 0) {\n this.pos += (4 - mode);\n }\n }\n }\n};\n\nBmpDecoder.prototype.bit15 = function() {\n var dif_w =this.width % 3;\n var _11111 = parseInt(\"11111\", 2),_1_5 = _11111;\n for (var y = this.height - 1; y >= 0; y--) {\n var line = this.bottom_up ? y : this.height - 1 - y\n for (var x = 0; x < this.width; x++) {\n\n var B = this.buffer.readUInt16LE(this.pos);\n this.pos+=2;\n var blue = (B & _1_5) / _1_5 * 255 | 0;\n var green = (B >> 5 & _1_5 ) / _1_5 * 255 | 0;\n var red = (B >> 10 & _1_5) / _1_5 * 255 | 0;\n var alpha = (B>>15)?0xFF:0x00;\n\n var location = line * this.width * 4 + x * 4;\n\n this.data[location] = alpha;\n this.data[location + 1] = blue;\n this.data[location + 2] = green;\n this.data[location + 3] = red;\n }\n //skip extra bytes\n this.pos += dif_w;\n }\n};\n\nBmpDecoder.prototype.bit16 = function() {\n var dif_w =(this.width % 2)*2;\n //default xrgb555\n this.maskRed = 0x7C00;\n this.maskGreen = 0x3E0;\n this.maskBlue =0x1F;\n this.mask0 = 0;\n\n if(this.compress == 3){\n this.maskRed = this.buffer.readUInt32LE(this.pos);\n this.pos+=4;\n this.maskGreen = this.buffer.readUInt32LE(this.pos);\n this.pos+=4;\n this.maskBlue = this.buffer.readUInt32LE(this.pos);\n this.pos+=4;\n this.mask0 = this.buffer.readUInt32LE(this.pos);\n this.pos+=4;\n }\n\n\n var ns=[0,0,0];\n for (var i=0;i<16;i++){\n if ((this.maskRed>>i)&0x01) ns[0]++;\n if ((this.maskGreen>>i)&0x01) ns[1]++;\n if ((this.maskBlue>>i)&0x01) ns[2]++;\n }\n ns[1]+=ns[0]; ns[2]+=ns[1];\tns[0]=8-ns[0]; ns[1]-=8; ns[2]-=8;\n\n for (var y = this.height - 1; y >= 0; y--) {\n var line = this.bottom_up ? y : this.height - 1 - y;\n for (var x = 0; x < this.width; x++) {\n\n var B = this.buffer.readUInt16LE(this.pos);\n this.pos+=2;\n\n var blue = (B&this.maskBlue)<<ns[0];\n var green = (B&this.maskGreen)>>ns[1];\n var red = (B&this.maskRed)>>ns[2];\n\n var location = line * this.width * 4 + x * 4;\n\n this.data[location] = 0;\n this.data[location + 1] = blue;\n this.data[location + 2] = green;\n this.data[location + 3] = red;\n }\n //skip extra bytes\n this.pos += dif_w;\n }\n};\n\nBmpDecoder.prototype.bit24 = function() {\n for (var y = this.height - 1; y >= 0; y--) {\n var line = this.bottom_up ? y : this.height - 1 - y\n for (var x = 0; x < this.width; x++) {\n //Little Endian rgb\n var blue = this.buffer.readUInt8(this.pos++);\n var green = this.buffer.readUInt8(this.pos++);\n var red = this.buffer.readUInt8(this.pos++);\n var location = line * this.width * 4 + x * 4;\n this.data[location] = 0;\n this.data[location + 1] = blue;\n this.data[location + 2] = green;\n this.data[location + 3] = red;\n }\n //skip extra bytes\n this.pos += (this.width % 4);\n }\n\n};\n\n/**\n * add 32bit decode func\n * @author soubok\n */\nBmpDecoder.prototype.bit32 = function() {\n //BI_BITFIELDS\n if(this.compress == 3){\n this.maskRed = this.buffer.readUInt32LE(this.pos);\n this.pos+=4;\n this.maskGreen = this.buffer.readUInt32LE(this.pos);\n this.pos+=4;\n this.maskBlue = this.buffer.readUInt32LE(this.pos);\n this.pos+=4;\n this.mask0 = this.buffer.readUInt32LE(this.pos);\n this.pos+=4;\n for (var y = this.height - 1; y >= 0; y--) {\n var line = this.bottom_up ? y : this.height - 1 - y;\n for (var x = 0; x < this.width; x++) {\n //Little Endian rgba\n var alpha = this.buffer.readUInt8(this.pos++);\n var blue = this.buffer.readUInt8(this.pos++);\n var green = this.buffer.readUInt8(this.pos++);\n var red = this.buffer.readUInt8(this.pos++);\n var location = line * this.width * 4 + x * 4;\n this.data[location] = alpha;\n this.data[location + 1] = blue;\n this.data[location + 2] = green;\n this.data[location + 3] = red;\n }\n }\n\n }else{\n for (var y = this.height - 1; y >= 0; y--) {\n var line = this.bottom_up ? y : this.height - 1 - y;\n for (var x = 0; x < this.width; x++) {\n //Little Endian argb\n var blue = this.buffer.readUInt8(this.pos++);\n var green = this.buffer.readUInt8(this.pos++);\n var red = this.buffer.readUInt8(this.pos++);\n var alpha = this.buffer.readUInt8(this.pos++);\n var location = line * this.width * 4 + x * 4;\n this.data[location] = alpha;\n this.data[location + 1] = blue;\n this.data[location + 2] = green;\n this.data[location + 3] = red;\n }\n }\n\n }\n\n\n\n\n};\n\nBmpDecoder.prototype.getData = function() {\n return this.data;\n};\n\nmodule.exports = function(bmpData) {\n var decoder = new BmpDecoder(bmpData);\n return decoder;\n};\n","/**\n * @author shaozilee\n *\n * support 1bit 4bit 8bit 24bit decode\n * encode with 24bit\n * \n */\n\nvar encode = require('./lib/encoder'),\n decode = require('./lib/decoder');\n\nmodule.exports = {\n encode: encode,\n decode: decode\n};\n","import { createHash, randomUUID } from \"node:crypto\";\nimport {\n appendFileSync,\n copyFileSync,\n existsSync,\n mkdirSync,\n readFileSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport type { ThinkingLevel } from \"@zpi-dev/agent\";\nimport type { JsonValue, Message, SystemMessage, Usage } from \"@zpi-dev/ai\";\nimport { assertSupportedOptions, getCurrentTools, isJsonObject } from \"@zpi-dev/ai\";\nimport { applyMicrocompactBoundary, microcompactClearedIds } from \"./microcompact.ts\";\nimport {\n isSessionEntry,\n isSessionHeader,\n maxSessionEntryBytes,\n validateMessage,\n} from \"./record-validation.ts\";\nimport { recoverStreamedToolJournal } from \"./streaming-tool-journal.ts\";\nimport type {\n SessionCurrentState,\n TranscriptSnapshot,\n TranscriptState,\n TranscriptStore,\n} from \"./transcript-store.ts\";\nimport { getMessageProvenance, setMessageProvenance } from \"./transcript-store.ts\";\nexport interface SessionHeader {\n type: \"session\";\n version: 1 | 2;\n format: \"zpi\";\n id: string;\n timestamp: string;\n cwd: string;\n}\ninterface EntryBase {\n id: string;\n parentId: string | null;\n timestamp: string;\n}\nexport type SessionEntry = EntryBase &\n (\n | { type: \"message\"; message: Message }\n | { type: \"model_change\"; provider: string; modelId: string }\n | { type: \"thinking_level_change\"; thinkingLevel: ThinkingLevel }\n | { type: \"session_info\"; name: string }\n | { type: \"custom\"; customType: string; data?: JsonValue }\n | { type: \"microcompact\"; data: import(\"./microcompact.ts\").MicrocompactBoundary }\n | {\n type: \"compaction\";\n summary: string;\n firstKeptEntryId: string;\n tokensBefore?: number;\n details?: { readFiles: string[]; modifiedFiles: string[] };\n usage?: Usage;\n systemMessage?: SystemMessage;\n contextMessage?: SystemMessage;\n }\n );\nexport interface SessionContext {\n messages: Message[];\n thinkingLevel: ThinkingLevel;\n model: { provider: string; modelId: string } | null;\n lastThinkingLevel: ThinkingLevel;\n}\nexport type SessionEntryInput = SessionEntry extends infer Entry\n ? Entry extends SessionEntry\n ? Omit<Entry, keyof EntryBase>\n : never\n : never;\nexport class SessionManager {\n private header: SessionHeader;\n private store?: TranscriptStore;\n private currentState?: SessionCurrentState;\n private contextCache?: { generation: string; endSeq: number; context: SessionContext };\n private entries: SessionEntry[] = [];\n private file?: string;\n private storageError?: Error;\n private appendQueue: Promise<unknown> = Promise.resolve();\n private lastEntry?: SessionEntry;\n private appendListeners = new Set<(entry: SessionEntry) => void>();\n subscribeEntries(listener: (entry: SessionEntry) => void): () => void {\n this.appendListeners.add(listener);\n return () => {\n this.appendListeners.delete(listener);\n };\n }\n private constructor(cwd: string, id: string = randomUUID()) {\n this.header = {\n type: \"session\",\n version: 1,\n format: \"zpi\",\n id,\n timestamp: new Date().toISOString(),\n cwd: resolve(cwd),\n };\n }\n /** Open an already validated indexed store without reading historical message bodies. */\n static fromStore(store: TranscriptStore, currentState?: SessionCurrentState): SessionManager {\n const header = store.getHeader();\n const manager = new SessionManager(header.cwd, header.id);\n manager.header = header;\n manager.file = store.getFile();\n manager.store = store;\n manager.currentState = currentState;\n recoverStreamedToolJournal(manager);\n return manager;\n }\n static async openAsync(\n store: TranscriptStore,\n currentState?: SessionCurrentState,\n ): Promise<SessionManager> {\n return SessionManager.fromStore(store, currentState);\n }\n hasCurrentState(): boolean {\n return this.currentState !== undefined;\n }\n getCurrentState(): Pick<TranscriptState, \"model\" | \"thinkingLevel\" | \"lastThinkingLevel\" | \"name\"> {\n if (this.store && !this.currentState) throw new Error(\"Indexed session requires current-state reader\");\n return this.currentState?.get() ?? this.getStateAt();\n }\n getStateAt(snapshot?: TranscriptSnapshot): TranscriptState {\n if (this.store) return this.store.getStateAt(snapshot ?? this.store.snapshot());\n const context = buildSessionContext(this.entries);\n return {\n model: context.model,\n thinkingLevel: context.thinkingLevel,\n lastThinkingLevel: context.lastThinkingLevel,\n hasThinkingEntry: this.entries.some((e) => e.type === \"thinking_level_change\"),\n lastMessageSeq: this.entries.findLastIndex((e) => e.type === \"message\") + 1,\n lastCompactionSeq: this.entries.findLastIndex((e) => e.type === \"compaction\") + 1,\n name: this.entries.findLast((e) => e.type === \"session_info\")?.name,\n };\n }\n *iterateEntries(): Iterable<SessionEntry> {\n if (!this.store) {\n yield* this.entries;\n return;\n }\n const snapshot = this.store.snapshot();\n for (const { entry } of this.store.readRange(1, snapshot.endSeq, snapshot)) yield entry;\n }\n readEntryById(id: string): SessionEntry | undefined {\n return this.store\n ? this.store.readEntryById(id, this.store.snapshot())?.entry\n : this.entries.find((e) => e.id === id);\n }\n *unresolvedToolJournals(): Iterable<SessionEntry[]> {\n if (this.store) yield* this.store.readUnresolvedToolJournals(this.store.snapshot());\n else yield this.entries;\n }\n /** Only effective retained entries, suitable for compaction and current usage. */\n getContextEntries(): SessionEntry[] {\n if (!this.store) return this.entries.slice();\n const snapshot = this.store.snapshot();\n const plan = this.store.getContextPlan(snapshot);\n const result: SessionEntry[] = [];\n for (const { entry } of this.store.readRange(plan.firstKeptSeq, snapshot.endSeq, snapshot, [\n \"message\",\n \"compaction\",\n \"microcompact\",\n \"model_change\",\n ]))\n result.push(entry);\n return result;\n }\n precedesCompaction(message: Message): boolean {\n const source = getMessageProvenance(message);\n return source !== undefined && source.seq < this.getStateAt().lastCompactionSeq;\n }\n async materializeContext(snapshot?: TranscriptSnapshot): Promise<SessionContext> {\n return this.buildSessionContext(snapshot);\n }\n static create(\n cwd: string,\n sessionDir = join(homedir(), \".zpi\", \"agent\", \"sessions\"),\n options: { id?: string } = {},\n ): SessionManager {\n assertSupportedOptions(options, [\"id\"], \"SessionManager.create\");\n const manager = new SessionManager(cwd, options.id);\n if (!/^[a-zA-Z0-9_-]+$/.test(manager.header.id)) throw new Error(\"Invalid session id\");\n manager.file = join(sessionDir, `${manager.header.id}.jsonl`);\n mkdirSync(sessionDir, { recursive: true });\n writeFileSync(manager.file, `${JSON.stringify(manager.header)}\\n`, { flag: \"wx\", mode: 0o600 });\n return manager;\n }\n static inMemory(\n cwd = process.cwd(),\n options: { id?: string } = {},\n entries: SessionEntry[] = [],\n ): SessionManager {\n assertSupportedOptions(options, [\"id\"], \"SessionManager.inMemory\");\n const m = new SessionManager(cwd, options.id);\n if (entries.some((e) => !isSessionEntry(e))) throw new Error(\"Invalid in-memory session entries\");\n m.entries = structuredClone(entries);\n return m;\n }\n static open(path: string, _sessionDir?: string, cwdOverride?: string): SessionManager {\n const raw = readFileSync(path, \"utf8\");\n const lines = raw.split(\"\\n\");\n if (lines.at(-1) === \"\") lines.pop();\n const parsed: unknown[] = [];\n let repairTo: string | undefined;\n for (let i = 0; i < lines.length; i++) {\n try {\n if (Buffer.byteLength(lines[i]) > maxSessionEntryBytes)\n throw new Error(\"Session entry exceeds 8 MiB\");\n parsed.push(JSON.parse(lines[i]));\n } catch (error) {\n if (i !== lines.length - 1 || i === 0 || raw.endsWith(\"\\n\"))\n throw new Error(`Corrupt session at line ${i + 1}: ${String(error)}`);\n repairTo = `${lines.slice(0, i).join(\"\\n\")}\\n`;\n }\n }\n const h: unknown = parsed.shift();\n if (!isSessionHeader(h)) throw new Error(\"Unsupported session header\");\n let parent: string | null = null;\n const ids = new Set<string>();\n for (const row of parsed) {\n if (!isSessionEntry(row) || ids.has(row.id) || row.parentId !== parent)\n throw new Error(\"Invalid session entry chain or content\");\n ids.add(row.id);\n parent = row.id;\n }\n if (repairTo !== undefined) {\n copyFileSync(path, `${path}.corrupt-${Date.now()}-${randomUUID()}`);\n writeFileSync(path, repairTo, { mode: 0o600 });\n } else if (!raw.endsWith(\"\\n\")) appendFileSync(path, \"\\n\");\n const m = new SessionManager(cwdOverride ?? h.cwd, h.id);\n m.header = { ...h, cwd: cwdOverride ?? h.cwd };\n m.file = path;\n m.entries = parsed as SessionEntry[];\n recoverStreamedToolJournal(m);\n return m;\n }\n getSessionId(): string {\n return this.header.id;\n }\n getSessionFile(): string | undefined {\n return this.store ? this.store.getFile() : this.file;\n }\n getCwd(): string {\n return this.header.cwd;\n }\n /** Move a draft into its worktree before any model messages are committed. */\n setCwd(cwd: string): void {\n if (this.storageError) throw this.storageError;\n if (this.getStateAt().lastMessageSeq || this.getStateAt().lastCompactionSeq)\n throw new Error(\"Cannot move a session with messages\");\n const header = { ...this.header, cwd: resolve(cwd) };\n if (this.store) this.store.replace(header, this.iterateEntries());\n else this.writeTranscript(header, this.entries);\n this.header = header;\n }\n getEntries(): SessionEntry[] {\n if (this.store) throw new Error(\"Indexed sessions require iterateEntries or getContextEntries\");\n return this.entries.slice();\n }\n getLastEntry(): SessionEntry | undefined {\n return this.store\n ? (this.lastEntry ?? this.store.getTail(this.store.snapshot())?.entry)\n : this.entries.at(-1);\n }\n /** Serialize durable appends, including concurrently finishing tools, before notifying readers. */\n appendEntryAsync(fields: SessionEntryInput): Promise<string> {\n return this.enqueueWrite(() => this.persistEntry(fields));\n }\n private enqueueWrite<T>(write: () => T | Promise<T>): Promise<T> {\n const operation = this.appendQueue.then(() => {\n if (this.storageError) throw this.storageError;\n return write();\n });\n this.appendQueue = operation.catch(() => {});\n return operation;\n }\n private async persistEntry(fields: SessionEntryInput): Promise<string> {\n if (!this.store?.appendAsync) return this.append(fields);\n const entry = this.createEntry(fields);\n try {\n await this.store.appendAsync(entry);\n } catch (error) {\n this.storageError = new Error(`storage: ${error instanceof Error ? error.message : String(error)}`);\n throw this.storageError;\n }\n this.publishEntry(entry);\n return entry.id;\n }\n async flushAsync(): Promise<void> {\n await this.appendQueue;\n if (this.storageError) throw this.storageError;\n }\n appendMessageAsync(message: Message): Promise<string> {\n return this.appendEntryAsync({ type: \"message\", message });\n }\n appendCustomEntryAsync(customType: string, data?: JsonValue): Promise<string> {\n return this.appendEntryAsync({ type: \"custom\", customType, data });\n }\n setCwdAsync(cwd: string): Promise<void> {\n return this.enqueueWrite(async () => {\n if (!this.store?.replaceAsync) return this.setCwd(cwd);\n if (this.getStateAt().lastMessageSeq || this.getStateAt().lastCompactionSeq)\n throw new Error(\"Cannot move a session with messages\");\n const header = { ...this.header, cwd: resolve(cwd) };\n await this.store.replaceAsync(header, this.iterateEntries());\n this.header = header;\n this.lastEntry = undefined;\n this.contextCache = undefined;\n });\n }\n replaceEntriesAsync(source: Iterable<SessionEntry>): Promise<void> {\n return this.enqueueWrite(async () => {\n if (!this.store?.replaceAsync) return this.replaceEntries(source);\n await this.store.replaceAsync(this.header, source, { remapIds: true });\n this.lastEntry = undefined;\n this.contextCache = undefined;\n });\n }\n /** Atomically replace a transcript after a stable fork or conversation rewind. */\n replaceEntries(source: Iterable<SessionEntry>): void {\n if (this.storageError) throw this.storageError;\n if (this.store) {\n this.store.replace(this.header, remapSessionEntries(source));\n this.contextCache = undefined;\n this.lastEntry = undefined;\n return;\n }\n const materialized: SessionEntry[] = Array.isArray(source) ? source : Array.from(source);\n const ids = new Map(materialized.map((entry) => [entry.id, randomUUID()]));\n if (ids.size !== materialized.length) throw new Error(\"Duplicate session entry IDs\");\n let parentId: string | null = null;\n const entries = materialized.map((entry) => {\n const id = ids.get(entry.id);\n if (!id) throw new Error(\"Invalid session entry identity\");\n const next = { ...structuredClone(entry), id, parentId };\n if (next.type === \"compaction\") {\n const boundary = ids.get(next.firstKeptEntryId);\n if (!boundary) throw new Error(\"Invalid compaction boundary\");\n next.firstKeptEntryId = boundary;\n }\n if (\n next.type === \"custom\" &&\n next.customType === \"zpi.streaming_tools\" &&\n isJsonObject(next.data) &&\n typeof next.data.anchorId === \"string\"\n ) {\n const anchor = ids.get(next.data.anchorId);\n if (!anchor) throw new Error(\"Invalid tool journal anchor\");\n next.data.anchorId = anchor;\n }\n if (!isSessionEntry(next) || Buffer.byteLength(JSON.stringify(next)) > maxSessionEntryBytes)\n throw new Error(\"Invalid session entry\");\n parentId = next.id;\n return next;\n });\n this.writeTranscript(this.header, entries);\n this.entries = entries;\n this.contextCache = undefined;\n }\n private writeTranscript(header: SessionHeader, entries: SessionEntry[]): void {\n if (!this.file) return;\n const temporary = `${this.file}.${randomUUID()}.tmp`;\n try {\n writeFileSync(temporary, `${[header, ...entries].map((entry) => JSON.stringify(entry)).join(\"\\n\")}\\n`, {\n mode: 0o600,\n });\n renameSync(temporary, this.file);\n } finally {\n rmSync(temporary, { force: true });\n }\n }\n getMicrocompactClearedIds(): string[] {\n if (!this.store) return this.entries.flatMap(microcompactClearedIds);\n const view = this.store.snapshot();\n return Array.from(this.store.readRange(1, view.endSeq, view, [\"microcompact\"])).flatMap(({ entry }) =>\n microcompactClearedIds(entry),\n );\n }\n buildSessionContext(snapshot?: TranscriptSnapshot): SessionContext {\n if (!this.store) return buildSessionContext(this.entries);\n const view = snapshot ?? this.store.snapshot();\n if (this.contextCache?.generation === view.generation && this.contextCache.endSeq === view.endSeq)\n return this.contextCache.context;\n const state = this.store.getStateAt(view);\n const plan = this.store.getContextPlan(view);\n const messages: Message[] = [];\n const compaction = plan.compaction;\n let start = 1;\n if (compaction) {\n const entry = compaction.entry;\n if (entry.type !== \"compaction\" || !entry.systemMessage)\n throw new Error(\"Invalid compaction: system snapshot is required\");\n const boundary = this.store.readEntryById(entry.firstKeptEntryId, view);\n if (!boundary || boundary.seq !== plan.firstKeptSeq || boundary.seq >= compaction.seq)\n throw new Error(\"Invalid compaction boundary\");\n if (boundary.entry.type === \"message\" && boundary.entry.message.role === \"toolResult\")\n throw new Error(\"Compaction boundary splits a tool turn\");\n const summary: Message = {\n role: \"user\",\n synthetic: true,\n content: `Summary of earlier conversation:\\n${entry.summary}`,\n timestamp: Date.parse(entry.timestamp),\n };\n setMessageProvenance(entry.systemMessage, {\n entryId: entry.id,\n seq: compaction.seq,\n kind: \"compaction-system\",\n });\n setMessageProvenance(summary, { entryId: entry.id, seq: compaction.seq, kind: \"compaction-summary\" });\n messages.push(entry.systemMessage, summary);\n start = boundary.seq;\n }\n const retainedCalls = new Set<string>();\n let contextRestored = false;\n for (const { seq, entry } of this.store.readRange(start, view.endSeq, view, [\n \"message\",\n \"microcompact\",\n ])) {\n if (compaction && seq >= compaction.seq && !contextRestored) {\n if (compaction.entry.type === \"compaction\" && compaction.entry.contextMessage)\n messages.push(compaction.entry.contextMessage);\n contextRestored = true;\n }\n if (entry.type !== \"message\") {\n const projected = applyMicrocompactBoundary(messages, microcompactClearedIds(entry));\n messages.splice(0, messages.length, ...projected);\n continue;\n }\n if (compaction && seq < compaction.seq && entry.message.role === \"system\") continue;\n if (compaction) {\n if (entry.message.role === \"assistant\") {\n retainedCalls.clear();\n for (const part of entry.message.content) if (part.type === \"toolCall\") retainedCalls.add(part.id);\n } else if (entry.message.role === \"toolResult\" && !retainedCalls.delete(entry.message.toolCallId)) {\n throw new Error(\"Compaction boundary splits a tool turn: missing retained declaration\");\n }\n }\n setMessageProvenance(entry.message, { entryId: entry.id, seq, kind: \"message\" });\n messages.push(entry.message);\n }\n if (\n compaction &&\n !contextRestored &&\n compaction.entry.type === \"compaction\" &&\n compaction.entry.contextMessage\n )\n messages.push(compaction.entry.contextMessage);\n const context = {\n messages,\n model: state.model,\n thinkingLevel: state.thinkingLevel,\n lastThinkingLevel: state.lastThinkingLevel,\n };\n this.contextCache = { ...view, context };\n return context;\n }\n appendMessage(message: Message): string {\n validateMessage(message);\n return this.append({ type: \"message\", message });\n }\n appendModelChange(provider: string, modelId: string): string {\n if (this.store) {\n if (!this.currentState) throw new Error(\"Indexed session requires current-state writer\");\n this.currentState.setModel(provider, modelId);\n return \"\";\n }\n return this.append({ type: \"model_change\", provider, modelId });\n }\n appendThinkingLevelChange(thinkingLevel: ThinkingLevel): string {\n if (this.store) {\n if (!this.currentState) throw new Error(\"Indexed session requires current-state writer\");\n this.currentState.setThinkingLevel(thinkingLevel);\n return \"\";\n }\n return this.append({ type: \"thinking_level_change\", thinkingLevel });\n }\n appendSessionInfo(name: string): string {\n if (this.store) {\n if (!this.currentState) throw new Error(\"Indexed session requires current-state writer\");\n this.currentState.setName(name);\n return \"\";\n }\n return this.append({ type: \"session_info\", name });\n }\n appendMicrocompact(data: import(\"./microcompact.ts\").MicrocompactBoundary): string {\n return this.append({ type: \"microcompact\", data });\n }\n appendCustomEntry(customType: string, data?: JsonValue): string {\n return this.append({ type: \"custom\", customType, data });\n }\n appendCompaction(\n summary: string,\n firstKeptEntryId: string,\n tokensBefore?: number,\n details?: { readFiles: string[]; modifiedFiles: string[] },\n usage?: Usage,\n ): string {\n return this.append(this.compactionInput(summary, firstKeptEntryId, tokensBefore, details, usage));\n }\n appendCompactionAsync(...args: Parameters<SessionManager[\"appendCompaction\"]>): Promise<string> {\n return this.enqueueWrite(() => this.persistEntry(this.compactionInput(...args)));\n }\n private compactionInput(\n summary: string,\n firstKeptEntryId: string,\n tokensBefore?: number,\n details?: { readFiles: string[]; modifiedFiles: string[] },\n usage?: Usage,\n ): Extract<SessionEntryInput, { type: \"compaction\" }> {\n if (!summary.trim() || !this.readEntryById(firstKeptEntryId))\n throw new Error(\"Invalid compaction boundary or summary\");\n const current = this.buildSessionContext().messages;\n const snapshot = systemSnapshot(current, Date.now());\n return {\n type: \"compaction\",\n summary,\n firstKeptEntryId,\n tokensBefore,\n details,\n usage,\n ...snapshot,\n };\n }\n private createEntry(fields: SessionEntryInput): SessionEntry {\n return {\n ...fields,\n id: randomUUID(),\n parentId: this.getLastEntry()?.id ?? null,\n timestamp: new Date().toISOString(),\n } as SessionEntry;\n }\n private publishEntry(entry: SessionEntry): void {\n if (this.store) this.lastEntry = entry;\n else this.entries.push(entry);\n this.contextCache = undefined;\n for (const listener of this.appendListeners) listener(structuredClone(entry));\n }\n private append(fields: SessionEntryInput): string {\n if (this.storageError) throw this.storageError;\n const entry = this.createEntry(fields);\n if (!isSessionEntry(entry)) throw new Error(\"Invalid session entry\");\n const line = JSON.stringify(entry);\n if (Buffer.byteLength(line) > maxSessionEntryBytes) throw new Error(\"Session entry exceeds 8 MiB\");\n try {\n if (this.store) this.store.append(entry);\n else if (this.file) {\n if (!existsSync(dirname(this.file))) throw new Error(\"Session directory no longer exists\");\n appendFileSync(this.file, `${line}\\n`, { mode: 0o600 });\n }\n } catch (e) {\n this.storageError = new Error(`storage: ${e instanceof Error ? e.message : String(e)}`);\n throw this.storageError;\n }\n this.publishEntry(entry);\n return entry.id;\n }\n}\n\nexport type CompactionEntry = Extract<SessionEntry, { type: \"compaction\" }>;\n/** Entries are append-only. Like Pi, context projection shares immutable message records. */\nexport function sessionEntryToContextMessages(entry: SessionEntry): Message[] {\n return entry.type === \"message\" ? [entry.message] : [];\n}\nfunction systemSnapshot(\n messages: Message[],\n timestamp: number,\n): {\n systemMessage: SystemMessage;\n contextMessage?: SystemMessage;\n} {\n const initial = messages[0]?.role === \"system\" ? messages[0] : undefined;\n const systemMessage: SystemMessage = {\n ...initial,\n role: \"system\",\n content: initial?.content ?? \"\",\n toolsAdded: getCurrentTools(messages),\n toolsRemoved: undefined,\n timestamp,\n };\n const sections: Record<string, string | null> = Object.create(null);\n const content: string[] = [];\n for (const message of messages.slice(initial ? 1 : 0)) {\n if (message.role !== \"system\") continue;\n const text =\n typeof message.content === \"string\" ? message.content : message.content.map((c) => c.text).join(\"\\n\");\n if (text) content.push(text);\n // Keep tombstones: summaries and retained text must not revive withdrawn blocks.\n Object.assign(sections, message.sections);\n }\n return {\n systemMessage,\n ...(content.length || Object.keys(sections).length\n ? {\n contextMessage: { role: \"system\", content: content.join(\"\\n\\n\"), sections, timestamp },\n }\n : {}),\n };\n}\nexport function buildSessionContext(entries: SessionEntry[]): SessionContext {\n const context: SessionContext = {\n messages: [],\n thinkingLevel: \"off\",\n model: null,\n lastThinkingLevel: \"medium\",\n };\n let compactionIndex = -1;\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i];\n if (entry.type === \"message\")\n setMessageProvenance(entry.message, { entryId: entry.id, seq: i + 1, kind: \"message\" });\n if (entry.type === \"compaction\") compactionIndex = i;\n if (entry.type === \"model_change\") context.model = { provider: entry.provider, modelId: entry.modelId };\n else if (entry.type === \"message\" && entry.message.role === \"assistant\")\n context.model = { provider: entry.message.provider, modelId: entry.message.model };\n else if (entry.type === \"thinking_level_change\") {\n context.thinkingLevel = entry.thinkingLevel;\n if (entry.thinkingLevel !== \"off\") context.lastThinkingLevel = entry.thinkingLevel;\n }\n }\n const compaction = entries[compactionIndex];\n if (compaction?.type !== \"compaction\") {\n context.messages = replayMicrocompact(entries.flatMap(sessionEntryToContextMessages), entries);\n return context;\n }\n const keepIndex = entries.findIndex((e) => e.id === compaction.firstKeptEntryId);\n if (keepIndex < 0 || keepIndex >= compactionIndex) throw new Error(\"Invalid compaction boundary\");\n const timestamp = Date.parse(compaction.timestamp);\n const snapshot = compaction.systemMessage\n ? { systemMessage: compaction.systemMessage, contextMessage: compaction.contextMessage }\n : systemSnapshot(entries.slice(0, compactionIndex).flatMap(sessionEntryToContextMessages), timestamp);\n context.messages = [\n snapshot.systemMessage,\n {\n role: \"user\",\n synthetic: true,\n content: `Summary of earlier conversation:\\n${compaction.summary}`,\n timestamp,\n },\n ...entries\n .slice(keepIndex, compactionIndex)\n .flatMap(sessionEntryToContextMessages)\n .filter((m) => m.role !== \"system\"),\n ...(snapshot.contextMessage ? [snapshot.contextMessage] : []),\n ...entries.slice(compactionIndex + 1).flatMap(sessionEntryToContextMessages),\n ];\n context.messages = replayMicrocompact(context.messages, entries);\n return context;\n}\n\nfunction replayMicrocompact(messages: Message[], entries: SessionEntry[]): Message[] {\n for (const [index, entry] of entries.entries()) {\n if (entry.type !== \"microcompact\") continue;\n // A persisted boundary can only clear results that existed when it was written.\n const preceding = messages.filter((message) => (getMessageProvenance(message)?.seq ?? Infinity) <= index);\n const projected = applyMicrocompactBoundary(preceding, microcompactClearedIds(entry));\n const replacements = new Map(preceding.map((message, i) => [message, projected[i]]));\n messages = messages.map((message) => replacements.get(message) ?? message);\n }\n return messages;\n}\n\n/** Stream ID remapping without retaining the whole transcript. */\nexport function* remapSessionEntries(source: Iterable<SessionEntry>): Iterable<SessionEntry> {\n const nonce = randomUUID();\n const remap = (id: string) =>\n createHash(\"sha256\").update(nonce).update(\"\\0\").update(id).digest(\"hex\").slice(0, 32);\n let parentId: string | null = null;\n for (const entry of source) {\n const next: SessionEntry = { ...structuredClone(entry), id: remap(entry.id), parentId };\n if (next.type === \"compaction\") next.firstKeptEntryId = remap(next.firstKeptEntryId);\n if (\n next.type === \"custom\" &&\n next.customType === \"zpi.streaming_tools\" &&\n isJsonObject(next.data) &&\n typeof next.data.anchorId === \"string\"\n )\n next.data.anchorId = remap(next.data.anchorId);\n if (!isSessionEntry(next) || Buffer.byteLength(JSON.stringify(next)) > maxSessionEntryBytes)\n throw new Error(\"Invalid session entry\");\n parentId = next.id;\n yield next;\n }\n}\n","import type { ThinkingLevel } from \"@zpi-dev/agent\";\nimport type { Message } from \"@zpi-dev/ai\";\nimport type { SessionEntry, SessionHeader } from \"./session-manager.ts\";\n\n/** A fixed generation and inclusive sequence watermark. Sequences start at 1. */\nexport interface TranscriptSnapshot {\n generation: string;\n endSeq: number;\n}\nexport interface IndexedSessionEntry {\n seq: number;\n entry: SessionEntry;\n}\nexport interface TranscriptState {\n model: { provider: string; modelId: string } | null;\n thinkingLevel: ThinkingLevel;\n lastThinkingLevel: ThinkingLevel;\n hasThinkingEntry: boolean;\n lastMessageSeq: number;\n lastCompactionSeq: number;\n name?: string;\n}\nexport interface TranscriptContextPlan {\n snapshot: TranscriptSnapshot;\n /** Latest compaction at the snapshot watermark, if any. */\n compaction?: IndexedSessionEntry;\n /** Inclusive sequence of first retained entry; 1 when there is no compaction. */\n firstKeptSeq: number;\n}\n/**\n * SDK-neutral, indexed transcript access. Implementations own all writes and recovery.\n * Readers MUST honor the snapshot generation and watermark, rejecting stale generations.\n * Ranges are inclusive, ordered, lazy iterators; no implicit whole-transcript materialization.\n * Append must durably persist the record before publishing its index/watermark.\n */\nexport interface TranscriptStore {\n getHeader(): SessionHeader;\n getFile(): string | undefined;\n snapshot(): TranscriptSnapshot;\n getStateAt(snapshot: TranscriptSnapshot): TranscriptState;\n getTail(snapshot: TranscriptSnapshot): IndexedSessionEntry | undefined;\n readEntryById(id: string, snapshot: TranscriptSnapshot): IndexedSessionEntry | undefined;\n readRange(\n startSeq: number,\n endSeq: number,\n snapshot: TranscriptSnapshot,\n types?: readonly SessionEntry[\"type\"][],\n ): Iterable<IndexedSessionEntry>;\n getContextPlan(snapshot: TranscriptSnapshot): TranscriptContextPlan;\n /** Each group contains only an unresolved journal's updates, anchor and canonical turn. */\n readUnresolvedToolJournals(snapshot: TranscriptSnapshot): Iterable<SessionEntry[]>;\n append(entry: SessionEntry): void;\n /** Optional asynchronous persistence; completion has the same durability/publication contract. */\n appendAsync?(entry: SessionEntry): Promise<void>;\n /** Implementations stage a fresh generation; preserve the old one on any failure. */\n replace(header: SessionHeader, entries: Iterable<SessionEntry>): void;\n replaceAsync?(\n header: SessionHeader,\n entries: Iterable<SessionEntry>,\n options?: { remapIds?: boolean },\n ): Promise<void>;\n}\nexport interface MessageProvenance {\n entryId: string;\n seq: number;\n kind: \"message\" | \"compaction-system\" | \"compaction-summary\";\n}\nconst provenance = new WeakMap<Message, MessageProvenance>();\nexport function setMessageProvenance(message: Message, source: MessageProvenance): void {\n provenance.set(message, source);\n}\nexport function getMessageProvenance(message: Message): MessageProvenance | undefined {\n return provenance.get(message);\n}\n\n/** Current product choices are separate from historical transcript checkpoints. */\nexport interface SessionCurrentState {\n get(): Pick<TranscriptState, \"model\" | \"thinkingLevel\" | \"lastThinkingLevel\" | \"name\">;\n setModel(provider: string, modelId: string): void;\n setThinkingLevel(level: ThinkingLevel): void;\n setName(name: string): void;\n}\n","import { estimateMessageTokens, type Message } from \"@zpi-dev/ai\";\nimport { getMessageProvenance, setMessageProvenance } from \"./transcript-store.ts\";\n\nexport const MICROCOMPACT_CLEARED_TOOL_RESULT_MESSAGE = \"[Old tool result content cleared]\";\nexport const DEFAULT_MICROCOMPACT_KEEP_RECENT_TOOL_RESULTS = 5;\nexport const DEFAULT_MICROCOMPACT_IDLE_THRESHOLD_MINUTES = 60;\nexport const DEFAULT_MICROCOMPACT_MIN_TOKEN_SAVINGS = 256;\nexport const DEFAULT_MICROCOMPACT_COMPACTABLE_TOOLS = [\n \"Read\",\n \"Bash\",\n \"Grep\",\n \"Glob\",\n \"WebFetch\",\n \"WebSearch\",\n \"Edit\",\n \"Write\",\n \"ApplyPatch\",\n] as const;\nexport interface MicrocompactConfig {\n enabled?: boolean;\n thresholdTokens?: number;\n idleThresholdMinutes?: number;\n keepRecentToolResults?: number;\n compactableToolNames?: readonly string[];\n clearErrorResults?: boolean;\n minTokenSavings?: number;\n}\nexport interface MicrocompactBoundary {\n trigger: \"time_based\" | \"token_pressure\";\n strategy: \"local_tool_result_clear\";\n preMicrocompactTokenCount: number;\n postMicrocompactTokenCount: number;\n tokensSaved: number;\n clearedMessageCount: number;\n clearedToolCallIds: string[];\n keptToolCallIds: string[];\n}\nexport function buildDefaultMicrocompactThreshold(autoCompactThreshold: number): number {\n return Math.max(0, Math.min(Math.floor(autoCompactThreshold * 0.9), autoCompactThreshold - 2000));\n}\nfunction nonnegative(value: number | undefined, fallback: number): number {\n return value !== undefined && Number.isFinite(value) && value >= 0 ? Math.floor(value) : fallback;\n}\nfunction repeatedResultIds(messages: Message[]): Set<string> {\n const seen = new Set<string>();\n const repeated = new Set<string>();\n for (const message of messages) {\n if (message.role !== \"toolResult\") continue;\n if (seen.has(message.toolCallId)) repeated.add(message.toolCallId);\n seen.add(message.toolCallId);\n }\n return repeated;\n}\nexport function applyMicrocompactBoundary(\n messages: Message[],\n clearedToolCallIds: readonly string[],\n): Message[] {\n if (!clearedToolCallIds.length) return messages;\n const cleared = new Set(clearedToolCallIds);\n // Legacy boundaries identify calls by ID only. Keep ambiguous results rather than\n // clear a newer turn, an error, or media that happened to reuse an earlier ID.\n const repeated = repeatedResultIds(messages);\n return messages.map((message) => {\n if (message.role !== \"toolResult\" || !cleared.has(message.toolCallId) || repeated.has(message.toolCallId))\n return message;\n if (message.content.some((block: { type: string }) => [\"image\", \"video\", \"file\"].includes(block.type)))\n return message;\n const projected: Message = {\n ...message,\n content: [{ type: \"text\", text: MICROCOMPACT_CLEARED_TOOL_RESULT_MESSAGE }],\n };\n const source = getMessageProvenance(message);\n if (source) setMessageProvenance(projected, source);\n return projected;\n });\n}\nexport function maybeMicrocompact(input: {\n messages: Message[];\n config?: MicrocompactConfig;\n lastAssistantCompletedAtMs?: number;\n nowMs?: number;\n}): { messages: Message[]; boundary?: MicrocompactBoundary } {\n const { messages } = input;\n const config = input.config ?? {};\n // Runtime defaults OFF; opting in is required even though the upstream pure function defaults on.\n if (config.enabled !== true) return { messages };\n const pre = messages.reduce((sum, message) => sum + estimateMessageTokens(message), 0);\n const idle = nonnegative(config.idleThresholdMinutes, DEFAULT_MICROCOMPACT_IDLE_THRESHOLD_MINUTES);\n const trigger =\n input.lastAssistantCompletedAtMs !== undefined &&\n Number.isFinite(input.lastAssistantCompletedAtMs) &&\n (input.nowMs ?? Date.now()) - input.lastAssistantCompletedAtMs > idle * 60_000\n ? \"time_based\"\n : config.thresholdTokens !== undefined && pre >= config.thresholdTokens\n ? \"token_pressure\"\n : undefined;\n if (!trigger) return { messages };\n const tools = new Set(config.compactableToolNames ?? DEFAULT_MICROCOMPACT_COMPACTABLE_TOOLS);\n const repeated = repeatedResultIds(messages);\n const groups: string[][] = [];\n let current: string[] | undefined;\n for (const message of messages) {\n if (message.role === \"assistant\" && message.content.some((block) => block.type === \"toolCall\")) {\n current = [];\n groups.push(current);\n continue;\n }\n if (message.role !== \"toolResult\" || !message.toolCallId || !message.toolName) continue;\n if (repeated.has(message.toolCallId)) continue;\n // ZPI's built-ins use lower-case Pi names; the upstream whitelist uses title-case names.\n if (\n !tools.has(message.toolName) &&\n !tools.has(message.toolName[0]?.toUpperCase() + message.toolName.slice(1))\n )\n continue;\n if (message.isError && config.clearErrorResults !== true) continue;\n // Microcompact never clears media, including extension-provided video or file blocks.\n if (message.content.some((block: { type: string }) => [\"image\", \"video\", \"file\"].includes(block.type)))\n continue;\n if (\n message.content.length === 1 &&\n message.content[0]?.type === \"text\" &&\n message.content[0].text === MICROCOMPACT_CLEARED_TOOL_RESULT_MESSAGE\n )\n continue;\n if (current) current.push(message.toolCallId);\n else groups.push([message.toolCallId]);\n }\n const candidates = groups.filter((group) => group.length > 0);\n const split = Math.max(\n 0,\n candidates.length -\n Math.max(1, nonnegative(config.keepRecentToolResults, DEFAULT_MICROCOMPACT_KEEP_RECENT_TOOL_RESULTS)),\n );\n const clearedToolCallIds = candidates.slice(0, split).flat();\n if (!clearedToolCallIds.length) return { messages };\n const projected = applyMicrocompactBoundary(messages, clearedToolCallIds);\n const post = projected.reduce((sum, message) => sum + estimateMessageTokens(message), 0);\n const tokensSaved = Math.max(0, pre - post);\n if (tokensSaved < nonnegative(config.minTokenSavings, DEFAULT_MICROCOMPACT_MIN_TOKEN_SAVINGS))\n return { messages };\n return {\n messages: projected,\n boundary: {\n trigger,\n strategy: \"local_tool_result_clear\",\n preMicrocompactTokenCount: pre,\n postMicrocompactTokenCount: post,\n tokensSaved,\n clearedMessageCount: clearedToolCallIds.length,\n clearedToolCallIds,\n keptToolCallIds: candidates.slice(split).flat(),\n },\n };\n}\n\nexport function microcompactClearedIds(entry: { type: string; data?: unknown }): string[] {\n if (entry.type !== \"microcompact\" || !entry.data || typeof entry.data !== \"object\") return [];\n const data = entry.data as { clearedToolCallIds?: unknown; keptToolCallIds?: unknown };\n const kept = new Set(Array.isArray(data.keptToolCallIds) ? data.keptToolCallIds : []);\n return Array.isArray(data.clearedToolCallIds)\n ? data.clearedToolCallIds.filter((id): id is string => typeof id === \"string\" && !kept.has(id))\n : [];\n}\n","import type { Message } from \"@zpi-dev/ai\";\nimport { Type } from \"typebox\";\nimport { Compile } from \"typebox/compile\";\nimport type { SessionEntry, SessionHeader } from \"./session-manager.ts\";\n\nexport const maxSessionEntryBytes = 8 * 1024 * 1024;\n\nconst text = Type.Object({ type: Type.Literal(\"text\"), text: Type.String() });\nconst image = Type.Object({ type: Type.Literal(\"image\"), data: Type.String(), mimeType: Type.String() });\nconst thinking = Type.Object({ type: Type.Literal(\"thinking\"), thinking: Type.String() });\nconst object = Type.Object({}, { additionalProperties: true });\nconst call = Type.Object({\n type: Type.Literal(\"toolCall\"),\n id: Type.String({ minLength: 1 }),\n name: Type.String({ minLength: 1 }),\n arguments: object,\n});\nconst tool = Type.Object({ name: Type.String(), description: Type.String(), parameters: object });\nconst rates = Type.Object({\n input: Type.Number(),\n output: Type.Number(),\n cacheRead: Type.Number(),\n cacheWrite: Type.Number(),\n});\nconst usage = Type.Object({\n input: Type.Number(),\n output: Type.Number(),\n cacheRead: Type.Number(),\n cacheWrite: Type.Number(),\n totalTokens: Type.Number(),\n cost: Type.Intersect([rates, Type.Object({ total: Type.Number() })]),\n});\nconst systemMessage = Type.Object({\n role: Type.Literal(\"system\"),\n content: Type.Union([Type.String(), Type.Array(text)]),\n timestamp: Type.Number(),\n sections: Type.Optional(Type.Record(Type.String(), Type.Union([Type.String(), Type.Null()]))),\n toolsAdded: Type.Optional(Type.Array(tool)),\n toolsRemoved: Type.Optional(Type.Array(Type.Object({ name: Type.String() }))),\n});\nconst message = Type.Union([\n systemMessage,\n Type.Object({\n role: Type.Literal(\"user\"),\n content: Type.Union([Type.String(), Type.Array(Type.Union([text, image]))]),\n timestamp: Type.Number(),\n }),\n Type.Object({\n role: Type.Literal(\"assistant\"),\n content: Type.Array(Type.Union([text, thinking, call])),\n api: Type.String(),\n provider: Type.String(),\n model: Type.String(),\n timestamp: Type.Number(),\n usage,\n stopReason: Type.Union([\n Type.Literal(\"stop\"),\n Type.Literal(\"length\"),\n Type.Literal(\"toolUse\"),\n Type.Literal(\"aborted\"),\n Type.Literal(\"error\"),\n ]),\n }),\n Type.Object({\n role: Type.Literal(\"toolResult\"),\n toolCallId: Type.String(),\n toolName: Type.String(),\n content: Type.Array(Type.Union([text, image])),\n isError: Type.Boolean(),\n timestamp: Type.Number(),\n }),\n]);\nconst header = Type.Object({\n type: Type.Literal(\"session\"),\n version: Type.Literal(1),\n format: Type.Literal(\"zpi\"),\n id: Type.String({ pattern: \"^[a-zA-Z0-9_-]+$\" }),\n timestamp: Type.String(),\n cwd: Type.String(),\n});\nconst level = Type.String({ minLength: 1, maxLength: 128, pattern: \"\\\\S\" });\nconst entry = Type.Intersect([\n Type.Object({\n id: Type.String(),\n parentId: Type.Union([Type.String(), Type.Null()]),\n timestamp: Type.String(),\n }),\n Type.Union([\n Type.Object({ type: Type.Literal(\"message\"), message }),\n Type.Object({ type: Type.Literal(\"model_change\"), provider: Type.String(), modelId: Type.String() }),\n Type.Object({ type: Type.Literal(\"thinking_level_change\"), thinkingLevel: level }),\n Type.Object({ type: Type.Literal(\"session_info\"), name: Type.String() }),\n Type.Object({ type: Type.Literal(\"custom\"), customType: Type.String() }),\n Type.Object({\n type: Type.Literal(\"microcompact\"),\n data: Type.Object({\n trigger: Type.Union([Type.Literal(\"time_based\"), Type.Literal(\"token_pressure\")]),\n strategy: Type.Literal(\"local_tool_result_clear\"),\n preMicrocompactTokenCount: Type.Number(),\n postMicrocompactTokenCount: Type.Number(),\n tokensSaved: Type.Number(),\n clearedMessageCount: Type.Number(),\n clearedToolCallIds: Type.Array(Type.String()),\n keptToolCallIds: Type.Array(Type.String()),\n }),\n }),\n Type.Object({\n type: Type.Literal(\"compaction\"),\n summary: Type.String(),\n firstKeptEntryId: Type.String(),\n tokensBefore: Type.Optional(Type.Number()),\n details: Type.Optional(\n Type.Object({ readFiles: Type.Array(Type.String()), modifiedFiles: Type.Array(Type.String()) }),\n ),\n usage: Type.Optional(usage),\n systemMessage: Type.Optional(systemMessage),\n contextMessage: Type.Optional(systemMessage),\n }),\n ]),\n]);\n// Compile the fixed schemas once; keep exactly the same validation at every public boundary.\nconst headerValidator = Compile(header);\nconst entryValidator = Compile(entry);\nconst messageValidator = Compile(message);\nexport function isSessionHeader(value: unknown): value is SessionHeader {\n return headerValidator.Check(value);\n}\nexport function isSessionEntry(value: unknown): value is SessionEntry {\n return entryValidator.Check(value);\n}\nexport function validateMessage(value: unknown): asserts value is Message {\n if (!messageValidator.Check(value)) throw new Error(\"Invalid message record\");\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { AgentEvent } from \"@zpi-dev/agent\";\nimport type { AssistantMessage, JsonValue, Message, ToolCall, ToolResultMessage } from \"@zpi-dev/ai\";\nimport { isJsonObject } from \"@zpi-dev/ai\";\nimport { validateMessage } from \"./record-validation.ts\";\nimport type { SessionEntry, SessionManager } from \"./session-manager.ts\";\nimport { getMessageProvenance } from \"./transcript-store.ts\";\n\nconst JOURNAL_TYPE = \"zpi.streaming_tools\";\ninterface Journal {\n id: string;\n anchorId: string | null;\n assistant: AssistantMessage;\n results: ToolResultMessage[];\n}\n\n/** Calls are durable before execute; results are durable before the batch settles. */\nexport class StreamingToolJournal {\n private partial?: AssistantMessage;\n private journal?: Journal;\n private manager: SessionManager;\n private notify: () => void;\n constructor(manager: SessionManager, notify: () => void) {\n this.manager = manager;\n this.notify = notify;\n }\n private async save(data: unknown) {\n await this.manager.appendEntryAsync({\n type: \"custom\",\n customType: JOURNAL_TYPE,\n data: JSON.parse(JSON.stringify(data)) as JsonValue,\n });\n this.notify();\n }\n async observe(event: AgentEvent) {\n if (event.type === \"message_start\" && event.message.role === \"assistant\") {\n this.partial = event.message;\n this.journal = {\n id: randomUUID(),\n anchorId: this.manager.getLastEntry()?.id ?? null,\n assistant: { ...structuredClone(event.message), content: [], stopReason: \"toolUse\" },\n results: [],\n };\n }\n if (event.type === \"message_update\" && event.message.role === \"assistant\") this.partial = event.message;\n const journal = this.journal;\n if (!journal) return;\n if (event.type === \"message_end\" && event.message.role === \"assistant\") {\n this.partial = event.message;\n const calls = event.message.content.filter((c) => c.type === \"toolCall\");\n if (calls.length) {\n // The final declaration includes deferred calls and restores their order\n // when a later read has already run during streaming. Persist it before\n // the canonical assistant, including calls not yet prepared/executed.\n journal.assistant = structuredClone({ ...event.message, content: calls });\n await this.save({ ...journal, results: [], responseComplete: true });\n }\n }\n if (event.type === \"tool_execution_start\") {\n let call =\n event.toolCall ??\n this.partial?.content.find((c) => c.type === \"toolCall\" && c.id === event.toolCallId);\n // Terminal-only declarations can be interrupted before message_end updates\n // the partial. Legacy/manual events may only carry the closed call's input.\n if (!call && isJsonObject(event.args))\n call = { type: \"toolCall\", id: event.toolCallId, name: event.toolName, arguments: event.args };\n if (call?.type !== \"toolCall\") throw new Error(\"Missing closed tool call\");\n if (!journal.assistant.content.some((c) => c.type === \"toolCall\" && c.id === call.id)) {\n journal.assistant.content.push(structuredClone(call));\n await this.save({ ...journal, assistant: { ...journal.assistant, content: [call] }, results: [] });\n }\n }\n if (\n event.type === \"tool_execution_end\" &&\n journal.assistant.content.some((c) => c.type === \"toolCall\" && c.id === event.toolCallId)\n ) {\n const result: ToolResultMessage = {\n role: \"toolResult\",\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n content: event.result.content,\n details: event.result.details,\n isError: event.isError,\n timestamp: Date.now(),\n };\n const call = journal.assistant.content.find((c) => c.type === \"toolCall\" && c.id === event.toolCallId);\n await this.save({\n ...journal,\n assistant: { ...journal.assistant, content: [call] },\n results: [result],\n });\n }\n if (event.type === \"turn_end\") {\n if (journal.assistant.content.length) await this.save({ id: journal.id, committed: true });\n this.journal = undefined;\n this.partial = undefined;\n }\n }\n}\n\n/** Missing canonical messages after a crash; never rerun a pending tool. */\nfunction interruptedMessages(entries: SessionEntry[]): { index: number; id: string; messages: Message[] }[] {\n // Read only unresolved journals. Completed calls do not add validation or\n // cloning work to every history load. Completion records carry only one call;\n // the response checkpoint carries the full declaration once, in model order.\n const records = new Map<string, { index: number; data: JsonValue }[]>();\n for (const [index, entry] of entries.entries()) {\n if (entry.type !== \"custom\" || entry.customType !== JOURNAL_TYPE || !isJsonObject(entry.data)) continue;\n const data = entry.data;\n if (typeof data.id !== \"string\") throw new Error(\"Invalid streaming tool journal\");\n if (data.committed === true) {\n records.delete(data.id);\n continue;\n }\n const updates = records.get(data.id) ?? [];\n updates.push({ index, data });\n records.set(data.id, updates);\n }\n const pending = new Map<string, { index: number; journal: Journal }>();\n for (const [id, updates] of records) {\n for (const { index, data } of updates) {\n if (!isJsonObject(data)) throw new Error(\"Invalid streaming tool journal\");\n validateMessage(data.assistant);\n if (\n !isJsonObject(data.assistant) ||\n data.assistant.role !== \"assistant\" ||\n !(data.anchorId === null || typeof data.anchorId === \"string\") ||\n !Array.isArray(data.results)\n )\n throw new Error(\"Invalid streaming tool journal\");\n for (const result of data.results) {\n validateMessage(result);\n if (!isJsonObject(result) || result.role !== \"toolResult\")\n throw new Error(\"Invalid streamed tool result\");\n }\n const update = data as unknown as Journal;\n let previous = pending.get(id);\n if (!previous) {\n previous = {\n index,\n journal: { ...update, assistant: { ...update.assistant, content: [] }, results: [] },\n };\n pending.set(id, previous);\n }\n if (data.responseComplete === true) previous.journal.assistant = { ...update.assistant, content: [] };\n for (const call of update.assistant.content) {\n if (call.type !== \"toolCall\") throw new Error(\"Invalid streaming tool call\");\n if (!previous.journal.assistant.content.some((c) => c.type === \"toolCall\" && c.id === call.id))\n previous.journal.assistant.content.push(call);\n }\n for (const result of update.results) {\n previous.journal.results = previous.journal.results.filter((r) => r.toolCallId !== result.toolCallId);\n previous.journal.results.push(result);\n }\n previous.index = index;\n }\n }\n return [...pending.values()].map(({ index, journal }) => {\n const anchor = entries.findIndex((entry) => entry.id === journal.anchorId);\n let calls = journal.assistant.content.filter((c) => c.type === \"toolCall\");\n const canonical = entries.findIndex(\n (entry, i) =>\n i > anchor &&\n entry.type === \"message\" &&\n entry.message.role === \"assistant\" &&\n calls.some(\n (call) =>\n entry.message.role === \"assistant\" &&\n entry.message.content.some((c) => c.type === \"toolCall\" && c.id === call.id),\n ),\n );\n const declaration = entries[canonical];\n if (declaration?.type === \"message\" && declaration.message.role === \"assistant\")\n calls = declaration.message.content.filter((c) => c.type === \"toolCall\");\n const paired = new Set<string>();\n let insertion = Math.max(index, canonical);\n for (let i = Math.max(anchor, canonical) + 1; i < entries.length; i++) {\n const entry = entries[i];\n if (entry.type !== \"message\") continue;\n const message = entry.message;\n if (message.role === \"assistant\") break;\n if (message.role === \"toolResult\" && calls.some((call) => call.id === message.toolCallId)) {\n paired.add(message.toolCallId);\n insertion = Math.max(insertion, i);\n }\n }\n const messages: Message[] = canonical < 0 ? [journal.assistant] : [];\n for (const call of calls) {\n if (paired.has(call.id)) continue;\n messages.push(\n journal.results.find((r) => r.toolCallId === call.id) ?? {\n role: \"toolResult\",\n toolCallId: call.id,\n toolName: call.name,\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"Tool execution was interrupted before a result was committed. Side effects may be unknown; inspect current state before retrying.\",\n },\n ],\n details: { type: \"stream_recovery_interrupted_tool\", reason: \"unknown_execution_state\" },\n timestamp: Date.now(),\n },\n );\n }\n return { index: insertion, id: journal.id, messages };\n });\n}\n\nexport function recoverStreamedToolJournal(manager: SessionManager): void {\n for (const entries of manager.unresolvedToolJournals()) {\n for (const { id, messages } of interruptedMessages(entries)) {\n for (const message of messages) manager.appendMessage(message);\n manager.appendCustomEntry(JOURNAL_TYPE, { id, committed: true });\n }\n }\n}\n\n/** History rendering also works before the writable SDK session is opened. */\nexport function projectStreamedToolJournal(entries: SessionEntry[]): SessionEntry[] {\n const additions = interruptedMessages(entries);\n return entries.flatMap((entry, index) => [\n entry,\n ...additions\n .filter((addition) => addition.index === index)\n .flatMap(({ id, messages }) =>\n messages.map(\n (message, n): SessionEntry => ({\n type: \"message\",\n id: `${id}:${n}`,\n parentId: entry.id,\n timestamp: entry.timestamp,\n message,\n }),\n ),\n ),\n ]);\n}\n\n/** Repair legacy canonical gaps within their declaring turn, without rerunning tools. */\nfunction canonicalRepairPlan(\n manager: SessionManager,\n messages: Message[],\n): { entries?: Iterable<SessionEntry>; trailing: Message[] } {\n const pending = new Map<string, ToolCall>();\n const insertions = new Map<string, ToolResultMessage[]>();\n const interrupted = (): ToolResultMessage[] => {\n const results = [...pending.values()].map(\n (call): ToolResultMessage => ({\n role: \"toolResult\",\n toolCallId: call.id,\n toolName: call.name,\n content: [\n {\n type: \"text\",\n text: \"Interrupted: prior execution outcome and side effects are unknown. This tool was not re-executed.\",\n },\n ],\n isError: true,\n timestamp: Date.now(),\n }),\n );\n pending.clear();\n return results;\n };\n for (const message of messages) {\n if ((message.role === \"assistant\" || message.role === \"user\") && pending.size) {\n const anchor = getMessageProvenance(message)?.entryId;\n if (!anchor) throw new Error(\"Missing canonical message provenance\");\n insertions.set(anchor, interrupted());\n }\n if (message.role === \"assistant\") {\n for (const part of message.content) {\n if (part.type === \"toolCall\" && !pending.has(part.id)) pending.set(part.id, part);\n }\n } else if (message.role === \"toolResult\") pending.delete(message.toolCallId);\n }\n if (insertions.size) {\n // Historical gaps need insertion before a later turn, especially when IDs\n // were reused. Reuse the manager's atomic replacement and boundary remapping.\n function* repaired(): Iterable<SessionEntry> {\n for (const entry of manager.iterateEntries()) {\n for (const message of insertions.get(entry.id) ?? [])\n yield { type: \"message\", id: randomUUID(), parentId: null, timestamp: entry.timestamp, message };\n yield entry;\n }\n }\n return { entries: repaired(), trailing: interrupted() };\n }\n return { trailing: interrupted() };\n}\n\nexport async function recoverCanonicalToolCallsAsync(\n manager: SessionManager,\n messages: Message[],\n): Promise<void> {\n const plan = canonicalRepairPlan(manager, messages);\n if (plan.entries) await manager.replaceEntriesAsync(plan.entries);\n for (const message of plan.trailing) await manager.appendEntryAsync({ type: \"message\", message });\n}\n","// Settings subset adapted from Pi cd34e17ff039502f3664d8363b3c0a23f93a2ca3 (MIT).\n\nimport { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { ThinkingLevel } from \"@zpi-dev/agent\";\nimport {\n DEFAULT_MODEL_FIRST_RESPONSE_TIMEOUT_MS,\n DEFAULT_MODEL_STREAM_IDLE_TIMEOUT_MS,\n type Model,\n type RetryPolicy,\n} from \"@zpi-dev/ai\";\nimport {\n type CompactionOptions,\n type CompactionSettings,\n DEFAULT_COMPACTION_SETTINGS,\n} from \"./compaction.ts\";\n\nexport interface ProviderRetrySettings {\n timeoutMs?: number;\n maxRetries?: number;\n maxRetryDelayMs?: number;\n}\nexport interface RetrySettings extends Partial<RetryPolicy> {\n provider?: ProviderRetrySettings;\n}\nexport interface Settings {\n defaultThinkingLevel?: ThinkingLevel;\n modelThinkingLevels?: Record<string, ThinkingLevel>;\n compaction?: CompactionOptions;\n retry?: RetrySettings;\n httpIdleTimeoutMs?: number | string;\n streamIdleTimeoutMs?: number;\n streamFirstResponseTimeoutMs?: number;\n}\nfunction object(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\nfunction merge(base: Settings, overrides: Settings): Settings {\n const result: Record<string, unknown> = { ...base };\n for (const [key, value] of Object.entries(overrides)) {\n if (value === undefined) continue;\n result[key] = object(result[key]) && object(value) ? merge(result[key], value) : value;\n }\n return result;\n}\nexport class SettingsManager {\n private settings: Settings;\n private errors: { path: string; error: Error }[] = [];\n constructor(settings: Settings = {}) {\n this.settings = settings;\n }\n static inMemory(settings: Settings = {}): SettingsManager {\n return new SettingsManager(settings);\n }\n static create(cwd = process.cwd(), agentDir = join(homedir(), \".zpi\", \"agent\")): SettingsManager {\n const manager = new SettingsManager();\n for (const path of [join(agentDir, \"settings.json\"), join(cwd, \".zpi\", \"settings.json\")]) {\n try {\n const settings: unknown = JSON.parse(readFileSync(path, \"utf8\").replace(/^\\uFEFF/, \"\"));\n if (!object(settings)) throw new Error(\"Settings must be an object\");\n manager.settings = merge(manager.settings, settings);\n } catch (error) {\n if (error && typeof error === \"object\" && \"code\" in error && error.code === \"ENOENT\") continue;\n manager.errors.push({ path, error: error instanceof Error ? error : new Error(String(error)) });\n }\n }\n return manager;\n }\n getErrors(): { path: string; error: Error }[] {\n return this.errors.slice();\n }\n applyOverrides(overrides: Settings): void {\n this.settings = merge(this.settings, overrides);\n }\n getDefaultThinkingLevel(): ThinkingLevel | undefined {\n return this.settings.defaultThinkingLevel;\n }\n getModelThinkingLevel(provider: string, id: string): ThinkingLevel | undefined {\n return this.settings.modelThinkingLevels?.[`${provider}/${id}`];\n }\n getCompactionSettings(model?: Pick<Model, \"provider\" | \"id\">): CompactionSettings {\n const config = this.settings.compaction;\n const key = model ? `${model.provider}/${model.id}` : undefined;\n const override = key === undefined ? undefined : config?.modelOverrides?.[key];\n if (override !== undefined && !object(override))\n throw new Error(`Invalid compaction.modelOverrides[\"${key}\"] setting`);\n const resolve = (field: \"reserveTokens\" | \"keepRecentTokens\") => {\n for (const value of [config?.[field], override?.[field]])\n if (value !== undefined && (!Number.isSafeInteger(value) || value < 0))\n throw new Error(\n `Invalid compaction.${field} setting: ${String(value)}. Expected a non-negative safe integer.`,\n );\n return override?.[field] ?? config?.[field] ?? DEFAULT_COMPACTION_SETTINGS[field];\n };\n return {\n enabled: config?.enabled ?? DEFAULT_COMPACTION_SETTINGS.enabled,\n reserveTokens: resolve(\"reserveTokens\"),\n keepRecentTokens: resolve(\"keepRecentTokens\"),\n };\n }\n getMicrocompactSettings(): import(\"./microcompact.ts\").MicrocompactConfig {\n return {\n ...this.settings.compaction?.microcompact,\n enabled:\n this.settings.compaction?.enabled !== false &&\n this.settings.compaction?.microcompact?.enabled === true,\n };\n }\n getRetrySettings(): RetryPolicy {\n const config = this.settings.retry;\n return {\n enabled: config?.enabled ?? true,\n maxRetries: config?.maxRetries ?? 10,\n baseDelayMs: config?.baseDelayMs ?? 2000,\n maxAgentDelayMs: config?.maxAgentDelayMs ?? 60000,\n maxElapsedMs: Number.isFinite(config?.maxElapsedMs) ? config?.maxElapsedMs : 600000,\n };\n }\n getProviderRetrySettings(): ProviderRetrySettings {\n return {\n ...this.settings.retry?.provider,\n maxRetryDelayMs: this.settings.retry?.provider?.maxRetryDelayMs ?? 60000,\n };\n }\n getStreamIdleTimeoutMs(): number {\n const value = this.settings.streamIdleTimeoutMs;\n return value === undefined || !Number.isFinite(value) ? DEFAULT_MODEL_STREAM_IDLE_TIMEOUT_MS : value;\n }\n getStreamFirstResponseTimeoutMs(): number {\n const value = this.settings.streamFirstResponseTimeoutMs;\n return value === undefined || !Number.isFinite(value) ? DEFAULT_MODEL_FIRST_RESPONSE_TIMEOUT_MS : value;\n }\n getHttpIdleTimeoutMs(): number {\n const value = this.settings.httpIdleTimeoutMs;\n // The model-event watchdog is now the default. Retain explicit Pi HTTP timeout overrides.\n if (value === undefined) return 0;\n const normalized =\n typeof value === \"string\" && value.trim().toLowerCase() === \"disabled\"\n ? 0\n : typeof value === \"number\"\n ? value\n : typeof value === \"string\" && value.trim().length > 0\n ? Number(value.trim())\n : NaN;\n if (!Number.isFinite(normalized) || normalized < 0)\n throw new Error(`Invalid httpIdleTimeoutMs setting: ${String(value)}`);\n return Math.floor(normalized);\n }\n}\n","// Adapted from Pi cd34e17ff039502f3664d8363b3c0a23f93a2ca3.\n// Copyright (c) 2025 Mario Zechner. MIT: licenses/third-party-notices.txt.\nimport { randomUUID } from \"node:crypto\";\n/**\n * Context compaction for long sessions.\n *\n * Pure functions for compaction logic. The session manager handles I/O,\n * and after compaction the session is reloaded.\n */\n\nimport type { AgentMessage, StreamFn, ThinkingLevel } from \"@zpi-dev/agent\";\nimport type { AssistantMessage, Model, SimpleStreamOptions, TranscriptContext, Usage } from \"@zpi-dev/ai\";\nimport {\n calculateContextTokens,\n contentText,\n estimateMessageTokens,\n isModelContextExceededError,\n isModelMediaTooLargeError,\n normalizeContext,\n projectCompactMediaForRetry,\n projectContextForModelMediaPolicy,\n type RetryCallbacks,\n type RetryPolicy,\n retryAssistantCall,\n streamSimple,\n} from \"@zpi-dev/ai\";\n\nconst convertToLlm = (messages: AgentMessage[]) => messages;\n\nimport {\n computeFileLists,\n createFileOps,\n extractFileOpsFromMessage,\n type FileOperations,\n formatFileOperations,\n SUMMARIZATION_SYSTEM_PROMPT,\n serializeConversation,\n} from \"./compaction-utils.ts\";\nimport {\n buildSessionContext,\n type CompactionEntry,\n type SessionEntry,\n sessionEntryToContextMessages,\n} from \"./session-manager.ts\";\n\n// ============================================================================\n// File Operation Tracking\n// ============================================================================\n\n/** Details stored in CompactionEntry.details for file tracking */\nexport interface CompactionDetails {\n readFiles: string[];\n modifiedFiles: string[];\n}\n\n/**\n * Extract file operations from messages and previous compaction entries.\n */\nfunction extractFileOperations(\n messages: AgentMessage[],\n entries: SessionEntry[],\n prevCompactionIndex: number,\n): FileOperations {\n const fileOps = createFileOps();\n\n // Collect from previous compaction's details (if pi-generated)\n if (prevCompactionIndex >= 0) {\n const prevCompaction = entries[prevCompactionIndex] as CompactionEntry;\n if (prevCompaction.details) {\n const details = prevCompaction.details as CompactionDetails;\n if (Array.isArray(details.readFiles)) {\n for (const f of details.readFiles) fileOps.read.add(f);\n }\n if (Array.isArray(details.modifiedFiles)) {\n for (const f of details.modifiedFiles) fileOps.edited.add(f);\n }\n }\n }\n\n // Extract from tool calls in messages\n for (const msg of messages) {\n extractFileOpsFromMessage(msg, fileOps);\n }\n\n return fileOps;\n}\n\n// ============================================================================\n// Message Extraction\n// ============================================================================\n\n/**\n * Extract AgentMessage from an entry if it produces one.\n * Returns undefined for entries that don't contribute to LLM context.\n */\nfunction getMessageFromEntryForCompaction(entry: SessionEntry): AgentMessage | undefined {\n if (entry.type === \"compaction\") {\n return undefined;\n }\n // System messages are prompt state, not conversation; the compaction entry carries their replay.\n const message = sessionEntryToContextMessages(entry)[0];\n return message?.role === \"system\" ? undefined : message;\n}\n\n/** Result from compact() - SessionManager adds uuid/parentUuid when saving */\nexport interface CompactionResult<T = unknown> {\n summary: string;\n firstKeptEntryId: string;\n tokensBefore: number;\n estimatedTokensAfter?: number;\n /** Usage from the LLM call(s) that generated this summary, if available */\n usage?: Usage;\n /** Extension-specific data (e.g., ArtifactIndex, version markers for structured compaction) */\n details?: T;\n}\n\nfunction combineUsage(first: Usage, second: Usage): Usage {\n return {\n input: first.input + second.input,\n output: first.output + second.output,\n cacheRead: first.cacheRead + second.cacheRead,\n cacheWrite: first.cacheWrite + second.cacheWrite,\n ...(first.reasoning !== undefined || second.reasoning !== undefined\n ? { reasoning: (first.reasoning ?? 0) + (second.reasoning ?? 0) }\n : {}),\n totalTokens: first.totalTokens + second.totalTokens,\n cost: {\n input: first.cost.input + second.cost.input,\n output: first.cost.output + second.cost.output,\n cacheRead: first.cost.cacheRead + second.cost.cacheRead,\n cacheWrite: first.cost.cacheWrite + second.cost.cacheWrite,\n total: first.cost.total + second.cost.total,\n },\n };\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CompactionSettings {\n enabled: boolean;\n reserveTokens: number;\n keepRecentTokens: number;\n}\n\nexport const DEFAULT_COMPACTION_SETTINGS: CompactionSettings = {\n enabled: true,\n reserveTokens: 16384,\n keepRecentTokens: 20000,\n};\n\n// ============================================================================\n// Token calculation\n// ============================================================================\n\nexport { calculateContextTokens };\n\n/**\n * Get usage from an assistant message if available.\n * Skips aborted, error, and all-zero usage messages as they don't have valid usage data.\n */\nfunction getAssistantUsage(msg: AgentMessage): Usage | undefined {\n if (msg.role === \"assistant\" && \"usage\" in msg) {\n const assistantMsg = msg as AssistantMessage;\n if (\n assistantMsg.stopReason !== \"aborted\" &&\n assistantMsg.stopReason !== \"error\" &&\n assistantMsg.usage &&\n calculateContextTokens(assistantMsg.usage) > 0\n ) {\n return assistantMsg.usage;\n }\n }\n return undefined;\n}\n\nexport interface ContextUsageEstimate {\n tokens: number;\n usageTokens: number;\n trailingTokens: number;\n lastUsageIndex: number | null;\n}\n\nfunction getLastAssistantUsageInfo(messages: AgentMessage[]): { usage: Usage; index: number } | undefined {\n for (let i = messages.length - 1; i >= 0; i--) {\n const usage = getAssistantUsage(messages[i]);\n if (usage) return { usage, index: i };\n }\n return undefined;\n}\n\n/**\n * Estimate context tokens from messages, using the last assistant usage when available.\n * If there are messages after the last usage, estimate their tokens with estimateTokens.\n */\nexport function estimateContextTokens(messages: AgentMessage[]): ContextUsageEstimate {\n const usageInfo = getLastAssistantUsageInfo(messages);\n\n if (!usageInfo) {\n let estimated = 0;\n for (const message of messages) {\n estimated += estimateTokens(message);\n }\n return {\n tokens: estimated,\n usageTokens: 0,\n trailingTokens: estimated,\n lastUsageIndex: null,\n };\n }\n\n const usageTokens = calculateContextTokens(usageInfo.usage);\n let trailingTokens = 0;\n for (let i = usageInfo.index + 1; i < messages.length; i++) {\n trailingTokens += estimateTokens(messages[i]);\n }\n\n return {\n tokens: usageTokens + trailingTokens,\n usageTokens,\n trailingTokens,\n lastUsageIndex: usageInfo.index,\n };\n}\n\n/**\n * Check if compaction should trigger based on context usage.\n */\nexport function shouldCompact(\n contextTokens: number,\n contextWindow: number,\n settings: CompactionSettings,\n): boolean {\n if (!settings.enabled) return false;\n return contextTokens > contextWindow - settings.reserveTokens;\n}\n\n// ============================================================================\n// Cut point detection\n// ============================================================================\n\n/**\n * Estimate token count for a message using chars/4 heuristic.\n * This is conservative (overestimates tokens).\n */\nexport function estimateTokens(message: AgentMessage): number {\n switch (message.role) {\n case \"user\":\n case \"assistant\":\n case \"toolResult\":\n return estimateMessageTokens(message);\n }\n return 0;\n}\n\nfunction isCutPointMessage(message: AgentMessage): boolean {\n switch (message.role) {\n case \"user\":\n case \"assistant\":\n return true;\n case \"toolResult\":\n return false;\n }\n return false;\n}\n\nfunction isTurnStartMessage(message: AgentMessage): boolean {\n switch (message.role) {\n case \"user\":\n return true;\n case \"assistant\":\n case \"toolResult\":\n return false;\n }\n return false;\n}\n\nfunction isTurnStartEntry(entry: SessionEntry): boolean {\n if (entry.type === \"compaction\") {\n return false;\n }\n return sessionEntryToContextMessages(entry).some(isTurnStartMessage);\n}\n\n/**\n * Find valid cut points: indices of context-visible user-like or assistant messages.\n * Never cut at tool results (they must follow their tool call).\n * When we cut at an assistant message with tool calls, its tool results follow it\n * and will be kept.\n */\nfunction findValidCutPoints(entries: SessionEntry[], startIndex: number, endIndex: number): number[] {\n const cutPoints: number[] = [];\n for (let i = startIndex; i < endIndex; i++) {\n const entry = entries[i];\n if (entry.type === \"compaction\") {\n continue;\n }\n if (sessionEntryToContextMessages(entry).some(isCutPointMessage)) {\n cutPoints.push(i);\n }\n }\n return cutPoints;\n}\n\n/**\n * Find the context-visible user-role message that starts the turn containing the given entry index.\n * Returns -1 if no turn start found before the index.\n */\nexport function findTurnStartIndex(entries: SessionEntry[], entryIndex: number, startIndex: number): number {\n for (let i = entryIndex; i >= startIndex; i--) {\n if (isTurnStartEntry(entries[i])) {\n return i;\n }\n }\n return -1;\n}\n\nexport interface CutPointResult {\n /** Index of first entry to keep */\n firstKeptEntryIndex: number;\n /** Index of user message that starts the turn being split, or -1 if not splitting */\n turnStartIndex: number;\n /** Whether this cut splits a turn (cut point is not a user message) */\n isSplitTurn: boolean;\n}\n\n/**\n * Find the cut point in session entries that keeps approximately `keepRecentTokens`.\n *\n * Algorithm: Walk backwards from newest, accumulating estimated message sizes.\n * Stop when we've accumulated >= keepRecentTokens. Cut at that point.\n *\n * Can cut at user OR assistant messages (never tool results). When cutting at an\n * assistant message with tool calls, its tool results come after and will be kept.\n *\n * Returns CutPointResult with:\n * - firstKeptEntryIndex: the entry index to start keeping from\n * - turnStartIndex: if cutting mid-turn, the user message that started that turn\n * - isSplitTurn: whether we're cutting in the middle of a turn\n *\n * Only considers entries between `startIndex` and `endIndex` (exclusive).\n */\nexport function findCutPoint(\n entries: SessionEntry[],\n startIndex: number,\n endIndex: number,\n keepRecentTokens: number,\n forceProgress = false,\n): CutPointResult {\n const cutPoints = findValidCutPoints(entries, startIndex, endIndex);\n\n if (cutPoints.length === 0) {\n return { firstKeptEntryIndex: startIndex, turnStartIndex: -1, isSplitTurn: false };\n }\n\n // Walk backwards from newest, accumulating estimated message sizes\n let accumulatedTokens = 0;\n let cutIndex = cutPoints[0]; // Default: keep from first message (not header)\n\n for (let i = endIndex - 1; i >= startIndex; i--) {\n const entry = entries[i];\n const messageTokens = sessionEntryToContextMessages(entry).reduce(\n (sum, message) => sum + estimateTokens(message),\n 0,\n );\n if (messageTokens === 0) continue;\n accumulatedTokens += messageTokens;\n\n // Check if we've exceeded the budget\n if (accumulatedTokens >= keepRecentTokens) {\n // Prefer the closest valid cut point at or after this entry. If trailing\n // tool results exceed the budget by themselves, keep their preceding\n // assistant tool call instead of falling back to the first message.\n cutIndex = cutPoints.find((candidate) => candidate >= i) ?? cutPoints[cutPoints.length - 1];\n break;\n }\n }\n\n // Scan backwards from cutIndex to include adjacent metadata entries that do not affect context.\n while (cutIndex > startIndex) {\n const prevEntry = entries[cutIndex - 1];\n // Stop at compaction boundaries or context-visible entries.\n if (prevEntry.type === \"compaction\" || sessionEntryToContextMessages(prevEntry).length > 0) {\n break;\n }\n cutIndex--;\n }\n\n if (forceProgress && cutPoints.length > 1 && cutIndex <= cutPoints[0]) {\n // Server usage can exceed local estimates. Summarize a complete turn when\n // possible; a single long turn still splits only at a valid message boundary.\n cutIndex =\n cutPoints.find((index) => index > cutPoints[0] && isTurnStartEntry(entries[index])) ??\n cutPoints[cutPoints.length - 1];\n }\n\n // Determine if this is a split turn\n const cutEntry = entries[cutIndex];\n const startsTurn = isTurnStartEntry(cutEntry);\n const turnStartIndex = startsTurn ? -1 : findTurnStartIndex(entries, cutIndex, startIndex);\n\n return {\n firstKeptEntryIndex: cutIndex,\n turnStartIndex,\n isSplitTurn: !startsTurn && turnStartIndex !== -1,\n };\n}\n\n// ============================================================================\n// Summarization\n// ============================================================================\n\nconst SUMMARIZATION_PROMPT = `The messages above are a conversation to summarize. Create a structured context checkpoint summary that another LLM will use to continue the work.\n\nUse this EXACT format:\n\n## Goal\n[What is the user trying to accomplish? Can be multiple items if the session covers different tasks.]\n\n## Constraints & Preferences\n- [Any constraints, preferences, or requirements mentioned by user]\n- [Or \"(none)\" if none were mentioned]\n\n## Progress\n### Done\n- [x] [Completed tasks/changes]\n\n### In Progress\n- [ ] [Current work]\n\n### Blocked\n- [Issues preventing progress, if any]\n\n## Key Decisions\n- **[Decision]**: [Brief rationale]\n\n## Next Steps\n1. [Ordered list of what should happen next]\n\n## Critical Context\n- [Any data, examples, or references needed to continue]\n- [Or \"(none)\" if not applicable]\n\nKeep each section concise. Preserve exact file paths, function names, and error messages.`;\n\nconst UPDATE_SUMMARIZATION_INSTRUCTIONS = `Update the existing structured summary with new information. RULES:\n- PRESERVE all existing information from the previous summary\n- ADD new progress, decisions, and context from the new messages\n- UPDATE the Progress section: move items from \"In Progress\" to \"Done\" when completed\n- UPDATE \"Next Steps\" based on what was accomplished\n- PRESERVE exact file paths, function names, and error messages\n- If something is no longer relevant, you may remove it\n\nUse this EXACT format:\n\n## Goal\n[Preserve existing goals, add new ones if the task expanded]\n\n## Constraints & Preferences\n- [Preserve existing, add new ones discovered]\n\n## Progress\n### Done\n- [x] [Include previously done items AND newly completed items]\n\n### In Progress\n- [ ] [Current work - update based on progress]\n\n### Blocked\n- [Current blockers - remove if resolved]\n\n## Key Decisions\n- **[Decision]**: [Brief rationale] (preserve all previous, add new)\n\n## Next Steps\n1. [Update based on current state]\n\n## Critical Context\n- [Preserve important context, add new if needed]\n\nKeep each section concise. Preserve exact file paths, function names, and error messages.`;\n\nconst UPDATE_SUMMARIZATION_PROMPT = `The messages above are NEW conversation messages to incorporate into the existing summary provided in <previous-summary> tags.\n\n${UPDATE_SUMMARIZATION_INSTRUCTIONS}`;\n\n/**\n * Returns an error message when a summarization response cannot safely be persisted.\n * A length stop contains partial text and must not become a session checkpoint.\n */\nexport function getSummarizationFailure(response: AssistantMessage, label: string): string | undefined {\n if (response.stopReason === \"error\") {\n return `${label} failed: ${response.errorMessage || \"Unknown error\"}`;\n }\n if (response.stopReason === \"aborted\") {\n return `${label} failed: generation was aborted`;\n }\n if (response.stopReason === \"length\") {\n return `${label} failed: generation hit the token cap and the summary is incomplete`;\n }\n if (response.content.some((block) => block.type === \"toolCall\")) {\n return `${label} attempted to call a tool`;\n }\n if (!contentText(response.content).trim()) {\n return `${label} failed: model returned an empty summary`;\n }\n return undefined;\n}\n\nfunction createSummarizationOptions(\n model: Model,\n maxTokens: number,\n apiKey: string | undefined,\n headers: Record<string, string> | undefined,\n signal: AbortSignal | undefined,\n thinkingLevel: ThinkingLevel | undefined,\n sessionId: string | undefined,\n onMediaProjection?: SimpleStreamOptions[\"onMediaProjection\"],\n): SimpleStreamOptions {\n const options: SimpleStreamOptions = { maxTokens, signal, apiKey, headers, sessionId, onMediaProjection };\n if (model.reasoning && thinkingLevel && thinkingLevel !== \"off\") {\n options.reasoning = thinkingLevel;\n }\n return options;\n}\n\n/**\n * Shared choke point for every compaction/branch-summary summarization call. Wraps the\n * single LLM call in {@link retryAssistantCall} so transient stream drops (e.g.\n * `terminated`, socket close) honor the configured retry policy instead of failing\n * the whole compaction on the first attempt. Deterministic errors and aborts return\n * immediately (see {@link retryAssistantCall}).\n */\nexport async function completeSummarization(\n model: Model,\n context: TranscriptContext,\n options: SimpleStreamOptions,\n streamFn?: StreamFn,\n retry?: RetryPolicy,\n callbacks?: RetryCallbacks,\n): Promise<AssistantMessage> {\n // Avoid cache writes for one-off summaries. Reuse caller-supplied routing when available;\n // callers without a session ID, including branch summaries, receive a fresh routing ID.\n const requestOptions: SimpleStreamOptions = {\n ...options,\n cacheRetention: \"none\",\n sessionId: options.sessionId ?? randomUUID(),\n };\n const produce = async (deadlineMs?: number): Promise<AssistantMessage> => {\n const attemptOptions = {\n ...requestOptions,\n streamDeadlineMs: deadlineMs ?? requestOptions.streamDeadlineMs,\n };\n let requestContext = context;\n let strippedMedia = false;\n let contextTrims = 0;\n const recover = (error: unknown): boolean => {\n if (isModelMediaTooLargeError(error) && !strippedMedia) {\n strippedMedia = true;\n requestContext = {\n ...requestContext,\n messages: projectCompactMediaForRetry(requestContext.messages).messages,\n };\n return true;\n }\n if (isModelContextExceededError(error) && contextTrims < 3) {\n const truncated = truncateSummaryRequest(requestContext);\n if (truncated === requestContext) return false;\n contextTrims++;\n requestContext = truncated;\n return true;\n }\n return false;\n };\n while (true) {\n requestOptions.signal?.throwIfAborted();\n try {\n // Injected streams may bypass native adapters. Keep this defensive projection;\n // an adapter reached through the injected stream sees no new omissions and reports nothing twice.\n const projected = streamFn\n ? projectContextForModelMediaPolicy(requestContext, model, {\n onProjection: requestOptions.onMediaProjection,\n })\n : requestContext;\n const result = await (streamFn\n ? await streamFn(model, projected, attemptOptions)\n : streamSimple(model, projected, attemptOptions)\n ).result();\n if (\n result.stopReason === \"error\" &&\n recover({\n message: result.errorMessage,\n code: result.errorDetails?.code,\n reason: result.rawStopReason,\n })\n )\n continue;\n return result;\n } catch (error) {\n if (!requestOptions.signal?.aborted && recover(error)) continue;\n throw error;\n }\n }\n };\n return retryAssistantCall(produce, retry, requestOptions.signal, callbacks);\n}\n\n/** Only recognized context overflow reaches this bounded request-local truncation. */\nfunction truncateSummaryRequest(context: TranscriptContext): TranscriptContext {\n let changed = false;\n const truncate = (text: string) => {\n if (text.length < 256) return text;\n changed = true;\n // Retain the summary instructions and the newest conversation text after dropping older text.\n const open = text.indexOf(\"<conversation>\\n\");\n const close = text.indexOf(\"\\n</conversation>\");\n if (open >= 0 && close > open) {\n const start = open + \"<conversation>\\n\".length;\n return (\n text.slice(0, start) +\n \"[Earlier conversation truncated]\\n\" +\n text.slice(start + Math.floor((close - start) / 2))\n );\n }\n return `[Earlier content truncated]\\n${text.slice(Math.floor(text.length / 2))}`;\n };\n const messages = context.messages.map((message) =>\n message.role !== \"user\"\n ? message\n : {\n ...message,\n content:\n typeof message.content === \"string\"\n ? truncate(message.content)\n : message.content.map((block) =>\n block.type === \"text\" ? { ...block, text: truncate(block.text) } : block,\n ),\n },\n );\n return changed ? { ...context, messages } : context;\n}\n\n/** Build the provider context for a standalone summary request. */\nfunction buildSummarizationContext(promptText: string): TranscriptContext {\n return normalizeContext({\n systemPrompt: SUMMARIZATION_SYSTEM_PROMPT,\n messages: [\n {\n role: \"user\",\n content: [{ type: \"text\", text: promptText }],\n timestamp: Date.now(),\n },\n ],\n });\n}\n\n/** Generate or update a conversation summary and return its provider usage. */\nexport async function generateSummaryWithUsage(\n currentMessages: AgentMessage[],\n model: Model,\n reserveTokens: number,\n apiKey: string | undefined,\n headers?: Record<string, string>,\n signal?: AbortSignal,\n customInstructions?: string,\n previousSummary?: string,\n thinkingLevel?: ThinkingLevel,\n streamFn?: StreamFn,\n retry?: RetryPolicy,\n callbacks?: RetryCallbacks,\n sessionId?: string,\n onMediaProjection?: SimpleStreamOptions[\"onMediaProjection\"],\n): Promise<{ text: string; usage: Usage }> {\n const maxTokens = Math.min(\n Math.max(1, Math.floor(0.8 * reserveTokens)),\n model.maxTokens > 0 ? model.maxTokens : Number.POSITIVE_INFINITY,\n );\n\n // Use update prompt if we have a previous summary, otherwise initial prompt\n let basePrompt = previousSummary ? UPDATE_SUMMARIZATION_PROMPT : SUMMARIZATION_PROMPT;\n if (customInstructions) {\n basePrompt = `${basePrompt}\\n\\nAdditional focus: ${customInstructions}`;\n }\n\n // Serialize conversation to text so model doesn't try to continue it\n // Convert to LLM messages first (handles custom types like bashExecution, custom, etc.)\n const llmMessages = convertToLlm(currentMessages);\n const conversationText = serializeConversation(llmMessages);\n\n // Build the prompt with conversation wrapped in tags\n let promptText = `<conversation>\\n${conversationText}\\n</conversation>\\n\\n`;\n if (previousSummary) {\n promptText += `<previous-summary>\\n${previousSummary}\\n</previous-summary>\\n\\n`;\n }\n promptText += basePrompt;\n\n const completionOptions = createSummarizationOptions(\n model,\n maxTokens,\n apiKey,\n headers,\n signal,\n thinkingLevel,\n sessionId,\n onMediaProjection,\n );\n\n const response = await completeSummarization(\n model,\n buildSummarizationContext(promptText),\n completionOptions,\n streamFn,\n retry,\n callbacks,\n );\n\n const failure = getSummarizationFailure(response, \"Summarization\");\n if (failure) {\n throw new Error(failure);\n }\n const textContent = contentText(response.content);\n\n return { text: textContent, usage: response.usage };\n}\n\n// ============================================================================\n// Compaction Preparation (for extensions)\n// ============================================================================\n\nexport interface CompactionPreparation {\n /** UUID of first entry to keep */\n firstKeptEntryId: string;\n /** Messages that will be summarized and discarded */\n messagesToSummarize: AgentMessage[];\n /** Messages that will be turned into turn prefix summary (if splitting) */\n turnPrefixMessages: AgentMessage[];\n /** Whether this is a split turn (cut point in middle of turn) */\n isSplitTurn: boolean;\n tokensBefore: number;\n /** Summary from previous compaction, for iterative update */\n previousSummary?: string;\n /** File operations extracted from messagesToSummarize */\n fileOps: FileOperations;\n /** Compaction settions from settings.jsonl\t*/\n settings: CompactionSettings;\n}\n\nexport function prepareCompaction(\n pathEntries: SessionEntry[],\n settings: CompactionSettings,\n): CompactionPreparation | undefined {\n if (pathEntries.length > 0 && pathEntries[pathEntries.length - 1].type === \"compaction\") {\n return undefined;\n }\n\n let prevCompactionIndex = -1;\n for (let i = pathEntries.length - 1; i >= 0; i--) {\n if (pathEntries[i].type === \"compaction\") {\n prevCompactionIndex = i;\n break;\n }\n }\n\n let previousSummary: string | undefined;\n let boundaryStart = 0;\n if (prevCompactionIndex >= 0) {\n const prevCompaction = pathEntries[prevCompactionIndex] as CompactionEntry;\n previousSummary = prevCompaction.summary;\n const firstKeptEntryIndex = pathEntries.findIndex(\n (entry) => entry.id === prevCompaction.firstKeptEntryId,\n );\n boundaryStart = firstKeptEntryIndex >= 0 ? firstKeptEntryIndex : prevCompactionIndex + 1;\n }\n const boundaryEnd = pathEntries.length;\n\n const tokensBefore = estimateContextTokens(buildSessionContext(pathEntries).messages).tokens;\n\n const cutPoint = findCutPoint(\n pathEntries,\n boundaryStart,\n boundaryEnd,\n settings.keepRecentTokens,\n tokensBefore > settings.keepRecentTokens,\n );\n\n // Get UUID of first kept entry\n const firstKeptEntry = pathEntries[cutPoint.firstKeptEntryIndex];\n if (!firstKeptEntry?.id) {\n return undefined; // Session needs migration\n }\n const firstKeptEntryId = firstKeptEntry.id;\n\n const historyEnd = cutPoint.isSplitTurn ? cutPoint.turnStartIndex : cutPoint.firstKeptEntryIndex;\n\n // Messages to summarize (will be discarded after summary)\n const messagesToSummarize: AgentMessage[] = [];\n for (let i = boundaryStart; i < historyEnd; i++) {\n const msg = getMessageFromEntryForCompaction(pathEntries[i]);\n if (msg) messagesToSummarize.push(msg);\n }\n\n // Messages for turn prefix summary (if splitting a turn)\n const turnPrefixMessages: AgentMessage[] = [];\n if (cutPoint.isSplitTurn) {\n for (let i = cutPoint.turnStartIndex; i < cutPoint.firstKeptEntryIndex; i++) {\n const msg = getMessageFromEntryForCompaction(pathEntries[i]);\n if (msg) turnPrefixMessages.push(msg);\n }\n }\n\n if (messagesToSummarize.length === 0 && turnPrefixMessages.length === 0) {\n return undefined;\n }\n\n // Extract file operations from messages and previous compaction\n const fileOps = extractFileOperations(messagesToSummarize, pathEntries, prevCompactionIndex);\n\n // Also extract file ops from turn prefix if splitting\n if (cutPoint.isSplitTurn) {\n for (const msg of turnPrefixMessages) {\n extractFileOpsFromMessage(msg, fileOps);\n }\n }\n\n return {\n firstKeptEntryId,\n messagesToSummarize,\n turnPrefixMessages,\n isSplitTurn: cutPoint.isSplitTurn,\n tokensBefore,\n previousSummary,\n fileOps,\n settings,\n };\n}\n\n// ============================================================================\n// Main compaction function\n// ============================================================================\n\nconst TURN_PREFIX_SUMMARIZATION_PROMPT = `This is the PREFIX of a turn that was too large to keep. The SUFFIX (recent work) is retained.\n\nSummarize the prefix to provide context for the retained suffix:\n\n## Original Request\n[What did the user ask for in this turn?]\n\n## Early Progress\n- [Key decisions and work done in the prefix]\n\n## Context for Suffix\n- [Information needed to understand the retained recent work]\n\nBe concise. Focus on what's needed to understand the kept suffix.`;\n\n/**\n * Generate summaries for compaction using prepared data.\n * Returns CompactionResult - SessionManager adds uuid/parentUuid when saving.\n *\n * @param preparation - Pre-calculated preparation from prepareCompaction()\n * @param customInstructions - Optional custom focus for the summary\n * @param sessionId - Optional routing session ID forwarded without enabling prompt caching\n */\nexport async function compact(\n preparation: CompactionPreparation,\n model: Model,\n apiKey: string | undefined,\n headers?: Record<string, string>,\n customInstructions?: string,\n signal?: AbortSignal,\n thinkingLevel?: ThinkingLevel,\n streamFn?: StreamFn,\n retry?: RetryPolicy,\n callbacks?: RetryCallbacks,\n sessionId?: string,\n onMediaProjection?: SimpleStreamOptions[\"onMediaProjection\"],\n): Promise<CompactionResult> {\n const {\n firstKeptEntryId,\n messagesToSummarize,\n turnPrefixMessages,\n isSplitTurn,\n tokensBefore,\n previousSummary,\n fileOps,\n settings,\n } = preparation;\n\n // Generate summaries and merge into one\n let summary: string;\n let summaryUsage: Usage;\n\n if (isSplitTurn && turnPrefixMessages.length > 0) {\n let historyText = previousSummary ?? \"No prior history.\";\n let historyUsage: Usage | undefined;\n if (messagesToSummarize.length > 0) {\n const historyResult = await generateSummaryWithUsage(\n messagesToSummarize,\n model,\n settings.reserveTokens,\n apiKey,\n headers,\n signal,\n customInstructions,\n previousSummary,\n thinkingLevel,\n streamFn,\n retry,\n callbacks,\n sessionId,\n onMediaProjection,\n );\n historyText = historyResult.text;\n historyUsage = historyResult.usage;\n }\n const turnPrefixResult = await generateTurnPrefixSummary(\n turnPrefixMessages,\n model,\n settings.reserveTokens,\n apiKey,\n headers,\n signal,\n thinkingLevel,\n streamFn,\n retry,\n callbacks,\n sessionId,\n onMediaProjection,\n );\n // Merge into single summary\n summary = `${historyText}\\n\\n---\\n\\n**Turn Context (split turn):**\\n\\n${turnPrefixResult.text}`;\n summaryUsage = historyUsage ? combineUsage(historyUsage, turnPrefixResult.usage) : turnPrefixResult.usage;\n } else {\n // Just generate history summary\n const result = await generateSummaryWithUsage(\n messagesToSummarize,\n model,\n settings.reserveTokens,\n apiKey,\n headers,\n signal,\n customInstructions,\n previousSummary,\n thinkingLevel,\n streamFn,\n retry,\n callbacks,\n sessionId,\n onMediaProjection,\n );\n summary = result.text;\n summaryUsage = result.usage;\n }\n\n // Compute file lists and append to summary\n const { readFiles, modifiedFiles } = computeFileLists(fileOps);\n summary += formatFileOperations(readFiles, modifiedFiles);\n\n if (!firstKeptEntryId) {\n throw new Error(\"First kept entry has no UUID - session may need migration\");\n }\n\n return {\n summary,\n firstKeptEntryId,\n tokensBefore,\n usage: summaryUsage,\n details: { readFiles, modifiedFiles } as CompactionDetails,\n };\n}\n\n/**\n * Generate a summary for a turn prefix (when splitting a turn).\n */\nasync function generateTurnPrefixSummary(\n messages: AgentMessage[],\n model: Model,\n reserveTokens: number,\n apiKey: string | undefined,\n headers?: Record<string, string>,\n signal?: AbortSignal,\n thinkingLevel?: ThinkingLevel,\n streamFn?: StreamFn,\n retry?: RetryPolicy,\n callbacks?: RetryCallbacks,\n sessionId?: string,\n onMediaProjection?: SimpleStreamOptions[\"onMediaProjection\"],\n): Promise<{ text: string; usage: Usage }> {\n const maxTokens = Math.min(\n Math.floor(0.5 * reserveTokens),\n model.maxTokens > 0 ? model.maxTokens : Number.POSITIVE_INFINITY,\n ); // Smaller budget for turn prefix\n const llmMessages = convertToLlm(messages);\n const conversationText = serializeConversation(llmMessages);\n const promptText = `<conversation>\\n${conversationText}\\n</conversation>\\n\\n${TURN_PREFIX_SUMMARIZATION_PROMPT}`;\n\n const response = await completeSummarization(\n model,\n buildSummarizationContext(promptText),\n createSummarizationOptions(\n model,\n maxTokens,\n apiKey,\n headers,\n signal,\n thinkingLevel,\n sessionId,\n onMediaProjection,\n ),\n streamFn,\n retry,\n callbacks,\n );\n\n const failure = getSummarizationFailure(response, \"Turn prefix summarization\");\n if (failure) {\n throw new Error(failure);\n }\n return {\n text: contentText(response.content),\n usage: response.usage,\n };\n}\n\nexport interface CompactionOptions {\n microcompact?: import(\"./microcompact.ts\").MicrocompactConfig;\n enabled?: boolean;\n reserveTokens?: number;\n keepRecentTokens?: number;\n modelOverrides?: Record<string, { reserveTokens?: number; keepRecentTokens?: number }>;\n}\n","// Adapted from Pi cd34e17ff039502f3664d8363b3c0a23f93a2ca3.\n// Copyright (c) 2025 Mario Zechner. MIT: licenses/third-party-notices.txt.\n/**\n * Shared utilities for compaction and branch summarization.\n */\n\nimport type { Message as AgentMessage } from \"@zpi-dev/ai\";\nimport { contentText, type Message } from \"@zpi-dev/ai\";\n\n// ============================================================================\n// File Operation Tracking\n// ============================================================================\n\nexport interface FileOperations {\n read: Set<string>;\n written: Set<string>;\n edited: Set<string>;\n}\n\nexport function createFileOps(): FileOperations {\n return {\n read: new Set(),\n written: new Set(),\n edited: new Set(),\n };\n}\n\n/**\n * Extract file operations from tool calls in an assistant message.\n */\nexport function extractFileOpsFromMessage(message: AgentMessage, fileOps: FileOperations): void {\n if (message.role !== \"assistant\") return;\n if (!(\"content\" in message) || !Array.isArray(message.content)) return;\n\n for (const block of message.content) {\n if (typeof block !== \"object\" || block === null) continue;\n if (!(\"type\" in block) || block.type !== \"toolCall\") continue;\n if (!(\"arguments\" in block) || !(\"name\" in block)) continue;\n\n const args = block.arguments as Record<string, unknown> | undefined;\n if (!args) continue;\n\n const path = typeof args.path === \"string\" ? args.path : undefined;\n if (!path) continue;\n\n switch (block.name) {\n case \"read\":\n fileOps.read.add(path);\n break;\n case \"write\":\n fileOps.written.add(path);\n break;\n case \"edit\":\n fileOps.edited.add(path);\n break;\n }\n }\n}\n\n/**\n * Compute final file lists from file operations.\n * Returns readFiles (files only read, not modified) and modifiedFiles.\n */\nexport function computeFileLists(fileOps: FileOperations): { readFiles: string[]; modifiedFiles: string[] } {\n const modified = new Set([...fileOps.edited, ...fileOps.written]);\n const readOnly = [...fileOps.read].filter((f) => !modified.has(f)).sort();\n const modifiedFiles = [...modified].sort();\n return { readFiles: readOnly, modifiedFiles };\n}\n\n/**\n * Format file operations as XML tags for summary.\n */\nexport function formatFileOperations(readFiles: string[], modifiedFiles: string[]): string {\n const sections: string[] = [];\n if (readFiles.length > 0) {\n sections.push(`<read-files>\\n${readFiles.join(\"\\n\")}\\n</read-files>`);\n }\n if (modifiedFiles.length > 0) {\n sections.push(`<modified-files>\\n${modifiedFiles.join(\"\\n\")}\\n</modified-files>`);\n }\n if (sections.length === 0) return \"\";\n return `\\n\\n${sections.join(\"\\n\\n\")}`;\n}\n\n// ============================================================================\n// Message Serialization\n// ============================================================================\n\n/** Maximum characters for a tool result in serialized summaries. */\nconst TOOL_RESULT_MAX_CHARS = 2000;\n\n/**\n * Truncate text to a maximum character length for summarization.\n * Keeps the beginning and appends a truncation marker.\n */\nfunction truncateForSummary(text: string, maxChars: number): string {\n if (text.length <= maxChars) return text;\n const truncatedChars = text.length - maxChars;\n return `${text.slice(0, maxChars)}\\n\\n[... ${truncatedChars} more characters truncated]`;\n}\n\n/**\n * Serialize LLM messages to text for summarization.\n * This prevents the model from treating it as a conversation to continue.\n * Call convertToLlm() first to handle custom message types.\n *\n * Tool results are truncated to keep the summarization request within\n * reasonable token budgets. Full content is not needed for summarization.\n */\nexport function serializeConversation(messages: Message[]): string {\n const parts: string[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"user\") {\n const content = contentText(msg.content, \"\");\n if (content) parts.push(`[User]: ${content}`);\n } else if (msg.role === \"assistant\") {\n const thinkingParts: string[] = [];\n const toolCalls: string[] = [];\n\n for (const block of msg.content) {\n if (block.type === \"thinking\") {\n thinkingParts.push(block.thinking);\n } else if (block.type === \"toolCall\") {\n const args = block.arguments as Record<string, unknown>;\n const argsStr = Object.entries(args)\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`)\n .join(\", \");\n toolCalls.push(`${block.name}(${argsStr})`);\n }\n }\n\n if (thinkingParts.length > 0) {\n parts.push(`[Assistant thinking]: ${thinkingParts.join(\"\\n\")}`);\n }\n const content = contentText(msg.content);\n if (content.trim()) {\n parts.push(`[Assistant]: ${content}`);\n }\n if (toolCalls.length > 0) {\n parts.push(`[Assistant tool calls]: ${toolCalls.join(\"; \")}`);\n }\n } else if (msg.role === \"toolResult\") {\n const content = contentText(msg.content, \"\");\n if (content) {\n parts.push(`[Tool result]: ${truncateForSummary(content, TOOL_RESULT_MAX_CHARS)}`);\n }\n }\n }\n\n return parts.join(\"\\n\\n\");\n}\n\n// ============================================================================\n// Summarization System Prompt\n// ============================================================================\n\nexport const SUMMARIZATION_SYSTEM_PROMPT = `You are a context summarization assistant. Your task is to read a conversation between a user and an AI assistant, then produce a structured summary following the exact format specified.\n\nDo NOT continue the conversation. Do NOT respond to any questions in the conversation. ONLY output the structured summary.`;\n","import { createHash } from \"node:crypto\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport { HttpsProxyAgent } from \"https-proxy-agent\";\nimport type OpenAI from \"openai\";\nimport type { ResponseStreamEvent } from \"openai/resources/responses/responses\";\nimport { ResponsesWS } from \"openai/resources/responses/ws\";\nimport { SocksProxyAgent } from \"socks-proxy-agent\";\nimport { WebSocket } from \"ws\";\nimport type { Model, StreamOptions } from \"../types.ts\";\nimport { abortable } from \"../utils/abort.ts\";\nimport { isJsonObject } from \"../utils/transcript.ts\";\n\ntype Payload = Record<string, unknown> & { input: unknown[] };\ntype Previous = { id: string; settings: Record<string, unknown>; input: unknown[] };\nconst IDLE_MS = 5 * 60_000;\ntype FailureReason =\n | \"connection_limit\"\n | \"previous_response_not_found\"\n | \"invalid_previous_response\"\n | \"closed_connection\"\n | \"transport\"\n | \"request_error\"\n | \"observer_error\"\n | \"aborted\"\n | \"disposed\";\nexport interface ResponsesSessionStats {\n connectionsCreated: number;\n connectionsReused: number;\n websocketRequests: number;\n warmupRequests: number;\n fullContextRequests: number;\n deltaRequests: number;\n reconnects: number;\n websocketFailures: number;\n httpRequests: number;\n httpFallbacks: number;\n lastInputItems: number;\n lastFullInputItems: number;\n}\nexport interface ResponsesSessionDiagnostic {\n event: \"request\" | \"reconnect\" | \"fallback\" | \"complete\" | \"error\";\n transport: \"websocket\" | \"http\";\n warmup: boolean;\n reason?: FailureReason;\n stats: ResponsesSessionStats;\n}\nexport interface ResponsesSessionOptions {\n /** Resolve a proxy URL, or undefined for a direct connection. Hosts can supply their system/PAC resolver. */\n resolveProxy?: (url: string) => Promise<string | undefined>;\n /** Local counters only: no credentials, prompts, response IDs, or server error bodies. */\n onDiagnostic?: (diagnostic: ResponsesSessionDiagnostic) => void;\n}\n\nexport function supportsResponsesWebSocket(model: Model): boolean {\n // Gateways retain their existing HTTP behavior; never forward official credentials to another endpoint.\n return model.api === \"openai-responses\" && /^https:\\/\\/api\\.openai\\.com\\/v1\\/?$/.test(model.baseUrl);\n}\n\n/** One conversation, one authenticated socket. Nothing here is persisted in the transcript. */\nexport class ResponsesSession {\n private socket?: ResponsesWS;\n private identity?: string;\n private previous?: Previous;\n private idle?: ReturnType<typeof setTimeout>;\n private openedAt = 0;\n private httpUntil = 0;\n private lifecycle = new AbortController();\n private tail: Promise<void> = Promise.resolve();\n private options: ResponsesSessionOptions;\n private stats: ResponsesSessionStats = {\n connectionsCreated: 0,\n connectionsReused: 0,\n websocketRequests: 0,\n warmupRequests: 0,\n fullContextRequests: 0,\n deltaRequests: 0,\n reconnects: 0,\n websocketFailures: 0,\n httpRequests: 0,\n httpFallbacks: 0,\n lastInputItems: 0,\n lastFullInputItems: 0,\n };\n constructor(options: ResponsesSessionOptions = {}) {\n this.options = options;\n }\n\n get diagnostics(): ResponsesSessionStats {\n return { ...this.stats };\n }\n\n private get disposed(): boolean {\n return this.lifecycle.signal.aborted;\n }\n\n private report(diagnostic: Omit<ResponsesSessionDiagnostic, \"stats\">): void {\n try {\n this.options.onDiagnostic?.({ ...diagnostic, stats: this.diagnostics });\n } catch {\n // Diagnostics must never change transport behavior or cause a generation to be replayed.\n }\n }\n\n dispose(): void {\n this.lifecycle.abort(new Error(\"Responses session disposed\"));\n this.disconnect();\n }\n\n private disconnect(): void {\n clearTimeout(this.idle);\n this.previous = undefined;\n const socket = this.socket;\n this.socket = undefined;\n socket?.close();\n }\n\n async *events(\n client: OpenAI,\n model: Model,\n payload: Payload,\n options: StreamOptions,\n http: () => Promise<AsyncIterable<ResponseStreamEvent>>,\n start: () => void,\n ): AsyncGenerator<ResponseStreamEvent> {\n let release!: () => void;\n const before = this.tail;\n this.tail = new Promise<void>((resolve) => {\n release = resolve;\n });\n // Serialize warmup and generation, including callers that accidentally share a session concurrently.\n const signal = AbortSignal.any([this.lifecycle.signal, ...(options.signal ? [options.signal] : [])]);\n try {\n await abortable(before, signal);\n } catch (error) {\n // A cancelled waiter must not let later requests overtake the current owner.\n void before.then(release);\n throw error;\n }\n let completed = false;\n let progressed = false;\n let usingSocket = false;\n let failureReason: FailureReason = \"transport\";\n const report = (\n event: ResponsesSessionDiagnostic[\"event\"],\n transport: ResponsesSessionDiagnostic[\"transport\"],\n reason?: FailureReason,\n ) => this.report({ event, transport, warmup: !!options.responsesWarmup, reason });\n const httpEvents = async function* (session: ResponsesSession) {\n session.stats.httpRequests++;\n report(\"request\", \"http\");\n try {\n for await (const event of await http()) {\n if (event.type === \"response.completed\" || event.type === \"response.incomplete\")\n report(\"complete\", \"http\");\n yield event;\n }\n } catch (error) {\n report(\"error\", \"http\", \"transport\");\n throw error;\n }\n };\n const abort = () => this.disconnect();\n try {\n options.signal?.throwIfAborted();\n if (this.disposed) throw new Error(\"Responses session disposed\");\n const identity = createHash(\"sha256\")\n .update(\n JSON.stringify([\n model.provider,\n model.id,\n model.auth,\n model.baseUrl,\n options.apiKey,\n model.headers,\n options.headers,\n ]),\n )\n .digest(\"hex\");\n if (identity !== this.identity) {\n this.disconnect();\n this.identity = identity;\n this.httpUntil = 0;\n }\n if (Date.now() - this.openedAt > 55 * 60_000) this.disconnect();\n clearTimeout(this.idle);\n if (Date.now() < this.httpUntil) {\n if (!options.responsesWarmup) yield* httpEvents(this);\n completed = true;\n return;\n }\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n usingSocket = true;\n const settings: Record<string, unknown> = { ...payload };\n delete settings.input;\n delete settings.stream;\n delete settings.background;\n delete settings.previous_response_id;\n const previous = this.previous;\n const continuation =\n previous &&\n isDeepStrictEqual(settings, previous.settings) &&\n previous.input.length <= payload.input.length &&\n previous.input.every((item, index) => isDeepStrictEqual(item, payload.input[index]));\n let parent = continuation ? previous.id : undefined;\n let retried = false;\n for (;;) {\n let iterator: ReturnType<ResponsesWS[\"stream\"]> | undefined;\n let recoverable: FailureReason | undefined;\n try {\n failureReason = \"transport\";\n // A close handshake may take seconds before the SDK emits its close event.\n if (this.socket && this.socket.socket.readyState >= WebSocket.CLOSING) {\n this.disconnect();\n this.stats.reconnects++;\n report(\"reconnect\", \"websocket\", \"closed_connection\");\n }\n if (!this.socket) {\n this.previous = undefined;\n parent = undefined;\n const proxy = await abortable(\n Promise.resolve(this.options.resolveProxy?.(model.baseUrl)),\n AbortSignal.any([signal, AbortSignal.timeout(10_000)]),\n );\n options.signal?.throwIfAborted();\n if (this.disposed) throw new Error(\"Responses session disposed\");\n const agent = proxy\n ? /^socks/.test(proxy)\n ? new SocksProxyAgent(proxy)\n : new HttpsProxyAgent(proxy)\n : undefined;\n this.socket = new ResponsesWS(client, {\n handshakeTimeout: 10_000,\n perMessageDeflate: true,\n agent,\n });\n this.stats.connectionsCreated++;\n this.openedAt = Date.now();\n // An idle socket can fail when no request iterator is listening.\n this.socket.on(\"error\", () => {});\n const socket = this.socket;\n socket.on(\"close\", () => {\n if (this.socket === socket) {\n this.socket = undefined;\n this.previous = undefined;\n }\n });\n } else this.stats.connectionsReused++;\n const socket = this.socket;\n iterator = socket.stream({ maxBufferedEvents: 4096 });\n this.stats.websocketRequests++;\n if (options.responsesWarmup) this.stats.warmupRequests++;\n this.stats[parent ? \"deltaRequests\" : \"fullContextRequests\"]++;\n this.stats.lastFullInputItems = payload.input.length;\n this.stats.lastInputItems = parent\n ? payload.input.length - (previous?.input.length ?? 0)\n : payload.input.length;\n report(\"request\", \"websocket\");\n start();\n socket.sendRaw(\n JSON.stringify({\n ...settings,\n type: \"response.create\",\n input: parent ? payload.input.slice(previous?.input.length) : payload.input,\n ...(parent ? { previous_response_id: parent } : {}),\n ...(options.responsesWarmup ? { generate: false } : {}),\n }),\n );\n let reported = false;\n for await (const record of iterator) {\n options.signal?.throwIfAborted();\n if (record.type === \"error\") {\n const detail = record.error.error;\n const body = detail && \"error\" in detail ? detail.error : detail;\n const code = body?.code;\n // The server may close the socket with either coded or uncoded parent errors.\n const invalidParent =\n parent &&\n detail &&\n \"status\" in detail &&\n detail.status === 400 &&\n /previous_response_id/i.test(body?.message ?? \"\") &&\n /invalid|not found|does not exist/i.test(body?.message ?? \"\");\n recoverable =\n code === \"websocket_connection_limit_reached\"\n ? \"connection_limit\"\n : parent && code === \"previous_response_not_found\"\n ? \"previous_response_not_found\"\n : invalidParent\n ? \"invalid_previous_response\"\n : undefined;\n const unsupported = [\n \"websocket_not_supported\",\n \"websockets_not_supported\",\n \"unsupported_transport\",\n ].includes(code ?? \"\");\n failureReason = recoverable ?? (detail && !unsupported ? \"request_error\" : \"transport\");\n // Request/auth/usage errors belong to the caller, rather than a silent transport retry.\n if (!recoverable && detail && !unsupported) progressed = true;\n throw Object.assign(record.error, {\n code,\n status: detail && \"status\" in detail ? detail.status : undefined,\n });\n }\n if (record.type === \"close\") throw new Error(\"Responses WebSocket closed\");\n if (record.type !== \"message\") continue;\n if (!reported) {\n reported = true;\n try {\n await options.onResponse?.(\n { status: 101, headers: { \"x-zpi-transport\": \"websocket\" } },\n model,\n );\n } catch (error) {\n progressed = true;\n failureReason = \"observer_error\";\n throw error;\n }\n options.signal?.throwIfAborted();\n if (this.disposed) throw new Error(\"Responses session disposed\");\n }\n const event = record.message as ResponseStreamEvent;\n if (event.type === \"response.completed\") {\n try {\n const hasResponse =\n options.responsesWarmup ||\n event.response.output.length > 0 ||\n (event.response.usage?.total_tokens ?? 0) > 0;\n this.previous = hasResponse\n ? {\n id: event.response.id,\n settings: structuredClone(settings),\n input: structuredClone([\n ...payload.input,\n ...outputInput(event.response.output, model),\n ]),\n }\n : undefined;\n } catch {\n // Malformed tool arguments are diagnosed by the adapter; never replay a completed generation.\n this.previous = undefined;\n }\n completed = true;\n } else if (event.type === \"response.incomplete\") {\n this.previous = undefined;\n completed = true;\n } else if (\n /^response\\.(?:output_|reasoning_|function_call_arguments\\.|refusal\\.)/.test(event.type)\n ) {\n // Transport metadata/heartbeats do not mean model output has started.\n progressed = true;\n }\n if (completed) report(\"complete\", \"websocket\");\n yield event;\n if (completed) return;\n }\n throw new Error(\"Stream ended without response.completed\");\n } catch (error) {\n if (!options.signal?.aborted && !this.disposed) this.stats.websocketFailures++;\n if (recoverable && !retried && !progressed && !options.signal?.aborted && !this.disposed) {\n this.disconnect();\n parent = undefined;\n retried = true;\n this.stats.reconnects++;\n report(\"reconnect\", \"websocket\", recoverable);\n } else throw error;\n } finally {\n await iterator?.return?.();\n }\n }\n } catch (error) {\n this.disconnect();\n if (options.responsesWarmup && !this.disposed) this.httpUntil = Date.now() + 60_000;\n if (!usingSocket) throw error;\n if (options.signal?.aborted || this.disposed || progressed) {\n report(\n \"error\",\n \"websocket\",\n options.signal?.aborted ? \"aborted\" : this.disposed ? \"disposed\" : failureReason,\n );\n throw error;\n }\n // A blocked proxy/upgrade should cost one short attempt, not one attempt per tool call.\n this.httpUntil = Date.now() + 60_000;\n this.stats.httpFallbacks++;\n report(\"fallback\", \"http\", failureReason);\n if (!options.responsesWarmup) {\n yield* httpEvents(this);\n completed = true;\n }\n } finally {\n options.signal?.removeEventListener(\"abort\", abort);\n if (usingSocket && !completed) this.disconnect();\n if (this.socket) {\n this.idle = setTimeout(() => this.disconnect(), IDLE_MS);\n this.idle.unref();\n }\n release();\n }\n }\n}\n\n/** Compare with the portable transcript projection, not with the server's different output item shape. */\nfunction outputInput(items: unknown[], model: Model): unknown[] {\n return items.flatMap((item): unknown[] => {\n if (!isJsonObject(item)) return [];\n if (item.type === \"reasoning\") return [item];\n if (item.type === \"message\" && Array.isArray(item.content))\n return item.content.flatMap((part) => {\n if (!isJsonObject(part)) return [];\n const text = part.type === \"output_text\" ? part.text : part.refusal;\n return typeof text === \"string\" && text.trim()\n ? [{ role: \"assistant\", content: text, ...(item.phase ? { phase: item.phase } : {}) }]\n : [];\n });\n if (item.type === \"function_call\")\n return [\n {\n type: \"function_call\",\n call_id: item.call_id,\n ...(item.id ? { id: item.id } : {}),\n name: item.name,\n arguments: JSON.stringify(JSON.parse(String(item.arguments || \"{}\"))),\n ...(model.auth === \"chatgpt\"\n ? { namespace: \"ZPI\" }\n : item.namespace\n ? { namespace: item.namespace }\n : {}),\n },\n ];\n return [];\n });\n}\n","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","import { concatBytes, encodeUTF8 } from './utils/bytes';\nimport { OpenAIError } from '../core/error';\nimport type { WebSocketLike } from './ws-adapter';\n\nconst webSocketErrors = new WeakMap<WebSocketLike, Error>();\n\n/** Records physical failure before transport callbacks notify public observers. @internal */\nexport function recordWebSocketError(socket: WebSocketLike, error: Error): void {\n webSocketErrors.set(socket, error);\n}\n\n/** Returns physical failure for this socket instance, never for a replacement. @internal */\nexport function getWebSocketError(socket: WebSocketLike): Error | undefined {\n return webSocketErrors.get(socket);\n}\n\n/** Options for an independently buffered WebSocket stream iterator. */\nexport interface WebSocketStreamOptions {\n /**\n * Maximum queued records, including raw data, errors and lifecycle events.\n * Must be a positive safe integer. Omitted means unlimited. Overflow discards\n * this iterator's backlog and rejects its next() calls with a WebSocketError,\n * without closing the shared socket or affecting other iterators.\n * This bounds event count, not payload bytes or total memory.\n */\n maxBufferedEvents?: number | undefined;\n}\n\n/** Snapshots and validates the iterator's limit before listeners are attached. */\nexport function getMaxBufferedEvents(options?: WebSocketStreamOptions): number | undefined {\n const limit = options?.maxBufferedEvents;\n if (limit !== undefined && (!Number.isSafeInteger(limit) || limit <= 0)) {\n throw new OpenAIError('maxBufferedEvents must be a positive safe integer');\n }\n return limit;\n}\n\n/** Reconnection event passed to the `onReconnecting` handler and event listeners. */\nexport interface ReconnectingEvent<Parameters = Record<string, unknown>> {\n /** Which retry attempt this is (1-based). */\n readonly attempt: number;\n /** Total attempts that will be made. */\n readonly maxAttempts: number;\n /** Delay in ms before this attempt connects. */\n readonly delay: number;\n /** The WebSocket close code that triggered reconnection. */\n readonly closeCode: number;\n /** The current query parameters. */\n readonly parameters: (Parameters & Record<string, unknown>) | undefined;\n}\n\n/**\n * Optional overrides returned from the `onReconnecting` handler\n * to customize the next reconnection attempt.\n */\nexport type ReconnectingOverrides<Parameters = Record<string, unknown>> =\n | {\n /**\n * If provided, assigns the query parameters for the next connection.\n * Set to `undefined` to clear all query parameters.\n */\n parameters?: (Parameters & Record<string, unknown>) | undefined;\n }\n | {\n /**\n * If set, will stop attempting to reconnect.\n */\n abort: true;\n };\n\n/**\n * Raw data types that can be sent over a WebSocket without serialization.\n */\nexport type RawWebSocketData = string | ArrayBufferLike | ArrayBufferView | ArrayBufferView[];\n\ninterface CredentialedWebSocketOptions {\n auth?: string | null | undefined;\n followRedirects?: boolean | undefined;\n headers?: object | null | undefined;\n}\n\nconst REDIRECT_SAFE_WEBSOCKET_HEADERS = new Set([\n 'connection',\n 'host',\n 'openai-beta',\n 'origin',\n 'sec-websocket-extensions',\n 'sec-websocket-key',\n 'sec-websocket-version',\n 'upgrade',\n 'user-agent',\n 'x-access-level',\n 'x-auth-metadata',\n 'x-auth-tokenization',\n 'x-authentication-metadata',\n 'x-authentication-tokenization',\n 'x-security-policy',\n 'x-token-budget',\n 'x-trace-id',\n]);\n\nfunction isWebSocketCredentialHeader(name: string): boolean {\n return !REDIRECT_SAFE_WEBSOCKET_HEADERS.has(name.toLowerCase().split('_').join('-'));\n}\n\n/**\n * Snapshots credential values in final socket options before validation and dispatch.\n * Reports potential caller authentication, including custom headers; the server\n * remains responsible for validating credentials. Noncredential headers are left intact.\n */\nexport function snapshotWebSocketCredentials(options: {\n auth?: unknown;\n headers?: Record<string, unknown> | undefined;\n}): boolean {\n if (options.auth !== null && options.auth !== undefined) {\n options.auth = String(options.auth);\n }\n const credentials = new Map<string, boolean>();\n const headers = options.headers ?? {};\n for (const [name, value] of Object.entries(headers)) {\n const normalizedName = name.toLowerCase().split('_').join('-');\n // Routing metadata is still protected on redirects, but cannot authenticate a socket.\n if (\n !isWebSocketCredentialHeader(name) ||\n normalizedName === 'openai-organization' ||\n normalizedName === 'openai-project'\n ) {\n continue;\n }\n let snapshot = value;\n if (Array.isArray(value)) {\n snapshot = value.map(String);\n } else if (value !== null && value !== undefined) {\n snapshot = String(value);\n }\n headers[name] = snapshot;\n const values = Array.isArray(snapshot) ? snapshot : [snapshot];\n credentials.set(\n name.toLowerCase(),\n values.some((item) => typeof item === 'string' && item.trim().length > 0),\n );\n }\n // Node applies header names case-insensitively, and Authorization overrides Basic auth.\n return (\n [...credentials.values()].some(Boolean) ||\n (!credentials.has('authorization') && typeof options.auth === 'string' && options.auth.trim().length > 0)\n );\n}\n\n/** Prevents WebSocket redirects from forwarding caller or SDK credentials to another origin. */\nexport function protectWebSocketOptionsFromCredentialRedirects<Options extends CredentialedWebSocketOptions>(\n options: Options,\n): Options {\n const hasSensitiveHeader = Object.keys(options.headers ?? {}).some(isWebSocketCredentialHeader);\n\n if (!options.auth && !hasSensitiveHeader) {\n return options;\n }\n\n return { ...options, followRedirects: false };\n}\n\n/** A queued application message or raw WebSocket frame that was never transmitted. */\nexport type UnsentMessage<T> =\n | {\n /** Identifies a JSON-serialized application message. */\n type: 'message';\n\n /** The deserialized snapshot captured when the message was queued. */\n message: T;\n }\n | {\n /** Identifies an unencoded WebSocket frame. */\n type: 'raw';\n\n /** The string or copied binary payload captured when the frame was queued. */\n data: RawWebSocketData;\n };\n\ntype QueueEntry =\n | { kind: 'json'; data: string; byteLength: number }\n | { kind: 'raw'; data: RawWebSocketData; byteLength: number };\n\nfunction toUint8Array(view: ArrayBufferView): Uint8Array {\n if (view instanceof Uint8Array) {\n return view;\n }\n return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n}\n\n/**\n * Flatten `ArrayBufferView[]` fragments into a single `Uint8Array` so that\n * `ws.send()` transmits the correct bytes.\n */\nexport function flattenRawData(data: RawWebSocketData): Exclude<RawWebSocketData, ArrayBufferView[]> {\n if (Array.isArray(data)) {\n return concatBytes(data.map(toUint8Array));\n }\n return data;\n}\n\nfunction snapshotRawData(data: RawWebSocketData): Exclude<RawWebSocketData, ArrayBufferView[]> {\n if (typeof data === 'string') {\n return data;\n }\n if (Array.isArray(data)) {\n return concatBytes(data.map(toUint8Array));\n }\n if (ArrayBuffer.isView(data)) {\n const copy = new Uint8Array(data.byteLength);\n copy.set(toUint8Array(data));\n return copy;\n }\n // oxlint-disable-next-line unicorn/prefer-spread -- ArrayBufferLike.slice copies bytes while spread changes the return type.\n return data.slice(0);\n}\n\n/** Counts wire bytes without allocating another payload-sized buffer. */\nexport function rawByteLength(data: RawWebSocketData): number {\n if (typeof data === 'string') {\n let bytes = 0;\n for (let index = 0; index < data.length; index += 1) {\n const code = data.codePointAt(index)!;\n if (code < 128) {\n bytes += 1;\n } else if (code < 2048) {\n bytes += 2;\n } else if (code <= 65_535) {\n bytes += 3;\n } else {\n bytes += 4;\n index += 1;\n }\n }\n return bytes;\n }\n if (Array.isArray(data)) {\n return data.reduce((sum, buf) => sum + buf.byteLength, 0);\n }\n if ('byteLength' in data) {\n return data.byteLength;\n }\n return 0;\n}\n\n/**\n * Buffers outgoing WebSocket messages while a connection is unavailable.\n *\n * JSON values are serialized immediately, and raw binary payloads are copied,\n * so later caller mutations cannot change queued messages. A single oversized\n * message is accepted when the queue is empty; further messages are rejected\n * whenever they would exceed the configured byte budget.\n */\nexport class SendQueue<T = unknown> {\n private _queue: QueueEntry[] = [];\n private _bytes = 0;\n private _maxBytes: number;\n\n /** Creates a queue with a one-mebibyte default byte budget. */\n constructor(maxBytes = 1_048_576) {\n this._maxBytes = maxBytes;\n }\n\n /**\n * Serializes and snapshots a JSON message before queueing it.\n *\n * @returns `true` when accepted, including an oversized first message; `false`\n * when adding it to a nonempty queue would exceed the byte budget.\n */\n enqueue(event: T): boolean {\n const data = JSON.stringify(event);\n const byteLength = encodeUTF8(data).byteLength;\n if (this._bytes + byteLength > this._maxBytes && this._queue.length > 0) {\n return false;\n }\n this._queue.push({ kind: 'json', data, byteLength });\n this._bytes += byteLength;\n return true;\n }\n\n /**\n * Queues a raw string or a defensive copy of a binary WebSocket payload.\n * Fragmented typed-array payloads are flattened before storage.\n *\n * @returns `true` when accepted, including an oversized first frame; `false`\n * when adding it to a nonempty queue would exceed the byte budget.\n */\n enqueueRaw(data: RawWebSocketData): boolean {\n const snapshot = snapshotRawData(data);\n const byteLength = rawByteLength(snapshot);\n if (this._bytes + byteLength > this._maxBytes && this._queue.length > 0) {\n return false;\n }\n this._queue.push({ kind: 'raw', data: snapshot, byteLength });\n this._bytes += byteLength;\n return true;\n }\n\n /**\n * Send every queued message via `send`. If `send` throws, the failing\n * message and all subsequent messages are re-queued and the error is\n * re-thrown so the caller can report it.\n */\n flush(send: (data: RawWebSocketData) => void): void {\n const pending = this._queue.splice(0);\n this._bytes = 0;\n for (let i = 0; i < pending.length; i++) {\n try {\n send(pending[i]!.data);\n } catch (err) {\n const remaining = pending.slice(i);\n this._queue = [...remaining, ...this._queue];\n this._bytes = this._queue.reduce((sum, item) => sum + item.byteLength, 0);\n throw err;\n }\n }\n }\n\n /**\n * Drain the queue and return the unsent messages. JSON messages are\n * deserialized back to their original form. Resets byte tracking to zero.\n */\n drain(): UnsentMessage<T>[] {\n const unsent = this._queue.map((entry): UnsentMessage<T> => {\n if (entry.kind === 'raw') {\n return { type: 'raw', data: entry.data };\n }\n // SAFETY: T is the transport caller's event contract; JSON syntax is parsed here without imposing a runtime schema on forward-compatible events.\n return { type: 'message', message: JSON.parse(entry.data) as T };\n });\n this._queue = [];\n this._bytes = 0;\n return unsent;\n }\n}\n\n/**\n * Reports whether an RFC 6455 close code represents a recoverable interruption.\n *\n * Network failures, service restarts, temporary server errors, and TLS\n * handshake failures can be retried; normal closure, protocol violations,\n * invalid payloads, and unrecognized codes cannot.\n */\nexport function isRecoverableClose(code: number): boolean {\n switch (code) {\n case 1000: {\n return false;\n } // Normal closure\n case 1001: {\n return true;\n } // Going away (server shutting down)\n case 1002: {\n return false;\n } // Protocol error\n case 1003: {\n return false;\n } // Unsupported data\n case 1005: {\n return true;\n } // No status code (abnormal)\n case 1006: {\n return true;\n } // Abnormal closure (network drop)\n case 1007: {\n return false;\n } // Invalid payload\n case 1008: {\n return false;\n } // Policy violation\n case 1009: {\n return false;\n } // Message too big\n case 1010: {\n return false;\n } // Missing extension\n case 1011: {\n return true;\n } // Internal server error\n case 1012: {\n return true;\n } // Service restart\n case 1013: {\n return true;\n } // Try again later\n case 1015: {\n return true;\n } // TLS handshake failure\n default: {\n return false;\n }\n }\n}\n","import type * as WS from 'ws';\nimport type { WebSocketLike } from './ws-adapter';\nimport { protectWebSocketOptionsFromCredentialRedirects } from './ws';\n\n/** A generic event listener callback. */\ntype Listener = (...args: any[]) => void;\n\n/**\n * Adapts a Node.js `ws` socket to the SDK's platform-neutral WebSocket API.\n *\n * Text frames become strings, binary frames become `Buffer` values, fragmented\n * messages are merged, and close reasons are decoded before reaching listeners.\n */\nexport class NodeWebSocket implements WebSocketLike {\n private _ws: WS.WebSocket;\n\n /** Maps `(event, originalListener)` to every wrapped registration in listener order. */\n private _listenerMap = new Map<string, Map<Listener, Listener[]>>();\n\n /** Wraps an existing socket created by the optional `ws` package. */\n constructor(ws: WS.WebSocket) {\n this._ws = ws;\n this._ws.on('redirect', (_url, request) => {\n try {\n const options = protectWebSocketOptionsFromCredentialRedirects({\n followRedirects: true,\n headers: request.getHeaders(),\n });\n\n if (options.followRedirects) {\n return;\n }\n } catch {\n // Header inspection failure must never permit a credentialed redirect.\n }\n\n this._ws.terminate();\n });\n }\n\n /** The underlying `ws` socket; accessing it makes calling code Node.js-specific. */\n get platformSocket(): WS.WebSocket {\n return this._ws;\n }\n\n /** Current numeric socket connection state, using standard WebSocket values. */\n get readyState(): number {\n return this._ws.readyState;\n }\n\n /** Sends a text or binary frame through the underlying `ws` connection. */\n send(data: string | ArrayBufferLike | ArrayBufferView): void {\n this._ws.send(data);\n }\n\n /** Initiates the socket's closing handshake with an optional code and reason. */\n close(code?: number, reason?: string): void {\n this._ws.close(code, reason);\n }\n\n /** Registers a listener with normalized message payloads and close reasons. */\n on(event: string, listener: Listener): void {\n const wrapped = NodeWebSocket._wrapListener(event, listener);\n this._registerListener(event, listener, wrapped);\n }\n\n /** Removes the platform listener associated with the original callback. */\n off(event: string, listener: Listener): void {\n const wrappedListeners = this._listenerMap.get(event)?.get(listener);\n const [wrapped] = wrappedListeners?.slice(-1) ?? [];\n if (!wrapped) {\n return;\n }\n\n this._removeListener(event, listener, wrapped);\n }\n\n /** Registers a listener that is removed before it handles its first event. */\n once(event: string, listener: Listener): void {\n let fired = false;\n const wrapped = NodeWebSocket._wrapListener(event, (...args) => {\n if (fired) {\n return;\n }\n\n fired = true;\n this._removeListener(event, listener, wrapped);\n listener(...args);\n });\n this._registerListener(event, listener, wrapped);\n }\n\n private _registerListener(event: string, listener: Listener, wrapped: Listener): void {\n const byListener = this._listenersFor(event);\n const wrappedListeners = byListener.get(listener);\n if (wrappedListeners) {\n wrappedListeners.push(wrapped);\n } else {\n byListener.set(listener, [wrapped]);\n }\n\n this._ws.on(event, wrapped);\n }\n\n private _removeListener(event: string, listener: Listener, wrapped: Listener): void {\n const byListener = this._listenerMap.get(event);\n const wrappedListeners = byListener?.get(listener);\n if (!byListener || !wrappedListeners) {\n return;\n }\n\n const index = wrappedListeners.lastIndexOf(wrapped);\n if (index === -1) {\n return;\n }\n\n wrappedListeners.splice(index, 1);\n if (wrappedListeners.length === 0) {\n byListener.delete(listener);\n }\n if (byListener.size === 0) {\n this._listenerMap.delete(event);\n }\n\n this._ws.removeListener(event, wrapped);\n }\n\n private _listenersFor(event: string): Map<Listener, Listener[]> {\n let map = this._listenerMap.get(event);\n if (!map) {\n map = new Map();\n this._listenerMap.set(event, map);\n }\n return map;\n }\n\n /**\n * Normalizes `ws` message payloads: text frames become strings,\n * binary frames stay as `Buffer`, and fragmented frames are merged.\n */\n private static _normalizeMessageData(\n data: Buffer | ArrayBuffer | Buffer[],\n isBinary: boolean,\n ): string | Buffer {\n if (!isBinary) {\n if (Array.isArray(data)) {\n return Buffer.concat(data).toString();\n }\n if (data instanceof ArrayBuffer) {\n return Buffer.from(data).toString();\n }\n return data.toString();\n }\n\n if (Array.isArray(data)) {\n return Buffer.concat(data);\n }\n if (data instanceof ArrayBuffer) {\n return Buffer.from(data);\n }\n return data;\n }\n\n private static _wrapListener(event: string, listener: Listener): Listener {\n switch (event) {\n case 'message': {\n return (data: Buffer | ArrayBuffer | Buffer[], isBinary: boolean) => {\n listener(NodeWebSocket._normalizeMessageData(data, isBinary), isBinary);\n };\n }\n\n case 'close': {\n return (code: number, reason: Buffer) => {\n listener(code, reason.toString());\n };\n }\n\n // 'open' and 'error' pass through unchanged\n default: {\n return listener;\n }\n }\n }\n}\n","import type { EmittedEventResult } from '../lib/EventEmitter';\n\n/** Listener callback associated with one event name in a typed event map. */\ntype EventListener<Events, EventType extends keyof Events> = Events[EventType];\n\ntype EventListeners<Events, EventType extends keyof Events> = {\n listener: EventListener<Events, EventType>;\n once?: boolean;\n removed?: boolean;\n detached?: boolean;\n}[];\n\n/** Extracts the ordered listener-argument tuple for one named event. */\nexport type EventParameters<Events, EventType extends keyof Events> = Record<\n EventType,\n EventListener<Events, EventType> extends (...args: infer P) => any ? P : never\n>[EventType];\n\n/** Registers strongly typed event listeners and awaits individual emitted events. */\nexport class EventEmitter<EventTypes extends Record<string, (...args: any) => any>> {\n #listeners: {\n [Event in keyof EventTypes]?: EventListeners<EventTypes, Event>;\n } = Object.create(null);\n #emittedListenerRegistrations = new WeakMap<\n object,\n { event: PropertyKey; registration: { removed?: boolean; detached?: boolean } }\n >();\n #pendingListenerCleanup = new Set<PropertyKey>();\n #listenerDispatchDepth = 0;\n\n /**\n * Adds the listener function to the end of the listeners array for the event.\n * No checks are made to see if the listener has already been added. Multiple calls passing\n * the same combination of event and listener will result in the listener being added, and\n * called, multiple times.\n * @returns this, so that calls can be chained\n */\n on<Event extends keyof EventTypes>(event: Event, listener: EventListener<EventTypes, Event>): this {\n const listeners: EventListeners<EventTypes, Event> = (this.#listeners[event] ||= []);\n listeners.push({ listener });\n return this;\n }\n\n /**\n * Removes the specified listener from the listener array for the event.\n * off() will remove, at most, one instance of a listener from the listener array. If any single\n * listener has been added multiple times to the listener array for the specified event, then\n * off() must be called multiple times to remove each instance.\n * @returns this, so that calls can be chained\n */\n off<Event extends keyof EventTypes>(event: Event, listener: EventListener<EventTypes, Event>): this {\n const listeners = this.#listeners[event];\n if (!listeners) {\n return this;\n }\n\n // SAFETY: Listener functions are object identities used as WeakMap keys; registration and removal use the same function instance.\n const emittedRegistration = this.#emittedListenerRegistrations.get(listener as object);\n if (\n emittedRegistration?.event === event &&\n !emittedRegistration.registration.removed &&\n !emittedRegistration.registration.detached\n ) {\n // SAFETY: The stored registration event was compared with this event above, preserving the event/listener type correlation.\n this.#removeEmittedListener(\n event,\n emittedRegistration.registration as EventListeners<EventTypes, Event>[number],\n );\n return this;\n }\n const index = listeners.findIndex(\n (registration) => !registration.removed && registration.listener === listener,\n );\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n return this;\n }\n\n /**\n * Adds a one-time listener function for the event. The next time the event is triggered,\n * this listener is removed and then invoked.\n * @returns this, so that calls can be chained\n */\n once<Event extends keyof EventTypes>(event: Event, listener: EventListener<EventTypes, Event>): this {\n const listeners: EventListeners<EventTypes, Event> = (this.#listeners[event] ||= []);\n listeners.push({ listener, once: true });\n return this;\n }\n\n #onceForEmitted<Event extends keyof EventTypes>(\n event: Event,\n listener: EventListener<EventTypes, Event>,\n ): void {\n const previousListeners = this.#listeners[event];\n const previousLength = previousListeners?.length ?? 0;\n this.once(event, listener);\n const listeners = this.#listeners[event];\n const [registration] = listeners?.slice(-1) ?? [];\n if (\n (previousListeners === undefined || listeners === previousListeners) &&\n listeners?.length === previousLength + 1 &&\n registration?.listener === listener &&\n registration.once\n ) {\n // SAFETY: Listener functions are object identities used as WeakMap keys; registration and removal use the same function instance.\n this.#emittedListenerRegistrations.set(listener as object, { event, registration });\n }\n }\n\n #removeEmittedListener<Event extends keyof EventTypes>(\n event: Event,\n registration: EventListeners<EventTypes, Event>[number],\n ): void {\n if (registration.removed) {\n return;\n }\n\n registration.removed = true;\n // SAFETY: Listener functions are object identities used as WeakMap keys; registration and removal use the same function instance.\n this.#emittedListenerRegistrations.delete(registration.listener as object);\n this.#pendingListenerCleanup.add(event);\n if (this.#listenerDispatchDepth === 0) {\n this.#cleanupEmittedListeners();\n }\n }\n\n #cleanupEmittedListeners(): void {\n for (const event of this.#pendingListenerCleanup) {\n // SAFETY: Pending cleanup keys are added only from registered EventTypes events; the key retains its event-map membership.\n const eventType = event as keyof EventTypes;\n const listeners = this.#listeners[eventType];\n if (listeners) {\n // SAFETY: Filtering only removes registrations from the same event bucket and preserves the listener signatures for that event.\n this.#listeners[eventType] = listeners.filter((listener) => !listener.removed) as any;\n }\n }\n this.#pendingListenerCleanup.clear();\n }\n\n /**\n * This is similar to `.once()`, but returns a Promise that resolves the next time\n * the event is triggered, instead of calling a listener callback.\n * Events without arguments resolve to `undefined`, single-argument events resolve\n * to that argument, and events with multiple arguments resolve to an argument tuple.\n *\n * @returns A promise for the next event, or a rejection if an error occurs first.\n * Requesting the `error` event resolves with the emitted error instead.\n *\n * Example:\n *\n * const message = await stream.emitted('message') // rejects if the stream errors\n */\n emitted<Event extends keyof EventTypes>(\n event: Event,\n ): Promise<EmittedEventResult<EventParameters<EventTypes, Event>>> {\n return new Promise((resolve, reject) => {\n const listeners = {\n // oxlint-disable-next-line anti-slop/no-unknown-parameters -- Failures and rejection reasons can be arbitrary JavaScript values; preserve them until inspection or forwarding.\n onError: (error: unknown) => {\n // SAFETY: This callback is paired with the same event when registered and removed; its variadic body forwards the event tuple or captured error.\n this.off(event, listeners.onEvent as any);\n reject(error);\n },\n onEvent: (...values: unknown[]) => {\n if (event !== 'error') {\n // SAFETY: This callback is paired with the same event when registered and removed; its variadic body forwards the event tuple or captured error.\n this.off('error', listeners.onError as any);\n }\n // SAFETY: The emitted API returns the sole argument or the full tuple according to its existing EventTypes-dependent result contract.\n resolve((values.length > 1 ? values : values[0]) as any);\n },\n };\n\n if (event !== 'error') {\n // SAFETY: This callback is paired with the same event when registered and removed; its variadic body forwards the event tuple or captured error.\n this.#onceForEmitted('error', listeners.onError as any);\n }\n // SAFETY: This callback is paired with the same event when registered and removed; its variadic body forwards the event tuple or captured error.\n this.#onceForEmitted(event, listeners.onEvent as any);\n });\n }\n\n protected _emit<Event extends keyof EventTypes>(\n this: EventEmitter<EventTypes>,\n event: Event,\n ...args: EventParameters<EventTypes, Event>\n ) {\n const listeners: EventListeners<EventTypes, Event> | undefined = this.#listeners[event];\n if (listeners) {\n // SAFETY: Filtering only removes registrations from the same event bucket and preserves the listener signatures for that event.\n this.#listeners[event] = listeners.filter((listener) => {\n if (listener.once) {\n listener.detached = true;\n }\n return !listener.once && !listener.removed;\n }) as any;\n let listenerThrew = false;\n let firstListenerError: unknown;\n this.#listenerDispatchDepth += 1;\n try {\n // SAFETY: The listener bucket and argument tuple come from the same EventTypes key; this bridges TypeScript generic indexed-access correlation.\n for (const registration of listeners as any) {\n if (!registration.removed) {\n try {\n const { listener } = registration;\n // SAFETY: The listener bucket and argument tuple come from the same EventTypes key; this bridges TypeScript generic indexed-access correlation.\n listener(...(args as any));\n } catch (error) {\n if (!listenerThrew) {\n listenerThrew = true;\n firstListenerError = error;\n }\n }\n }\n }\n } finally {\n this.#listenerDispatchDepth -= 1;\n if (this.#listenerDispatchDepth === 0) {\n this.#cleanupEmittedListeners();\n }\n }\n if (listenerThrew) {\n throw firstListenerError;\n }\n }\n }\n\n protected _hasListener(event: keyof EventTypes): boolean {\n const listeners = this.#listeners[event];\n return listeners && listeners.some((listener) => !listener.removed);\n }\n}\n\n/**\n * An EventEmitter variant that exposes `_emit()` publicly.\n *\n * The base {@link EventEmitter} keeps `_emit` protected so that consumers\n * can only listen, not dispatch. When you need a separate emitter instance\n * that your own code can emit on, without exposing emit on the\n * consumer-facing emitter, use this class.\n */\nexport class InternalEventEmitter<\n EventTypes extends Record<string, (...args: any) => any>,\n> extends EventEmitter<EventTypes> {\n /** Dispatches a named event to its currently registered listeners. */\n override _emit<Event extends keyof EventTypes>(event: Event, ...args: EventParameters<EventTypes, Event>) {\n super._emit(event, ...args);\n }\n}\n","// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details.\n\nimport * as ResponsesAPI from './responses';\nimport { OpenAI } from '../../client';\nimport { EventEmitter } from '../../core/EventEmitter';\nimport { OpenAIError } from '../../core/error';\nimport { assertX509WebSocketSupported } from '../../internal/auth/x509-workload-identity-auth';\n\nimport type { RawWebSocketData, ReconnectingEvent, UnsentMessage } from '../../internal/ws';\n\nexport type ResponsesStreamMessage =\n | { type: 'connecting' | 'open' | 'closing' }\n | {\n type: 'close';\n code: number;\n reason: string;\n unsent: UnsentMessage<ResponsesAPI.ResponsesClientEvent>[];\n }\n | { type: 'reconnecting'; reconnect: ReconnectingEvent }\n | { type: 'reconnected' }\n | { type: 'message'; message: ResponsesAPI.ResponsesServerEvent }\n | { type: 'raw'; data: RawWebSocketData }\n | { type: 'error'; error: WebSocketError };\n\ntype WebSocketErrorEvent = Extract<ResponsesAPI.ResponsesServerEvent, { type: 'error' }>;\n\nexport class WebSocketError extends OpenAIError {\n /**\n * The error data that the API sent back in an error event.\n *\n * This property is non-enumerable to avoid exposing the event through\n * JSON serialization, object spread, or Object.assign.\n */\n error?: WebSocketErrorEvent | undefined;\n\n constructor(message: string, event: WebSocketErrorEvent | null) {\n super(message);\n\n Object.defineProperty(this, 'error', {\n value: event ?? undefined,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n }\n}\n\ntype Simplify<T> = { [KeyType in keyof T]: T[KeyType] } & {};\n\ntype WebSocketEvents = Simplify<\n {\n event: (event: ResponsesAPI.ResponsesServerEvent) => void;\n raw: (data: RawWebSocketData) => void;\n error: (error: WebSocketError) => void;\n close: (code: number, reason: string, unsent: UnsentMessage<ResponsesAPI.ResponsesClientEvent>[]) => void;\n reconnecting: (event: ReconnectingEvent) => void;\n reconnected: () => void;\n } & {\n [EventType in Exclude<NonNullable<ResponsesAPI.ResponsesServerEvent['type']>, 'error'>]: (\n event: Extract<ResponsesAPI.ResponsesServerEvent, { type?: EventType }>,\n ) => unknown;\n }\n>;\n\nexport abstract class ResponsesEmitter extends EventEmitter<WebSocketEvents> {\n /**\n * Send an event to the API.\n */\n abstract send(event: ResponsesAPI.ResponsesClientEvent): void;\n\n /**\n * Send raw data over the WebSocket without JSON serialization.\n */\n abstract sendRaw(data: RawWebSocketData): void;\n\n /**\n * Close the WebSocket connection.\n */\n abstract close(props?: { code: number; reason: string }): void;\n\n protected _onError(event: null, message: string, cause: any): void;\n protected _onError(event: WebSocketErrorEvent, message?: string | undefined): void;\n protected _onError(event: WebSocketErrorEvent | null, message?: string | undefined, cause?: any): void {\n const safeMessage = safeWebSocketErrorMessage(event, message);\n message = safeMessage ?? 'unknown error';\n\n if (!this._hasListener('error')) {\n const error = new WebSocketError(\n message +\n `\\n\\nTo resolve these unhandled rejection errors you should bind an \\`error\\` callback, e.g. \\`ws.on('error', (error) => ...)\\` `,\n event,\n );\n // @ts-ignore\n error.cause = cause;\n Promise.reject(error);\n return;\n }\n\n const error = new WebSocketError(message, event);\n // @ts-ignore\n error.cause = cause;\n\n this._emit('error', error);\n }\n}\n\nexport function buildURL(client: OpenAI, parameters: Record<string, unknown>): URL {\n assertX509WebSocketSupported(client);\n const { ...query } = parameters;\n const endpoint = '/responses';\n const url = new URL(client.buildURL(endpoint, query, undefined));\n url.protocol = url.protocol === 'http:' || url.protocol === 'ws:' ? 'ws:' : 'wss:';\n return url;\n}\n\nfunction safeWebSocketErrorMessage(event: unknown, message: unknown): string | undefined {\n if (typeof message === 'string') return message;\n if (typeof event !== 'object' || event === null) return undefined;\n\n try {\n const error = Object.getOwnPropertyDescriptor(event, 'error')?.value;\n const nestedMessage =\n typeof error === 'object' && error !== null\n ? Object.getOwnPropertyDescriptor(error, 'message')?.value\n : undefined;\n const eventMessage = Object.getOwnPropertyDescriptor(event, 'message')?.value;\n const candidate = typeof nestedMessage === 'string' ? nestedMessage : eventMessage;\n return typeof candidate === 'string' ? candidate : undefined;\n } catch {\n return undefined;\n }\n}\n","/**\n * Normalized WebSocket interface that abstracts over the `ws` package (Node.js)\n * and the native WebSocket API (browser).\n */\nexport interface WebSocketLike {\n /** Current connection state, using the numeric values in {@link ReadyState}. */\n readonly readyState: number;\n\n /** Sends a text or binary frame through the underlying platform socket. */\n send(data: string | ArrayBufferLike | ArrayBufferView): void;\n\n /** Initiates the closing handshake, optionally providing a close code and reason. */\n close(code?: number, reason?: string): void;\n\n /** Registers a listener that runs when the socket connection opens. */\n on(event: 'open', listener: () => void): void;\n\n /** Registers a listener for normalized text or binary message payloads. */\n on(\n event: 'message',\n listener: (data: string | ArrayBuffer | ArrayBufferView, isBinary: boolean) => void,\n ): void;\n\n /** Registers a listener for the numeric close code and decoded close reason. */\n on(event: 'close', listener: (code: number, reason: string) => void): void;\n\n /** Registers a listener for normalized WebSocket connection errors. */\n on(event: 'error', listener: (err: Error) => void): void;\n\n /** Registers a listener for any additional platform-supported socket event. */\n on(event: string, listener: (...args: any[]) => void): void;\n\n /** Removes a listener previously registered for the same event. */\n off(event: string, listener: (...args: any[]) => void): void;\n\n /** Registers a listener that removes itself before its first invocation. */\n once(event: string, listener: (...args: any[]) => void): void;\n}\n\n/** Standard WebSocket readyState values (RFC 6455). */\nexport const ReadyState = {\n /** The connection has been created but is not ready to send messages. */\n CONNECTING: 0,\n\n /** The connection is established and ready to send messages. */\n OPEN: 1,\n\n /** The closing handshake has started but is not complete. */\n CLOSING: 2,\n\n /** The connection is closed or could not be established. */\n CLOSED: 3,\n} as const;\n","// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details.\n\nimport { ResponsesEmitter, ResponsesStreamMessage, WebSocketError, buildURL } from './internal-base';\nimport { InternalEventEmitter } from '../../core/EventEmitter';\nimport { sleep } from '../../internal/utils/sleep';\nimport { type WebSocketLike, ReadyState } from '../../internal/ws-adapter';\nimport {\n SendQueue,\n getMaxBufferedEvents,\n recordWebSocketError,\n rawByteLength,\n type WebSocketStreamOptions,\n flattenRawData,\n isRecoverableClose,\n type RawWebSocketData,\n type ReconnectingEvent,\n type ReconnectingOverrides,\n type UnsentMessage,\n} from '../../internal/ws';\nimport * as ResponsesAPI from './responses';\nimport { OpenAI } from '../../client';\nimport { OpenAIError } from '../../core/error';\n\nconst webSocketEventPayloads = new WeakMap<ResponsesAPI.ResponsesServerEvent, string>();\nconst webSocketEventBytes = new WeakMap<ResponsesAPI.ResponsesServerEvent, number>();\n\n/** Uses immutable wire size, or JSON accounting for a custom emitter. @internal */\nexport function getWebSocketEventBytes(event: ResponsesAPI.ResponsesServerEvent): number {\n return webSocketEventBytes.get(event) ?? rawByteLength(JSON.stringify(event));\n}\n\n/** Original JSON, available only during synchronous event notification.\n * @internal\n */\nexport function getWebSocketEventPayload(event: ResponsesAPI.ResponsesServerEvent): string | undefined {\n return webSocketEventPayloads.get(event);\n}\n\nexport interface ResponsesWSReconnectOptions {\n /**\n * Called before each reconnect attempt. Return an object with\n * `parameters` to override query parameters for the next connection.\n */\n onReconnecting(\n event: ReconnectingEvent<Record<string, unknown>>,\n ): ReconnectingOverrides<Record<string, unknown>> | void;\n\n /**\n * Maximum number of reconnection attempts. Default: 5.\n * Set to 0 to disable reconnection entirely.\n */\n maxRetries?: number;\n\n /**\n * Initial backoff delay in milliseconds. Default: 500.\n */\n initialDelay?: number;\n\n /**\n * Maximum backoff delay in milliseconds. Default: 8000.\n */\n maxDelay?: number;\n}\n\nexport interface ResponsesWSBaseOptions {\n /**\n * Options for automatic reconnection on recoverable close codes.\n * Automatic reconnection is only enabled when this has a non-null value.\n */\n reconnect?: ResponsesWSReconnectOptions | null | undefined;\n\n /**\n * Byte budget for outgoing messages queued while the socket is connecting\n * or reconnecting. An empty queue accepts one message even if it exceeds\n * this budget. Further messages are discarded and an `error` event is emitted\n * if the total queued size would exceed the budget.\n * Default: 1 MiB (1,048,576 bytes).\n */\n maxQueueSize?: number | undefined;\n}\n\nexport abstract class ResponsesWSBase<TSocket extends WebSocketLike> extends ResponsesEmitter {\n url!: URL;\n socket!: TSocket;\n\n protected _client: OpenAI;\n protected _parameters: Record<string, unknown> | null | undefined;\n private _reconnectOptions: ResponsesWSReconnectOptions | null;\n private _sendQueue: SendQueue<ResponsesAPI.ResponsesClientEvent>;\n private _isReconnecting: boolean = false;\n private _intentionallyClosed = false;\n private _closeCode: number = 1000;\n private _closeReason: string = 'OK';\n private _lastCloseCode: number = 1006;\n private _lastCloseReason: string = '';\n\n // Necessary to keep the public event interface clean while we manage reconnecting\n private _internalEvents = new InternalEventEmitter<{\n socketSwap: (oldSocket: TSocket, newSocket: TSocket) => void;\n reconnecting: (event: ReconnectingEvent<Record<string, unknown>>) => void;\n reconnected: () => void;\n close: (code: number, reason: string, unsent: UnsentMessage<ResponsesAPI.ResponsesClientEvent>[]) => void;\n }>();\n\n constructor(client: OpenAI, options?: ResponsesWSBaseOptions | undefined) {\n super();\n this._client = client;\n this._parameters = undefined;\n this._reconnectOptions = options?.reconnect ?? null;\n this._sendQueue = new SendQueue<ResponsesAPI.ResponsesClientEvent>(options?.maxQueueSize);\n }\n\n /** Establishes the initial WebSocket connection. */\n protected _connectInitial(): void {\n this.url = buildURL(this._client, {});\n this.socket = this._connect();\n }\n\n /**\n * Creates a platform-specific WebSocket for the given URL and captured client auth headers.\n * The transport must supply or validate its final credentials before connecting;\n * these headers may be empty when authentication is managed by the transport.\n */\n protected abstract _createSocket(url: URL, authHeaders: Record<string, string>): TSocket;\n\n send(event: ResponsesAPI.ResponsesClientEvent) {\n if (!this.socket) {\n throw new OpenAIError('Internal error: failed to initialize socket. Please report this issue.');\n }\n\n if (this._isReconnecting || this.socket.readyState === ReadyState.CONNECTING) {\n if (!this._sendQueue.enqueue(event)) {\n this._onError(null, 'send queue is full, message discarded', undefined);\n }\n return;\n }\n if (this.socket.readyState !== ReadyState.OPEN) {\n this._onError(null, 'cannot send on a closed WebSocket', undefined);\n return;\n }\n try {\n this.socket.send(JSON.stringify(event));\n } catch (err) {\n this._onError(null, 'could not send data', err);\n }\n }\n\n sendRaw(data: RawWebSocketData) {\n if (!this.socket) {\n throw new OpenAIError('Internal error: failed to initialize socket. Please report this issue.');\n }\n\n if (this._isReconnecting || this.socket.readyState === ReadyState.CONNECTING) {\n if (!this._sendQueue.enqueueRaw(data)) {\n this._onError(null, 'send queue is full, message discarded', undefined);\n }\n return;\n }\n if (this.socket.readyState !== ReadyState.OPEN) {\n this._onError(null, 'cannot send on a closed WebSocket', undefined);\n return;\n }\n try {\n this.socket.send(flattenRawData(data));\n } catch (err) {\n this._onError(null, 'could not send data', err);\n }\n }\n\n close(props?: { code: number; reason: string }) {\n if (!this.socket) {\n throw new OpenAIError('Internal error: failed to initialize socket. Please report this issue.');\n }\n\n this._intentionallyClosed = true;\n this._closeCode = props?.code ?? 1000;\n this._closeReason = props?.reason ?? 'OK';\n try {\n this.socket.close(this._closeCode, this._closeReason);\n } catch (err) {\n this._onError(null, 'could not close the connection', err);\n }\n }\n\n /**\n * Returns an async iterator over WebSocket lifecycle and message events,\n * providing an alternative to the event-based `.on()` API.\n * The iterator will exit if the socket closes but exiting the iterator\n * does not close the socket.\n *\n * Pass `maxBufferedEvents` to limit queued records for this iterator, including\n * lifecycle events. Overflow discards its backlog and rejects `next()` with a\n * WebSocketError; the shared socket and other iterators remain active.\n * Omitted means unlimited. This is an event-count limit, not a byte limit.\n *\n * @example\n * ```ts\n * for await (const event of client.stream()) {\n * switch (event.type) {\n * case 'message':\n * console.log('received:', event.message);\n * break;\n * case 'error':\n * console.error(event.error);\n * break;\n * case 'close':\n * console.log('connection closed');\n * break;\n * }\n * }\n * ```\n */\n stream(options?: WebSocketStreamOptions): AsyncIterableIterator<ResponsesStreamMessage> {\n return options === undefined ? this[Symbol.asyncIterator]() : this[Symbol.asyncIterator](options);\n }\n\n [Symbol.asyncIterator](options?: WebSocketStreamOptions): AsyncIterableIterator<ResponsesStreamMessage> {\n if (!this.socket) {\n throw new OpenAIError('Internal error: failed to initialize socket. Please report this issue.');\n }\n\n const maxBufferedEvents = getMaxBufferedEvents(options);\n\n // Two-queue async iterator: `queue` buffers incoming messages,\n // `resolvers` buffers waiting next() calls. A push wakes the\n // oldest next(); a next() drains the oldest message.\n const queue: (ResponsesStreamMessage | undefined)[] = [];\n const resolvers: ((() => void) | undefined)[] = [];\n let queueHead = 0;\n let resolverHead = 0;\n let done = false;\n let failure: WebSocketError | undefined;\n let currentSocket = this.socket;\n\n const wakeResolver = () => {\n if (resolverHead >= resolvers.length) return;\n\n const resolver = resolvers[resolverHead];\n resolvers[resolverHead] = undefined;\n resolverHead += 1;\n if (resolverHead >= 64 && resolverHead * 2 >= resolvers.length) {\n resolvers.splice(0, resolverHead);\n resolverHead = 0;\n }\n resolver?.();\n };\n\n const push = (msg: ResponsesStreamMessage) => {\n if (done) return;\n\n if (maxBufferedEvents !== undefined && queue.length - queueHead >= maxBufferedEvents) {\n failure = new WebSocketError(\n `WebSocket stream exceeded maxBufferedEvents (${maxBufferedEvents})`,\n null,\n );\n done = true;\n queue.length = 0;\n queueHead = 0;\n cleanup();\n flushResolvers();\n return;\n }\n\n queue.push(msg);\n wakeResolver();\n };\n\n const onEvent = (event: ResponsesAPI.ResponsesServerEvent) => {\n if (event.type === 'error') return; // handled by onEmitterError\n push({ type: 'message', message: event });\n };\n\n const onRaw = (data: RawWebSocketData) => {\n push({ type: 'raw', data });\n };\n\n // All errors (API + socket) funnel through _onError → 'error' event\n const onEmitterError = (err: WebSocketError) => {\n push({ type: 'error', error: err });\n };\n\n const onOpen = () => {\n push({ type: 'open' });\n };\n\n const onReconnecting = (evt: ReconnectingEvent<Record<string, unknown>>) => {\n push({ type: 'reconnecting', reconnect: evt });\n };\n\n const onReconnected = () => {\n push({ type: 'reconnected' });\n };\n\n const flushResolvers = () => {\n while (resolverHead < resolvers.length) {\n const resolver = resolvers[resolverHead];\n resolvers[resolverHead] = undefined;\n resolverHead += 1;\n resolver?.();\n }\n resolvers.length = 0;\n resolverHead = 0;\n };\n\n const onClose = (\n code: number,\n reason: string,\n unsent: UnsentMessage<ResponsesAPI.ResponsesClientEvent>[],\n ) => {\n push({ type: 'close', code, reason, unsent });\n done = true;\n flushResolvers();\n cleanup();\n };\n\n const onSocketSwap = (_oldSocket: TSocket, newSocket: TSocket) => {\n if (currentSocket === newSocket) return;\n currentSocket.off('open', onOpen);\n newSocket.on('open', onOpen);\n currentSocket = newSocket;\n };\n\n const cleanup = () => {\n this.off('event', onEvent);\n this.off('raw', onRaw);\n this.off('error', onEmitterError);\n currentSocket.off('open', onOpen);\n this._internalEvents.off('close', onClose);\n this._internalEvents.off('socketSwap', onSocketSwap);\n this._internalEvents.off('reconnecting', onReconnecting);\n this._internalEvents.off('reconnected', onReconnected);\n };\n\n this.on('event', onEvent);\n this.on('raw', onRaw);\n this.on('error', onEmitterError);\n this.socket.on('open', onOpen);\n this._internalEvents.on('close', onClose);\n this._internalEvents.on('socketSwap', onSocketSwap);\n this._internalEvents.on('reconnecting', onReconnecting);\n this._internalEvents.on('reconnected', onReconnected);\n\n if (this._isReconnecting) {\n // A reconnect is already in flight. The socket may be CLOSED but the\n // instance is still alive. Emit 'reconnecting' so the iterator stays\n // open and receives the upcoming reconnected/message events.\n push({\n type: 'reconnecting',\n reconnect: { attempt: 0, maxAttempts: 0, delay: 0, closeCode: 0, parameters: undefined },\n });\n } else {\n switch (this.socket.readyState) {\n case ReadyState.CONNECTING:\n push({ type: 'connecting' });\n break;\n case ReadyState.OPEN:\n push({ type: 'open' });\n break;\n case ReadyState.CLOSING:\n push({ type: 'closing' });\n break;\n case ReadyState.CLOSED:\n push({\n type: 'close',\n code: this._lastCloseCode,\n reason: this._lastCloseReason,\n unsent: this._sendQueue.drain(),\n });\n done = true;\n cleanup();\n break;\n }\n }\n\n const resolve = (\n res: (value: IteratorResult<ResponsesStreamMessage>) => void,\n reject: (error: WebSocketError) => void,\n ) => {\n if (failure) {\n reject(failure);\n } else if (queueHead < queue.length) {\n const queued = queue[queueHead]!;\n queue[queueHead] = undefined;\n queueHead += 1;\n if (queueHead >= 64 && queueHead * 2 >= queue.length) {\n queue.splice(0, queueHead);\n queueHead = 0;\n }\n res({ value: queued, done: false });\n } else if (done) {\n res({ value: undefined, done: true });\n } else {\n return false;\n }\n return true;\n };\n\n const next = (): Promise<IteratorResult<ResponsesStreamMessage>> =>\n new Promise((res, reject) => {\n if (resolve(res, reject)) return;\n resolvers.push(() => {\n resolve(res, reject);\n });\n });\n\n return {\n next,\n return: (): Promise<IteratorReturnResult<undefined>> => {\n done = true;\n queue.length = 0;\n queueHead = 0;\n cleanup();\n flushResolvers();\n return Promise.resolve({ value: undefined, done: true });\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n }\n\n private _connect(): TSocket {\n this.url = buildURL(this._client, this._parameters ?? {});\n\n const socket = this._createSocket(this.url, this._authHeaders());\n\n socket.on('message', (data: string | ArrayBuffer | ArrayBufferView, isBinary: boolean) => {\n if (isBinary) {\n this._emit('raw', data);\n return;\n }\n\n // Coerce to string in case the adapter delivers a typed-array for text frames.\n const text = typeof data === 'string' ? data : String(data);\n\n let event: ResponsesAPI.ResponsesServerEvent;\n try {\n event = JSON.parse(text) as ResponsesAPI.ResponsesServerEvent;\n } catch {\n this._emit('raw', data);\n return;\n }\n\n if (\n event === null ||\n typeof event !== 'object' ||\n Array.isArray(event) ||\n !Object.prototype.hasOwnProperty.call(event, 'type') ||\n typeof event.type !== 'string'\n ) {\n this._onError(\n null,\n 'received invalid WebSocket event: expected an object with an own string type',\n undefined,\n );\n return;\n }\n\n const eventType: string = event.type;\n const errorEvent = event.type === 'error' ? event : undefined;\n const reservedEventType =\n eventType === 'raw' ||\n eventType === 'close' ||\n eventType === 'event' ||\n eventType === 'reconnecting' ||\n eventType === 'reconnected' ||\n eventType === 'open' ||\n eventType === 'error';\n if (reservedEventType && eventType !== 'error') {\n this._onError(null, 'received reserved WebSocket event type', undefined);\n return;\n }\n\n webSocketEventBytes.set(event, rawByteLength(data));\n webSocketEventPayloads.set(event, text);\n try {\n this._emit('event', event);\n } finally {\n webSocketEventPayloads.delete(event);\n }\n\n if (errorEvent) {\n this._onError(errorEvent);\n } else {\n // @ts-ignore TS isn't smart enough to get the relationship right here\n this._emit(eventType, event);\n }\n });\n\n socket.on('error', (err: Error) => {\n recordWebSocketError(socket, err);\n // Suppress transient errors during reconnection — the retry loop\n // already handles them and will surface a close if retries exhaust.\n if (this._isReconnecting) return;\n this._onError(null, err.message, err);\n });\n\n socket.on('open', () => {\n this._flushSendQueue();\n });\n\n socket.on('close', (code: number, reason: string) => {\n // Ignore close events from superseded sockets — a stale socket's\n // late close must not kick off a second reconnect loop.\n if (socket !== this.socket) return;\n if (!this._intentionallyClosed && this._canReconnect(code)) {\n this._reconnect(code);\n } else if (!this._isReconnecting) {\n this._emitPermanentClose(code, reason);\n }\n });\n\n return socket;\n }\n\n // Reconnect is opt-in via onReconnecting so callers can pass\n // state (e.g. session IDs) into the new connection.\n private _canReconnect(code: number): boolean {\n if (this._intentionallyClosed) return false;\n if (!this._reconnectOptions) return false;\n if (this._reconnectOptions.maxRetries === 0) return false;\n if (!this._reconnectOptions.onReconnecting) return false;\n return isRecoverableClose(code);\n }\n\n private async _reconnect(closeCode: number): Promise<void> {\n if (!this.socket) {\n throw new OpenAIError('Internal error: failed to initialize socket. Please report this issue.');\n }\n\n if (this._isReconnecting || !this._reconnectOptions) return;\n this._isReconnecting = true;\n\n const maxRetries = this._reconnectOptions.maxRetries ?? 5;\n const initialDelay = this._reconnectOptions.initialDelay ?? 500;\n const maxDelay = this._reconnectOptions.maxDelay ?? 8000;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n if (!this._canReconnect(closeCode)) {\n this._isReconnecting = false;\n if (!this._intentionallyClosed) {\n this._onError(\n null,\n `WebSocket reconnect aborted: non-recoverable close code ${closeCode}`,\n undefined,\n );\n }\n this._emitPermanentClose(\n this._intentionallyClosed ? this._closeCode : closeCode,\n this._intentionallyClosed ? this._closeReason : 'reconnect aborted',\n );\n return;\n }\n\n const baseDelay = Math.min(initialDelay * Math.pow(2, attempt - 1), maxDelay);\n // Jitter: rand [0.75, 1.0] to spread out connection attempts without over-delaying\n const jitter = 0.75 + Math.random() * 0.25;\n const actualDelay = Math.round(baseDelay * jitter);\n\n let reconnectingEvent: ReconnectingEvent<Record<string, unknown>> = {\n attempt,\n maxAttempts: maxRetries,\n delay: actualDelay,\n closeCode,\n parameters: this._parameters ? { ...this._parameters } : undefined,\n };\n\n let overrides: ReconnectingOverrides<Record<string, unknown>> | void;\n try {\n overrides = this._reconnectOptions.onReconnecting(reconnectingEvent);\n } catch (err) {\n this._isReconnecting = false;\n this._onError(null, 'onReconnecting callback threw', err);\n this._emitPermanentClose(closeCode, 'onReconnecting callback threw');\n return;\n }\n\n if (overrides && 'abort' in overrides && overrides.abort) {\n this._isReconnecting = false;\n this._emitPermanentClose(closeCode, 'reconnect aborted by handler');\n return;\n }\n\n if (overrides && 'parameters' in overrides) {\n this._parameters = overrides.parameters;\n reconnectingEvent = { ...reconnectingEvent, parameters: this._parameters };\n }\n\n try {\n this._emit('reconnecting', reconnectingEvent);\n } catch (err) {\n this._onError(null, 'onReconnecting callback threw', err);\n }\n this._internalEvents._emit('reconnecting', reconnectingEvent);\n\n if (!this._canReconnect(closeCode)) {\n this._isReconnecting = false;\n if (!this._intentionallyClosed) {\n this._onError(\n null,\n `WebSocket reconnect aborted: non-recoverable close code ${closeCode}`,\n undefined,\n );\n }\n this._emitPermanentClose(\n this._intentionallyClosed ? this._closeCode : closeCode,\n this._intentionallyClosed ? this._closeReason : 'reconnect aborted',\n );\n return;\n }\n\n await sleep(actualDelay);\n\n if (!this._canReconnect(closeCode)) {\n this._isReconnecting = false;\n if (!this._intentionallyClosed) {\n this._onError(\n null,\n `WebSocket reconnect aborted: non-recoverable close code ${closeCode}`,\n undefined,\n );\n }\n this._emitPermanentClose(\n this._intentionallyClosed ? this._closeCode : closeCode,\n this._intentionallyClosed ? this._closeReason : 'reconnect aborted',\n );\n return;\n }\n\n let closeCodePromise: Promise<number> | undefined;\n try {\n const oldSocket = this.socket;\n this.socket = this._connect();\n // Registered synchronously after _connect() and before any\n // await so the code is captured even when ws emits 'close'\n // in the same tick as 'error' (e.g. abortHandshake).\n closeCodePromise = new Promise<number>((resolve) => {\n this.socket.once('close', resolve);\n });\n\n await this._awaitOpen(this.socket);\n\n this._internalEvents._emit('socketSwap', oldSocket, this.socket);\n this._isReconnecting = false;\n this._flushSendQueue();\n this._emit('reconnected');\n this._internalEvents._emit('reconnected');\n return;\n } catch {\n if (closeCodePromise) {\n // ws may emit 'error' before 'close', so await the code\n // rather than reading it synchronously.\n closeCode = await closeCodePromise;\n }\n }\n }\n\n // All retries exhausted — surface an error so consumers can\n // distinguish retry failure from a clean close.\n this._isReconnecting = false;\n this._onError(\n null,\n `WebSocket reconnect failed after ${maxRetries} attempts (close code: ${closeCode})`,\n undefined,\n );\n this._emitPermanentClose(closeCode, `reconnect failed after ${maxRetries} attempts`);\n }\n\n /**\n * Resolves once the socket is open, rejects if it errors or closes first\n */\n private _awaitOpen(socket: TSocket): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const cleanup = () => {\n socket.off('open', onOpen);\n socket.off('error', onError);\n socket.off('close', onFail);\n };\n const onOpen = () => {\n cleanup();\n resolve();\n };\n const onError = (err: Error) => {\n cleanup();\n reject(err);\n };\n const onFail = () => {\n cleanup();\n reject(new Error('socket closed before open'));\n };\n socket.once('open', onOpen);\n socket.once('error', onError);\n socket.once('close', onFail);\n });\n }\n\n private _flushSendQueue(): void {\n if (!this.socket) {\n throw new OpenAIError('Internal error: failed to initialize socket. Please report this issue.');\n }\n\n try {\n this._sendQueue.flush((data) => this.socket.send(flattenRawData(data)));\n } catch (err) {\n this._onError(null, 'could not send queued data', err);\n }\n }\n\n /**\n * Emits the public `close` event with unsent messages and the internal\n * `close` event used by the async iterator.\n */\n private _emitPermanentClose(code: number, reason: string): void {\n this._lastCloseCode = code;\n this._lastCloseReason = reason;\n const unsent = this._sendQueue.drain();\n // Internal close fires first so the async iterator is guaranteed to\n // terminate even if a public 'close' listener throws.\n this._internalEvents._emit('close', code, reason, unsent);\n this._emit('close', code, reason, unsent);\n }\n\n protected _authHeaders(): Record<string, string> {\n const apiKey = this._client.apiKey;\n return typeof apiKey === 'string' && apiKey ? { Authorization: `Bearer ${apiKey}` } : {};\n }\n}\n","// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details.\n\nimport * as WS from 'ws';\nimport { NodeWebSocket } from '../../internal/ws-adapter-node';\nimport { ResponsesWSBase, type ResponsesWSBaseOptions } from './ws-base';\nimport { OpenAI } from '../../client';\nimport { OpenAIError } from '../../core/error';\nimport { snapshotWebSocketCredentials } from '../../internal/ws';\n\nexport type { WebSocketStreamOptions } from '../../internal/ws';\n\nexport type { ResponsesWSReconnectOptions } from './ws-base';\n\nexport interface ResponsesWSClientOptions extends WS.ClientOptions, ResponsesWSBaseOptions {\n /** Basic authentication forwarded by the Node `ws` transport. */\n auth?: string;\n}\n\nexport class ResponsesWS extends ResponsesWSBase<NodeWebSocket> {\n private _wsOptions: WS.ClientOptions | null | undefined;\n\n constructor(client: OpenAI, options?: ResponsesWSClientOptions | null | undefined) {\n if (!WS?.WebSocket) {\n throw new Error(\n 'ResponsesWS from \"openai/resources/responses/ws\" requires the \"ws\" package but it could not be loaded.',\n );\n }\n const { reconnect, maxQueueSize, ...wsOptions } = options ?? {};\n super(client, { reconnect, maxQueueSize });\n this._wsOptions = wsOptions;\n this._connectInitial();\n }\n\n protected _createSocket(url: URL, authHeaders: Record<string, string>): NodeWebSocket {\n const capturedAuthHeaders = { ...authHeaders };\n const headers = new Map(Object.entries(this._client._buildWebSocketHeaders(capturedAuthHeaders)));\n for (const [name, value] of Object.entries(this._wsOptions?.headers ?? {})) {\n if (value === null) {\n headers.delete(name.toLowerCase());\n } else if (value !== undefined) {\n headers.set(name.toLowerCase(), value);\n }\n }\n const socketOptions: ResponsesWSClientOptions = {\n ...this._wsOptions,\n headers: Object.fromEntries(headers),\n followRedirects: false,\n };\n if (\n this._client._hasApiKeyProvider() &&\n !capturedAuthHeaders['Authorization'] &&\n !snapshotWebSocketCredentials(socketOptions)\n ) {\n throw new OpenAIError(\n 'Cannot open a Responses WebSocket with an unresolved function-based apiKey. Resolve it before constructing the WebSocket or provide explicit WebSocket credentials.',\n );\n }\n\n const ws = new WS.WebSocket(url, socketOptions);\n return new NodeWebSocket(ws);\n }\n}\n","import type {\n Api,\n AssistantMessageEventStream,\n Context,\n MediaBudgetStats,\n Model,\n ResponsesSessionDiagnostic,\n ResponsesSessionOptions,\n SimpleStreamOptions,\n TranscriptContext,\n} from \"@zpi-dev/ai\";\nimport {\n assertSupportedOptions,\n guardModelStream,\n normalizeContext,\n projectContextForModelMediaPolicy,\n streamSimple,\n validateReasoningConfig,\n validateThinkingMap,\n} from \"@zpi-dev/ai\";\nimport { supportsResponsesWebSocket } from \"@zpi-dev/ai/api/responses-session\";\nexport interface ProviderChatModelConfig extends Omit<Model, \"provider\" | \"api\" | \"baseUrl\"> {\n type?: \"chat\";\n api?: Api;\n}\nexport interface ProviderConfigInput {\n name?: string;\n baseUrl?: string;\n api?: Api;\n apiKey?: string;\n /** A rejected key requests one credential recovery; other callers resolve normally. */\n getApiKey?: (rejectedApiKey?: string) => Promise<string>;\n headers?: Record<string, string>;\n models?: ProviderChatModelConfig[];\n streamSimple?: (\n model: Model,\n context: TranscriptContext,\n options?: SimpleStreamOptions,\n ) => AssistantMessageEventStream;\n}\nexport interface MediaProjectionContext {\n sessionId?: string;\n provider: string;\n modelId: string;\n}\nexport interface ModelRuntimeOptions {\n fetch?: typeof fetch;\n /** Custom fetch implementations use HTTP unless the host explicitly enables WebSocket connections. */\n responsesTransport?: \"auto\" | \"http\";\n responsesProxy?: ResponsesSessionOptions[\"resolveProxy\"];\n /** Optional local diagnostics; the SDK has no dependency on a logging backend. */\n onMediaProjection?: (stats: MediaBudgetStats, context: MediaProjectionContext) => void;\n onResponsesDiagnostic?: (diagnostic: ResponsesSessionDiagnostic, context: MediaProjectionContext) => void;\n}\nexport class ModelRuntime {\n private providers = new Map<string, ProviderConfigInput>();\n private keys = new Map<string, string>();\n private requestFetch?: typeof fetch;\n private onMediaProjection?: ModelRuntimeOptions[\"onMediaProjection\"];\n private onResponsesDiagnostic?: ModelRuntimeOptions[\"onResponsesDiagnostic\"];\n private responsesTransport: \"auto\" | \"http\";\n readonly responsesProxy?: ResponsesSessionOptions[\"resolveProxy\"];\n constructor(requestFetch?: typeof fetch, options: ModelRuntimeOptions = {}) {\n this.requestFetch = requestFetch ?? options.fetch;\n this.responsesTransport = options.responsesTransport ?? (this.requestFetch ? \"http\" : \"auto\");\n this.responsesProxy = options.responsesProxy;\n this.onMediaProjection = options.onMediaProjection;\n this.onResponsesDiagnostic = options.onResponsesDiagnostic;\n }\n get fetch(): typeof fetch {\n return this.requestFetch ?? globalThis.fetch;\n }\n canUseResponsesSession(model: Model): boolean {\n return (\n this.responsesTransport === \"auto\" &&\n supportsResponsesWebSocket(model) &&\n !this.providers.get(model.provider)?.streamSimple\n );\n }\n static async create(options: ModelRuntimeOptions = {}): Promise<ModelRuntime> {\n return new ModelRuntime(options.fetch, options);\n }\n mediaProjectionObserver(model: Model, sessionId?: string): SimpleStreamOptions[\"onMediaProjection\"] {\n const report = this.onMediaProjection;\n return report\n ? (stats) => report(stats, { sessionId, provider: model.provider, modelId: model.id })\n : undefined;\n }\n responsesDiagnosticObserver(model: Model, sessionId?: string): ResponsesSessionOptions[\"onDiagnostic\"] {\n const report = this.onResponsesDiagnostic;\n return report\n ? (diagnostic) => report(diagnostic, { sessionId, provider: model.provider, modelId: model.id })\n : undefined;\n }\n clearProviders(): void {\n this.providers.clear();\n this.keys.clear();\n }\n registerProvider(id: string, config: ProviderConfigInput): void {\n assertSupportedOptions(\n config,\n [\"name\", \"baseUrl\", \"api\", \"apiKey\", \"getApiKey\", \"headers\", \"models\", \"streamSimple\"],\n \"provider\",\n );\n for (const model of config.models ?? []) {\n assertSupportedOptions(\n model,\n [\n \"type\",\n \"id\",\n \"name\",\n \"api\",\n \"auth\",\n \"input\",\n \"cost\",\n \"reasoning\",\n \"contextWindow\",\n \"maxTokens\",\n \"headers\",\n \"compat\",\n \"thinkingLevelMap\",\n \"reasoningConfig\",\n \"defaultThinkingLevel\",\n \"samplingParams\",\n ],\n \"model\",\n );\n if (model.type && model.type !== \"chat\") throw new Error(\"Only chat models are supported\");\n if (model.thinkingLevelMap) validateThinkingMap(model.thinkingLevelMap);\n if (model.reasoningConfig) validateReasoningConfig(model.reasoningConfig);\n }\n const old = this.providers.get(id);\n this.providers.set(id, { ...old, ...config, headers: config.headers ?? old?.headers });\n if (config.apiKey !== undefined) this.keys.set(id, config.apiKey);\n }\n getModel(provider: string, id: string): Model | undefined {\n const p = this.providers.get(provider);\n const model = p?.models?.find((m) => m.id === id);\n if (!p || !model) return undefined;\n const { type: _, ...fields } = model;\n return {\n ...fields,\n api: model.api ?? p.api ?? \"openai-completions\",\n provider,\n baseUrl: p.baseUrl ?? \"\",\n headers: { ...p.headers, ...model.headers },\n };\n }\n async getAvailable(): Promise<readonly Model[]> {\n const models: Model[] = [];\n for (const [id, p] of this.providers)\n if (p.streamSimple || p.getApiKey || this.keys.has(id))\n for (const m of p.models ?? []) {\n const model = this.getModel(id, m.id);\n if (model) models.push(model);\n }\n return models;\n }\n async setRuntimeApiKey(provider: string, key: string): Promise<void> {\n this.keys.set(provider, key);\n }\n streamSimple(model: Model, context: Context, options?: SimpleStreamOptions): AssistantMessageEventStream {\n const p = this.providers.get(model.provider);\n if (!p) throw new Error(`Provider not configured: ${model.provider}`);\n const transcript = normalizeContext(context);\n const opts = {\n ...options,\n fetch: options?.fetch ?? this.requestFetch,\n apiKey: options?.apiKey ?? this.keys.get(model.provider),\n onMediaProjection:\n options?.onMediaProjection ?? this.mediaProjectionObserver(model, options?.sessionId),\n };\n const customStream = p.streamSimple;\n if (customStream)\n return guardModelStream(\n model,\n async (guarded) => {\n const apiKey = p.getApiKey && options?.apiKey === undefined ? await p.getApiKey() : guarded.apiKey;\n guarded.signal?.throwIfAborted();\n return customStream(\n model,\n projectContextForModelMediaPolicy(transcript, model, { onProjection: opts.onMediaProjection }),\n { ...guarded, apiKey },\n );\n },\n opts,\n );\n // Native protocols own their request boundary, including direct API callers.\n // Only custom providers need projection here; the common stream wrapper does not repeat it.\n return streamSimple(model, transcript, {\n ...opts,\n ...(p.getApiKey && options?.apiKey === undefined ? { getApiKey: p.getApiKey } : {}),\n });\n }\n}\n","import { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { AgentTool, ThinkingLevel } from \"@zpi-dev/agent\";\nimport type { Context, Model } from \"@zpi-dev/ai\";\nimport { assertSupportedOptions, clampThinkingLevel } from \"@zpi-dev/ai\";\nimport { assembleSession, type SessionContributions, validatePluginSnapshot } from \"../plugins/assembly.ts\";\nimport type { HookRegistration } from \"../plugins/hooks.ts\";\nimport { withPluginResources } from \"../plugins/resources.ts\";\nimport { AgentSession } from \"./agent-session.ts\";\nimport type { CompactionOptions } from \"./compaction.ts\";\nimport type { ModelPerformanceTotals } from \"./model-performance.ts\";\nimport { ModelRuntime } from \"./model-runtime.ts\";\nimport { FileResourceLoader } from \"./resources.ts\";\nimport { SessionManager } from \"./session-manager.ts\";\nimport { SettingsManager } from \"./settings-manager.ts\";\nimport { recoverCanonicalToolCallsAsync } from \"./streaming-tool-journal.ts\";\nimport { buildSystemContext, type PromptTemplate } from \"./system-prompt.ts\";\nimport { createCodingTools, FileReadState } from \"./tools/index.ts\";\nimport type { ResourceLoader, ToolContext } from \"./types.ts\";\nexport interface SystemPromptContext {\n tools: readonly AgentTool[];\n}\nexport interface CreateAgentSessionOptions extends SessionContributions {\n /** Build tool definitions and selection once the shared resource catalog is loaded. */\n prepareTools?: (loader: ResourceLoader) => Pick<SessionContributions, \"customTools\" | \"tools\">;\n modelRequestOptions?: () => import(\"@zpi-dev/ai\").SimpleStreamOptions;\n onCompaction?: (\n phase: \"before\" | \"after\",\n context: { manual: boolean; instructions: string },\n signal?: AbortSignal,\n ) => Promise<void>;\n /** Base instructions only. SDK resources and plugin context remain independently managed. */\n systemPrompt?: string | ((context: SystemPromptContext) => string);\n /** Host policy checked at each foreground model request, including continuation requests. */\n beforeModelRequest?: (model: Model, context: Context) => void;\n hooks?: readonly HookRegistration[];\n modelPerformanceTotals?: ModelPerformanceTotals;\n cwd?: string;\n agentDir?: string;\n modelRuntime?: ModelRuntime;\n model?: Model;\n thinkingLevel?: ThinkingLevel;\n /** Literal additions, recomputed after resource reload when supplied as a function. */\n customInstructions?: readonly string[] | (() => readonly string[]);\n resourceLoader?: ResourceLoader;\n sessionManager?: SessionManager;\n homeDir?: string;\n compaction?: CompactionOptions;\n settingsManager?: SettingsManager;\n promptTemplate?: () => PromptTemplate;\n projectName?: string | (() => string);\n}\nexport interface CreateAgentSessionResult {\n session: AgentSession;\n}\nexport async function createAgentSession(\n options: CreateAgentSessionOptions = {},\n): Promise<CreateAgentSessionResult> {\n assertSupportedOptions(\n options,\n [\n \"cwd\",\n \"prepareTools\",\n \"beforeModelRequest\",\n \"systemPrompt\",\n \"modelRequestOptions\",\n \"onCompaction\",\n \"agentDir\",\n \"modelRuntime\",\n \"model\",\n \"thinkingLevel\",\n \"noTools\",\n \"tools\",\n \"excludeTools\",\n \"customTools\",\n \"plugins\",\n \"hooks\",\n \"customInstructions\",\n \"toolOverrides\",\n \"resourceLoader\",\n \"sessionManager\",\n \"homeDir\",\n \"compaction\",\n \"settingsManager\",\n \"promptTemplate\",\n \"projectName\",\n \"modelPerformanceTotals\",\n ],\n \"createAgentSession\",\n );\n if (options.noTools !== undefined && options.noTools !== \"all\" && options.noTools !== \"builtin\")\n throw new Error(\"Invalid noTools\");\n const cwd = resolve(options.cwd ?? options.sessionManager?.getCwd() ?? process.cwd());\n const agentDir = options.agentDir ?? join(homedir(), \".zpi\", \"agent\");\n const settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n if (options.compaction) settingsManager.applyOverrides({ compaction: options.compaction });\n const runtime = options.modelRuntime ?? (await ModelRuntime.create());\n const manager = options.sessionManager ?? SessionManager.create(cwd, join(agentDir, \"sessions\"));\n const restored = await manager.materializeContext();\n const selection = manager.getCurrentState();\n const available = await runtime.getAvailable();\n const model =\n options.model ??\n (selection.model ? runtime.getModel(selection.model.provider, selection.model.modelId) : available[0]);\n if (!model)\n throw new Error(selection.model ? \"Recorded model is not configured\" : \"No callable model configured\");\n if (!available.some((m) => m.provider === model.provider && m.id === model.id))\n throw new Error(\"Model authentication or provider is not configured\");\n if (!selection.model || selection.model.modelId !== model.id || selection.model.provider !== model.provider)\n manager.appendModelChange(model.provider, model.id);\n await recoverCanonicalToolCallsAsync(manager, restored.messages);\n let session: AgentSession;\n const fileReadState = new FileReadState();\n const builtin = createCodingTools(\n cwd,\n join(agentDir, \"tool-output\", manager.getSessionId()),\n () => session?.model ?? model,\n () => ({\n cwd,\n model: session?.model ?? model,\n thinkingLevel: session?.thinkingLevel ?? \"off\",\n sessionManager: manager,\n }),\n fileReadState,\n );\n const toolContext = (signal?: AbortSignal): ToolContext => ({\n cwd,\n model: session.model,\n thinkingLevel: session.thinkingLevel,\n sessionManager: manager,\n signal,\n isIdle: () => session.isIdle,\n getSystemPrompt: () => session.systemPrompt,\n getToolNames: () => session.state.tools.map((tool) => tool.name),\n });\n // The final loader is shared by tool preparation, prompt construction and later refreshes.\n const plugins = options.plugins ?? [];\n for (const plugin of plugins) validatePluginSnapshot(plugin);\n const baseLoader =\n options.resourceLoader ??\n new FileResourceLoader({ projectDir: manager.getCwd(), homeDir: options.homeDir });\n const loader = withPluginResources(\n baseLoader,\n plugins.flatMap((plugin) => [...(plugin.skills ?? [])]),\n );\n await loader.reload?.();\n const prepared = options.prepareTools?.(loader) ?? {};\n assertSupportedOptions(prepared, [\"customTools\", \"tools\"], \"prepareTools result\");\n const assembly = assembleSession({ ...options, ...prepared, builtinTools: builtin, context: toolContext });\n const { allTools: all, activeTools: active } = assembly;\n const buildContext = () => {\n let baseInstructions: string | undefined;\n if (options.systemPrompt !== undefined) {\n baseInstructions =\n typeof options.systemPrompt === \"function\"\n ? options.systemPrompt({\n tools: session?.state.tools ?? active,\n })\n : options.systemPrompt;\n if (typeof baseInstructions !== \"string\") throw new Error(\"Invalid systemPrompt\");\n }\n const instructions =\n typeof options.customInstructions === \"function\"\n ? options.customInstructions()\n : options.customInstructions;\n if (\n instructions !== undefined &&\n (!Array.isArray(instructions) || instructions.some((part) => typeof part !== \"string\"))\n )\n throw new Error(\"invalid_input: customInstructions must be an array of strings\");\n const context = buildSystemContext({\n cwd,\n projectName: typeof options.projectName === \"function\" ? options.projectName() : options.projectName,\n template: options.promptTemplate?.(),\n tools: session?.state.tools ?? active,\n loader,\n customInstructions: instructions,\n baseInstructions,\n });\n return { ...context, sections: { ...context.sections, ...assembly.getContextSections() } };\n };\n let requestedThinking = options.thinkingLevel;\n if (requestedThinking == null) {\n const hasExistingSession = restored.messages.length > 0;\n const useRecordedThinking =\n manager.hasCurrentState() || (hasExistingSession && manager.getStateAt().hasThinkingEntry);\n requestedThinking = useRecordedThinking\n ? selection.thinkingLevel\n : ((!hasExistingSession\n ? settingsManager.getModelThinkingLevel(model.provider, model.id)\n : undefined) ??\n settingsManager.getDefaultThinkingLevel() ??\n \"medium\");\n }\n const thinking = clampThinkingLevel(model, requestedThinking);\n if (thinking !== selection.thinkingLevel) manager.appendThinkingLevelChange(thinking);\n session = await AgentSession.create(\n model,\n runtime,\n manager,\n all,\n active,\n buildContext().base,\n thinking,\n {\n loader,\n buildContext,\n settingsManager,\n },\n options.modelPerformanceTotals,\n {\n commands: assembly.commands,\n hooks: [...assembly.hooks, ...(options.hooks ?? [])],\n beforeModelRequest: options.beforeModelRequest,\n modelRequestOptions: options.modelRequestOptions,\n onCompaction: options.onCompaction,\n },\n );\n session.subscribe((event) => {\n if (\n (event.type === \"compaction\" && event.status === \"completed\") ||\n (event.type === \"entry_appended\" && event.entry.type === \"microcompact\")\n )\n fileReadState.clear();\n });\n return { session };\n}\n","import type { AgentTool } from \"@zpi-dev/agent\";\nimport { assertSupportedOptions, type JsonValue } from \"@zpi-dev/ai\";\nimport type { TSchema } from \"typebox\";\nimport type { ToolDefinition } from \"../../types.ts\";\nexport function wrapToolDefinition<T extends TSchema, D, C>(\n definition: ToolDefinition<T, D, C>,\n context: (signal?: AbortSignal) => C,\n serializeDetails = true,\n): AgentTool<T> {\n assertSupportedOptions(\n definition,\n [\n \"name\",\n \"label\",\n \"description\",\n \"parameters\",\n \"promptSnippet\",\n \"promptGuidelines\",\n \"prepareArguments\",\n \"executionMode\",\n \"metadata\",\n \"permission\",\n \"requiresUserInteraction\",\n \"outputSchema\",\n \"execute\",\n ],\n \"custom tool\",\n );\n // Standalone Pi tools historically normalize details; SDK custom tools retain\n // their values for the executor's JSON validation rather than silently coercing them.\n const details = (value: D) =>\n value === undefined\n ? undefined\n : serializeDetails\n ? (JSON.parse(JSON.stringify(value)) as JsonValue)\n : (value as JsonValue);\n return {\n name: definition.name,\n label: definition.label,\n description: definition.description,\n parameters: definition.parameters,\n promptSnippet: definition.promptSnippet,\n promptGuidelines: definition.promptGuidelines,\n prepareArguments: definition.prepareArguments,\n executionMode: definition.executionMode,\n metadata: definition.metadata,\n permission: definition.permission,\n requiresUserInteraction: definition.requiresUserInteraction,\n execute: async (id, params, signal, update) => {\n const result = await definition.execute(\n id,\n params,\n signal,\n update\n ? (result) =>\n update({\n ...result,\n details: details(result.details),\n })\n : undefined,\n context(signal),\n );\n return {\n ...result,\n details: details(result.details),\n };\n },\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { AgentToolResult } from \"@zpi-dev/agent\";\nimport { abortable, assertSupportedOptions } from \"@zpi-dev/ai\";\nimport { Type } from \"typebox\";\nimport { Check } from \"typebox/value\";\n\nexport const hookEvents = [\n \"SessionStart\",\n \"UserPromptSubmit\",\n \"PreToolUse\",\n \"PostToolUse\",\n \"PostToolUseFailure\",\n \"Stop\",\n \"InputAccepted\",\n \"RunStart\",\n \"RunEnd\",\n \"Notification\",\n] as const;\nexport type HookEvent = (typeof hookEvents)[number];\nexport type HookInput = {\n sessionId: string;\n cwd: string;\n invocationId: string;\n} & (\n | { event: \"SessionStart\"; source: \"startup\" | \"resume\" }\n | { event: \"UserPromptSubmit\"; prompt: string }\n | {\n event: \"PreToolUse\" | \"PostToolUse\" | \"PostToolUseFailure\";\n toolCallId: string;\n toolName: string;\n toolInput: unknown;\n toolResult?: AgentToolResult;\n }\n | { event: \"Stop\"; response: string; stopHookActive: boolean }\n | { event: \"InputAccepted\"; prompt: string }\n | { event: \"RunStart\"; runId: string; prompt: string; sessionCreated: boolean; userInitiated: boolean }\n | { event: \"RunEnd\"; runId: string; status: \"completed\" | \"aborted\" | \"error\" }\n | {\n event: \"Notification\";\n runId: string;\n notificationType: \"task_completed\" | \"task_failed\";\n message: string;\n }\n);\ntype WithoutInvocation<T> = T extends unknown ? Omit<T, \"invocationId\"> : never;\nexport type HookInvocation = WithoutInvocation<HookInput>;\nexport interface HookOutput {\n block?: boolean;\n reason?: string;\n updatedInput?: unknown;\n additionalContext?: string;\n}\nexport interface HookRegistration {\n event: HookEvent;\n matcher?: string;\n timeoutMs?: number;\n onError?: \"continue\" | \"block\";\n handler(input: HookInput, signal: AbortSignal): HookOutput | undefined | Promise<HookOutput | undefined>;\n}\nexport interface HookExecution {\n invocationId: string;\n pluginId?: string;\n event: HookEvent;\n index: number;\n status: \"completed\" | \"blocked\" | \"error\" | \"cancelled\" | \"timeout\";\n durationMs: number;\n}\n\nconst outputSchema = Type.Object(\n {\n block: Type.Optional(Type.Boolean()),\n reason: Type.Optional(Type.String()),\n updatedInput: Type.Optional(Type.Unknown()),\n additionalContext: Type.Optional(Type.String()),\n },\n { additionalProperties: false },\n);\nexport const maxHookContextChars = 24_000;\n\nexport function validateHookRegistration(hook: HookRegistration): void {\n if (!hook || !hookEvents.includes(hook.event) || typeof hook.handler !== \"function\")\n throw new Error(\"Invalid hook registration\");\n assertSupportedOptions(hook, [\"event\", \"matcher\", \"timeoutMs\", \"onError\", \"handler\"], \"hook\");\n if (hook.matcher !== undefined) {\n if (typeof hook.matcher !== \"string\") throw new Error(\"Invalid hook matcher\");\n if (hook.matcher !== \"*\") new RegExp(hook.matcher);\n }\n if (\n hook.timeoutMs !== undefined &&\n (!Number.isSafeInteger(hook.timeoutMs) || hook.timeoutMs <= 0 || hook.timeoutMs > 300_000)\n )\n throw new Error(\"Invalid hook timeout\");\n if (hook.onError !== undefined && ![\"continue\", \"block\"].includes(hook.onError))\n throw new Error(\"Invalid hook error policy\");\n}\n\nexport class HookRunner {\n private hooks: (HookRegistration & { pluginId?: string })[];\n private observe: (event: HookExecution) => void;\n constructor(\n hooks: readonly (HookRegistration & { pluginId?: string })[],\n observe: (event: HookExecution) => void = () => {},\n ) {\n this.observe = observe;\n this.hooks = hooks.map((hook) => {\n const { pluginId, ...registration } = hook;\n validateHookRegistration(registration);\n return { ...registration, pluginId };\n });\n }\n get hasToolHooks(): boolean {\n return this.hooks.some((hook) =>\n [\"PreToolUse\", \"PostToolUse\", \"PostToolUseFailure\"].includes(hook.event),\n );\n }\n async run(\n input: HookInvocation,\n signal?: AbortSignal,\n validateInput?: (input: unknown) => unknown,\n ): Promise<{ block: boolean; reason?: string; updatedInput?: unknown; additionalContexts: string[] }> {\n const eventInput: HookInput = { ...input, invocationId: randomUUID() };\n const result = {\n block: false,\n reason: undefined as string | undefined,\n updatedInput: undefined as unknown,\n additionalContexts: [] as string[],\n };\n let contextChars = 0;\n for (const [index, hook] of this.hooks.entries()) {\n const match =\n \"toolName\" in eventInput\n ? eventInput.toolName\n : eventInput.event === \"Notification\"\n ? eventInput.notificationType\n : eventInput.event === \"SessionStart\"\n ? eventInput.source\n : \"\";\n if (\n hook.event !== eventInput.event ||\n (hook.matcher && hook.matcher !== \"*\" && !new RegExp(hook.matcher).test(match))\n )\n continue;\n signal?.throwIfAborted();\n const started = Date.now();\n let timedOut = false;\n const controller = new AbortController();\n const abort = () => controller.abort(signal?.reason);\n signal?.addEventListener(\"abort\", abort, { once: true });\n const timer = setTimeout(() => {\n timedOut = true;\n controller.abort(new Error(\"Hook timed out\"));\n }, hook.timeoutMs ?? 30_000);\n let status: HookExecution[\"status\"] = \"completed\";\n let updatingInput = false;\n try {\n const returned = await abortable(\n Promise.resolve().then(() => hook.handler(structuredClone(eventInput), controller.signal)),\n controller.signal,\n );\n const output = returned === undefined ? undefined : structuredClone(returned);\n signal?.throwIfAborted();\n if (output !== undefined && !Check(outputSchema, output)) throw new Error(\"Invalid hook output\");\n if (output?.block && [\"PreToolUse\", \"UserPromptSubmit\"].includes(input.event)) {\n result.block = true;\n result.reason ??= output.reason?.slice(0, 4_000) || \"Blocked by hook\";\n status = \"blocked\";\n }\n if (output?.updatedInput !== undefined) {\n updatingInput = true;\n if (input.event !== \"PreToolUse\" || !validateInput)\n throw new Error(\"updatedInput requires PreToolUse\");\n result.updatedInput = validateInput(output.updatedInput);\n if (\"toolInput\" in eventInput) eventInput.toolInput = structuredClone(result.updatedInput);\n updatingInput = false;\n }\n if (output?.additionalContext) {\n contextChars += output.additionalContext.length;\n if (contextChars > maxHookContextChars) throw new Error(\"Hook context budget exceeded\");\n result.additionalContexts.push(output.additionalContext);\n }\n } catch (error) {\n status = signal?.aborted ? \"cancelled\" : timedOut ? \"timeout\" : \"error\";\n if (signal?.aborted) throw error;\n if (\n (input.event === \"PreToolUse\" || input.event === \"UserPromptSubmit\") &&\n (hook.onError === \"block\" || updatingInput)\n ) {\n result.block = true;\n result.reason ??= `${input.event} hook failed`;\n }\n } finally {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", abort);\n this.observe({\n invocationId: eventInput.invocationId,\n pluginId: hook.pluginId,\n event: input.event,\n index,\n status,\n durationMs: Date.now() - started,\n });\n }\n }\n return result;\n }\n}\n","import type { AgentTool } from \"@zpi-dev/agent\";\nimport { assertSupportedOptions, isJsonObject } from \"@zpi-dev/ai\";\nimport type { TSchema } from \"typebox\";\nimport { wrapToolDefinition } from \"../core/tools/pi/tool-definition-wrapper.ts\";\nimport type { ToolContext, ToolDefinition } from \"../core/types.ts\";\nimport { validateHookRegistration } from \"./hooks.ts\";\nimport type { PluginCommand, PluginSnapshot, SessionPlugin } from \"./types.ts\";\n\nexport interface SessionContributions {\n plugins?: readonly SessionPlugin[];\n customTools?: readonly ToolDefinition<TSchema, unknown>[];\n toolOverrides?: readonly ToolDefinition<TSchema, unknown>[];\n noTools?: \"all\" | \"builtin\";\n tools?: readonly string[];\n excludeTools?: readonly string[];\n}\n\nconst identifier = /^[a-zA-Z0-9][a-zA-Z0-9_.:@/-]*$/;\nconst commandName = /^[a-zA-Z0-9][a-zA-Z0-9_:-]*$/;\nconst reservedCommands = new Set([\"compact\"]);\n\nexport function validatePluginSnapshot(value: unknown): asserts value is PluginSnapshot {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"Invalid plugin snapshot\");\n const plugin = value as PluginSnapshot;\n if (\n typeof plugin.id !== \"string\" ||\n !identifier.test(plugin.id) ||\n typeof plugin.version !== \"string\" ||\n !plugin.version.trim()\n )\n throw new Error(\"Invalid plugin identity\");\n if ([plugin.name, plugin.description].some((v) => v !== undefined && typeof v !== \"string\"))\n throw new Error(\"Invalid plugin metadata\");\n if (\n plugin.runtime !== undefined &&\n (typeof plugin.runtime !== \"string\" || !identifier.test(plugin.runtime))\n )\n throw new Error(\"Invalid plugin runtime\");\n if (plugin.options !== undefined && !isJsonObject(plugin.options))\n throw new Error(\"Invalid plugin options\");\n if (\n plugin.instructions !== undefined &&\n (!Array.isArray(plugin.instructions) || plugin.instructions.some((part) => typeof part !== \"string\"))\n )\n throw new Error(\"Invalid plugin instructions\");\n if (\n plugin.commands !== undefined &&\n (!Array.isArray(plugin.commands) ||\n plugin.commands.some(\n (command) =>\n !command ||\n typeof command.name !== \"string\" ||\n !commandName.test(command.name) ||\n reservedCommands.has(command.name) ||\n typeof command.description !== \"string\" ||\n typeof command.prompt !== \"string\",\n ))\n )\n throw new Error(\"Invalid plugin command\");\n if (\n plugin.skills !== undefined &&\n (!Array.isArray(plugin.skills) ||\n plugin.skills.some(\n (skill) =>\n !skill ||\n typeof skill.name !== \"string\" ||\n !commandName.test(skill.name) ||\n [skill.description, skill.path, skill.baseDir, skill.body].some((part) => typeof part !== \"string\"),\n ))\n )\n throw new Error(\"Invalid plugin skill\");\n}\n\n/** Serializable field projection; snapshotPlugins also validates and copies the data. */\nexport function pluginSnapshotData(plugin: PluginSnapshot): PluginSnapshot {\n const { id, version, name, description, instructions, commands, skills, runtime, options } = plugin;\n return {\n id,\n version,\n name,\n description,\n instructions,\n commands,\n skills,\n runtime,\n options,\n };\n}\n\nexport function snapshotPlugins(plugins: readonly SessionPlugin[]): PluginSnapshot[] {\n return plugins.map((plugin) => {\n validatePluginSnapshot(plugin);\n return structuredClone(pluginSnapshotData(plugin));\n });\n}\n\n/** Pure assembly: validate contributions and select tools without executing plugin code. */\nexport function assembleSession(\n options: SessionContributions & {\n builtinTools: readonly AgentTool[];\n context?: (signal?: AbortSignal) => ToolContext;\n },\n) {\n if (options.noTools !== undefined && ![\"all\", \"builtin\"].includes(options.noTools))\n throw new Error(\"Invalid noTools\");\n const plugins = [...(options.plugins ?? [])];\n const identities = new Set<string>();\n const commands: PluginCommand[] = [];\n const names = new Set<string>();\n for (const plugin of plugins) {\n validatePluginSnapshot(plugin);\n assertSupportedOptions(\n plugin,\n [\n \"id\",\n \"version\",\n \"name\",\n \"description\",\n \"instructions\",\n \"commands\",\n \"skills\",\n \"runtime\",\n \"options\",\n \"tools\",\n \"toolOverrides\",\n \"contextInstructions\",\n \"hooks\",\n ],\n \"plugin\",\n );\n if (identities.has(plugin.id)) throw new Error(`Duplicate plugin: ${plugin.id}`);\n identities.add(plugin.id);\n if (plugin.contextInstructions !== undefined && typeof plugin.contextInstructions !== \"function\")\n throw new Error(\"Invalid plugin context instructions\");\n for (const command of plugin.commands ?? []) {\n if (names.has(command.name)) throw new Error(`Duplicate plugin command: ${command.name}`);\n names.add(command.name);\n commands.push(structuredClone(command));\n }\n for (const hook of plugin.hooks ?? []) validateHookRegistration(hook);\n }\n const skills = plugins.flatMap((plugin) => [...(plugin.skills ?? [])]);\n if (new Set(skills.map((skill) => skill.name)).size !== skills.length)\n throw new Error(\"Duplicate plugin skill\");\n const context =\n options.context ??\n (() => {\n throw new Error(\"Preview tools cannot execute\");\n });\n const wrap = (tool: ToolDefinition<TSchema, unknown>) => wrapToolDefinition(tool, context, false);\n const custom = [...(options.customTools ?? []), ...plugins.flatMap((plugin) => plugin.tools ?? [])].map(\n wrap,\n );\n const overrides = [\n ...(options.toolOverrides ?? []),\n ...plugins.flatMap((plugin) => plugin.toolOverrides ?? []),\n ].map(wrap);\n if (new Set(overrides.map((tool) => tool.name)).size !== overrides.length)\n throw new Error(\"Duplicate tool overrides\");\n for (const tool of overrides)\n if (!options.builtinTools.some((base) => base.name === tool.name))\n throw new Error(`Unknown built-in tool override: ${tool.name}`);\n const allTools = [\n ...options.builtinTools.map((base) => overrides.find((tool) => tool.name === base.name) ?? base),\n ...custom,\n ];\n if (new Set(allTools.map((tool) => tool.name)).size !== allTools.length)\n throw new Error(\"Duplicate tool names\");\n const defaults = options.noTools === \"all\" ? [] : options.noTools === \"builtin\" ? custom : allTools;\n const activeTools = (options.tools ?? defaults.map((tool) => tool.name))\n .map((name) => {\n const tool = allTools.find((tool) => tool.name === name);\n if (!tool) throw new Error(`Unknown tool: ${name}`);\n return tool;\n })\n .filter((tool) => !options.excludeTools?.includes(tool.name));\n if (new Set(activeTools.map((tool) => tool.name)).size !== activeTools.length)\n throw new Error(\"Duplicate selected tools\");\n for (const name of options.excludeTools ?? [])\n if (!allTools.some((tool) => tool.name === name)) throw new Error(`Unknown excluded tool: ${name}`);\n return {\n allTools,\n activeTools,\n commands,\n skills,\n getContextSections: (): Record<string, string> =>\n Object.fromEntries(\n plugins.flatMap((plugin) => {\n const dynamic = plugin.contextInstructions?.() ?? {};\n if (\n !dynamic ||\n typeof dynamic !== \"object\" ||\n Array.isArray(dynamic) ||\n Object.entries(dynamic).some(([name, part]) => !name || typeof part !== \"string\")\n )\n throw new Error(\"Invalid plugin context instructions\");\n // Tuple keys prevent a plugin's local names from colliding with another owner or the SDK.\n return [\n [JSON.stringify([\"plugin\", plugin.id]), (plugin.instructions ?? []).join(\"\\n\\n\")],\n ...Object.entries(dynamic).map(([name, value]) => [\n JSON.stringify([\"plugin\", plugin.id, name]),\n value,\n ]),\n ].filter(([, value]) => value);\n }),\n ),\n hooks: plugins.flatMap((plugin) =>\n (plugin.hooks ?? []).map((hook) => ({ ...hook, pluginId: plugin.id })),\n ),\n };\n}\n\nexport function expandPluginCommand(command: PluginCommand, args: string, cwd: string): string {\n return command.prompt.replace(/{{\\s*(cwd|arguments)\\s*}}/g, (_, key) => (key === \"cwd\" ? cwd : args));\n}\n","import type { LoadedSkill } from \"../core/resources.ts\";\nimport type { ResourceLoader } from \"../core/types.ts\";\nimport type { PluginSkill } from \"./types.ts\";\n\n/** Adds explicit frozen plugin skills without changing filesystem discovery. */\nexport function withPluginResources(loader: ResourceLoader, skills: readonly PluginSkill[]): ResourceLoader {\n if (!skills.length) return loader;\n const metadata = skills.map(({ body: _body, ...skill }) => ({ ...skill, source: \"plugin\" as const }));\n return {\n reload: () => loader.reload?.() ?? Promise.resolve(),\n getBaseInstructions: () => loader.getBaseInstructions?.(),\n getInstructions: () => loader.getInstructions?.() ?? [],\n getDiagnostics: () => loader.getDiagnostics?.() ?? [],\n listSkills: () => {\n const existing = loader.listSkills?.() ?? { skills: [], diagnostics: [] };\n if (existing.skills.some((skill) => metadata.some((plugin) => plugin.name === skill.name)))\n throw new Error(\"Duplicate resource skill\");\n return { ...existing, skills: [...existing.skills, ...structuredClone(metadata)] };\n },\n loadSkill: async (name) => {\n const skill = skills.find((entry) => entry.name === name);\n if (skill) return { ...structuredClone(skill), source: \"plugin\" } satisfies LoadedSkill;\n if (!loader.loadSkill) throw new Error(`Skill not found: ${name}`);\n return loader.loadSkill(name);\n },\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { AgentEvent, AgentState, AgentTool, ThinkingLevel } from \"@zpi-dev/agent\";\nimport { Agent } from \"@zpi-dev/agent\";\nimport type {\n ImageContent,\n Message,\n Model,\n ModelRetryStatus,\n ModelWaitStatus,\n SimpleStreamOptions,\n TranscriptContext,\n UserGuide,\n} from \"@zpi-dev/ai\";\nimport {\n assertSupportedOptions,\n clampThinkingLevel,\n createAssistantMessageEventStream,\n emptyAssistant,\n isContextOverflowMessage,\n isRecoverableLength,\n isRetryableAssistantError,\n ModelRequestRetryError,\n retryAttemptLimit,\n retryDelayMs,\n} from \"@zpi-dev/ai\";\nimport { ResponsesSession } from \"@zpi-dev/ai/api/responses-session\";\nimport { expandPluginCommand } from \"../plugins/assembly.ts\";\nimport type { HookExecution, HookRegistration } from \"../plugins/hooks.ts\";\nimport { SessionHooks } from \"../plugins/session-hooks.ts\";\nimport type { PluginCommand } from \"../plugins/types.ts\";\nimport type { ParsedInput } from \"./commands.ts\";\nimport { listCommands, parseInput } from \"./commands.ts\";\nimport {\n calculateContextTokens,\n compact as compactContext,\n estimateContextTokens,\n prepareCompaction,\n shouldCompact,\n} from \"./compaction.ts\";\nimport { contextUpdate } from \"./dynamic-context.ts\";\nimport { withHttpIdleTimeout } from \"./http-idle-timeout.ts\";\nimport { buildDefaultMicrocompactThreshold, maybeMicrocompact } from \"./microcompact.ts\";\nimport {\n type ModelPerformance,\n type ModelPerformanceTotals,\n SessionPerformance,\n} from \"./model-performance.ts\";\nimport type { ModelRuntime } from \"./model-runtime.ts\";\nimport type { LoadedSkill, SkillList } from \"./resources.ts\";\nimport type { SessionEntry, SessionManager } from \"./session-manager.ts\";\nimport type { ContextUsage } from \"./session-state.ts\";\nimport { contextUsage } from \"./session-state.ts\";\nimport { SettingsManager } from \"./settings-manager.ts\";\nimport { StreamingToolJournal } from \"./streaming-tool-journal.ts\";\nimport type { SystemContext } from \"./system-prompt.ts\";\nimport type { ResourceDiagnostic, ResourceLoader } from \"./types.ts\";\nexport interface InputContext {\n images?: ImageContent[];\n fileReferences?: string[];\n}\nfunction withReferences(text: string, references?: string[]): string {\n const instructions = references?.some((path) => path.endsWith(\"/\"))\n ? \"Referenced project files and folders (use bash to list folders and read to inspect files when needed)\"\n : \"Referenced project files (read with the read tool when needed)\";\n return references?.length\n ? `${text}\\n\\n${instructions}:\\n${references.map((p) => `- ${JSON.stringify(p)}`).join(\"\\n\")}`\n : text;\n}\nfunction validateInputContext(input: ParsedInput, context: InputContext): void {\n if ((context.images?.length || context.fileReferences?.length) && input.kind === \"compact\")\n throw new Error(\"invalid_input: 此控制命令不接收图片或文件引用\");\n}\nexport type AgentSessionEvent =\n | { type: \"hook_execution\"; execution: HookExecution }\n | { type: \"model_performance\"; performance: ModelPerformance; totals: ModelPerformanceTotals }\n | Exclude<AgentEvent, { type: \"agent_end\" }>\n | { type: \"agent_end\"; messages: AgentState[\"messages\"]; willRetry: boolean }\n | { type: \"agent_settled\" }\n | { type: \"entry_appended\"; entry: SessionEntry }\n | { type: \"session_info_changed\"; name: string }\n | { type: \"thinking_level_changed\"; thinkingLevel: ThinkingLevel }\n | { type: \"model_retry\"; status: ModelRetryStatus | null }\n | { type: \"model_wait\"; status: ModelWaitStatus | null }\n | {\n type: \"compaction\";\n id: string;\n status: \"running\" | \"completed\" | \"aborted\" | \"error\" | \"noop\";\n origin: \"manual\" | \"auto\";\n error?: string;\n }\n | { type: \"command_result\"; message: string };\nexport class AgentSession {\n private modelRequestOptions?: () => SimpleStreamOptions;\n private onCompaction?: (\n phase: \"before\" | \"after\",\n context: { manual: boolean; instructions: string },\n signal?: AbortSignal,\n ) => Promise<void>;\n private agent: Agent;\n private pluginCommands: readonly PluginCommand[];\n private hooks: SessionHooks;\n private manager: SessionManager;\n private steering: import(\"@zpi-dev/ai\").UserMessage[] = [];\n private pendingMessages: import(\"@zpi-dev/ai\").UserMessage[] = [];\n private allTools: Map<string, AgentTool>;\n private listeners = new Set<(event: AgentSessionEvent) => void>();\n private running?: Promise<void>;\n private active?: \"prompt\" | \"compact\";\n private disposed = false;\n private abortRequested = false;\n private fault?: Error;\n private runtime: ModelRuntime;\n private responsesSession?: ResponsesSession;\n private responsesWarmupTimer?: ReturnType<typeof setTimeout>;\n private responsesWarmupController?: AbortController;\n private resources?: {\n loader: ResourceLoader;\n buildContext: () => SystemContext;\n settingsManager?: SettingsManager;\n };\n private compactController?: AbortController;\n readonly settingsManager: SettingsManager;\n private overflowRecoveryAttempted = false;\n private retryAttempt = 0;\n private recoveryStartedAt?: number;\n private retryCurrentRequest?: () => boolean;\n private lastAssistantCompletedAtMs?: number;\n private microcompactProjection = new WeakMap<Message, Message>();\n private recoveredCalls = new WeakSet<object>();\n private performance: SessionPerformance;\n get modelPerformance(): ModelPerformance {\n return this.performance.value;\n }\n constructor(\n model: Model,\n runtime: ModelRuntime,\n manager: SessionManager,\n allTools: AgentTool[],\n activeTools: AgentTool[],\n systemPrompt: string,\n thinkingLevel: ThinkingLevel,\n resources?: {\n loader: ResourceLoader;\n buildContext: () => SystemContext;\n settingsManager?: SettingsManager;\n },\n performanceTotals?: ModelPerformanceTotals,\n extensions: {\n modelRequestOptions?: () => SimpleStreamOptions;\n onCompaction?: (\n phase: \"before\" | \"after\",\n context: { manual: boolean; instructions: string },\n signal?: AbortSignal,\n ) => Promise<void>;\n beforeModelRequest?: (model: Model, context: import(\"@zpi-dev/ai\").Context) => void;\n commands?: readonly PluginCommand[];\n hooks?: readonly (HookRegistration & { pluginId?: string })[];\n } = {},\n ) {\n this.modelRequestOptions = extensions.modelRequestOptions;\n this.onCompaction = extensions.onCompaction;\n this.pluginCommands = structuredClone(extensions.commands ?? []);\n this.hooks = new SessionHooks(\n {\n sessionId: manager.getSessionId(),\n cwd: manager.getCwd(),\n source: manager.buildSessionContext().messages.some((m) => m.role === \"user\") ? \"resume\" : \"startup\",\n },\n extensions.hooks ?? [],\n (execution) => this.notify({ type: \"hook_execution\", execution }),\n );\n this.performance = new SessionPerformance(\n (performance, totals) => this.notify({ type: \"model_performance\", performance, totals }),\n performanceTotals,\n );\n this.manager = manager;\n this.runtime = runtime;\n this.resources = resources;\n this.settingsManager = resources?.settingsManager ?? SettingsManager.inMemory();\n this.allTools = new Map(allTools.map((t) => [t.name, t]));\n for (const message of initialSystemMessages(\n manager,\n activeTools,\n systemPrompt,\n resources?.buildContext(),\n ))\n manager.appendMessage(message);\n this.lastAssistantCompletedAtMs = manager\n .buildSessionContext()\n .messages.findLast(\n (message) =>\n message.role === \"assistant\" && message.stopReason !== \"error\" && message.stopReason !== \"aborted\",\n )?.timestamp;\n this.agent = new Agent({\n initialState: {\n model,\n thinkingLevel,\n messages: manager.buildSessionContext().messages,\n tools: activeTools,\n },\n streamFn: (m, c, o) => {\n extensions.beforeModelRequest?.(m, c);\n return this.streamWithRecovery(m, c, o);\n },\n transformContext: async (messages) => {\n const config = this.settingsManager.getMicrocompactSettings();\n const settings = this.settingsManager.getCompactionSettings(this.model);\n const projected = messages.map((message) => this.microcompactProjection.get(message) ?? message);\n const result = maybeMicrocompact({\n messages: projected,\n config: {\n ...config,\n thresholdTokens:\n config.thresholdTokens ??\n buildDefaultMicrocompactThreshold(this.model.contextWindow - settings.reserveTokens),\n },\n lastAssistantCompletedAtMs: this.lastAssistantCompletedAtMs,\n });\n if (result.boundary) {\n for (const [index, message] of messages.entries())\n if (result.messages[index] !== message)\n this.microcompactProjection.set(message, result.messages[index]);\n await this.manager.appendEntryAsync({ type: \"microcompact\", data: result.boundary });\n this.notifyLastEntry();\n }\n return result.messages;\n },\n prepareNextTurnWithContext: async (turn, signal) => {\n const updated = await this.syncContext();\n const settings = this.settingsManager.getCompactionSettings(this.model);\n if (\n this.model.contextWindow > 0 &&\n shouldCompact(this.estimateTokens(turn.context.messages), this.model.contextWindow, settings)\n ) {\n if (await this.tryAutoCompact(signal))\n return { context: { ...turn.context, messages: this.manager.buildSessionContext().messages } };\n }\n return updated\n ? { context: { ...turn.context, messages: this.manager.buildSessionContext().messages } }\n : undefined;\n },\n beforeToolCall: this.hooks.runner.hasToolHooks ? this.hooks.beforeToolCall : undefined,\n afterToolCall: this.hooks.runner.hasToolHooks ? this.hooks.afterToolCall : undefined,\n beforeStop: this.hooks.beforeStop,\n streamingToolExecution: this.hooks.runner.hasToolHooks ? \"off\" : \"readOnly\",\n toolExecution: \"parallel\",\n getSteeringMessages: () => this.steering.splice(0),\n getPendingMessages: () => [...this.hooks.drainMessages(), ...this.pendingMessages.splice(0)],\n });\n const streamingTools = new StreamingToolJournal(manager, () => this.notifyLastEntry());\n this.agent.subscribe(async (event) => {\n try {\n if (event.type === \"tool_execution_start\") this.performance.toolStart(event.toolCallId);\n if (event.type === \"tool_execution_end\") this.performance.toolEnd(event.toolCallId);\n await streamingTools.observe(event);\n if (\n event.type === \"message_end\" &&\n event.message.role === \"assistant\" &&\n !this.recoveredCalls.has(event.message)\n ) {\n if (![\"error\", \"length\"].includes(event.message.stopReason)) this.overflowRecoveryAttempted = false;\n if (event.message.stopReason !== \"error\") {\n this.notify({ type: \"model_retry\", status: null });\n this.retryAttempt = 0;\n this.recoveryStartedAt = undefined;\n }\n }\n if (event.type === \"message_end\") {\n if (event.message.role === \"assistant\" && ![\"error\", \"aborted\"].includes(event.message.stopReason))\n this.lastAssistantCompletedAtMs = Date.now();\n await this.manager.appendEntryAsync({ type: \"message\", message: event.message });\n this.notifyLastEntry();\n }\n } catch (e) {\n this.fault = e instanceof Error ? e : new Error(String(e));\n this.agent.abort();\n throw this.fault;\n }\n const last = event.type === \"agent_end\" ? event.messages.at(-1) : undefined;\n this.notify(\n event.type === \"agent_end\"\n ? {\n ...event,\n willRetry: last?.role === \"assistant\" && this.canRetry(last),\n }\n : event,\n );\n });\n this.prepareResponsesSession();\n }\n private prepareResponsesSession(): void {\n clearTimeout(this.responsesWarmupTimer);\n this.responsesWarmupTimer = undefined;\n this.responsesWarmupController?.abort();\n this.responsesWarmupController = undefined;\n this.responsesSession?.dispose();\n this.responsesSession = undefined;\n if (!this.runtime.canUseResponsesSession(this.model)) return;\n const connection = new ResponsesSession({\n resolveProxy: this.runtime.responsesProxy,\n onDiagnostic: this.runtime.responsesDiagnosticObserver(this.model, this.sessionId),\n });\n this.responsesSession = connection;\n // Let callers finish selecting model + reasoning before capturing warmup parameters.\n this.responsesWarmupTimer = setTimeout(() => {\n this.responsesWarmupTimer = undefined;\n if (this.disposed || connection !== this.responsesSession) return;\n const controller = new AbortController();\n this.responsesWarmupController = controller;\n // Best effort, concurrent with resource loading/user input; never journaled or measured.\n void Promise.resolve()\n .then(() => {\n if (controller.signal.aborted || connection !== this.responsesSession) return;\n return this.runtime\n .streamSimple(\n this.model,\n { messages: this.messages },\n {\n sessionId: this.sessionId,\n responsesSession: connection,\n responsesWarmup: true,\n reasoning: this.thinkingLevel,\n signal: AbortSignal.any([controller.signal, AbortSignal.timeout(15_000)]),\n streamFirstResponseTimeoutMs: 15_000,\n maxRetries: 0,\n },\n )\n .result();\n })\n .catch(() => {})\n .finally(() => {\n if (this.responsesWarmupController === controller) this.responsesWarmupController = undefined;\n });\n }, 0);\n this.responsesWarmupTimer.unref();\n }\n static async create(...args: ConstructorParameters<typeof AgentSession>): Promise<AgentSession> {\n const [, , manager, , activeTools, systemPrompt, , resources] = args;\n for (const message of initialSystemMessages(\n manager,\n activeTools,\n systemPrompt,\n resources?.buildContext(),\n ))\n await manager.appendEntryAsync({ type: \"message\", message });\n return new AgentSession(...args);\n }\n get state(): AgentState {\n return this.agent.state;\n }\n get messages(): AgentState[\"messages\"] {\n return this.state.messages;\n }\n get model(): Model {\n return this.state.model;\n }\n get thinkingLevel(): ThinkingLevel {\n return this.state.thinkingLevel;\n }\n get isStreaming(): boolean {\n return this.active !== undefined;\n }\n get isIdle(): boolean {\n return !this.active;\n }\n get systemPrompt(): string {\n return this.state.systemPrompt;\n }\n getContextUsage(): ContextUsage {\n return contextUsage(this.manager.getContextEntries(), this.model);\n }\n listSkills(): SkillList {\n return this.resources?.loader.listSkills?.() ?? { skills: [], diagnostics: [] };\n }\n getResourceDiagnostics(): ResourceDiagnostic[] {\n return [\n ...(this.resources?.loader.getDiagnostics?.() ?? []),\n ...this.settingsManager.getErrors().map(({ path, error }) => ({ path, message: error.message })),\n ];\n }\n async loadSkill(name: string): Promise<LoadedSkill> {\n if (!this.resources?.loader.loadSkill) throw new Error(`Skill not found: ${name}`);\n return this.resources.loader.loadSkill(name);\n }\n async prepareInput(text: string, context: InputContext = {}): Promise<ParsedInput> {\n this.idleCheck();\n const parsed = parseInput(text);\n validateInputContext(parsed, context);\n if (parsed.kind === \"prompt\") {\n const invocation = /^\\s*\\/(\\S+)(?:\\s+([\\s\\S]*))?$/.exec(text);\n const command = invocation && this.pluginCommands.find((command) => command.name === invocation[1]);\n if (command)\n return {\n kind: \"prompt\",\n text: expandPluginCommand(command, invocation?.[2]?.trim() ?? \"\", this.manager.getCwd()),\n };\n }\n if (parsed.kind === \"compact\" && !this.alreadyCompacted()) this.compactionBoundary();\n return parsed;\n }\n listCommands(): { name: string; description: string }[] {\n return listCommands(this.pluginCommands);\n }\n async submit(text: string): Promise<void> {\n return this.executeInput(await this.prepareInput(text));\n }\n async executeInput(input: ParsedInput, context: InputContext = {}): Promise<void> {\n validateInputContext(input, context);\n if (input.kind === \"compact\") return this.compact(input.args);\n if (input.kind !== \"prompt\") throw new Error(\"Input must be prepared before execution\");\n return this.prompt(withReferences(input.text, context.fileReferences), { images: context.images });\n }\n private async syncContext(): Promise<boolean> {\n const current = this.resources?.buildContext();\n if (!current) return false;\n const update = contextUpdate(this.manager.buildSessionContext().messages, {\n \"zpi.base\": current.base,\n ...current.sections,\n });\n if (!update) return false;\n await this.manager.appendEntryAsync({ type: \"message\", message: update });\n this.notifyLastEntry();\n return true;\n }\n private async refreshInstructions(): Promise<void> {\n await this.resources?.loader.reload?.();\n\n if (await this.syncContext()) this.agent.state.messages = this.manager.buildSessionContext().messages;\n }\n private compactionBoundary() {\n const preparation = prepareCompaction(\n this.manager.getContextEntries(),\n this.settingsManager.getCompactionSettings(this.model),\n );\n if (!preparation) throw new Error(\"invalid_input: 没有可压缩的完整对话内容\");\n return preparation;\n }\n private estimateTokens(messages: AgentState[\"messages\"]): number {\n const estimate = estimateContextTokens(messages);\n const source = estimate.lastUsageIndex === null ? undefined : messages[estimate.lastUsageIndex];\n if (source?.role === \"assistant\" && this.precedesCompaction(source)) return 0;\n return estimate.tokens;\n }\n private precedesCompaction(message: AgentState[\"messages\"][number]): boolean {\n return this.manager.precedesCompaction(message);\n }\n private async tryAutoCompact(signal?: AbortSignal): Promise<boolean> {\n if (\n !prepareCompaction(\n this.manager.getContextEntries(),\n this.settingsManager.getCompactionSettings(this.model),\n )\n )\n return false;\n try {\n await this.summarize(false, \"\", signal);\n return true;\n } catch (error) {\n if (signal?.aborted) throw error;\n return false;\n }\n }\n private async checkCompaction(signal?: AbortSignal, includeAborted = false): Promise<boolean> {\n const message = this.messages.findLast((message) => message.role === \"assistant\");\n const settings = this.settingsManager.getCompactionSettings(this.model);\n if (\n !settings.enabled ||\n !message ||\n message.role !== \"assistant\" ||\n (!includeAborted && message.stopReason === \"aborted\")\n )\n return false;\n if (this.precedesCompaction(message)) return false;\n const sameModel = message.provider === this.model.provider && message.model === this.model.id;\n const overflow =\n sameModel &&\n (isContextOverflowMessage(message, this.model.contextWindow) ||\n isRecoverableLength(message, this.model.maxTokens));\n if (overflow) {\n const retry = message.stopReason !== \"stop\";\n if (retry && this.overflowRecoveryAttempted) return false;\n if (retry) {\n this.overflowRecoveryAttempted = true;\n }\n if (!(await this.tryAutoCompact(signal))) return false;\n this.state.messages = this.manager.buildSessionContext().messages;\n if (retry) this.dropFailedAssistant();\n return retry;\n }\n const direct = message.stopReason === \"error\" ? 0 : calculateContextTokens(message.usage);\n const tokens = direct || this.estimateTokens(this.messages);\n if (shouldCompact(tokens, this.model.contextWindow, settings) && (await this.tryAutoCompact(signal)))\n this.state.messages = this.manager.buildSessionContext().messages;\n return false;\n }\n private dropFailedAssistant(): void {\n const index = this.messages.findLastIndex((message) => message.role !== \"system\");\n const last = this.messages[index];\n if (last?.role === \"assistant\" && [\"error\", \"length\"].includes(last.stopReason))\n this.state.messages = this.messages.filter((_, i) => i !== index);\n }\n private async waitForRetry(\n message: Extract<AgentState[\"messages\"][number], { role: \"assistant\" }>,\n signal?: AbortSignal,\n ): Promise<boolean> {\n if (!this.canRetry(message)) return false;\n const settings = this.settingsManager.getRetrySettings();\n const manualRetry = message.errorDetails?.code === \"MODEL_REQUEST_RETRY\";\n if (manualRetry) {\n this.retryAttempt = 0;\n this.recoveryStartedAt = Date.now();\n } else this.recoveryStartedAt ??= Date.now();\n this.dropFailedAssistant();\n this.retryAttempt++;\n const delay = manualRetry\n ? 0\n : retryDelayMs(settings, this.retryAttempt, message.errorDetails?.retryAfterMs);\n this.notify({\n type: \"model_retry\",\n status: {\n origin: manualRetry ? \"manual\" : \"auto\",\n attempt: this.retryAttempt,\n maxRetries: settings.maxRetries,\n retryDelayMs: delay,\n errorStatus: message.errorDetails?.status ?? null,\n },\n });\n if (await this.waitForRetryDelay(delay, signal)) {\n this.recoveryStartedAt = Date.now();\n this.retryAttempt = 1;\n }\n return true;\n }\n private waitForRetryDelay(delay: number, signal?: AbortSignal): Promise<boolean> {\n return new Promise<boolean>((resolve, reject) => {\n const cleanup = () => {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", abort);\n if (this.retryCurrentRequest === retryNow) this.retryCurrentRequest = undefined;\n };\n const retryNow = () => {\n cleanup();\n resolve(true);\n return true;\n };\n const abort = () => {\n cleanup();\n reject(new DOMException(\"Request aborted\", \"AbortError\"));\n };\n const timer = setTimeout(() => {\n cleanup();\n resolve(false);\n }, delay);\n this.retryCurrentRequest = retryNow;\n if (signal?.aborted) abort();\n else signal?.addEventListener(\"abort\", abort, { once: true });\n });\n }\n private canRetry(message: Extract<AgentState[\"messages\"][number], { role: \"assistant\" }>): boolean {\n const settings = this.settingsManager.getRetrySettings();\n if (!this.abortRequested && message.errorDetails?.code === \"MODEL_REQUEST_RETRY\") return true;\n const deadline = this.recoveryDeadline(this.recoveryStartedAt ?? Date.now());\n const delay = retryDelayMs(settings, this.retryAttempt + 1, message.errorDetails?.retryAfterMs);\n return (\n !this.abortRequested &&\n !(\n !settings.enabled ||\n this.retryAttempt >= retryAttemptLimit(message, settings.maxRetries) ||\n !Number.isFinite(delay) ||\n (deadline !== undefined && Date.now() + delay >= deadline) ||\n isContextOverflowMessage(message, this.model.contextWindow) ||\n !isRetryableAssistantError(message)\n )\n );\n }\n private recoveryDeadline(startedAt = this.recoveryStartedAt): number | undefined {\n const limit = this.settingsManager.getRetrySettings().maxElapsedMs;\n return limit && limit > 0 && startedAt !== undefined ? startedAt + limit : undefined;\n }\n /** Only the active model request or retry backoff can be retried; tools keep their lifecycle. */\n retryModelRequest(): boolean {\n if (this.abortRequested || this.disposed || !this.active) return false;\n if (!this.retryCurrentRequest?.()) return false;\n this.notify({\n type: \"model_retry\",\n status: {\n origin: \"manual\",\n attempt: 1,\n maxRetries: this.settingsManager.getRetrySettings().maxRetries,\n retryDelayMs: 0,\n errorStatus: null,\n },\n });\n return true;\n }\n private requestOptions(options: SimpleStreamOptions = {}): SimpleStreamOptions {\n const request = { ...options, ...this.modelRequestOptions?.(), signal: options.signal };\n const provider = this.settingsManager.getProviderRetrySettings();\n const idle = this.settingsManager.getHttpIdleTimeoutMs();\n const requestFetch = request.fetch ?? this.runtime.fetch;\n return {\n ...provider,\n ...request,\n timeoutMs: request.timeoutMs ?? provider.timeoutMs ?? (idle === 0 ? 2147483647 : idle),\n streamIdleTimeoutMs: request.streamIdleTimeoutMs ?? this.settingsManager.getStreamIdleTimeoutMs(),\n streamFirstResponseTimeoutMs:\n request.streamFirstResponseTimeoutMs ?? this.settingsManager.getStreamFirstResponseTimeoutMs(),\n maxRetries: request.maxRetries ?? provider.maxRetries,\n maxRetryDelayMs: request.maxRetryDelayMs ?? provider.maxRetryDelayMs,\n fetch: withHttpIdleTimeout(requestFetch, idle),\n };\n }\n private alreadyCompacted(): boolean {\n const state = this.manager.getStateAt();\n return state.lastCompactionSeq > 0 && state.lastMessageSeq < state.lastCompactionSeq;\n }\n private async summarize(manual: boolean, instructions: string, signal?: AbortSignal): Promise<void> {\n const id = randomUUID();\n const origin = manual ? \"manual\" : \"auto\";\n this.notify({ type: \"compaction\", id, status: \"running\", origin });\n try {\n await this.onCompaction?.(\"before\", { manual, instructions }, signal);\n await this.summarizeContext(manual, instructions, signal);\n await this.onCompaction?.(\"after\", { manual, instructions }, signal);\n this.notify({ type: \"compaction\", id, status: \"completed\", origin });\n } catch (error) {\n this.notify({\n type: \"compaction\",\n id,\n status: signal?.aborted ? \"aborted\" : \"error\",\n origin,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n private async summarizeContext(manual: boolean, instructions: string, signal?: AbortSignal): Promise<void> {\n signal?.throwIfAborted();\n const preparation = this.compactionBoundary();\n const result = await compactContext(\n preparation,\n this.model,\n undefined,\n undefined,\n instructions || undefined,\n signal,\n this.thinkingLevel,\n (model, context, options) => this.measuredStream(model, context, this.requestOptions(options)),\n this.settingsManager.getRetrySettings(),\n {\n onRetryScheduled: (attempt, maxRetries, retryDelayMs, _errorMessage, origin) => {\n this.notify({\n type: \"model_retry\",\n status: { origin, attempt, maxRetries, retryDelayMs, errorStatus: null },\n });\n },\n onRetryFinished: () => this.notify({ type: \"model_retry\", status: null }),\n waitBeforeRetry: (delay, signal) => this.waitForRetryDelay(delay, signal),\n },\n randomUUID(),\n this.runtime.mediaProjectionObserver(this.model, this.sessionId),\n );\n signal?.throwIfAborted();\n await this.manager.appendCompactionAsync(\n result.summary,\n result.firstKeptEntryId,\n result.tokensBefore,\n result.details as { readFiles: string[]; modifiedFiles: string[] },\n result.usage,\n );\n this.notifyLastEntry();\n this.notify({\n type: \"command_result\",\n message: manual\n ? \"上下文已压缩;完整历史保留,下一次请求使用摘要和最近回合。\"\n : \"上下文接近容量,已自动压缩。\",\n });\n }\n private streamWithRecovery(model: Model, context: TranscriptContext, options: SimpleStreamOptions = {}) {\n // If input is already ready, generate directly instead of queueing a late warmup behind it.\n clearTimeout(this.responsesWarmupTimer);\n this.responsesWarmupTimer = undefined;\n const output = createAssistantMessageEventStream();\n let partial = emptyAssistant(model);\n void (async () => {\n const response = this.measuredStream(\n model,\n context,\n this.requestOptions({\n ...options,\n sessionId: this.sessionId,\n ...(this.responsesSession ? { responsesSession: this.responsesSession } : {}),\n streamDeadlineMs:\n options.streamDeadlineMs ?? (this.retryAttempt > 0 ? this.recoveryDeadline() : undefined),\n }),\n );\n let started = false;\n for await (const event of response) {\n partial =\n event.type === \"error\" ? event.error : event.type === \"done\" ? event.message : event.partial;\n if (event.type === \"start\") {\n started = true;\n // The response stream is connected again; keep the retry budget until\n // the message succeeds, but stop showing the reconnect indicator now.\n if (this.retryAttempt > 0) this.notify({ type: \"model_retry\", status: null });\n output.push(event);\n continue;\n }\n if (\n event.type === \"error\" &&\n event.error.content.some((block) => block.type === \"toolCall\") &&\n (await this.waitForRetry(event.error, options.signal))\n ) {\n // Preserve the existing streamed-read recovery: drain completed calls once,\n // discard partial prose and continue with their paired results.\n const recovered = emptyAssistant(model);\n recovered.content = event.error.content.filter((block) => block.type === \"toolCall\");\n recovered.stopReason = \"toolUse\";\n this.recoveredCalls.add(recovered);\n if (!started) output.push({ type: \"start\", partial: recovered });\n output.push({ type: \"reset\", partial: recovered });\n output.end(recovered);\n return;\n }\n output.push(event);\n }\n })().catch((error: unknown) => {\n const result = partial;\n result.stopReason = options.signal?.aborted ? \"aborted\" : \"error\";\n result.errorMessage = error instanceof Error ? error.message : String(error);\n output.end(result);\n });\n return output;\n }\n private measuredStream(model: Model, context: TranscriptContext, options: SimpleStreamOptions) {\n const output = createAssistantMessageEventStream();\n const request = this.performance.request();\n const retry = new AbortController();\n const retryNow = () => {\n if (retry.signal.aborted || options.signal?.aborted) return false;\n retry.abort(new ModelRequestRetryError());\n return true;\n };\n this.retryCurrentRequest = retryNow;\n void (async () => {\n try {\n const response = this.runtime.streamSimple(model, context, {\n ...options,\n onPerformance: request.update,\n retrySignal: retry.signal,\n onModelWait: (status) => this.notify({ type: \"model_wait\", status }),\n });\n for await (const event of response) {\n if (event.type === \"done\" || event.type === \"error\") {\n if (this.retryCurrentRequest === retryNow) this.retryCurrentRequest = undefined;\n request.finish(\n event.type === \"done\" && event.reason !== \"length\" && !options.signal?.aborted,\n event.type === \"done\" ? event.message : event.error,\n );\n }\n output.push(event);\n }\n } catch (error) {\n const failure = emptyAssistant(model);\n failure.stopReason = options.signal?.aborted ? \"aborted\" : \"error\";\n failure.errorMessage = error instanceof Error ? error.message : String(error);\n output.end(failure);\n } finally {\n if (this.retryCurrentRequest === retryNow) this.retryCurrentRequest = undefined;\n request.finish(false);\n }\n })();\n return output;\n }\n compact(instructions = \"\"): Promise<void> {\n try {\n this.idleCheck();\n if (this.alreadyCompacted()) {\n this.notify({ type: \"compaction\", id: randomUUID(), status: \"noop\", origin: \"manual\" });\n this.notify({ type: \"command_result\", message: \"上下文已是最新,无需压缩\" });\n return Promise.resolve();\n }\n this.compactionBoundary();\n } catch (error) {\n return Promise.reject(error);\n }\n this.active = \"compact\";\n this.performance.begin();\n this.abortRequested = false;\n this.retryAttempt = 0;\n this.recoveryStartedAt = undefined;\n const controller = new AbortController();\n this.compactController = controller;\n this.running = (async () => {\n await this.resources?.loader.reload?.();\n await this.summarize(true, instructions, controller.signal);\n this.state.messages = this.manager.buildSessionContext().messages;\n })().finally(() => {\n this.performance.settle();\n this.compactController = undefined;\n this.retryCurrentRequest = undefined;\n this.notify({ type: \"model_retry\", status: null });\n this.notify({ type: \"model_wait\", status: null });\n this.active = undefined;\n this.running = undefined;\n this.notify({ type: \"agent_settled\" });\n });\n return this.running;\n }\n get sessionId(): string {\n return this.manager.getSessionId();\n }\n get sessionFile(): string | undefined {\n return this.manager.getSessionFile();\n }\n get sessionName(): string | undefined {\n return this.manager.getCurrentState().name;\n }\n subscribe(listener: (event: AgentSessionEvent) => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n private notify(event: AgentSessionEvent): void {\n for (const l of this.listeners) {\n try {\n const result: unknown = l(event);\n if (result instanceof Promise) void result.catch(() => {});\n } catch {\n /* Notification listeners cannot control persistence or settlement. */\n }\n }\n }\n private notifyLastEntry(): void {\n const entry = this.manager.getLastEntry();\n if (entry) this.notify({ type: \"entry_appended\", entry });\n }\n private idleCheck(): void {\n if (this.disposed) throw new Error(\"Session disposed\");\n if (this.fault) throw this.fault;\n if (this.active) throw new Error(\"Session busy\");\n }\n prompt(text: string, options: { images?: ImageContent[] } = {}): Promise<void> {\n try {\n this.idleCheck();\n assertSupportedOptions(options, [\"images\"], \"Session.prompt\");\n this.validateImages(options.images);\n } catch (e) {\n return Promise.reject(e);\n }\n this.active = \"prompt\";\n this.hooks.beginRun();\n this.performance.begin();\n this.abortRequested = false;\n this.overflowRecoveryAttempted = false;\n this.retryAttempt = 0;\n this.recoveryStartedAt = undefined;\n this.compactController = new AbortController();\n this.running = Promise.resolve()\n .then(async () => {\n if (this.abortRequested) return;\n const signal = this.compactController?.signal;\n const hookMessages = await this.hooks.preparePrompt(text, signal);\n if (signal?.aborted) return;\n await this.refreshInstructions();\n if (signal?.aborted) return;\n await this.checkCompaction(signal, true);\n if (signal?.aborted) return;\n await this.agent.prompt([\n ...hookMessages,\n {\n role: \"user\",\n content: options.images?.length ? [{ type: \"text\", text }, ...options.images] : text,\n timestamp: Date.now(),\n },\n ]);\n while (!signal?.aborted) {\n const last = this.messages.findLast((message) => message.role === \"assistant\");\n if (last?.role === \"assistant\" && (await this.waitForRetry(last, signal))) {\n // 失败请求已结束,重试必须先接入待引导输入,不能一直用旧上下文重试。\n if (this.steering.length) await this.agent.prompt(this.steering.splice(0));\n else await this.agent.continue();\n continue;\n }\n if (this.steering.length) {\n await this.agent.prompt(this.steering.splice(0));\n continue;\n }\n const compacted = await this.checkCompaction(signal);\n if (!signal?.aborted && this.steering.length) {\n await this.agent.prompt(this.steering.splice(0));\n continue;\n }\n if (!compacted) break;\n await this.agent.continue();\n }\n })\n .catch((error) => {\n if (!this.abortRequested) throw error;\n })\n .finally(() => {\n this.performance.settle();\n this.compactController = undefined;\n this.notify({ type: \"model_retry\", status: null });\n this.notify({ type: \"model_wait\", status: null });\n this.retryCurrentRequest = undefined;\n this.active = undefined;\n this.running = undefined;\n this.steering = [];\n this.pendingMessages = [];\n this.notify({ type: \"agent_settled\" });\n });\n return this.running;\n }\n /** Queue input for the next completed model/tool boundary without interrupting generation. */\n steer(\n text: string,\n options: {\n queueOnly?: boolean;\n inputId?: string;\n userGuide?: UserGuide;\n images?: ImageContent[];\n fileReferences?: string[];\n } = {},\n ): boolean {\n this.validateImages(options.images);\n if ((!text.trim() && !options.images?.length) || (!options.queueOnly && text.length > 100000))\n throw new Error(\"Invalid steering input\");\n if (this.active !== \"prompt\" || this.disposed || this.abortRequested) return false;\n (options.queueOnly ? this.pendingMessages : this.steering).push({\n role: \"user\",\n content: options.images?.length\n ? [{ type: \"text\", text: withReferences(text, options.fileReferences) }, ...options.images]\n : withReferences(text, options.fileReferences),\n timestamp: Date.now(),\n ...(options.inputId ? { inputId: options.inputId } : {}),\n ...(options.userGuide ? { userGuide: options.userGuide } : {}),\n });\n return true;\n }\n async abort(): Promise<void> {\n this.abortRequested = true;\n this.compactController?.abort();\n this.agent.abort();\n await this.running;\n }\n async waitForIdle(): Promise<void> {\n await this.running;\n }\n dispose(): void {\n clearTimeout(this.responsesWarmupTimer);\n this.responsesWarmupController?.abort();\n this.responsesSession?.dispose();\n this.performance.dispose();\n this.disposed = true;\n this.compactController?.abort();\n this.agent.abort();\n this.listeners.clear();\n }\n getToolDefinitions(): AgentTool[] {\n return [...this.allTools.values()];\n }\n validateImages(images?: ImageContent[]): void {\n if (this.model.input.includes(\"image\")) return;\n if (\n images?.length ||\n this.messages.some(\n (m) => m.role === \"user\" && Array.isArray(m.content) && m.content.some((c) => c.type === \"image\"),\n )\n )\n throw new Error(\n \"configuration: 当前模型不支持图片;请选择图片模型或移除新附件(有效历史中的图片也需图片模型)\",\n );\n }\n getActiveToolNames(): string[] {\n return this.state.tools.map((t) => t.name);\n }\n setActiveToolsByName(names: string[]): void {\n this.idleCheck();\n this.state.tools = names.map((n) => {\n const t = this.allTools.get(n);\n if (!t) throw new Error(`Unknown tool ${n}`);\n return t;\n });\n }\n async setModel(model: Model): Promise<void> {\n this.idleCheck();\n const changed =\n model.provider !== this.model.provider ||\n model.id !== this.model.id ||\n model.api !== this.model.api ||\n model.baseUrl !== this.model.baseUrl ||\n model.auth !== this.model.auth;\n if (model.provider !== this.model.provider || model.id !== this.model.id) {\n if (this.manager.appendModelChange(model.provider, model.id)) this.notifyLastEntry();\n }\n this.state.model = model;\n const thinkingLevel = clampThinkingLevel(model, this.thinkingLevel);\n if (thinkingLevel !== this.thinkingLevel) this.setThinkingLevel(thinkingLevel);\n if (changed) this.prepareResponsesSession();\n }\n setThinkingLevel(thinkingLevel: ThinkingLevel): void {\n this.idleCheck();\n const changed = thinkingLevel !== this.thinkingLevel;\n const entryId = this.manager.appendThinkingLevelChange(thinkingLevel);\n this.state.thinkingLevel = thinkingLevel;\n if (entryId) this.notifyLastEntry();\n this.notify({ type: \"thinking_level_changed\", thinkingLevel });\n if (changed && (this.responsesWarmupTimer || this.responsesWarmupController))\n this.prepareResponsesSession();\n }\n setSessionName(name: string): void {\n this.idleCheck();\n if (this.manager.appendSessionInfo(name)) this.notifyLastEntry();\n this.notify({ type: \"session_info_changed\", name });\n }\n}\n\nfunction initialSystemMessages(\n manager: SessionManager,\n activeTools: AgentTool[],\n systemPrompt: string,\n context?: SystemContext,\n): Extract<Message, { role: \"system\" }>[] {\n const messages: Extract<Message, { role: \"system\" }>[] = [];\n const restored = manager.buildSessionContext();\n // Restored plugin readers may not be prepared until the prompt hooks run.\n // Keep the last effective state until that boundary instead of withdrawing it at startup.\n if (restored.messages.some((m) => m.role === \"system\")) return messages;\n messages.push({\n role: \"system\",\n content: \"\",\n sections: { \"zpi.base\": systemPrompt },\n toolsAdded: activeTools.map((t) => ({\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n })),\n timestamp: Date.now(),\n });\n if (context) {\n const update = contextUpdate([...restored.messages, ...messages], {\n \"zpi.base\": context.base,\n ...context.sections,\n });\n if (update) messages.push(update);\n }\n return messages;\n}\n","import type { AssistantMessage, ToolCall, ToolResultMessage } from \"@zpi-dev/ai\";\nimport { isJsonValue } from \"@zpi-dev/ai\";\nimport { Check } from \"typebox/value\";\nimport type { AgentContext, AgentEventSink, AgentLoopConfig, AgentTool, AgentToolResult } from \"./types.ts\";\n\nexport const toolFailure = (error: unknown): AgentToolResult => ({\n content: [{ type: \"text\", text: error instanceof Error ? error.message : String(error) }],\n details: undefined,\n isError: true,\n});\n\ninterface PreparedCall {\n call: ToolCall;\n tool?: AgentTool;\n args: unknown;\n error?: AgentToolResult;\n}\n\nexport function toolResultMessage(call: ToolCall, result: AgentToolResult): ToolResultMessage {\n return {\n role: \"toolResult\",\n toolCallId: call.id,\n toolName: call.name,\n content: result.content,\n details: result.details,\n isError: result.isError ?? false,\n timestamp: Date.now(),\n };\n}\n\nexport async function finishToolCall(\n call: ToolCall,\n result: AgentToolResult,\n emit: AgentEventSink,\n): Promise<ToolResultMessage> {\n await emit({\n type: \"tool_execution_end\",\n toolCallId: call.id,\n toolName: call.name,\n result,\n isError: result.isError ?? false,\n });\n return toolResultMessage(call, result);\n}\n\n/** Shared execution path for Pi batches and ZCode's streamed read-only calls. */\nexport function createToolExecutor(\n context: AgentContext,\n assistant: AssistantMessage,\n config: AgentLoopConfig,\n emit: AgentEventSink,\n signal?: AbortSignal,\n) {\n async function finish(call: ToolCall, result: AgentToolResult): Promise<ToolResultMessage> {\n return finishToolCall(call, result, emit);\n }\n\n async function prepare(call: ToolCall): Promise<PreparedCall> {\n // Pi emits start before validation and the ordered before hook.\n await emit({\n type: \"tool_execution_start\",\n toolCallId: call.id,\n toolName: call.name,\n args: call.arguments,\n toolCall: call,\n });\n const tool = context.tools?.find((t) => t.name === call.name);\n let args: unknown = call.arguments;\n try {\n if (signal?.aborted || assistant.stopReason === \"aborted\")\n throw new Error(\"Tool cancelled before execution; effects unknown\");\n if (assistant.stopReason === \"error\") throw new Error(\"Tool not executed: provider response failed\");\n if (assistant.stopReason === \"length\")\n throw new Error(\"Tool not executed: output length limit may have truncated arguments\");\n if (!tool) throw new Error(`Unknown tool: ${call.name}`);\n args = tool.prepareArguments ? tool.prepareArguments(args) : args;\n if (!Check(tool.parameters, args)) throw new Error(`Invalid arguments for tool ${call.name}`);\n const blocked = await config.beforeToolCall?.(\n { assistantMessage: assistant, toolCall: call, args, context },\n signal,\n );\n if (signal?.aborted) throw new Error(\"Tool cancelled before execution\");\n if (blocked?.block) throw new Error(blocked.reason ?? \"Tool blocked by hook\");\n if (blocked?.args !== undefined) {\n args = blocked.args;\n if (!Check(tool.parameters, args)) throw new Error(`Invalid arguments for tool ${call.name}`);\n }\n return { call, tool, args };\n } catch (error) {\n return { call, tool, args, error: toolFailure(error) };\n }\n }\n\n async function execute({ call, tool, args }: PreparedCall): Promise<ToolResultMessage> {\n if (signal?.aborted) return finish(call, toolFailure(\"Tool cancelled before execution\"));\n let alive = true;\n let updates = Promise.resolve();\n let result: AgentToolResult;\n try {\n const executed = await tool?.execute(call.id, args, signal, (partialResult) => {\n if (!alive) return;\n updates = updates\n .then(() =>\n emit({\n type: \"tool_execution_update\",\n toolCallId: call.id,\n toolName: call.name,\n args,\n partialResult,\n }),\n )\n .catch(() => {\n // The loop retains sink failures. Still finalize the executed tool so\n // its result and side effects survive a failed progress notification.\n });\n });\n if (!executed) throw new Error(\"Tool returned no result\");\n result = executed;\n } catch (error) {\n result = toolFailure(error);\n } finally {\n alive = false;\n await updates;\n }\n try {\n const replacement = await config.afterToolCall?.(\n {\n assistantMessage: assistant,\n toolCall: call,\n args,\n context,\n result,\n isError: result.isError ?? false,\n },\n signal,\n );\n if (replacement) result = { ...result, ...replacement };\n if (result.details !== undefined && !isJsonValue(result.details))\n throw new Error(\"Tool details must be JSON serializable\");\n } catch (error) {\n result = toolFailure(error);\n }\n return finish(call, result);\n }\n\n // Preflight failures are finalized immediately and never enter afterToolCall.\n async function schedule(call: ToolCall): Promise<() => Promise<ToolResultMessage>> {\n const prepared = await prepare(call);\n if (prepared.error) {\n const result = await finish(call, prepared.error);\n return async () => result;\n }\n return () => execute(prepared);\n }\n return { schedule };\n}\n","import type { AssistantMessage, ToolCall, ToolResultMessage } from \"@zpi-dev/ai\";\nimport { createToolExecutor, finishToolCall, toolFailure, toolResultMessage } from \"./tool-execution.ts\";\nimport type { AgentContext, AgentEventSink, AgentLoopConfig } from \"./types.ts\";\n\nconst CANCEL_DRAIN_TIMEOUT_MS = 250;\n\nexport function shouldExecuteDuringStream(\n context: AgentContext,\n config: AgentLoopConfig,\n call: ToolCall,\n): boolean {\n // A later declaration can make the entire batch sequential. Defer speculation\n // whenever such a tool is available, before any earlier call can run out of order.\n if (\n !call.name.trim() ||\n config.streamingToolExecution === \"off\" ||\n config.toolExecution === \"sequential\" ||\n context.tools?.some((tool) => tool.executionMode === \"sequential\")\n )\n return false;\n const tool = context.tools?.find((t) => t.name === call.name);\n const metadata = tool?.metadata;\n return !!(\n metadata?.readOnly &&\n metadata.concurrentSafe &&\n !metadata.destructive &&\n !metadata.needsApproval &&\n !(tool?.requiresUserInteraction ?? metadata.requiresUserInteraction) &&\n (tool?.permission?.sideEffectScope ?? metadata.sideEffectScope) === \"none\"\n );\n}\n\nasync function withinDrainWindow<T>(promise: Promise<T>): Promise<T | undefined> {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<undefined>((resolve) => {\n timeout = setTimeout(() => resolve(undefined), CANCEL_DRAIN_TIMEOUT_MS);\n }),\n ]);\n } finally {\n clearTimeout(timeout);\n }\n}\n\n/** One coordinator per streamed response; no handles survive recovery or cancellation. */\nexport function createStreamingToolCoordinator(\n context: AgentContext,\n config: AgentLoopConfig,\n emit: AgentEventSink,\n signal?: AbortSignal,\n) {\n const controller = new AbortController();\n const abort = () => controller.abort();\n if (signal?.aborted) abort();\n signal?.addEventListener(\"abort\", abort, { once: true });\n const handles = new Map<string, Promise<ToolResultMessage | undefined>>();\n const accepted = new Set<string>();\n const ended = new Set<string>();\n let active = true;\n let preparation = Promise.resolve();\n const streamingEmit: AgentEventSink = async (event) => {\n if (!active) return;\n await emit(\n event.type === \"tool_execution_start\" ? { ...event, executionTiming: \"during_stream\" } : event,\n );\n if (event.type === \"tool_execution_end\") ended.add(event.toolCallId);\n };\n function detach() {\n active = false;\n signal?.removeEventListener(\"abort\", abort);\n }\n return {\n accept(call: ToolCall, assistant: AssistantMessage) {\n if (accepted.has(call.id)) return;\n // Arguments belong to the closed call, never to a later mutable stream partial.\n const closed = structuredClone(call);\n accepted.add(call.id);\n if (!shouldExecuteDuringStream(context, config, closed)) return;\n const executor = createToolExecutor(\n context,\n structuredClone(assistant),\n config,\n streamingEmit,\n controller.signal,\n );\n const scheduled = preparation.then(() => executor.schedule(closed));\n preparation = scheduled.then(\n () => undefined,\n () => undefined,\n );\n // Infrastructure failure falls back to normal end-of-stream execution, as in ZCode.\n handles.set(\n closed.id,\n scheduled.then((execute) => execute()).catch(() => undefined),\n );\n },\n async drain(calls: ToolCall[]): Promise<Map<string, ToolResultMessage>> {\n const results = new Map<string, ToolResultMessage>();\n let onCancel: (() => void) | undefined;\n try {\n const completed = Promise.all(calls.map((call) => handles.get(call.id)));\n const cancelled = new Promise<undefined>((resolve) => {\n onCancel = () => resolve(undefined);\n if (signal?.aborted) onCancel();\n else signal?.addEventListener(\"abort\", onCancel, { once: true });\n });\n const settled = await Promise.race([completed, cancelled]);\n if (!settled) return await this.interrupt(calls);\n for (const [index, call] of calls.entries()) {\n const result = settled[index];\n if (result) results.set(call.id, result);\n }\n return results;\n } finally {\n if (onCancel) signal?.removeEventListener(\"abort\", onCancel);\n detach();\n }\n },\n async interrupt(calls: ToolCall[]): Promise<Map<string, ToolResultMessage>> {\n abort();\n const settled = await Promise.all(\n calls.map((call) => {\n const handle = handles.get(call.id);\n return handle ? withinDrainWindow(handle) : undefined;\n }),\n );\n detach();\n const results = new Map<string, ToolResultMessage>();\n for (const [index, call] of calls.entries()) {\n const result = settled[index];\n if (result) {\n results.set(call.id, result);\n continue;\n }\n const reason = handles.has(call.id) ? \"unknown_execution_state\" : \"not_executed\";\n const text =\n reason === \"not_executed\"\n ? \"Tool execution was interrupted during streaming recovery before this tool was executed. Treat this tool call as failed and do not retry blindly.\"\n : \"Tool execution was interrupted during streaming recovery before a result was committed. Side effects may be unknown; inspect current state before retrying.\";\n if (!handles.has(call.id))\n await emit({\n type: \"tool_execution_start\",\n toolCallId: call.id,\n toolName: call.name,\n args: call.arguments,\n toolCall: call,\n });\n const failure = {\n ...toolFailure(text),\n details: { type: \"stream_recovery_interrupted_tool\", reason },\n };\n // A failed infrastructure path may already have emitted end. History still needs a paired result.\n const message = ended.has(call.id)\n ? toolResultMessage(call, failure)\n : await finishToolCall(call, failure, emit);\n results.set(call.id, message);\n }\n return results;\n },\n async abandon() {\n abort();\n await withinDrainWindow(Promise.allSettled(handles.values()));\n detach();\n },\n };\n}\n","import type { ToolResultMessage } from \"@zpi-dev/ai\";\nimport { emptyAssistant, getCurrentTools, normalizeContext, toToolDeclaration } from \"@zpi-dev/ai\";\nimport { createStreamingToolCoordinator } from \"./streaming-tool-coordinator.ts\";\nimport { createToolExecutor } from \"./tool-execution.ts\";\nimport type { AgentContext, AgentEventSink, AgentLoopConfig, AgentMessage, StreamFn } from \"./types.ts\";\n\nfunction declareTools(context: AgentContext): AgentMessage[] {\n const old = getCurrentTools(context.messages);\n const next = (context.tools ?? []).map(toToolDeclaration);\n const added = next.filter((t) => JSON.stringify(old.find((o) => o.name === t.name)) !== JSON.stringify(t));\n const removed = old.filter((t) => !next.some((n) => n.name === t.name)).map((t) => ({ name: t.name }));\n return added.length || removed.length\n ? [{ role: \"system\", content: \"\", toolsAdded: added, toolsRemoved: removed, timestamp: Date.now() }]\n : [];\n}\nexport async function runAgentLoop(\n prompts: AgentMessage[],\n context: AgentContext,\n config: AgentLoopConfig,\n emit: AgentEventSink,\n signal: AbortSignal | undefined,\n streamFn: StreamFn,\n): Promise<AgentMessage[]> {\n return run([...declareTools(context), ...prompts], context, config, emit, signal, streamFn);\n}\nexport async function runAgentLoopContinue(\n context: AgentContext,\n config: AgentLoopConfig,\n emit: AgentEventSink,\n signal: AbortSignal | undefined,\n streamFn: StreamFn,\n): Promise<AgentMessage[]> {\n const converted = await config.convertToLlm(context.messages);\n const last = converted.findLast((message) => message.role !== \"system\");\n if (!last || (last.role !== \"user\" && last.role !== \"toolResult\"))\n throw new Error(\"Cannot continue: last message must be user or toolResult\");\n return run(declareTools(context), context, config, emit, signal, streamFn);\n}\nasync function run(\n prompts: AgentMessage[],\n initial: AgentContext,\n config: AgentLoopConfig,\n sink: AgentEventSink,\n signal: AbortSignal | undefined,\n streamFn: StreamFn,\n): Promise<AgentMessage[]> {\n let listenerError: unknown;\n const emit: AgentEventSink = async (event) => {\n try {\n await sink(event);\n } catch (e) {\n listenerError = e;\n throw e;\n }\n };\n const context: AgentContext = { messages: [...initial.messages], tools: initial.tools };\n const fresh: AgentMessage[] = [];\n async function add(message: AgentMessage): Promise<void> {\n context.messages.push(message);\n fresh.push(message);\n await emit({ type: \"message_start\", message });\n await emit({ type: \"message_end\", message });\n }\n await emit({ type: \"agent_start\" });\n await emit({ type: \"turn_start\" });\n try {\n for (const prompt of prompts) await add(prompt);\n while (true) {\n for (const message of config.getPendingMessages?.() ?? []) await add(message);\n let assistant = emptyAssistant(config.model);\n let started = false;\n let coordinator = createStreamingToolCoordinator(context, config, emit, signal);\n let streamed = new Map<string, ToolResultMessage>();\n let recovering = false;\n try {\n if (signal?.aborted) throw new Error(\"Run aborted\");\n const transformed = config.transformContext\n ? await config.transformContext([...context.messages], signal)\n : context.messages;\n const transcript = normalizeContext({ messages: await config.convertToLlm(transformed) });\n const {\n model: _,\n convertToLlm: __,\n transformContext: ___,\n getApiKey,\n beforeToolCall: ____,\n afterToolCall: _____,\n toolExecution: ______,\n streamingToolExecution: _______,\n prepareNextTurnWithContext: ________,\n getSteeringMessages: _________,\n getPendingMessages: __________,\n beforeStop: ___________,\n ...options\n } = config;\n const apiKey = (await getApiKey?.(config.model.provider)) ?? config.apiKey;\n const events = await streamFn(config.model, transcript, {\n ...options,\n apiKey,\n signal,\n });\n for await (const event of events) {\n if (event.type === \"start\") {\n assistant = event.partial;\n started = true;\n await emit({ type: \"message_start\", message: assistant });\n } else if (event.type === \"done\") assistant = event.message;\n else if (event.type === \"error\") assistant = event.error;\n else {\n assistant = event.partial;\n await emit({ type: \"message_update\", message: assistant, assistantMessageEvent: event });\n if (event.type === \"reset\" && !recovering) {\n const closed = assistant.content.filter((c) => c.type === \"toolCall\");\n streamed = await coordinator.interrupt(closed);\n recovering = closed.length > 0;\n if (!recovering) coordinator = createStreamingToolCoordinator(context, config, emit, signal);\n } else if (event.type === \"toolcall_end\" && !recovering) {\n coordinator.accept(event.toolCall, assistant);\n }\n }\n }\n assistant = await events.result();\n } catch (error) {\n if (listenerError) {\n await coordinator.abandon();\n throw listenerError;\n }\n assistant.stopReason = signal?.aborted ? \"aborted\" : \"error\";\n assistant.errorMessage = error instanceof Error ? error.message : String(error);\n }\n const seenCallIds = new Set<string>();\n let duplicateId: string | undefined;\n const uniqueContent = assistant.content.filter((part) => {\n if (part.type !== \"toolCall\") return true;\n if (seenCallIds.has(part.id)) {\n duplicateId = part.id;\n return false;\n }\n seenCallIds.add(part.id);\n return true;\n });\n if (duplicateId !== undefined)\n assistant = {\n ...assistant,\n content: uniqueContent,\n stopReason: \"error\",\n errorMessage: `Provider returned duplicate tool call ID: ${duplicateId}`,\n };\n const calls = assistant.content.filter((c) => c.type === \"toolCall\");\n try {\n if (!recovering) {\n streamed =\n signal?.aborted || [\"error\", \"aborted\", \"length\"].includes(assistant.stopReason)\n ? await coordinator.interrupt(calls)\n : await coordinator.drain(calls);\n }\n if (listenerError) throw listenerError;\n if (!started) await emit({ type: \"message_start\", message: assistant });\n context.messages.push(assistant);\n fresh.push(assistant);\n await emit({ type: \"message_end\", message: assistant });\n } catch (error) {\n await coordinator.abandon();\n throw error;\n }\n // Close every declared call on cancellation; the executor rejects aborted calls\n // before tool hooks or execution, so durable history never keeps an orphan call.\n const results: ToolResultMessage[] = [];\n if (calls.length) {\n const executor = createToolExecutor(context, assistant, config, emit, signal);\n const sequential =\n config.toolExecution === \"sequential\" ||\n calls.some((c) => context.tools?.find((t) => t.name === c.name)?.executionMode === \"sequential\");\n if (sequential) {\n for (const call of calls) {\n const result = streamed.get(call.id) ?? (await (await executor.schedule(call))());\n results.push(result);\n await add(result);\n }\n } else {\n // Pi prepares every call in declaration order before launching the batch.\n const scheduled: (() => Promise<ToolResultMessage>)[] = [];\n for (const call of calls) {\n const result = streamed.get(call.id);\n scheduled.push(result ? async () => result : await executor.schedule(call));\n }\n const outcomes = await Promise.allSettled(scheduled.map((execute) => execute()));\n for (const outcome of outcomes) {\n if (outcome.status === \"fulfilled\") {\n results.push(outcome.value);\n await add(outcome.value);\n }\n }\n const rejected = outcomes.find((o) => o.status === \"rejected\");\n if (rejected?.status === \"rejected\") throw rejected.reason;\n }\n }\n await emit({ type: \"turn_end\", message: assistant, toolResults: results });\n if (listenerError) throw listenerError;\n if (signal?.aborted || [\"error\", \"aborted\", \"length\"].includes(assistant.stopReason)) break;\n // Finish the response and its tools without interrupting provider continuation.\n // Final text (including text without a phase) leaves queue-only mail for the next request.\n const acceptsPending =\n calls.length > 0 ||\n (assistant.content.length > 0 &&\n assistant.content.every(\n (part) =>\n part.type === \"thinking\" ||\n (part.type === \"text\" && (part.phase === \"commentary\" || part.phase === \"partial_answer\")),\n ));\n const steering = [\n ...(acceptsPending ? (config.getPendingMessages?.() ?? []) : []),\n ...(config.getSteeringMessages?.() ?? []),\n ];\n for (const message of steering) await add(message);\n if (!calls.length && !steering.length) {\n const feedback = await config.beforeStop?.(assistant, signal);\n if (signal?.aborted || !feedback?.length) break;\n for (const message of feedback) await add(message);\n }\n const next = await config.prepareNextTurnWithContext?.(\n { message: assistant, toolResults: results, context, newMessages: fresh },\n signal,\n );\n if (next?.context) {\n context.messages = next.context.messages;\n context.tools = next.context.tools;\n }\n if (signal?.aborted) break;\n await emit({ type: \"turn_start\" });\n }\n } finally {\n await emit({ type: \"agent_end\", messages: fresh });\n }\n return fresh;\n}\n","import type { ImageContent, Message, UserMessage } from \"@zpi-dev/ai\";\nimport { assertSupportedOptions, getCurrentSystemPrompt, toToolDeclaration } from \"@zpi-dev/ai\";\nimport { runAgentLoop, runAgentLoopContinue } from \"./agent-loop.ts\";\nimport type { AgentEvent, AgentMessage, AgentOptions, AgentState, PrepareNextTurnContext } from \"./types.ts\";\nexport class Agent {\n readonly state: AgentState;\n private options: AgentOptions;\n private listeners = new Set<(event: AgentEvent) => void | Promise<void>>();\n private controller?: AbortController;\n private running?: Promise<void>;\n private active = false;\n private partial?: AgentMessage;\n private pending = new Set<string>();\n private error?: string;\n constructor(options: AgentOptions) {\n assertSupportedOptions(\n options,\n [\n \"initialState\",\n \"streamFn\",\n \"convertToLlm\",\n \"transformContext\",\n \"getApiKey\",\n \"beforeToolCall\",\n \"afterToolCall\",\n \"onPayload\",\n \"onResponse\",\n \"toolExecution\",\n \"streamingToolExecution\",\n \"prepareNextTurnWithContext\",\n \"getSteeringMessages\",\n \"getPendingMessages\",\n \"beforeStop\",\n ],\n \"Agent\",\n );\n if (typeof options.streamFn !== \"function\") throw new Error(\"Agent requires streamFn\");\n this.options = options;\n const initial = options.initialState ?? {};\n assertSupportedOptions(\n initial,\n [\"model\", \"messages\", \"tools\", \"systemPrompt\", \"thinkingLevel\"],\n \"initialState\",\n );\n // No implicit default model: fail before accepting work.\n if (!initial.model) throw new Error(\"Agent requires an initial model\");\n let messages = [...(initial.messages ?? [])];\n let tools = [...(initial.tools ?? [])];\n if (messages[0]?.role !== \"system\" && (initial.systemPrompt || tools.length))\n messages.unshift({\n role: \"system\",\n content: initial.systemPrompt ?? \"\",\n toolsAdded: tools.map(toToolDeclaration),\n timestamp: 0,\n });\n const self = this;\n this.state = {\n model: initial.model,\n thinkingLevel: initial.thinkingLevel ?? \"off\",\n get systemPrompt() {\n return getCurrentSystemPrompt(messages);\n },\n get messages() {\n return messages;\n },\n set messages(value) {\n if (self.active) throw new Error(\"Agent busy\");\n messages = [...value];\n },\n get tools() {\n return tools;\n },\n set tools(value) {\n if (self.active) throw new Error(\"Agent busy\");\n tools = [...value];\n },\n get isStreaming() {\n return self.active;\n },\n get streamingMessage() {\n return self.partial;\n },\n get pendingToolCalls() {\n return self.pending;\n },\n get errorMessage() {\n return self.error;\n },\n };\n }\n get signal(): AbortSignal | undefined {\n return this.controller?.signal;\n }\n subscribe(listener: (event: AgentEvent) => void | Promise<void>): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n abort(): void {\n this.controller?.abort();\n }\n async waitForIdle(): Promise<void> {\n await this.running;\n }\n prompt(input: string | AgentMessage | AgentMessage[], images?: ImageContent[]): Promise<void> {\n const prompts: AgentMessage[] =\n typeof input === \"string\"\n ? [\n {\n role: \"user\",\n content: images?.length ? [{ type: \"text\", text: input }, ...images] : input,\n timestamp: Date.now(),\n } satisfies UserMessage,\n ]\n : Array.isArray(input)\n ? input\n : [input];\n return this.start(prompts);\n }\n continue(): Promise<void> {\n return this.start();\n }\n private start(prompts?: AgentMessage[]): Promise<void> {\n if (this.active) return Promise.reject(new Error(\"Agent busy: a run is already active\"));\n this.active = true;\n this.error = undefined;\n this.controller = new AbortController();\n const { initialState: _, streamFn: __, ...loopOptions } = this.options;\n const config = {\n ...loopOptions,\n model: this.state.model,\n convertToLlm:\n this.options.convertToLlm ??\n ((messages: AgentMessage[]) =>\n messages.filter((m) =>\n [\"system\", \"user\", \"assistant\", \"toolResult\"].includes(m.role),\n ) as Message[]),\n reasoning: this.state.thinkingLevel,\n prepareNextTurnWithContext: this.options.prepareNextTurnWithContext\n ? async (turn: PrepareNextTurnContext, signal?: AbortSignal) => {\n const next = await this.options.prepareNextTurnWithContext?.(turn, signal);\n if (next?.context)\n this.state.messages.splice(0, this.state.messages.length, ...next.context.messages);\n return next;\n }\n : undefined,\n };\n const emit = async (event: AgentEvent): Promise<void> => {\n if (event.type === \"message_start\" && event.message.role === \"assistant\") this.partial = event.message;\n if (event.type === \"message_update\") this.partial = event.message;\n if (event.type === \"message_end\") {\n this.state.messages.push(event.message);\n this.partial = undefined;\n if (event.message.role === \"assistant\") this.error = event.message.errorMessage;\n }\n if (event.type === \"tool_execution_start\") this.pending.add(event.toolCallId);\n if (event.type === \"tool_execution_end\") this.pending.delete(event.toolCallId);\n try {\n for (const listener of this.listeners) await listener(event);\n } catch (error) {\n // A streamed tool can fail its sink while the provider is still generating.\n this.controller?.abort();\n throw error;\n }\n };\n const context = { messages: [...this.state.messages], tools: [...this.state.tools] };\n // Defer entry so running is installed before any callback can observe it.\n this.running = Promise.resolve()\n .then(async () => {\n if (prompts)\n await runAgentLoop(prompts, context, config, emit, this.controller?.signal, this.options.streamFn);\n else\n await runAgentLoopContinue(context, config, emit, this.controller?.signal, this.options.streamFn);\n })\n .finally(() => {\n this.active = false;\n this.partial = undefined;\n this.pending.clear();\n this.controller = undefined;\n });\n return this.running;\n }\n}\n","import type { AgentLoopConfig, AgentMessage } from \"@zpi-dev/agent\";\nimport { contentText } from \"@zpi-dev/ai\";\nimport { Check } from \"typebox/value\";\nimport {\n type HookEvent,\n type HookExecution,\n type HookRegistration,\n HookRunner,\n hookEvents,\n maxHookContextChars,\n} from \"./hooks.ts\";\n\n/** Bridges lifecycle decisions to the loop; the runner never owns session history. */\nexport class SessionHooks {\n readonly runner: HookRunner;\n private started = false;\n private startMessages: AgentMessage[] = [];\n private pending = new Map<HookEvent, Map<number, string[]>>();\n private callOrder = new Map<string, number>();\n private continuations = 0;\n private context: { sessionId: string; cwd: string; source: \"startup\" | \"resume\" };\n constructor(\n context: { sessionId: string; cwd: string; source: \"startup\" | \"resume\" },\n hooks: readonly (HookRegistration & { pluginId?: string })[],\n observe: (event: HookExecution) => void,\n ) {\n this.context = context;\n this.runner = new HookRunner(hooks, observe);\n }\n beginRun(): void {\n this.pending.clear();\n this.callOrder.clear();\n this.continuations = 0;\n }\n async preparePrompt(prompt: string, signal?: AbortSignal): Promise<AgentMessage[]> {\n if (!this.started) {\n const result = await this.runner.run({ ...this.context, event: \"SessionStart\" }, signal);\n this.startMessages = contextMessages(\"SessionStart\", result.additionalContexts);\n this.started = true;\n }\n const result = await this.runner.run({ ...this.context, event: \"UserPromptSubmit\", prompt }, signal);\n if (result.block) throw new Error(result.reason ?? \"Input blocked by hook\");\n const messages = [\n ...this.startMessages,\n ...contextMessages(\"UserPromptSubmit\", result.additionalContexts),\n ];\n this.startMessages = [];\n return messages;\n }\n drainMessages(): AgentMessage[] {\n const messages = [...this.pending]\n .sort(([a], [b]) => hookEvents.indexOf(a) - hookEvents.indexOf(b))\n .flatMap(([event, entries]) =>\n contextMessages(\n event,\n [...entries].sort(([a], [b]) => a - b).flatMap(([, contexts]) => contexts),\n ),\n );\n this.pending.clear();\n this.callOrder.clear();\n return messages;\n }\n beforeToolCall: NonNullable<AgentLoopConfig[\"beforeToolCall\"]> = async (call, signal) => {\n this.continuations = 0;\n this.callOrder.set(call.toolCall.id, this.callOrder.size);\n const result = await this.runner.run(\n {\n ...this.context,\n event: \"PreToolUse\",\n toolCallId: call.toolCall.id,\n toolName: call.toolCall.name,\n toolInput: call.args,\n },\n signal,\n (input) => {\n const tool = call.context.tools?.find((tool) => tool.name === call.toolCall.name);\n const args = tool?.prepareArguments ? tool.prepareArguments(structuredClone(input)) : input;\n if (!tool || !Check(tool.parameters, args)) throw new Error(\"Invalid hook tool input\");\n return args;\n },\n );\n this.enqueue(\"PreToolUse\", call.toolCall.id, result.additionalContexts);\n return { block: result.block, reason: result.reason, args: result.updatedInput };\n };\n afterToolCall: NonNullable<AgentLoopConfig[\"afterToolCall\"]> = async (call, signal) => {\n const event = call.isError ? \"PostToolUseFailure\" : \"PostToolUse\";\n try {\n const result = await this.runner.run(\n {\n ...this.context,\n event,\n toolCallId: call.toolCall.id,\n toolName: call.toolCall.name,\n toolInput: call.args,\n toolResult: call.result,\n },\n signal,\n );\n this.enqueue(event, call.toolCall.id, result.additionalContexts);\n } catch (error) {\n // 工具已经完成;取消 hook 只能结束等待,不能抹掉已执行结果和文件变更事实。\n if (!signal?.aborted) throw error;\n }\n return undefined;\n };\n beforeStop: NonNullable<AgentLoopConfig[\"beforeStop\"]> = async (message, signal) => {\n if (this.continuations >= 3) return;\n const result = await this.runner.run(\n {\n ...this.context,\n event: \"Stop\",\n response: contentText(message.content, \"\"),\n stopHookActive: this.continuations > 0,\n },\n signal,\n );\n if (!result.additionalContexts.length) return;\n this.continuations++;\n return contextMessages(\"Stop\", result.additionalContexts);\n };\n private enqueue(event: HookEvent, toolCallId: string, contexts: string[]): void {\n if (!contexts.length) return;\n const entries = this.pending.get(event) ?? new Map<number, string[]>();\n entries.set(this.callOrder.get(toolCallId) ?? 0, contexts);\n this.pending.set(event, entries);\n }\n}\n\nfunction contextMessages(event: HookEvent, contexts: string[]): AgentMessage[] {\n return contexts.length\n ? [\n {\n role: \"user\",\n synthetic: true,\n content: `<hook_context event=\"${event}\">\\n${contexts.join(\"\\n\\n\").slice(0, maxHookContextChars)}\\n</hook_context>`,\n timestamp: Date.now(),\n },\n ]\n : [];\n}\n","export const localCommands = [{ name: \"compact\", description: \"摘要旧对话,保留完整历史\" }] as const;\nexport function listCommands(\n commands: readonly { name: string; description: string }[] = [],\n): { name: string; description: string }[] {\n return [...commands, ...localCommands].map(({ name, description }) => ({ name, description }));\n}\nexport type ParsedInput = { kind: \"prompt\"; text: string } | { kind: \"compact\"; args: string };\nexport function parseInput(text: string): ParsedInput {\n const trimmed = text.trim();\n const command = /^\\/(\\S+)(?:\\s+([\\s\\S]*))?$/.exec(trimmed);\n if (command && command[1] === \"compact\") {\n const name = command[1];\n return { kind: name, args: command[2]?.trim() ?? \"\" };\n }\n return { kind: \"prompt\", text };\n}\n","import type { Message, SystemMessage } from \"@zpi-dev/ai\";\n\nfunction sdkBlock(name: string): boolean {\n return name.startsWith(\"zpi.\") || name.startsWith('[\"plugin\",');\n}\n\n/** Full desired SDK state in, only changed blocks out. Foreign system state is never withdrawn. */\nexport function contextUpdate(\n messages: readonly Message[],\n current: Readonly<Record<string, string>>,\n): SystemMessage | undefined {\n const previous = new Map<string, string | null>();\n for (const message of messages) {\n if (message.role !== \"system\") continue;\n for (const [name, value] of Object.entries(message.sections ?? {}))\n if (sdkBlock(name)) previous.set(name, value || null);\n }\n const sections: Record<string, string | null> = Object.create(null);\n for (const [name, value] of Object.entries(current)) {\n if (!sdkBlock(name) || typeof value !== \"string\") throw new Error(`Invalid SDK context block: ${name}`);\n const next = value || null;\n if (next !== (previous.get(name) ?? null)) sections[name] = next;\n }\n for (const [name, value] of previous)\n if (!Object.hasOwn(current, name) && value !== null) sections[name] = null;\n return Object.keys(sections).length\n ? { role: \"system\", content: \"\", sections, timestamp: Date.now() }\n : undefined;\n}\n","/** Pi's header/body idle timeout, adapted for both Node fetch and Electron net.fetch. */\nexport function withHttpIdleTimeout(requestFetch: typeof fetch, timeoutMs: number): typeof fetch {\n if (timeoutMs === 0) return requestFetch;\n return async (input, init) => {\n const parent = init?.signal ?? (input instanceof Request ? input.signal : undefined);\n const controller = new AbortController();\n const abort = () => controller.abort(parent?.reason);\n parent?.addEventListener(\"abort\", abort, { once: true });\n if (parent?.aborted) abort();\n let timer: ReturnType<typeof setTimeout> | undefined;\n const cleanup = () => {\n clearTimeout(timer);\n parent?.removeEventListener(\"abort\", abort);\n };\n const timed = async <T>(operation: () => Promise<T>, phase: \"headers\" | \"body\"): Promise<T> => {\n controller.signal.throwIfAborted();\n let onAbort: (() => void) | undefined;\n const cancelled = new Promise<never>((_, reject) => {\n onAbort = () => reject(controller.signal.reason ?? new DOMException(\"Request aborted\", \"AbortError\"));\n controller.signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n const error = new TypeError(\"fetch failed\", {\n cause: Object.assign(new Error(`${phase} timeout`), {\n code: phase === \"headers\" ? \"UND_ERR_HEADERS_TIMEOUT\" : \"UND_ERR_BODY_TIMEOUT\",\n }),\n });\n controller.abort(error);\n reject(error);\n }, timeoutMs);\n });\n try {\n return await Promise.race([operation(), timeout, cancelled]);\n } finally {\n clearTimeout(timer);\n if (onAbort) controller.signal.removeEventListener(\"abort\", onAbort);\n }\n };\n try {\n const response = await timed(\n () => requestFetch(input, { ...init, signal: controller.signal }),\n \"headers\",\n );\n if (!response.body) {\n cleanup();\n return response;\n }\n const reader = response.body.getReader();\n const body = new ReadableStream<Uint8Array>({\n async pull(stream) {\n try {\n const next = await timed(() => reader.read(), \"body\");\n if (next.done) {\n cleanup();\n stream.close();\n } else stream.enqueue(next.value);\n } catch (error) {\n cleanup();\n stream.error(error);\n void reader.cancel(error).catch(() => {});\n }\n },\n async cancel(reason) {\n cleanup();\n controller.abort(reason);\n await reader.cancel(reason);\n },\n });\n const wrapped = new Response(body, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n Object.defineProperty(wrapped, \"url\", { value: response.url });\n return wrapped;\n } catch (error) {\n cleanup();\n throw error;\n }\n };\n}\n","import type { AssistantMessage, ModelPerformanceSample } from \"@zpi-dev/ai\";\n\nexport interface ModelPerformance {\n turns?: number;\n steps?: number;\n llmMs?: number;\n toolMs?: number;\n ttftMs?: number;\n tokensPerSecond?: number;\n inputTokens?: number;\n outputTokens?: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n cacheHitRate?: number;\n}\n\n/** Constant-size, committed task totals. No prompts or generated content are retained. */\nexport const emptyPerformanceTotals = () => ({\n turns: 0,\n steps: 0,\n llmMs: 0,\n toolMs: 0,\n ttftMs: 0,\n ttftCount: 0,\n decodeMs: 0,\n decodeTokens: 0,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n usageCount: 0,\n cacheCount: 0,\n});\nexport type ModelPerformanceTotals = ReturnType<typeof emptyPerformanceTotals> & { turnsKnown?: false };\n\nexport function validPerformanceTotals(value: unknown): value is ModelPerformanceTotals {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const data = value as Record<string, unknown>;\n return (\n (data.turnsKnown === undefined || data.turnsKnown === false) &&\n Object.keys(emptyPerformanceTotals()).every(\n (key) =>\n typeof data[key] === \"number\" &&\n Number.isFinite(data[key]) &&\n data[key] >= 0 &&\n (key.endsWith(\"Ms\") || Number.isSafeInteger(data[key])),\n )\n );\n}\n\nexport function modelPerformance(t: ModelPerformanceTotals): ModelPerformance {\n const input = t.inputTokens + t.cacheReadTokens + t.cacheWriteTokens;\n return {\n ...(t.steps ? { ...(t.turnsKnown === false ? {} : { turns: t.turns }), steps: t.steps } : {}),\n ...(t.llmMs > 0 ? { llmMs: t.llmMs } : {}),\n ...(t.toolMs > 0 ? { toolMs: t.toolMs } : {}),\n ...(t.ttftCount ? { ttftMs: t.ttftMs / t.ttftCount } : {}),\n ...(t.decodeMs > 0 && t.decodeTokens > 0\n ? { tokensPerSecond: (t.decodeTokens * 1000) / t.decodeMs }\n : {}),\n ...(t.usageCount\n ? {\n inputTokens: t.inputTokens,\n outputTokens: t.outputTokens,\n cacheReadTokens: t.cacheReadTokens,\n cacheWriteTokens: t.cacheWriteTokens,\n }\n : {}),\n ...(t.cacheCount && input > 0 ? { cacheHitRate: t.cacheReadTokens / input } : {}),\n };\n}\n\n/** Like the Harness dock, publish settled requests; keep prior readings while streaming. */\nexport class SessionPerformance {\n private totals: ModelPerformanceTotals;\n private epoch = 0;\n private countedTurn = false;\n private tools = new Map<string, number>();\n private changed: (value: ModelPerformance, totals: ModelPerformanceTotals) => void;\n constructor(\n changed: (value: ModelPerformance, totals: ModelPerformanceTotals) => void,\n initial?: ModelPerformanceTotals,\n ) {\n this.changed = changed;\n this.totals = initial && validPerformanceTotals(initial) ? { ...initial } : emptyPerformanceTotals();\n }\n get value(): ModelPerformance {\n return modelPerformance(this.totals);\n }\n get snapshot(): ModelPerformanceTotals {\n return { ...this.totals };\n }\n begin(): void {\n this.epoch++;\n this.countedTurn = false;\n this.tools.clear();\n }\n request() {\n const epoch = ++this.epoch;\n let sample: ModelPerformanceSample | undefined;\n let finished = false;\n return {\n update: (next: ModelPerformanceSample) => {\n if (!finished && epoch === this.epoch) sample = next;\n },\n finish: (\n success: boolean,\n message?: Pick<AssistantMessage, \"usage\" | \"usageAvailable\" | \"cacheUsageAvailable\">,\n ) => {\n if (finished || epoch !== this.epoch) return;\n finished = true;\n this.totals.steps++;\n if (!this.countedTurn) {\n this.totals.turns++;\n this.countedTurn = true;\n }\n const positive = (n: number | undefined): n is number =>\n n !== undefined && Number.isFinite(n) && n > 0;\n if (success && sample) {\n if (positive(sample.requestMs)) this.totals.llmMs += sample.requestMs;\n if (positive(sample.ttftMs)) {\n this.totals.ttftMs += sample.ttftMs;\n this.totals.ttftCount++;\n }\n // The dock's decode interval is first content to assembled response, excluding TTFT and tools.\n const decodeMs =\n positive(sample.requestMs) && positive(sample.ttftMs)\n ? sample.requestMs - sample.ttftMs\n : sample.generationMs;\n if (positive(sample.outputTokens) && positive(decodeMs)) {\n this.totals.decodeTokens += sample.outputTokens;\n this.totals.decodeMs += decodeMs;\n }\n }\n // Billed usage is separate from successful latency averages, including failed attempts with usage.\n if (message?.usageAvailable === true) {\n const u = message.usage;\n if (\n [u.input, u.output, u.cacheRead, u.cacheWrite].every((n) => Number.isSafeInteger(n) && n >= 0)\n ) {\n this.totals.inputTokens += u.input;\n this.totals.outputTokens += u.output;\n this.totals.cacheReadTokens += u.cacheRead;\n this.totals.cacheWriteTokens += u.cacheWrite;\n this.totals.usageCount++;\n if (message.cacheUsageAvailable) this.totals.cacheCount++;\n }\n }\n this.publish();\n },\n };\n }\n toolStart(id: string): void {\n this.tools.set(id, performance.now());\n }\n toolEnd(id: string): void {\n const start = this.tools.get(id);\n if (start === undefined) return;\n this.tools.delete(id);\n this.totals.toolMs += Math.max(0, performance.now() - start);\n this.publish();\n }\n settle(): void {\n this.epoch++;\n this.tools.clear();\n }\n dispose(): void {\n this.settle();\n }\n private publish(): void {\n this.changed(this.value, this.snapshot);\n }\n}\n","import type { ThinkingLevel } from \"@zpi-dev/agent\";\nimport type { ContextBreakdownItem, Model } from \"@zpi-dev/ai\";\nimport { thinkingChoices } from \"@zpi-dev/ai\";\nimport type { SessionEntry } from \"./session-manager.ts\";\n\nexport interface ContextUsage {\n contextWindow: number;\n inputTokens: number | null;\n percent: number | null;\n timestamp: number | null;\n source: \"server usage\" | \"unknown\";\n breakdown?: ContextBreakdownItem[];\n averageCacheHitRate?: number | null;\n}\nexport function contextUsage(entries: SessionEntry[], model: Model): ContextUsage {\n const result: ContextUsage = {\n contextWindow: model.contextWindow,\n inputTokens: null,\n percent: null,\n timestamp: null,\n source: \"unknown\",\n };\n let cacheRead = 0,\n totalInput = 0;\n for (const entry of entries) {\n if (entry.type === \"compaction\" || entry.type === \"model_change\") {\n cacheRead = 0;\n totalInput = 0;\n }\n if (entry.type !== \"message\" || entry.message.role !== \"assistant\") continue;\n const m = entry.message;\n if (\n m.model !== model.id ||\n m.provider !== model.provider ||\n [\"error\", \"aborted\"].includes(m.stopReason) ||\n m.usageAvailable === false ||\n m.cacheUsageAvailable !== true\n )\n continue;\n cacheRead += m.usage.cacheRead;\n totalInput += m.usage.input + m.usage.cacheRead + m.usage.cacheWrite;\n }\n for (const entry of [...entries].reverse()) {\n if (entry.type === \"compaction\") break;\n if (entry.type !== \"message\" || entry.message.role !== \"assistant\") continue;\n const m = entry.message;\n if (m.stopReason === \"error\" || m.stopReason === \"aborted\") continue;\n if (m.usageAvailable === false || (m.usageAvailable !== true && m.usage.totalTokens === 0)) continue;\n const inputTokens = m.usage.input + m.usage.cacheRead + m.usage.cacheWrite;\n return {\n contextWindow: model.contextWindow,\n inputTokens,\n percent: (inputTokens / model.contextWindow) * 100,\n timestamp: m.timestamp,\n source: \"server usage\",\n breakdown: m.contextBreakdown,\n averageCacheHitRate: totalInput > 0 ? cacheRead / totalInput : null,\n };\n }\n return result;\n}\nexport function supportedThinkingLevels(model: Model): ThinkingLevel[] {\n return thinkingChoices(model);\n}\n","import { open, readdir, readFile, realpath, stat } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport type { JsonObject } from \"@zpi-dev/ai\";\nimport { matchMarkdownFrontmatter, parseMarkdownFrontmatter } from \"./markdown.ts\";\nimport type { ResourceDiagnostic, ResourceLoader } from \"./types.ts\";\n\nexport interface SkillMetadata {\n name: string;\n description: string;\n path: string;\n baseDir: string;\n source: \"user\" | \"project\" | \"plugin\";\n}\nexport interface DiscoveredSkill extends SkillMetadata {\n enabled: boolean;\n overriddenBy?: string;\n}\nexport interface SkillPolicyOptions {\n projectDir: string;\n homeDir?: string;\n projectResources?: boolean;\n isSkillEnabled?: (path: string) => boolean;\n}\nexport interface SkillList {\n skills: SkillMetadata[];\n diagnostics: ResourceDiagnostic[];\n}\nexport interface LoadedSkill extends SkillMetadata {\n body: string;\n}\nfunction missing(error: unknown): boolean {\n return error instanceof Error && \"code\" in error && error.code === \"ENOENT\";\n}\nasync function metadataText(path: string): Promise<string> {\n // Skip devices and pipes before opening: a FIFO without a writer blocks discovery indefinitely.\n if (!(await stat(path)).isFile()) throw new Error(\"SKILL.md must be a regular file\");\n const file = await open(path, \"r\");\n try {\n let text = \"\";\n const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n for (let offset = 0; offset < 65536; offset += 1024) {\n const buffer = Buffer.alloc(1024);\n const { bytesRead } = await file.read(buffer, 0, buffer.length, offset);\n text += decoder.decode(buffer.subarray(0, bytesRead), { stream: bytesRead !== 0 });\n if (matchMarkdownFrontmatter(text)) return text;\n if (bytesRead === 0) break;\n }\n throw new Error(\"Missing or oversized YAML frontmatter (limit 64 KiB)\");\n } finally {\n await file.close();\n }\n}\nfunction skillMarkdown(text: string) {\n const parsed = parseMarkdownFrontmatter(text);\n if (!parsed) throw new Error(\"SKILL.md requires closed YAML frontmatter\");\n return parsed;\n}\nfunction parseMetadata(path: string, source: SkillMetadata[\"source\"], fields: JsonObject): SkillMetadata {\n const { description } = fields;\n const name = basename(dirname(path));\n if (typeof description !== \"string\" || !description.trim() || description.length > 1024)\n throw new Error(\"Skill description must contain 1–1024 characters\");\n return { name, description: description.trim(), path, baseDir: dirname(path), source };\n}\nexport class SkillCatalog {\n private discovered: DiscoveredSkill[] = [];\n private winners: SkillMetadata[] = [];\n private catalog: SkillList = { skills: [], diagnostics: [] };\n constructor(privateOptions: SkillPolicyOptions) {\n this.options = privateOptions;\n }\n private options: SkillPolicyOptions;\n async reload(): Promise<void> {\n const skills = new Map<string, SkillMetadata>();\n const discovered: SkillMetadata[] = [];\n const diagnostics: ResourceDiagnostic[] = [];\n const roots: { path: string; source: SkillMetadata[\"source\"] }[] = [\n { path: join(this.options.homeDir ?? homedir(), \".agents\", \"skills\"), source: \"user\" },\n { path: join(this.options.homeDir ?? homedir(), \".zpi\", \"skills\"), source: \"user\" },\n ...(this.options.projectResources === false\n ? []\n : [\n { path: join(this.options.projectDir, \".agents\", \"skills\"), source: \"project\" as const },\n { path: join(this.options.projectDir, \".zpi\", \"skills\"), source: \"project\" as const },\n ]),\n ];\n for (const root of roots) {\n try {\n const entries = await readdir(root.path, { withFileTypes: true });\n for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;\n const path = join(root.path, entry.name, \"SKILL.md\");\n try {\n const skill = parseMetadata(path, root.source, skillMarkdown(await metadataText(path)).fields);\n skill.path = await realpath(skill.path);\n discovered.push(skill);\n skills.set(skill.name, skill);\n } catch (e) {\n if (!missing(e)) diagnostics.push({ path, message: String(e) });\n }\n }\n } catch (e) {\n if (!missing(e)) diagnostics.push({ path: root.path, message: String(e) });\n }\n }\n this.winners = [...skills.values()];\n const lastByPath = new Map(discovered.map((skill, index) => [skill.path, index]));\n this.discovered = discovered\n .filter((skill, index) => lastByPath.get(skill.path) === index)\n .map((skill) => ({\n ...skill,\n enabled: this.options.isSkillEnabled?.(skill.path) !== false,\n ...(skills.get(skill.name)?.path !== skill.path\n ? { overriddenBy: skills.get(skill.name)?.path }\n : {}),\n }));\n this.catalog = {\n skills: this.winners.filter((skill) => this.options.isSkillEnabled?.(skill.path) !== false),\n diagnostics,\n };\n }\n listSkills(): SkillList {\n return structuredClone(this.catalog);\n }\n listDiscoveredSkills(): DiscoveredSkill[] {\n return structuredClone(this.discovered);\n }\n async loadSkill(name: string): Promise<LoadedSkill> {\n const winner = this.winners.find((s) => s.name === name);\n if (winner && !this.catalog.skills.some((s) => s.path === winner.path))\n throw new Error(`invalid_input: Skill disabled: ${name}`);\n const skill = this.catalog.skills.find((s) => s.name === name);\n if (!skill) throw new Error(`invalid_input: Skill not found: ${name}`);\n const text = await readFile(skill.path, \"utf8\");\n const parsed = skillMarkdown(text);\n const current = parseMetadata(skill.path, skill.source, parsed.fields);\n return { ...current, name: skill.name, body: parsed.body };\n }\n}\nexport class FileResourceLoader implements ResourceLoader {\n private options: SkillPolicyOptions;\n private catalog: SkillCatalog;\n private instructions: string[] = [];\n private diagnostics: ResourceDiagnostic[] = [];\n constructor(options: SkillPolicyOptions) {\n this.options = options;\n this.catalog = new SkillCatalog(options);\n }\n getBaseInstructions(): undefined {\n return undefined;\n }\n getInstructions(): string[] {\n return [...this.instructions];\n }\n\n async reload(): Promise<void> {\n const home = this.options.homeDir ?? homedir();\n const project = resolve(this.options.projectDir);\n const files = [\n join(home, \".agents\", \"AGENTS.md\"),\n join(home, \".zpi\", \"AGENTS.md\"),\n ...(this.options.projectResources === false\n ? []\n : [join(project, \"AGENTS.md\"), join(project, \".zpi\", \"AGENTS.md\")]),\n ];\n // At most four instruction files; keep their precedence and diagnostics in source order.\n const [instructions] = await Promise.all([\n Promise.allSettled(\n files.map(async (file) => {\n if (!(await stat(file)).isFile()) throw new Error(\"AGENTS.md must be a regular file\");\n return `<project_instructions path=\"${xml(file)}\">\\n${await readFile(file, \"utf8\")}\\n</project_instructions>`;\n }),\n ),\n this.catalog.reload(),\n ]);\n const append: string[] = [];\n const diagnostics: ResourceDiagnostic[] = [];\n for (const [index, result] of instructions.entries()) {\n if (result.status === \"fulfilled\") append.push(result.value);\n else if (!missing(result.reason))\n diagnostics.push({ path: files[index], message: String(result.reason) });\n }\n const skills = this.catalog.listSkills();\n diagnostics.push(...skills.diagnostics);\n if (append.length)\n append.splice(\n 0,\n append.length,\n `<project_context>\\nProject-specific instructions and guidelines:\\n\\n${append.join(\"\\n\\n\")}\\n</project_context>`,\n );\n if (skills.skills.length) append.push(formatSkillsForPrompt(skills.skills));\n this.instructions = append;\n this.diagnostics = diagnostics;\n }\n listSkills(): SkillList {\n return this.catalog.listSkills();\n }\n listDiscoveredSkills(): DiscoveredSkill[] {\n return this.catalog.listDiscoveredSkills();\n }\n loadSkill(name: string): Promise<LoadedSkill> {\n return this.catalog.loadSkill(name);\n }\n getDiagnostics(): ResourceDiagnostic[] {\n return structuredClone(this.diagnostics);\n }\n}\n\nfunction xml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\nexport function formatSkillsForPrompt(\n skills: SkillMetadata[],\n tool: \"read\" | \"bash\" | \"Read\" | \"Bash\" | \"Skill\" = \"read\",\n): string {\n return [\n \"<skills>\",\n \"The following skills provide specialized instructions for specific tasks.\",\n tool === \"Skill\"\n ? \"Use the Skill tool with the skill name to load its instructions when the task matches its description.\"\n : `Use the ${tool} tool to load a skill's file when the task matches its description.`,\n \"When a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.\",\n \"\",\n \"<available_skills>\",\n ...skills.flatMap((s) => [\n \" <skill>\",\n ` <name>${xml(s.name)}</name>`,\n ` <description>${xml(s.description)}</description>`,\n ` <location>${xml(s.path)}</location>`,\n \" </skill>\",\n ]),\n \"</available_skills>\",\n \"</skills>\",\n ].join(\"\\n\");\n}\n","import { isJsonObject, type JsonObject } from \"@zpi-dev/ai\";\nimport { parseDocument } from \"yaml\";\n\nexport interface MarkdownFrontmatter {\n fields: JsonObject;\n body: string;\n bodyOffset: number;\n}\n\n/** Match closed fences without parsing YAML, including during bounded metadata discovery. */\nexport function matchMarkdownFrontmatter(text: string): { yaml: string; bodyOffset: number } | undefined {\n const match = /^\\uFEFF?---[ \\t]*\\r?\\n([\\s\\S]*?)\\r?\\n---[ \\t]*(?:\\r?\\n|$)/.exec(text);\n return match ? { yaml: match[1], bodyOffset: match[0].length } : undefined;\n}\n\n/** Syntax only: callers own required fields and whether frontmatter is mandatory. */\nexport function parseMarkdownFrontmatter(text: string): MarkdownFrontmatter | undefined {\n const match = matchMarkdownFrontmatter(text);\n if (!match) return;\n const document = parseDocument(match.yaml, { uniqueKeys: true });\n if (document.errors.length) throw new Error(document.errors.map((error) => error.message).join(\"; \"));\n const fields: unknown = document.toJS({ maxAliasCount: 20 });\n if (!isJsonObject(fields)) throw new Error(\"YAML frontmatter must be an object\");\n return { fields, body: text.slice(match.bodyOffset).trim(), bodyOffset: match.bodyOffset };\n}\n","import type { AgentTool, AgentToolResult, AgentToolUpdateCallback, ThinkingLevel } from \"@zpi-dev/agent\";\nimport type { JsonValue, Model } from \"@zpi-dev/ai\";\nimport type { Static, TSchema } from \"typebox\";\nimport type { LoadedSkill, SkillList } from \"./resources.ts\";\nimport type { SessionManager } from \"./session-manager.ts\";\nimport type { ImageResizeOptions } from \"./tools/pi/utils/image-resize-core.ts\";\n/** Resource discovery is separate from explicit customInstructions. */\nexport interface ResourceLoader {\n getBaseInstructions?(): string | undefined;\n getInstructions?(): readonly string[];\n reload?(): Promise<void>;\n listSkills?(): SkillList;\n loadSkill?(name: string): Promise<LoadedSkill>;\n getDiagnostics?(): ResourceDiagnostic[];\n}\nexport interface ResourceDiagnostic {\n path: string;\n message: string;\n}\nexport function resourceInstructions(loader?: ResourceLoader): readonly string[] {\n return loader?.getInstructions?.() ?? [];\n}\nexport function resourceBaseInstructions(loader?: ResourceLoader): string | undefined {\n return loader?.getBaseInstructions?.();\n}\nexport class StaticResourceLoader implements ResourceLoader {\n private baseInstructions?: string;\n private instructions: readonly string[];\n constructor(options: { baseInstructions?: string; instructions?: readonly string[] } = {}) {\n this.baseInstructions = options.baseInstructions;\n this.instructions = [...(options.instructions ?? [])];\n }\n getBaseInstructions(): string | undefined {\n return this.baseInstructions;\n }\n getInstructions(): string[] {\n return [...this.instructions];\n }\n}\n/** Session context supplied to custom tools and built-in overrides. */\nexport interface ToolContext {\n cwd: string;\n model: Model & { inputLimits?: { images?: { resize?: ImageResizeOptions } } };\n sessionManager: SessionManager;\n thinkingLevel?: ThinkingLevel;\n signal?: AbortSignal;\n isIdle(): boolean;\n getSystemPrompt(): string;\n getToolNames?(): string[];\n}\nexport interface ToolDefinition<\n TParameters extends TSchema = TSchema,\n TDetails = JsonValue | undefined,\n TContext = ToolContext,\n> extends Pick<AgentTool, \"executionMode\" | \"metadata\" | \"permission\" | \"requiresUserInteraction\"> {\n name: string;\n label: string;\n description: string;\n parameters: TParameters;\n promptSnippet?: string;\n promptGuidelines?: string[];\n /** Optional result schema metadata; tool results retain their existing runtime validation. */\n outputSchema?: TSchema;\n prepareArguments?: (args: unknown) => Static<TParameters>;\n execute(\n toolCallId: string,\n params: Static<TParameters>,\n signal: AbortSignal | undefined,\n onUpdate: AgentToolUpdateCallback<TDetails> | undefined,\n context: TContext,\n ): Promise<AgentToolResult<TDetails>>;\n}\n","import type { AgentTool } from \"@zpi-dev/agent\";\nimport { formatSkillsForPrompt } from \"./resources.ts\";\nimport { type ResourceLoader, resourceBaseInstructions, resourceInstructions } from \"./types.ts\";\nexport interface PromptTemplate {\n id: string;\n name: string;\n preamble: string;\n rules: string;\n}\nexport const piTemplate: PromptTemplate = {\n id: \"pi\",\n name: \"ZPI 通用\",\n preamble:\n \"You are an expert coding assistant operating inside ZPI, a coding agent harness. You help users by reading files, executing commands, editing code, and writing new files.\",\n rules: \"Be concise in your responses\\nShow file paths clearly when working with files\",\n};\nexport function validateTemplate(template: PromptTemplate): void {\n if (\n !template ||\n typeof template.id !== \"string\" ||\n !/^[a-zA-Z0-9_-]+$/.test(template.id) ||\n typeof template.name !== \"string\" ||\n !template.name.trim() ||\n template.name.length > 200 ||\n typeof template.preamble !== \"string\" ||\n typeof template.rules !== \"string\" ||\n template.preamble.length + template.rules.length > 100000\n )\n throw new Error(\"invalid_input: 提示词模板无效\");\n for (const match of `${template.preamble}\\n${template.rules}`.matchAll(/{{([\\s\\S]*?)}}/g))\n if (![\"cwd\", \"project_name\", \"platform\"].includes(match[1].trim()))\n throw new Error(`invalid_input: 未知占位符 {{${match[1]}}}`);\n}\nexport function renderTemplate(\n text: string,\n context: { cwd: string; project_name: string; platform: string },\n): string {\n return text.replace(\n /{{\\s*(cwd|project_name|platform)\\s*}}/g,\n (_, key: keyof typeof context) => context[key],\n );\n}\nexport interface SystemContext {\n base: string;\n sections: Record<string, string>;\n}\nexport function buildSystemContext(options: {\n cwd: string;\n projectName?: string;\n platform?: string;\n template?: PromptTemplate;\n tools: readonly Pick<AgentTool, \"name\" | \"description\" | \"promptSnippet\" | \"promptGuidelines\">[];\n loader?: ResourceLoader;\n /** Literal instructions appended after resources, before the skill catalog and working directory. */\n customInstructions?: readonly string[];\n baseInstructions?: string;\n}): SystemContext {\n if (\n options.customInstructions !== undefined &&\n (!Array.isArray(options.customInstructions) ||\n options.customInstructions.some((part) => typeof part !== \"string\"))\n )\n throw new Error(\"invalid_input: customInstructions must be an array of strings\");\n const template = options.template ?? piTemplate;\n validateTemplate(template);\n const context = {\n cwd: options.cwd,\n project_name: options.projectName ?? \"ZPI\",\n platform: options.platform ?? process.platform,\n };\n const rules: string[] = [];\n if (\n options.tools.some((t) => t.name === \"bash\") &&\n !options.tools.some((t) => [\"grep\", \"find\", \"ls\"].includes(t.name))\n )\n rules.push(\"Use bash for file operations like ls, rg, find\");\n for (const tool of options.tools) rules.push(...(tool.promptGuidelines ?? []));\n const baseRules = renderTemplate(template.rules, context)\n .split(\"\\n\")\n .map((line) => line.replace(/^\\s*-\\s*/, \"\"))\n .filter(Boolean);\n const toolSnippets = options.tools\n .filter((tool) => [\"read\", \"write\", \"edit\", \"bash\"].includes(tool.name) && tool.promptSnippet)\n .map((tool) => `- ${tool.name}: ${tool.promptSnippet}`);\n const skills = options.loader?.listSkills?.().skills ?? [];\n const skillTool = ([\"read\", \"Read\", \"Skill\", \"bash\", \"Bash\"] as const).find((name) =>\n options.tools.some((tool) => tool.name === name),\n );\n const base =\n options.baseInstructions ??\n [\n resourceBaseInstructions(options.loader) ?? renderTemplate(template.preamble, context),\n `<rules>\\n${[...new Set(baseRules)].map((r) => `- ${r}`).join(\"\\n\")}\\n</rules>`,\n ]\n .filter(Boolean)\n .join(\"\\n\\n\");\n const sections: Record<string, string> = {\n \"zpi.tools\": toolSnippets.length ? `<tools>\\n${toolSnippets.join(\"\\n\")}\\n</tools>` : \"\",\n \"zpi.tool-rules\": rules.length\n ? `<rules>\\n${[...new Set(rules)].map((r) => `- ${r}`).join(\"\\n\")}\\n</rules>`\n : \"\",\n \"zpi.resources\": resourceInstructions(options.loader)\n .filter((part) => !part.startsWith(\"<skills>\"))\n .join(\"\\n\\n\"),\n \"zpi.custom\": (options.customInstructions ?? []).join(\"\\n\\n\"),\n \"zpi.skills\": skills.length && skillTool ? formatSkillsForPrompt(skills, skillTool) : \"\",\n \"zpi.environment\": `<cwd>\\n${options.cwd.replace(/\\\\/g, \"/\")}\\n</cwd>`,\n };\n return { base, sections };\n}\n\n/** Human-readable preview; model requests use the independently managed blocks. */\nexport function buildSystemPrompt(options: Parameters<typeof buildSystemContext>[0]): string {\n const { base, sections } = buildSystemContext(options);\n return [base, ...Object.values(sections)].filter(Boolean).join(\"\\n\\n\");\n}\n","import { createHash } from \"node:crypto\";\nimport { realpath, writeFile } from \"node:fs/promises\";\nimport type { AgentTool, AgentToolResult } from \"@zpi-dev/agent\";\nimport type { JsonValue, Model } from \"@zpi-dev/ai\";\nimport type { ToolContext, ToolDefinition } from \"../types.ts\";\nimport { beforeFile, type FileChange, recordFileChange } from \"./file-change.ts\";\nimport { type BashToolOptions, createBashToolDefinition } from \"./pi/bash.ts\";\nimport { createEditToolDefinition, type EditToolOptions } from \"./pi/edit.ts\";\nimport { FileReadState } from \"./pi/file-read-state.ts\";\nimport { createReadToolDefinition, type ReadToolOptions } from \"./pi/read.ts\";\nimport { wrapToolDefinition } from \"./pi/tool-definition-wrapper.ts\";\nimport { readRegularFile } from \"./pi/utils/read-file.ts\";\nimport { createWriteToolDefinition, type WriteToolOptions } from \"./pi/write.ts\";\n\nexport { createBashToolDefinition, createLocalBashOperations } from \"./pi/bash.ts\";\nexport { createEditToolDefinition } from \"./pi/edit.ts\";\nexport { FileReadState } from \"./pi/file-read-state.ts\";\nexport { createReadToolDefinition } from \"./pi/read.ts\";\nexport { createWriteToolDefinition } from \"./pi/write.ts\";\nexport type { BashToolOptions, EditToolOptions, ReadToolOptions, WriteToolOptions };\nexport type ToolContextFactory = () => Partial<ToolContext> | undefined;\n\nexport function createReadTool(\n cwd: string,\n options?: ReadToolOptions | (() => Model),\n context?: ToolContextFactory,\n): AgentTool {\n const getModel = typeof options === \"function\" ? options : undefined;\n const definition = createReadToolDefinition(cwd, typeof options === \"function\" ? undefined : options);\n return wrapToolDefinition(definition, context ?? (() => ({ cwd, model: getModel?.() })));\n}\nexport function createBashTool(\n cwd: string,\n options?: BashToolOptions,\n context?: ToolContextFactory,\n): AgentTool {\n return wrapToolDefinition(createBashToolDefinition(cwd, options), context ?? (() => undefined));\n}\n\n// File-change observation is outside the Pi tool semantics, but runs inside its mutation queue.\n// It adds persisted UI facts without altering matching, filesystem operations, or model-facing success text.\nfunction observeMutation(\n cwd: string,\n tool: \"write\" | \"edit\",\n options: WriteToolOptions | EditToolOptions | undefined,\n outputDir: string | undefined,\n context: ToolContextFactory | undefined,\n): AgentTool {\n const base =\n tool === \"write\"\n ? createWriteToolDefinition(cwd, options as WriteToolOptions)\n : createEditToolDefinition(cwd, options as EditToolOptions);\n const wrapped = wrapToolDefinition(\n base as ToolDefinition<typeof base.parameters, unknown, Partial<ToolContext> | undefined>,\n context ?? (() => undefined),\n );\n return {\n ...wrapped,\n execute: async (id, params, signal, update) => {\n if (options?.operations) return wrapped.execute(id, params as never, signal, update);\n let change: FileChange | undefined;\n let diagnostic = \"\";\n const observeWrite = async (path: string, content: string) => {\n const before = await beforeFile(path);\n let failure: unknown;\n try {\n await writeFile(path, content, \"utf8\");\n } catch (error) {\n failure = error;\n }\n try {\n change = await recordFileChange(\n await realpath(path).catch(() => path),\n id,\n before,\n outputDir,\n Boolean(failure),\n );\n } catch (error) {\n if (failure) diagnostic = `文件最终状态不可读,可能已修改;记录不可用: ${String(error)}`;\n else\n change = {\n path,\n operation: before === null ? \"created\" : \"modified\",\n toolCallId: id,\n beforeHash: before === null ? null : createHash(\"sha256\").update(before).digest(\"hex\"),\n afterHash: \"unknown\",\n reason: \"文件已修改,但记录不可用\",\n };\n }\n if (failure) throw failure;\n };\n const definition =\n tool === \"write\"\n ? createWriteToolDefinition(cwd, {\n ...options,\n operations: {\n writeFile: observeWrite,\n mkdir: async (path) => {\n const { mkdir } = await import(\"node:fs/promises\");\n await mkdir(path, { recursive: true });\n },\n },\n })\n : createEditToolDefinition(cwd, {\n ...options,\n operations: {\n writeFile: observeWrite,\n readFile: readRegularFile,\n access: async (path) => {\n const { access, constants } = await import(\"node:fs/promises\");\n await access(path, constants.R_OK | constants.W_OK);\n },\n },\n });\n let result: AgentToolResult;\n try {\n result = await wrapToolDefinition(\n definition as ToolDefinition<\n typeof definition.parameters,\n unknown,\n Partial<ToolContext> | undefined\n >,\n context ?? (() => undefined),\n ).execute(id, params as never, signal, update);\n } catch (error) {\n if (!change && !diagnostic) throw error;\n result = {\n isError: true,\n content: [\n {\n type: \"text\",\n text: `${String(error)}${diagnostic ? `\\n${diagnostic}` : \"; file has changed.\"}`,\n },\n ],\n details: undefined,\n };\n }\n if (change)\n result.details = {\n ...(result.details as Record<string, JsonValue> | undefined),\n fileChange: { ...change, ...(result.isError ? { failed: true } : {}) },\n };\n return result;\n },\n };\n}\nexport function createWriteTool(\n cwd: string,\n options?: WriteToolOptions | string,\n context?: ToolContextFactory,\n): AgentTool {\n return observeMutation(\n cwd,\n \"write\",\n typeof options === \"string\" ? undefined : options,\n typeof options === \"string\" ? options : undefined,\n context,\n );\n}\nexport function createEditTool(\n cwd: string,\n options?: EditToolOptions | string,\n context?: ToolContextFactory,\n): AgentTool {\n return observeMutation(\n cwd,\n \"edit\",\n typeof options === \"string\" ? undefined : options,\n typeof options === \"string\" ? options : undefined,\n context,\n );\n}\nexport function createCodingTools(\n cwd: string,\n outputDir?: string,\n getModel?: () => Model,\n context?: ToolContextFactory,\n fileReadState = new FileReadState(),\n): AgentTool[] {\n return [\n createReadTool(cwd, { fileReadState }, context ?? (() => ({ cwd, model: getModel?.() }))),\n createBashTool(cwd, undefined, context),\n observeMutation(cwd, \"edit\", { fileReadState }, outputDir, context),\n observeMutation(cwd, \"write\", { fileReadState }, outputDir, context),\n ];\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { createTwoFilesPatch, parsePatch } from \"diff\";\nimport { readRegularFile } from \"./pi/utils/read-file.ts\";\nexport interface FileChange {\n path: string;\n operation: \"created\" | \"modified\";\n toolCallId: string;\n beforeHash: string | null;\n afterHash: string;\n patch?: string;\n patchFile?: string;\n beforeFile?: string;\n afterFile?: string;\n reason?: string;\n failed?: boolean;\n additions?: number;\n deletions?: number;\n}\nexport async function beforeFile(path: string): Promise<Buffer | null> {\n try {\n return await readRegularFile(path);\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw e;\n }\n}\nconst hash = (b: Buffer) => createHash(\"sha256\").update(b).digest(\"hex\");\nexport async function recordFileChange(\n path: string,\n toolCallId: string,\n before: Buffer | null,\n outputDir?: string,\n failed = false,\n): Promise<FileChange | undefined> {\n const after = await readRegularFile(path);\n if (before?.equals(after)) return undefined;\n const change: FileChange = {\n path,\n toolCallId,\n operation: before === null ? \"created\" : \"modified\",\n beforeHash: before === null ? null : hash(before),\n afterHash: hash(after),\n ...(failed ? { failed } : {}),\n };\n try {\n if ((before?.length ?? 0) + after.length > 4 * 1024 * 1024)\n return { ...change, reason: \"二进制或文件超限,无法内联比较\" };\n // Preserve bounded byte snapshots even when an intermediate edit is not text.\n // A later repair still needs its final snapshot for the whole turn's net diff.\n if (outputDir) {\n await mkdir(outputDir, { recursive: true });\n const key = randomUUID();\n if (before !== null) {\n change.beforeFile = join(outputDir, `${key}.before`);\n await writeFile(change.beforeFile, before, { mode: 0o600 });\n }\n change.afterFile = join(outputDir, `${key}.after`);\n await writeFile(change.afterFile, after, { mode: 0o600 });\n }\n if (before?.includes(0) || after.includes(0))\n return { ...change, reason: \"二进制或文件超限,无法内联比较\" };\n const decode = new TextDecoder(\"utf8\", { fatal: true });\n const beforeText = before === null ? \"\" : decode.decode(before),\n afterText = decode.decode(after);\n const patch = createTwoFilesPatch(\n before === null ? \"/dev/null\" : path,\n path,\n beforeText,\n afterText,\n \"\",\n \"\",\n { context: 3, timeout: 50 },\n );\n if (patch === undefined) return { ...change, reason: \"文件已修改,diff 计算超时,无法内联比较\" };\n Object.assign(change, patchLineCounts(patch));\n if (Buffer.byteLength(patch) <= 64 * 1024) change.patch = patch;\n else if (outputDir) {\n await mkdir(outputDir, { recursive: true });\n change.patchFile = join(outputDir, `${randomUUID()}.patch`);\n await writeFile(change.patchFile, patch, { mode: 0o600 });\n } else change.reason = \"Patch 超限;未配置记录目录\";\n } catch (e) {\n change.reason = `文件已修改,但记录不可用: ${String(e)}`;\n }\n return change;\n}\n\nexport function patchLineCounts(patch: string): { additions: number; deletions: number } {\n let additions = 0,\n deletions = 0;\n for (const file of parsePatch(patch))\n for (const hunk of file.hunks)\n for (const line of hunk.lines) {\n if (line.startsWith(\"+\")) additions++;\n if (line.startsWith(\"-\")) deletions++;\n }\n return { additions, deletions };\n}\n","export default class Diff {\n diff(oldStr, newStr, \n // Type below is not accurate/complete - see above for full possibilities - but it compiles\n options = {}) {\n let callback;\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n else if ('callback' in options) {\n callback = options.callback;\n }\n // Allow subclasses to massage the input prior to running\n const oldString = this.castInput(oldStr, options);\n const newString = this.castInput(newStr, options);\n const oldTokens = this.removeEmpty(this.tokenize(oldString, options));\n const newTokens = this.removeEmpty(this.tokenize(newString, options));\n return this.diffWithOptionsObj(oldTokens, newTokens, options, callback);\n }\n diffWithOptionsObj(oldTokens, newTokens, options, callback) {\n var _a;\n const done = (value) => {\n value = this.postProcess(value, options);\n if (callback) {\n setTimeout(function () { callback(value); }, 0);\n return undefined;\n }\n else {\n return value;\n }\n };\n const newLen = newTokens.length, oldLen = oldTokens.length;\n let editLength = 1;\n let maxEditLength = newLen + oldLen;\n if (options.maxEditLength != null) {\n maxEditLength = Math.min(maxEditLength, options.maxEditLength);\n }\n const maxExecutionTime = (_a = options.timeout) !== null && _a !== void 0 ? _a : Infinity;\n const abortAfterTimestamp = Date.now() + maxExecutionTime;\n const bestPath = [{ oldPos: -1, lastComponent: undefined }];\n // Seed editLength = 0, i.e. the content starts with the same values\n let newPos = this.extractCommon(bestPath[0], newTokens, oldTokens, 0, options);\n if (bestPath[0].oldPos + 1 >= oldLen && newPos + 1 >= newLen) {\n // Identity per the equality and tokenizer\n return done(this.buildValues(bestPath[0].lastComponent, newTokens, oldTokens));\n }\n // Once we hit the right edge of the edit graph on some diagonal k, we can\n // definitely reach the end of the edit graph in no more than k edits, so\n // there's no point in considering any moves to diagonal k+1 any more (from\n // which we're guaranteed to need at least k+1 more edits).\n // Similarly, once we've reached the bottom of the edit graph, there's no\n // point considering moves to lower diagonals.\n // We record this fact by setting minDiagonalToConsider and\n // maxDiagonalToConsider to some finite value once we've hit the edge of\n // the edit graph.\n // This optimization is not faithful to the original algorithm presented in\n // Myers's paper, which instead pointlessly extends D-paths off the end of\n // the edit graph - see page 7 of Myers's paper which notes this point\n // explicitly and illustrates it with a diagram. This has major performance\n // implications for some common scenarios. For instance, to compute a diff\n // where the new text simply appends d characters on the end of the\n // original text of length n, the true Myers algorithm will take O(n+d^2)\n // time while this optimization needs only O(n+d) time.\n let minDiagonalToConsider = -Infinity, maxDiagonalToConsider = Infinity;\n // Main worker method. checks all permutations of a given edit length for acceptance.\n const execEditLength = () => {\n for (let diagonalPath = Math.max(minDiagonalToConsider, -editLength); diagonalPath <= Math.min(maxDiagonalToConsider, editLength); diagonalPath += 2) {\n let basePath;\n const removePath = bestPath[diagonalPath - 1], addPath = bestPath[diagonalPath + 1];\n if (removePath) {\n // No one else is going to attempt to use this value, clear it\n // @ts-expect-error - perf optimisation. This type-violating value will never be read.\n bestPath[diagonalPath - 1] = undefined;\n }\n let canAdd = false;\n if (addPath) {\n // what newPos will be after we do an insertion:\n const addPathNewPos = addPath.oldPos - diagonalPath;\n canAdd = addPath && 0 <= addPathNewPos && addPathNewPos < newLen;\n }\n const canRemove = removePath && removePath.oldPos + 1 < oldLen;\n if (!canAdd && !canRemove) {\n // If this path is a terminal then prune\n // @ts-expect-error - perf optimisation. This type-violating value will never be read.\n bestPath[diagonalPath] = undefined;\n continue;\n }\n // Select the diagonal that we want to branch from. We select the prior\n // path whose position in the old string is the farthest from the origin\n // and does not pass the bounds of the diff graph\n if (!canRemove || (canAdd && removePath.oldPos < addPath.oldPos)) {\n basePath = this.addToPath(addPath, true, false, 0, options);\n }\n else {\n basePath = this.addToPath(removePath, false, true, 1, options);\n }\n newPos = this.extractCommon(basePath, newTokens, oldTokens, diagonalPath, options);\n if (basePath.oldPos + 1 >= oldLen && newPos + 1 >= newLen) {\n // If we have hit the end of both strings, then we are done\n return done(this.buildValues(basePath.lastComponent, newTokens, oldTokens)) || true;\n }\n else {\n bestPath[diagonalPath] = basePath;\n if (basePath.oldPos + 1 >= oldLen) {\n maxDiagonalToConsider = Math.min(maxDiagonalToConsider, diagonalPath - 1);\n }\n if (newPos + 1 >= newLen) {\n minDiagonalToConsider = Math.max(minDiagonalToConsider, diagonalPath + 1);\n }\n }\n }\n editLength++;\n };\n // Performs the length of edit iteration. Is a bit fugly as this has to support the\n // sync and async mode which is never fun. Loops over execEditLength until a value\n // is produced, or until the edit length exceeds options.maxEditLength (if given),\n // in which case it will return undefined.\n if (callback) {\n (function exec() {\n setTimeout(function () {\n if (editLength > maxEditLength || Date.now() > abortAfterTimestamp) {\n return callback(undefined);\n }\n if (!execEditLength()) {\n exec();\n }\n }, 0);\n }());\n }\n else {\n while (editLength <= maxEditLength && Date.now() <= abortAfterTimestamp) {\n const ret = execEditLength();\n if (ret) {\n return ret;\n }\n }\n }\n }\n addToPath(path, added, removed, oldPosInc, options) {\n const last = path.lastComponent;\n if (last && !options.oneChangePerToken && last.added === added && last.removed === removed) {\n return {\n oldPos: path.oldPos + oldPosInc,\n lastComponent: { count: last.count + 1, added: added, removed: removed, previousComponent: last.previousComponent }\n };\n }\n else {\n return {\n oldPos: path.oldPos + oldPosInc,\n lastComponent: { count: 1, added: added, removed: removed, previousComponent: last }\n };\n }\n }\n extractCommon(basePath, newTokens, oldTokens, diagonalPath, options) {\n const newLen = newTokens.length, oldLen = oldTokens.length;\n let oldPos = basePath.oldPos, newPos = oldPos - diagonalPath, commonCount = 0;\n while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(oldTokens[oldPos + 1], newTokens[newPos + 1], options)) {\n newPos++;\n oldPos++;\n commonCount++;\n if (options.oneChangePerToken) {\n basePath.lastComponent = { count: 1, previousComponent: basePath.lastComponent, added: false, removed: false };\n }\n }\n if (commonCount && !options.oneChangePerToken) {\n basePath.lastComponent = { count: commonCount, previousComponent: basePath.lastComponent, added: false, removed: false };\n }\n basePath.oldPos = oldPos;\n return newPos;\n }\n equals(left, right, options) {\n if (options.comparator) {\n return options.comparator(left, right);\n }\n else {\n return left === right\n || (!!options.ignoreCase && left.toLowerCase() === right.toLowerCase());\n }\n }\n removeEmpty(array) {\n const ret = [];\n for (let i = 0; i < array.length; i++) {\n if (array[i]) {\n ret.push(array[i]);\n }\n }\n return ret;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n castInput(value, options) {\n return value;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n tokenize(value, options) {\n return Array.from(value);\n }\n join(chars) {\n // Assumes ValueT is string, which is the case for most subclasses.\n // When it's false, e.g. in diffArrays, this method needs to be overridden (e.g. with a no-op)\n // Yes, the casts are verbose and ugly, because this pattern - of having the base class SORT OF\n // assume tokens and values are strings, but not completely - is weird and janky.\n return chars.join('');\n }\n postProcess(changeObjects, \n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n options) {\n return changeObjects;\n }\n get useLongestToken() {\n return false;\n }\n buildValues(lastComponent, newTokens, oldTokens) {\n // First we convert our linked list of components in reverse order to an\n // array in the right order:\n const components = [];\n let nextComponent;\n while (lastComponent) {\n components.push(lastComponent);\n nextComponent = lastComponent.previousComponent;\n delete lastComponent.previousComponent;\n lastComponent = nextComponent;\n }\n components.reverse();\n const componentLen = components.length;\n let componentPos = 0, newPos = 0, oldPos = 0;\n for (; componentPos < componentLen; componentPos++) {\n const component = components[componentPos];\n if (!component.removed) {\n if (!component.added && this.useLongestToken) {\n let value = newTokens.slice(newPos, newPos + component.count);\n value = value.map(function (value, i) {\n const oldValue = oldTokens[oldPos + i];\n return oldValue.length > value.length ? oldValue : value;\n });\n component.value = this.join(value);\n }\n else {\n component.value = this.join(newTokens.slice(newPos, newPos + component.count));\n }\n newPos += component.count;\n // Common case\n if (!component.added) {\n oldPos += component.count;\n }\n }\n else {\n component.value = this.join(oldTokens.slice(oldPos, oldPos + component.count));\n oldPos += component.count;\n }\n }\n return components;\n }\n}\n","import Diff from './base.js';\nimport { generateOptions } from '../util/params.js';\nclass LineDiff extends Diff {\n constructor() {\n super(...arguments);\n this.tokenize = tokenize;\n }\n equals(left, right, options) {\n // If we're ignoring whitespace, we need to normalise lines by stripping\n // whitespace before checking equality. (This has an annoying interaction\n // with newlineIsToken that requires special handling: if newlines get their\n // own token, then we DON'T want to trim the *newline* tokens down to empty\n // strings, since this would cause us to treat whitespace-only line content\n // as equal to a separator between lines, which would be weird and\n // inconsistent with the documented behavior of the options.)\n if (options.ignoreWhitespace) {\n if (!options.newlineIsToken || !left.includes('\\n')) {\n left = left.trim();\n }\n if (!options.newlineIsToken || !right.includes('\\n')) {\n right = right.trim();\n }\n }\n else if (options.ignoreNewlineAtEof && !options.newlineIsToken) {\n if (left.endsWith('\\n')) {\n left = left.slice(0, -1);\n }\n if (right.endsWith('\\n')) {\n right = right.slice(0, -1);\n }\n }\n return super.equals(left, right, options);\n }\n}\nexport const lineDiff = new LineDiff();\nexport function diffLines(oldStr, newStr, options) {\n return lineDiff.diff(oldStr, newStr, options);\n}\nexport function diffTrimmedLines(oldStr, newStr, options) {\n options = generateOptions(options, { ignoreWhitespace: true });\n return lineDiff.diff(oldStr, newStr, options);\n}\n// Exported standalone so it can be used from jsonDiff too.\nexport function tokenize(value, options) {\n if (options.stripTrailingCr) {\n // remove one \\r before \\n to match GNU diff's --strip-trailing-cr behavior\n value = value.replace(/\\r\\n/g, '\\n');\n }\n const retLines = [], linesAndNewlines = value.split(/(\\n|\\r\\n)/);\n // Ignore the final empty token that occurs if the string ends with a new line\n if (!linesAndNewlines[linesAndNewlines.length - 1]) {\n linesAndNewlines.pop();\n }\n // Merge the content and line separators into single tokens\n for (let i = 0; i < linesAndNewlines.length; i++) {\n const line = linesAndNewlines[i];\n if (i % 2 && !options.newlineIsToken) {\n retLines[retLines.length - 1] += line;\n }\n else {\n retLines.push(line);\n }\n }\n return retLines;\n}\n","/**\n * Parses a unified diff format patch into a structured patch object.\n *\n * `parsePatch` has some understanding of Git's particular dialect of unified diff format.\n * When parsing a Git patch, each index in the result may contain additional\n * fields (`isRename`, `isBinary`, etc) not included in the data structure returned by\n * `structuredPatch`; see the `StructuredPatch` interface for a full list.\n *\n * @return a JSON object representation of the patch, suitable for use with the `applyPatch`\n * method. This parses to the same structure returned by `structuredPatch`, except that\n * `oldFileName` and `newFileName` may be `undefined` if the patch doesn't contain enough\n * information to determine them (e.g. a hunk-only patch with no file headers).\n */\nexport function parsePatch(uniDiff) {\n const diffstr = uniDiff.split(/\\n/), list = [];\n let i = 0;\n // These helper functions identify line types that can appear between files\n // in a multi-file patch. Keeping them in one place avoids subtle\n // inconsistencies from having the same regexes duplicated in multiple places.\n // Matches `diff --git ...` lines specifically.\n function isGitDiffHeader(line) {\n return (/^diff --git /).test(line);\n }\n // Matches lines that denote the start of a new diff's section in a\n // multi-file patch: `diff --git ...`, `Index: ...`, or `diff -r ...`.\n function isDiffHeader(line) {\n return isGitDiffHeader(line)\n || (/^Index:\\s/).test(line)\n || (/^diff(?: -r \\w+)+\\s/).test(line);\n }\n // Matches `--- ...` and `+++ ...` file header lines.\n function isFileHeader(line) {\n return (/^(---|\\+\\+\\+)\\s/).test(line);\n }\n // Matches `@@ ...` hunk header lines.\n function isHunkHeader(line) {\n return (/^@@\\s/).test(line);\n }\n function parseIndex() {\n var _a;\n const index = {};\n index.hunks = [];\n list.push(index);\n // Parse diff metadata\n let seenDiffHeader = false;\n while (i < diffstr.length) {\n const line = diffstr[i];\n // File header (---, +++) or hunk header (@@) found; end parsing diff metadata\n if (isFileHeader(line) || isHunkHeader(line)) {\n break;\n }\n // The next two branches handle recognized diff headers. Note that\n // isDiffHeader deliberately does NOT match arbitrary `diff`\n // commands like `diff -u -p -r1.1 -r1.2`, because in some\n // formats (e.g. CVS diffs) such lines appear as metadata within\n // a single file's header section, after an `Index:` line. See the\n // diffx documentation (https://diffx.org) for examples.\n //\n // In both branches: if we've already seen a diff header for *this*\n // file and now we encounter another one, it must belong to the\n // next file, so break.\n if (isGitDiffHeader(line)) {\n if (seenDiffHeader) {\n return;\n }\n seenDiffHeader = true;\n index.isGit = true;\n // Parse the old and new filenames from the `diff --git` header and\n // tentatively set oldFileName and newFileName from them. These may\n // be overridden below by `rename from` / `rename to` or `copy from` /\n // `copy to` extended headers, or by --- and +++ lines. But for Git\n // diffs that lack all of those (e.g. mode-only changes, binary\n // file changes without rename), these are the only filenames we\n // get.\n // parseGitDiffHeader returns null if the header can't be parsed\n // (e.g. unterminated quoted filename, or unexpected format). In\n // that case we skip setting filenames here; they may still be\n // set from --- / +++ or rename from / rename to lines below.\n const paths = parseGitDiffHeader(line);\n if (paths) {\n index.oldFileName = paths.oldFileName;\n index.newFileName = paths.newFileName;\n }\n // Consume Git extended headers (`old mode`, `new mode`, `rename from`,\n // `rename to`, `similarity index`, `index`, `Binary files ... differ`,\n // etc.)\n i++;\n while (i < diffstr.length) {\n const extLine = diffstr[i];\n // Stop consuming extended headers if we hit a file header,\n // hunk header, or another diff header.\n if (isFileHeader(extLine) || isHunkHeader(extLine) || isDiffHeader(extLine)) {\n break;\n }\n // Parse `rename from` / `rename to` lines - these give us\n // unambiguous filenames. These lines don't include the\n // a/ and b/ prefixes that appear in the `diff --git` header\n // and --- / +++ lines, so we add them for consistency.\n // Git C-style quotes filenames containing special characters\n // (tabs, newlines, backslashes, double quotes), so we must\n // unquote them when present.\n const renameFromMatch = (/^rename from (.*)/).exec(extLine);\n if (renameFromMatch) {\n index.oldFileName = 'a/' + unquoteIfQuoted(renameFromMatch[1]);\n index.isRename = true;\n }\n const renameToMatch = (/^rename to (.*)/).exec(extLine);\n if (renameToMatch) {\n index.newFileName = 'b/' + unquoteIfQuoted(renameToMatch[1]);\n index.isRename = true;\n }\n // Parse copy from / copy to lines similarly\n const copyFromMatch = (/^copy from (.*)/).exec(extLine);\n if (copyFromMatch) {\n index.oldFileName = 'a/' + unquoteIfQuoted(copyFromMatch[1]);\n index.isCopy = true;\n }\n const copyToMatch = (/^copy to (.*)/).exec(extLine);\n if (copyToMatch) {\n index.newFileName = 'b/' + unquoteIfQuoted(copyToMatch[1]);\n index.isCopy = true;\n }\n const newFileModeMatch = (/^new file mode (\\d+)/).exec(extLine);\n if (newFileModeMatch) {\n index.isCreate = true;\n index.newMode = newFileModeMatch[1];\n }\n const deletedFileModeMatch = (/^deleted file mode (\\d+)/).exec(extLine);\n if (deletedFileModeMatch) {\n index.isDelete = true;\n index.oldMode = deletedFileModeMatch[1];\n }\n const oldModeMatch = (/^old mode (\\d+)/).exec(extLine);\n if (oldModeMatch) {\n index.oldMode = oldModeMatch[1];\n }\n const newModeMatch = (/^new mode (\\d+)/).exec(extLine);\n if (newModeMatch) {\n index.newMode = newModeMatch[1];\n }\n if ((/^Binary files /).test(extLine)) {\n index.isBinary = true;\n }\n i++;\n }\n continue;\n }\n else if (isDiffHeader(line)) {\n if (seenDiffHeader) {\n return;\n }\n seenDiffHeader = true;\n // For Mercurial-style headers like\n // diff -r 9117c6561b0b -r 273ce12ad8f1 .hgignore\n // or Index: headers like\n // Index: something with multiple words\n // we extract the trailing filename as the index.\n //\n // TODO: It seems awkward that we indiscriminately trim off\n // trailing whitespace here. Theoretically, couldn't that\n // be meaningful - e.g. if the patch represents a diff of a\n // file whose name ends with a space? Seems wrong to nuke\n // it. But this behaviour has been around since v2.2.1 in\n // 2015, so if it's going to change, it should be done\n // cautiously and in a new major release, for\n // backwards-compat reasons.\n // -- ExplodingCabbage\n const headerMatch = (/^(?:Index:|diff(?: -r \\w+)+)\\s+/).exec(line);\n if (headerMatch) {\n index.index = line.substring(headerMatch[0].length).trim();\n }\n }\n i++;\n }\n // Parse file headers if they are defined. Unified diff requires them, but\n // there's no technical issues to have an isolated hunk without file header\n parseFileHeader(index);\n parseFileHeader(index);\n // If we got one file header but not the other, that's a malformed patch.\n if ((index.oldFileName === undefined) !== (index.newFileName === undefined)) {\n throw new Error('Missing ' + (index.oldFileName !== undefined ? '\"+++ ...\"' : '\"--- ...\"')\n + ' file header for ' + ((_a = index.oldFileName) !== null && _a !== void 0 ? _a : index.newFileName));\n }\n while (i < diffstr.length) {\n const line = diffstr[i];\n if (isDiffHeader(line) || isFileHeader(line) || (/^===================================================================/).test(line)) {\n break;\n }\n else if (isHunkHeader(line)) {\n index.hunks.push(parseHunk());\n }\n else {\n // Skip blank lines and any other unrecognized content between\n // or after hunks. Real-world examples of such content include:\n // - `Only in <dir>: <file>` from GNU `diff -r`\n // - `Property changes on:` sections from `svn diff`\n // - Trailing prose or commentary in email patches\n // GNU `patch` tolerates all of these, and so do we.\n i++;\n }\n }\n }\n /**\n * Parses the old and new filenames from a `diff --git` header line.\n *\n * The format is:\n * diff --git a/<old-path> b/<new-path>\n *\n * When filenames contain special characters (including newlines, tabs,\n * backslashes, or double quotes), Git quotes them with C-style escaping:\n * diff --git \"a/file\\twith\\ttabs.txt\" \"b/file\\twith\\ttabs.txt\"\n *\n * When filenames don't contain special characters and the old and new names\n * are the same, we can unambiguously split on ` b/` by finding where the\n * two halves (including their a/ and b/ prefixes) yield matching bare names.\n *\n * A pathological case exists in which we cannot reliably determine the paths\n * from the `diff --git` header. This case is when the following are true:\n * - the old and new file paths differ\n * - they are both unquoted (i.e. contain no special characters)\n * - at least one of the underlying file paths includes the substring ` b/`\n * In this scenario, we do not know which occurrence of ` b/` indicates the\n * start of the new file path, so the header is inherently ambiguous. We thus\n * select a possible interpretation arbitrarily and return that.\n *\n * Fortunately, this ambiguity should never matter, because in any patch\n * genuinely output by Git in which this pathological scenario occurs, there\n * must also be `rename from`/`rename to` or `copy from`/`copy to` extended\n * headers present below the `diff --git` header. `parseIndex` will parse\n * THOSE headers, from which we CAN unambiguously determine the filenames,\n * and will discard the result returned by this function.\n *\n * Returns null if the header can't be parsed at all — e.g. a quoted filename\n * has an unterminated quote, or if the unquoted header doesn't match the\n * expected `a/... b/...` format. In that case, the caller (parseIndex)\n * skips setting oldFileName/newFileName from this header, but they may\n * still be set later from `---`/`+++` lines or `rename from`/`rename to`\n * extended headers; if none of those are present either, they'll remain\n * undefined in the output.\n */\n function parseGitDiffHeader(line) {\n // Strip the \"diff --git \" prefix\n const rest = line.substring('diff --git '.length);\n // Handle quoted paths: \"a/path\" \"b/path\"\n // Git quotes paths when they contain characters like newlines, tabs,\n // backslashes, or double quotes (but notably not spaces).\n if (rest.startsWith('\"')) {\n const oldPath = parseQuotedFileName(rest);\n if (oldPath === null) {\n return null;\n }\n const afterOld = rest.substring(oldPath.rawLength + 1); // +1 for space\n let newFileName;\n if (afterOld.startsWith('\"')) {\n const newPath = parseQuotedFileName(afterOld);\n if (newPath === null) {\n return null;\n }\n newFileName = newPath.fileName;\n }\n else {\n newFileName = afterOld;\n }\n return {\n oldFileName: oldPath.fileName,\n newFileName\n };\n }\n // Check if the second path is quoted\n // e.g. diff --git a/simple \"b/renamed\\nnewline.txt\"\n const quoteIdx = rest.indexOf('\"');\n if (quoteIdx > 0) {\n const oldFileName = rest.substring(0, quoteIdx - 1);\n const newPath = parseQuotedFileName(rest.substring(quoteIdx));\n if (newPath === null) {\n return null;\n }\n return {\n oldFileName,\n newFileName: newPath.fileName\n };\n }\n // Unquoted paths. Try to find the split point.\n // The format is: a/<old-path> b/<new-path>\n //\n // Note the potential ambiguity caused by the possibility of the file paths\n // themselves containing the substring ` b/`, plus the pathological case\n // described in the comment above.\n //\n // Strategy: find all occurrences of \" b/\" and split on the middle\n // one. When old and new names are the same (which is the only case where\n // we can't rely on extended headers later in the patch so HAVE to get\n // this right), this will always be the correct split.\n if (rest.startsWith('a/')) {\n const splits = [];\n let idx = 0;\n while (true) {\n idx = rest.indexOf(' b/', idx + 1);\n if (idx === -1) {\n break;\n }\n splits.push(idx);\n }\n if (splits.length > 0) {\n const mid = splits[Math.floor(splits.length / 2)];\n return {\n oldFileName: rest.substring(0, mid),\n newFileName: rest.substring(mid + 1)\n };\n }\n }\n // Fallback: can't parse, return null\n return null;\n }\n /**\n * If `s` starts with a double quote, unquotes it using C-style escape\n * rules (as used by Git). Otherwise returns `s` as-is.\n */\n function unquoteIfQuoted(s) {\n if (s.startsWith('\"')) {\n const parsed = parseQuotedFileName(s);\n if (parsed) {\n return parsed.fileName;\n }\n }\n return s;\n }\n /**\n * Parses a C-style quoted filename as used by Git or GNU `diff -u`.\n * Returns the unescaped filename and the raw length consumed (including quotes).\n */\n function parseQuotedFileName(s) {\n if (!s.startsWith('\"')) {\n return null;\n }\n let result = '';\n let j = 1; // skip opening quote\n while (j < s.length) {\n if (s[j] === '\"') {\n return { fileName: result, rawLength: j + 1 };\n }\n if (s[j] === '\\\\' && j + 1 < s.length) {\n j++;\n switch (s[j]) {\n case 'a':\n result += '\\x07';\n break;\n case 'b':\n result += '\\b';\n break;\n case 'f':\n result += '\\f';\n break;\n case 'n':\n result += '\\n';\n break;\n case 'r':\n result += '\\r';\n break;\n case 't':\n result += '\\t';\n break;\n case 'v':\n result += '\\v';\n break;\n case '\\\\':\n result += '\\\\';\n break;\n case '\"':\n result += '\"';\n break;\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7': {\n // C-style octal escapes represent raw bytes. Collect\n // consecutive octal-escaped bytes and decode as UTF-8.\n // Validate that we have a full 3-digit octal escape\n if (j + 2 >= s.length || s[j + 1] < '0' || s[j + 1] > '7' || s[j + 2] < '0' || s[j + 2] > '7') {\n return null;\n }\n const bytes = [parseInt(s.substring(j, j + 3), 8)];\n j += 3;\n while (s[j] === '\\\\' && s[j + 1] >= '0' && s[j + 1] <= '7') {\n if (j + 3 >= s.length || s[j + 2] < '0' || s[j + 2] > '7' || s[j + 3] < '0' || s[j + 3] > '7') {\n return null;\n }\n bytes.push(parseInt(s.substring(j + 1, j + 4), 8));\n j += 4;\n }\n result += new TextDecoder('utf-8').decode(new Uint8Array(bytes));\n continue; // j already points at the next character\n }\n // Note that in C, there are also three kinds of hex escape sequences:\n // - \\xhh\n // - \\uhhhh\n // - \\Uhhhhhhhh\n // We do not bother to parse them here because, so far as we know,\n // they are never emitted by any tools that generate unified diff\n // format diffs, and so for now jsdiff does not consider them legal.\n default: return null;\n }\n }\n else {\n result += s[j];\n }\n j++;\n }\n // Unterminated quote\n return null;\n }\n // Parses the --- and +++ headers, if none are found, no lines\n // are consumed.\n function parseFileHeader(index) {\n const fileHeaderMatch = (/^(---|\\+\\+\\+)\\s+/).exec(diffstr[i]);\n if (fileHeaderMatch) {\n const prefix = fileHeaderMatch[1], data = diffstr[i].substring(3).trim().split('\\t', 2), header = (data[1] || '').trim();\n let fileName = data[0];\n if (fileName.startsWith('\"')) {\n fileName = unquoteIfQuoted(fileName);\n }\n else {\n fileName = fileName.replace(/\\\\\\\\/g, '\\\\');\n }\n if (prefix === '---') {\n index.oldFileName = fileName;\n index.oldHeader = header;\n }\n else {\n index.newFileName = fileName;\n index.newHeader = header;\n }\n i++;\n }\n }\n // Parses a hunk\n // This assumes that we are at the start of a hunk.\n function parseHunk() {\n var _a;\n const chunkHeaderIndex = i, chunkHeaderLine = diffstr[i++], chunkHeader = chunkHeaderLine.split(/@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/);\n const hunk = {\n oldStart: +chunkHeader[1],\n oldLines: typeof chunkHeader[2] === 'undefined' ? 1 : +chunkHeader[2],\n newStart: +chunkHeader[3],\n newLines: typeof chunkHeader[4] === 'undefined' ? 1 : +chunkHeader[4],\n lines: []\n };\n // Unified Diff Format quirk: If the chunk size is 0,\n // the first number is one lower than one would expect.\n // https://www.artima.com/weblogs/viewpost.jsp?thread=164293\n if (hunk.oldLines === 0) {\n hunk.oldStart += 1;\n }\n if (hunk.newLines === 0) {\n hunk.newStart += 1;\n }\n let addCount = 0, removeCount = 0;\n for (; i < diffstr.length && (removeCount < hunk.oldLines || addCount < hunk.newLines || ((_a = diffstr[i]) === null || _a === void 0 ? void 0 : _a.startsWith('\\\\'))); i++) {\n const operation = (diffstr[i].length == 0 && i != (diffstr.length - 1)) ? ' ' : diffstr[i][0];\n if (operation === '+' || operation === '-' || operation === ' ' || operation === '\\\\') {\n hunk.lines.push(diffstr[i]);\n if (operation === '+') {\n addCount++;\n }\n else if (operation === '-') {\n removeCount++;\n }\n else if (operation === ' ') {\n addCount++;\n removeCount++;\n }\n }\n else {\n throw new Error(`Hunk at line ${chunkHeaderIndex + 1} contained invalid line ${diffstr[i]}`);\n }\n }\n // Handle the empty block count case\n if (!addCount && hunk.newLines === 1) {\n hunk.newLines = 0;\n }\n if (!removeCount && hunk.oldLines === 1) {\n hunk.oldLines = 0;\n }\n // Perform sanity checking\n if (addCount !== hunk.newLines) {\n throw new Error('Added line count did not match for hunk at line ' + (chunkHeaderIndex + 1));\n }\n if (removeCount !== hunk.oldLines) {\n throw new Error('Removed line count did not match for hunk at line ' + (chunkHeaderIndex + 1));\n }\n // Check for extra hunk-body-like lines after the declared line counts\n // were exhausted. If the very next line starts with ' ', '+', or '-',\n // the hunk's line counts were probably wrong — unless it's a file\n // header (--- or +++), which legitimately appears immediately after a\n // hunk in multi-file diffs without Index lines.\n if (i < diffstr.length && diffstr[i] && (/^[+ -]/).test(diffstr[i])\n && !isFileHeader(diffstr[i])) {\n throw new Error('Hunk at line ' + (chunkHeaderIndex + 1)\n + ' has more lines than expected (expected '\n + hunk.oldLines + ' old lines and ' + hunk.newLines + ' new lines)');\n }\n return hunk;\n }\n while (i < diffstr.length) {\n parseIndex();\n }\n return list;\n}\n","import { diffLines } from '../diff/line.js';\n/**\n * Returns true if the filename contains characters that require C-style\n * quoting (as used by Git and GNU diffutils in diff output).\n */\nfunction needsQuoting(s) {\n for (let i = 0; i < s.length; i++) {\n if (s[i] < '\\x20' || s[i] > '\\x7e' || s[i] === '\"' || s[i] === '\\\\') {\n return true;\n }\n }\n return false;\n}\n/**\n * C-style quotes a filename, encoding special characters as escape sequences\n * and non-ASCII bytes as octal escapes. This is the inverse of\n * `parseQuotedFileName` in parse.ts.\n *\n * Non-ASCII bytes are encoded as UTF-8 before being emitted as octal escapes.\n * This matches the behaviour of both Git and GNU diffutils, which always emit\n * UTF-8 octal escapes regardless of the underlying filesystem encoding (e.g.\n * Git for Windows converts from NTFS's UTF-16 to UTF-8 internally).\n *\n * If the filename doesn't need quoting, returns it as-is.\n */\nfunction quoteFileNameIfNeeded(s) {\n if (!needsQuoting(s)) {\n return s;\n }\n let result = '\"';\n const bytes = new TextEncoder().encode(s);\n let i = 0;\n while (i < bytes.length) {\n const b = bytes[i];\n // See https://en.wikipedia.org/wiki/Escape_sequences_in_C#Escape_sequences\n if (b === 0x07) {\n result += '\\\\a';\n }\n else if (b === 0x08) {\n result += '\\\\b';\n }\n else if (b === 0x09) {\n result += '\\\\t';\n }\n else if (b === 0x0a) {\n result += '\\\\n';\n }\n else if (b === 0x0b) {\n result += '\\\\v';\n }\n else if (b === 0x0c) {\n result += '\\\\f';\n }\n else if (b === 0x0d) {\n result += '\\\\r';\n }\n else if (b === 0x22) {\n result += '\\\\\"';\n }\n else if (b === 0x5c) {\n result += '\\\\\\\\';\n }\n else if (b >= 0x20 && b <= 0x7e) {\n // Just a printable ASCII character that is neither a double quote nor a\n // backslash; no need to escape it.\n result += String.fromCharCode(b);\n }\n else {\n // Either part of a non-ASCII character or a control character without a\n // special escape sequence; needs escaping as a 3-digit octal escape\n result += '\\\\' + b.toString(8).padStart(3, '0');\n }\n i++;\n }\n result += '\"';\n return result;\n}\nexport const INCLUDE_HEADERS = {\n includeIndex: true,\n includeUnderline: true,\n includeFileHeaders: true\n};\nexport const FILE_HEADERS_ONLY = {\n includeIndex: false,\n includeUnderline: false,\n includeFileHeaders: true\n};\nexport const OMIT_HEADERS = {\n includeIndex: false,\n includeUnderline: false,\n includeFileHeaders: false\n};\nexport function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {\n let optionsObj;\n if (!options) {\n optionsObj = {};\n }\n else if (typeof options === 'function') {\n optionsObj = { callback: options };\n }\n else {\n optionsObj = options;\n }\n if (typeof optionsObj.context === 'undefined') {\n optionsObj.context = 4;\n }\n // We copy this into its own variable to placate TypeScript, which thinks\n // optionsObj.context might be undefined in the callbacks below.\n const context = optionsObj.context;\n // @ts-expect-error (runtime check for something that is correctly a static type error)\n if (optionsObj.newlineIsToken) {\n throw new Error('newlineIsToken may not be used with patch-generation functions, only with diffing functions');\n }\n if (!optionsObj.callback) {\n return diffLinesResultToPatch(diffLines(oldStr, newStr, optionsObj));\n }\n else {\n const { callback } = optionsObj;\n diffLines(oldStr, newStr, Object.assign(Object.assign({}, optionsObj), { callback: (diff) => {\n const patch = diffLinesResultToPatch(diff);\n // TypeScript is unhappy without the cast because it does not understand that `patch` may\n // be undefined here only if `callback` is StructuredPatchCallbackAbortable:\n callback(patch);\n } }));\n }\n function diffLinesResultToPatch(diff) {\n // STEP 1: Build up the patch with no \"\\" lines and with the arrays\n // of lines containing trailing newline characters. We'll tidy up later...\n if (!diff) {\n return;\n }\n diff.push({ value: '', lines: [] }); // Append an empty value to make cleanup easier\n function contextLines(lines) {\n return lines.map(function (entry) { return ' ' + entry; });\n }\n const hunks = [];\n let oldRangeStart = 0, newRangeStart = 0, curRange = [], oldLine = 1, newLine = 1;\n for (let i = 0; i < diff.length; i++) {\n const current = diff[i], lines = current.lines || splitLines(current.value);\n current.lines = lines;\n if (current.added || current.removed) {\n // If we have previous context, start with that\n if (!oldRangeStart) {\n const prev = diff[i - 1];\n oldRangeStart = oldLine;\n newRangeStart = newLine;\n if (prev) {\n curRange = context > 0 ? contextLines(prev.lines.slice(-context)) : [];\n oldRangeStart -= curRange.length;\n newRangeStart -= curRange.length;\n }\n }\n // Output our changes\n for (const line of lines) {\n curRange.push((current.added ? '+' : '-') + line);\n }\n // Track the updated file position\n if (current.added) {\n newLine += lines.length;\n }\n else {\n oldLine += lines.length;\n }\n }\n else {\n // Identical context lines. Track line changes\n if (oldRangeStart) {\n // Close out any changes that have been output (or join overlapping)\n if (lines.length <= context * 2 && i < diff.length - 2) {\n // Overlapping\n for (const line of contextLines(lines)) {\n curRange.push(line);\n }\n }\n else {\n // end the range and output\n const contextSize = Math.min(lines.length, context);\n for (const line of contextLines(lines.slice(0, contextSize))) {\n curRange.push(line);\n }\n const hunk = {\n oldStart: oldRangeStart,\n oldLines: (oldLine - oldRangeStart + contextSize),\n newStart: newRangeStart,\n newLines: (newLine - newRangeStart + contextSize),\n lines: curRange\n };\n hunks.push(hunk);\n oldRangeStart = 0;\n newRangeStart = 0;\n curRange = [];\n }\n }\n oldLine += lines.length;\n newLine += lines.length;\n }\n }\n // Step 2: eliminate the trailing `\\n` from each line of each hunk, and, where needed, add\n // \"\\".\n for (const hunk of hunks) {\n for (let i = 0; i < hunk.lines.length; i++) {\n if (hunk.lines[i].endsWith('\\n')) {\n hunk.lines[i] = hunk.lines[i].slice(0, -1);\n }\n else {\n hunk.lines.splice(i + 1, 0, '\\\');\n i++; // Skip the line we just added, then continue iterating\n }\n }\n }\n return {\n oldFileName: oldFileName, newFileName: newFileName,\n oldHeader: oldHeader, newHeader: newHeader,\n hunks: hunks\n };\n }\n}\n/**\n * creates a unified diff patch.\n *\n * @param patch either a single structured patch object (as returned by `structuredPatch`) or an\n * array of them (as returned by `parsePatch`).\n * @param headerOptions behaves the same as the `headerOptions` option of `createTwoFilesPatch`.\n * Ignored for patches where `isGit` is `true`.\n *\n * When a patch has `isGit: true`, `formatPatch` output is changed to more closely match Git's\n * output: it emits a `diff --git` header, emits Git extended headers as appropriate based on\n * properties like `isRename`, `isCreate`, `newMode`, etc, and will omit `---`/`+++` file\n * headers for patches with no hunks (e.g. renames without content changes).\n */\nexport function formatPatch(patch, headerOptions) {\n var _a, _b, _c, _d, _e, _f;\n if (!headerOptions) {\n headerOptions = INCLUDE_HEADERS;\n }\n if (Array.isArray(patch)) {\n if (patch.length > 1 && !headerOptions.includeFileHeaders && !patch.every(p => p.isGit)) {\n throw new Error('Cannot omit file headers on a multi-file patch. '\n + '(The result would be unparseable; how would a tool trying to apply '\n + 'the patch know which changes are to which file?)');\n }\n return patch.map(p => formatPatch(p, headerOptions)).join('\\n');\n }\n const ret = [];\n // Git patches have a fixed header format (diff --git, extended headers,\n // and ---/+++ when hunks are present), so headerOptions is ignored.\n if (patch.isGit) {\n headerOptions = INCLUDE_HEADERS;\n // Emit Git-style diff --git header and extended headers.\n // Git never puts /dev/null in the \"diff --git\" line; for file\n // creations/deletions it uses the real filename on both sides.\n if (!patch.oldFileName) {\n throw new Error('oldFileName must be specified for Git patches');\n }\n if (!patch.newFileName) {\n throw new Error('newFileName must be specified for Git patches');\n }\n let gitOldName = patch.oldFileName;\n let gitNewName = patch.newFileName;\n if (patch.isCreate && gitOldName === '/dev/null') {\n gitOldName = gitNewName.replace(/^b\\//, 'a/');\n }\n else if (patch.isDelete && gitNewName === '/dev/null') {\n gitNewName = gitOldName.replace(/^a\\//, 'b/');\n }\n ret.push('diff --git ' + quoteFileNameIfNeeded(gitOldName) + ' ' + quoteFileNameIfNeeded(gitNewName));\n if (patch.isDelete) {\n ret.push('deleted file mode ' + ((_a = patch.oldMode) !== null && _a !== void 0 ? _a : '100644'));\n }\n if (patch.isCreate) {\n ret.push('new file mode ' + ((_b = patch.newMode) !== null && _b !== void 0 ? _b : '100644'));\n }\n if (patch.oldMode && patch.newMode && !patch.isDelete && !patch.isCreate) {\n ret.push('old mode ' + patch.oldMode);\n ret.push('new mode ' + patch.newMode);\n }\n if (patch.isRename) {\n ret.push('rename from ' + quoteFileNameIfNeeded(((_c = patch.oldFileName) !== null && _c !== void 0 ? _c : '').replace(/^a\\//, '')));\n ret.push('rename to ' + quoteFileNameIfNeeded(((_d = patch.newFileName) !== null && _d !== void 0 ? _d : '').replace(/^b\\//, '')));\n }\n if (patch.isCopy) {\n ret.push('copy from ' + quoteFileNameIfNeeded(((_e = patch.oldFileName) !== null && _e !== void 0 ? _e : '').replace(/^a\\//, '')));\n ret.push('copy to ' + quoteFileNameIfNeeded(((_f = patch.newFileName) !== null && _f !== void 0 ? _f : '').replace(/^b\\//, '')));\n }\n }\n else {\n if (headerOptions.includeIndex && patch.oldFileName == patch.newFileName && patch.oldFileName !== undefined) {\n ret.push('Index: ' + patch.oldFileName);\n }\n if (headerOptions.includeUnderline) {\n ret.push('===================================================================');\n }\n }\n // Emit --- / +++ file headers. For Git patches with no hunks (e.g.\n // pure renames, mode-only changes), Git omits these, so we do too.\n const hasHunks = patch.hunks.length > 0;\n if (headerOptions.includeFileHeaders && patch.oldFileName !== undefined && patch.newFileName !== undefined\n && (!patch.isGit || hasHunks)) {\n ret.push('--- ' + quoteFileNameIfNeeded(patch.oldFileName) + (patch.oldHeader ? '\\t' + patch.oldHeader : ''));\n ret.push('+++ ' + quoteFileNameIfNeeded(patch.newFileName) + (patch.newHeader ? '\\t' + patch.newHeader : ''));\n }\n for (let i = 0; i < patch.hunks.length; i++) {\n const hunk = patch.hunks[i];\n // Unified Diff Format quirk: If the chunk size is 0,\n // the first number is one lower than one would expect.\n // https://www.artima.com/weblogs/viewpost.jsp?thread=164293\n const oldStart = hunk.oldLines === 0 ? hunk.oldStart - 1 : hunk.oldStart;\n const newStart = hunk.newLines === 0 ? hunk.newStart - 1 : hunk.newStart;\n ret.push('@@ -' + oldStart + ',' + hunk.oldLines\n + ' +' + newStart + ',' + hunk.newLines\n + ' @@');\n for (const line of hunk.lines) {\n ret.push(line);\n }\n }\n return ret.join('\\n') + '\\n';\n}\nexport function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {\n if (typeof options === 'function') {\n options = { callback: options };\n }\n if (!(options === null || options === void 0 ? void 0 : options.callback)) {\n const patchObj = structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options);\n if (!patchObj) {\n return;\n }\n return formatPatch(patchObj, options === null || options === void 0 ? void 0 : options.headerOptions);\n }\n else {\n const { callback } = options;\n structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, Object.assign(Object.assign({}, options), { callback: patchObj => {\n if (!patchObj) {\n callback(undefined);\n }\n else {\n callback(formatPatch(patchObj, options.headerOptions));\n }\n } }));\n }\n}\nexport function createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) {\n return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options);\n}\n/**\n * Split `text` into an array of lines, including the trailing newline character (where present)\n */\nfunction splitLines(text) {\n const hasTrailingNl = text.endsWith('\\n');\n const result = text.split('\\n').map(line => line + '\\n');\n if (hasTrailingNl) {\n result.pop();\n }\n else {\n result.push(result.pop().slice(0, -1));\n }\n return result;\n}\n","import { constants } from \"node:fs\";\nimport { open } from \"node:fs/promises\";\n\n/** Inspect the opened handle without waiting for a FIFO writer, including through symlinks. */\nexport async function readRegularFile(path: string): Promise<Buffer> {\n const file = await open(path, constants.O_RDONLY | (constants.O_NONBLOCK ?? 0));\n try {\n if (!(await file.stat()).isFile()) throw new Error(\"File mutation requires a regular file\");\n return await file.readFile();\n } finally {\n await file.close();\n }\n}\n","// Adapted from Pi c20cb09772bf4e2590a316cb54514cef76df4293.\n// Copyright (c) 2025 Mario Zechner. MIT license: licenses/third-party-notices.txt.\nconst BASH_UPDATE_THROTTLE_MS = 100;\n\nimport { spawn } from \"node:child_process\";\nimport { constants } from \"node:fs\";\nimport { access as fsAccess } from \"node:fs/promises\";\nimport { constants as osConstants } from \"node:os\";\nimport { type Static, Type } from \"typebox\";\nimport type { ToolContext, ToolDefinition } from \"../../types.ts\";\nimport { cleanupOutputFiles, OutputAccumulator } from \"./output-accumulator.ts\";\nimport { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, type TruncationResult } from \"./truncate.ts\";\nimport { waitForChildProcess } from \"./utils/child-process.ts\";\nimport { getShellConfig, getShellEnv, killProcessTree, type ShellConfig } from \"./utils/shell.ts\";\n\nconst MAX_TIMEOUT_MS = 2_147_483_647;\n/** Output limit of `structuredContent.output`, which programmatic callers such as codemode scripts receive. */\nconst STRUCTURED_OUTPUT_MAX_BYTES = 1024 * 1024;\nconst MAX_TIMEOUT_SECONDS = MAX_TIMEOUT_MS / 1000;\nconst outputCleanups = new Map<string, { startedAt: number; done: Promise<void> }>();\n\nfunction resolveTimeoutMs(timeout: number | undefined): number | undefined {\n if (timeout === undefined) return undefined;\n if (!Number.isFinite(timeout) || timeout <= 0) {\n throw new Error(\"Invalid timeout: must be a finite number of seconds\");\n }\n\n const timeoutMs = timeout * 1000;\n if (timeoutMs > MAX_TIMEOUT_MS) {\n throw new Error(`Invalid timeout: maximum is ${MAX_TIMEOUT_SECONDS} seconds`);\n }\n return timeoutMs;\n}\n\nconst bashSchema = Type.Object({\n command: Type.String({ description: \"Shell command to execute\" }),\n timeout: Type.Optional(Type.Number({ description: \"Timeout in seconds (optional, no default timeout)\" })),\n});\n\nexport const bashToolSystemPromptContribution = {\n snippet: \"Execute bash commands (ls, grep, find, etc.)\",\n guidelines: [\"You can inspect ZPI_* environment variables for current model and session details.\"],\n} as const;\n\n/**\n * Result for programmatic callers such as codemode scripts. A non-zero exit code is an error result for the model, but scripts still resolve to this value.\n * `output` is not limited like the model-facing output: callers decide how much of it reaches the model.\n */\nconst bashOutputSchema = Type.Object({\n output: Type.String({ description: \"Combined stdout and stderr, possibly truncated\" }),\n truncated: Type.Boolean(),\n full_output_path: Type.Optional(Type.String({ description: \"Full output, when truncated\" })),\n exit_code: Type.Number(),\n wall_time_seconds: Type.Number(),\n});\n\nexport type BashToolOutput = Static<typeof bashOutputSchema>;\n\nexport interface BashToolDetails {\n truncation?: TruncationResult;\n fullOutputPath?: string;\n}\n\n/**\n * Pluggable operations for the bash tool.\n * Override these to delegate command execution to remote systems (for example SSH).\n */\nexport interface BashOperations {\n /**\n * Execute a command and stream output.\n * @param command The command to execute\n * @param cwd Working directory\n * @param options Execution options\n * @returns Promise resolving to the exit code. Report signal terminations as 128 + signal number;\n * a null exit code is treated as a failed command.\n */\n exec: (\n command: string,\n cwd: string,\n options: {\n /**\n * Await returned promises before delivering another chunk to bound pending output writes.\n * Other return values are ignored, as with the original synchronous callback.\n */\n onData: (data: Buffer, stream?: \"stdout\" | \"stderr\") => unknown;\n signal?: AbortSignal;\n timeout?: number;\n env?: NodeJS.ProcessEnv;\n },\n ) => Promise<{ exitCode: number | null }>;\n}\n\n/** Shared process execution used by the built-in shell tools. */\nexport function createLocalShellOperations(\n shellName: string,\n resolveShellConfig: () => ShellConfig,\n): BashOperations {\n return {\n exec: async (command, cwd, { onData, signal, timeout, env }) => {\n const timeoutMs = resolveTimeoutMs(timeout);\n if (signal?.aborted) {\n throw new Error(\"aborted\");\n }\n const shellConfig = resolveShellConfig();\n try {\n await fsAccess(cwd, constants.F_OK);\n } catch {\n throw new Error(`Working directory does not exist: ${cwd}\\nCannot execute ${shellName} commands.`);\n }\n\n const commandFromStdin = shellConfig.commandTransport === \"stdin\";\n const child = spawn(\n shellConfig.shell,\n commandFromStdin ? shellConfig.args : [...shellConfig.args, command],\n {\n cwd,\n detached: process.platform !== \"win32\",\n env: env ?? getShellEnv(),\n stdio: [commandFromStdin ? \"pipe\" : \"ignore\", \"pipe\", \"pipe\"],\n windowsHide: true,\n },\n );\n if (commandFromStdin) {\n child.stdin?.on(\"error\", () => {});\n child.stdin?.end(command);\n }\n let timedOut = false;\n let timeoutHandle: NodeJS.Timeout | undefined;\n let pendingOutput: Promise<void> | undefined;\n let outputError: Error | undefined;\n let stopped = false;\n const stopSignal = Promise.withResolvers<void>();\n const stop = () => {\n if (stopped) return;\n stopped = true;\n stopSignal.resolve();\n if (child.pid) killProcessTree(child.pid);\n // A stopped consumer must not leave paused pipes keeping execution alive.\n child.stdout?.destroy();\n child.stderr?.destroy();\n };\n const handleOutputError = (error: unknown) => {\n if (stopped) return;\n outputError = error instanceof Error ? error : new Error(String(error));\n stop();\n };\n const handleData = (data: Buffer, stream: \"stdout\" | \"stderr\") => {\n try {\n // A pipe can deliver an already scheduled chunk after pause (including the\n // child-process exit flush). Serialize that chunk behind the current write.\n const deliver = () => (stopped ? undefined : onData(data, stream));\n const pending = pendingOutput ? pendingOutput.then(deliver) : deliver();\n if (\n pending &&\n (typeof pending === \"object\" || typeof pending === \"function\") &&\n \"then\" in pending &&\n typeof pending.then === \"function\"\n ) {\n // Both pipes share one output file: pausing only the current pipe still lets the\n // other enqueue unbounded writes while the consumer is waiting for disk.\n child.stdout?.pause();\n child.stderr?.pause();\n const current = Promise.resolve(pending).then(() => {\n if (pendingOutput !== current) return;\n pendingOutput = undefined;\n if (!stopped) {\n child.stdout?.resume();\n child.stderr?.resume();\n }\n }, handleOutputError);\n pendingOutput = current;\n }\n } catch (error) {\n handleOutputError(error);\n }\n };\n const onStdout = (data: Buffer) => handleData(data, \"stdout\");\n const onStderr = (data: Buffer) => handleData(data, \"stderr\");\n const onOutputResume = () => {\n // Node also resumes inherited pipes on process exit. That must not bypass a\n // pending consumer or start the inherited-handle idle clock while it is busy.\n if (pendingOutput) {\n child.stdout?.pause();\n child.stderr?.pause();\n }\n };\n const onAbort = stop;\n\n try {\n // Set timeout if provided.\n if (timeoutMs !== undefined) {\n timeoutHandle = setTimeout(() => {\n timedOut = true;\n stop();\n }, timeoutMs);\n }\n // Stream stdout and stderr.\n child.stdout?.on(\"resume\", onOutputResume);\n child.stderr?.on(\"resume\", onOutputResume);\n child.stdout?.on(\"data\", onStdout);\n child.stderr?.on(\"data\", onStderr);\n // Handle abort signal by killing the entire process tree.\n if (signal) {\n if (signal.aborted) onAbort();\n else signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n // Handle shell spawn errors and wait for the process to terminate without hanging\n // on inherited stdio handles held by detached descendants.\n const exitCode = await waitForChildProcess(child);\n if (pendingOutput) await Promise.race([pendingOutput, stopSignal.promise]);\n if (signal?.aborted) {\n throw new Error(\"aborted\");\n }\n if (timedOut) {\n throw new Error(`timeout:${timeout}`);\n }\n if (outputError !== undefined) throw outputError;\n // A signal-killed shell has no exit code. Use the standard shell convention so\n // callers do not mistake the termination for a successful command.\n const signalCode = child.signalCode;\n return { exitCode: exitCode ?? (signalCode ? 128 + (osConstants.signals[signalCode] ?? 0) : 1) };\n } finally {\n stopped = true;\n if (timeoutHandle) clearTimeout(timeoutHandle);\n if (signal) signal.removeEventListener(\"abort\", onAbort);\n child.stdout?.removeListener(\"data\", onStdout);\n child.stderr?.removeListener(\"data\", onStderr);\n child.stdout?.removeListener(\"resume\", onOutputResume);\n child.stderr?.removeListener(\"resume\", onOutputResume);\n }\n },\n };\n}\n\n/**\n * Create bash operations using the local shell execution backend.\n */\nexport function createLocalBashOperations(options?: { shellPath?: string }): BashOperations {\n return createLocalShellOperations(\"bash\", () => getShellConfig(options?.shellPath));\n}\n\nexport interface BashSpawnContext {\n command: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n}\n\nexport type BashSpawnHook = (context: BashSpawnContext) => BashSpawnContext;\n\nfunction resolveSpawnContext(\n command: string,\n cwd: string,\n spawnHook: BashSpawnHook | undefined,\n exposeSessionEnvironment: boolean,\n ctx: Partial<ToolContext> | undefined,\n): BashSpawnContext {\n const env = { ...getShellEnv() };\n for (const name of [\"SESSION_ID\", \"SESSION_FILE\", \"PROVIDER\", \"MODEL\", \"REASONING_LEVEL\"]) {\n delete env[`PI_${name}`];\n delete env[`ZPI_${name}`];\n }\n if (exposeSessionEnvironment && ctx) {\n const model = ctx.model;\n if (ctx.sessionManager) env.ZPI_SESSION_ID = ctx.sessionManager.getSessionId();\n const sessionFile = ctx.sessionManager?.getSessionFile();\n if (sessionFile) env.ZPI_SESSION_FILE = sessionFile;\n if (model) {\n env.ZPI_PROVIDER = model.provider;\n env.ZPI_MODEL = model.id;\n }\n if (ctx.thinkingLevel) env.ZPI_REASONING_LEVEL = ctx.thinkingLevel;\n }\n const baseContext: BashSpawnContext = { command, cwd, env };\n return spawnHook ? spawnHook(baseContext) : baseContext;\n}\n\nexport interface BashToolOptions {\n /** Custom operations for command execution. Default: local shell */\n operations?: BashOperations;\n /** Command prefix prepended to every command (for example shell setup commands) */\n commandPrefix?: string;\n /** Optional explicit shell path from settings */\n shellPath?: string;\n /** Expose current ZPI session metadata as ZPI_* environment variables. Default: true */\n exposeSessionEnvironment?: boolean;\n /** Hook to adjust command, cwd, or env before execution */\n spawnHook?: BashSpawnHook;\n}\n\nexport interface ShellToolConfig {\n name: string;\n label: string;\n shellName: string;\n promptSnippet: string;\n promptGuidelines?: readonly string[];\n tempFilePrefix: string;\n}\n\nexport function createShellToolDefinition(cwd: string, config: ShellToolConfig, options?: BashToolOptions) {\n const ops = options?.operations ?? createLocalBashOperations({ shellPath: options?.shellPath });\n const commandPrefix = options?.commandPrefix;\n const exposeSessionEnvironment = options?.exposeSessionEnvironment ?? true;\n const spawnHook = options?.spawnHook;\n return {\n name: config.name,\n label: config.label,\n description: `Execute a ${config.shellName} command in the current working directory. Returns stdout and stderr. Output is truncated to last ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). If truncated, full output is saved to a temp file. Optionally provide a timeout in seconds.`,\n promptSnippet: config.promptSnippet,\n promptGuidelines:\n exposeSessionEnvironment && config.promptGuidelines ? [...config.promptGuidelines] : undefined,\n parameters: bashSchema,\n outputSchema: bashOutputSchema,\n async execute(\n _toolCallId,\n { command, timeout }: { command: string; timeout?: number },\n signal?: AbortSignal,\n onUpdate?,\n ctx?: Partial<ToolContext>,\n ) {\n const resolvedCommand = commandPrefix ? `${commandPrefix}\\n${command}` : command;\n const spawnContext = resolveSpawnContext(\n resolvedCommand,\n ctx?.cwd || cwd,\n spawnHook,\n exposeSessionEnvironment,\n ctx,\n );\n let cleanup = outputCleanups.get(config.tempFilePrefix);\n if (!cleanup || Date.now() - cleanup.startedAt >= 24 * 60 * 60 * 1000) {\n cleanup = { startedAt: Date.now(), done: cleanupOutputFiles(config.tempFilePrefix).catch(() => {}) };\n outputCleanups.set(config.tempFilePrefix, cleanup);\n }\n await cleanup.done;\n const output = new OutputAccumulator({ tempFilePrefix: config.tempFilePrefix });\n let acceptingOutput = true;\n let updateTimer: NodeJS.Timeout | undefined;\n let updateDirty = false;\n let lastUpdateAt = 0;\n\n const emitOutputUpdate = () => {\n if (!onUpdate || !updateDirty) return;\n updateDirty = false;\n lastUpdateAt = Date.now();\n const snapshot = output.snapshot({ persistIfTruncated: true });\n onUpdate({\n content: [{ type: \"text\", text: snapshot.content || \"\" }],\n details: {\n truncation: snapshot.truncation.truncated ? snapshot.truncation : undefined,\n fullOutputPath: snapshot.fullOutputPath,\n },\n });\n };\n\n const clearUpdateTimer = () => {\n if (updateTimer) {\n clearTimeout(updateTimer);\n updateTimer = undefined;\n }\n };\n\n const scheduleOutputUpdate = () => {\n if (!onUpdate) return;\n updateDirty = true;\n const delay = BASH_UPDATE_THROTTLE_MS - (Date.now() - lastUpdateAt);\n if (delay <= 0) {\n clearUpdateTimer();\n emitOutputUpdate();\n return;\n }\n updateTimer ??= setTimeout(() => {\n updateTimer = undefined;\n emitOutputUpdate();\n }, delay);\n };\n\n if (onUpdate) {\n onUpdate({ content: [], details: undefined });\n }\n\n const handleData = (data: Buffer) => {\n if (!acceptingOutput) return;\n const pending = output.append(data);\n scheduleOutputUpdate();\n return pending;\n };\n\n const finishOutput = async () => {\n acceptingOutput = false;\n output.finish();\n clearUpdateTimer();\n emitOutputUpdate();\n const snapshot = output.snapshot({ persistIfTruncated: true });\n await output.closeTempFile();\n return snapshot;\n };\n\n const formatOutput = (\n snapshot: Awaited<ReturnType<typeof finishOutput>>,\n emptyText = \"(no output)\",\n ) => {\n const truncation = snapshot.truncation;\n let text = snapshot.content || emptyText;\n let details: BashToolDetails | undefined;\n if (truncation.truncated) {\n details = { truncation, fullOutputPath: snapshot.fullOutputPath };\n const startLine = truncation.totalLines - truncation.outputLines + 1;\n const endLine = truncation.totalLines;\n if (truncation.lastLinePartial) {\n const lastLineSize = formatSize(output.getLastLineBytes());\n text += `\\n\\n[Showing last ${formatSize(truncation.outputBytes)} of line ${endLine} (line is ${lastLineSize}). Full output: ${snapshot.fullOutputPath}]`;\n } else if (truncation.truncatedBy === \"lines\") {\n text += `\\n\\n[Showing lines ${startLine}-${endLine} of ${truncation.totalLines}. Full output: ${snapshot.fullOutputPath}]`;\n } else {\n text += `\\n\\n[Showing lines ${startLine}-${endLine} of ${truncation.totalLines} (${formatSize(DEFAULT_MAX_BYTES)} limit). Full output: ${snapshot.fullOutputPath}]`;\n }\n }\n return { text, details };\n };\n\n const appendStatus = (text: string, status: string) => `${text ? `${text}\\n\\n` : \"\"}${status}`;\n const startedAt = performance.now();\n\n try {\n let exitCode: number | null;\n try {\n const result = await ops.exec(spawnContext.command, spawnContext.cwd, {\n onData: handleData,\n signal,\n timeout,\n env: spawnContext.env,\n });\n exitCode = result.exitCode;\n } catch (err) {\n const snapshot = await finishOutput();\n const { text } = formatOutput(snapshot, \"\");\n if (err instanceof Error && err.message === \"aborted\") {\n throw new Error(appendStatus(text, \"Command aborted\"));\n }\n if (err instanceof Error && err.message.startsWith(\"timeout:\")) {\n const timeoutSecs = err.message.split(\":\")[1];\n throw new Error(appendStatus(text, `Command timed out after ${timeoutSecs} seconds`));\n }\n throw err;\n }\n\n const snapshot = await finishOutput();\n const { text: outputText, details } = formatOutput(snapshot);\n if (exitCode === null) {\n throw new Error(appendStatus(outputText, \"Command terminated without an exit code\"));\n }\n const wallTimeSeconds = Math.round((performance.now() - startedAt) / 100) / 10;\n const fullOutput = await output.readFullOutput(STRUCTURED_OUTPUT_MAX_BYTES);\n const structuredContent: BashToolOutput = {\n output: fullOutput.content,\n truncated: fullOutput.truncated,\n ...(fullOutput.truncated && snapshot.fullOutputPath\n ? { full_output_path: snapshot.fullOutputPath }\n : {}),\n exit_code: exitCode,\n wall_time_seconds: wallTimeSeconds,\n };\n if (exitCode !== 0) {\n return {\n content: [\n { type: \"text\", text: appendStatus(outputText, `Command exited with code ${exitCode}`) },\n ],\n details,\n structuredContent,\n isError: true,\n };\n }\n return { content: [{ type: \"text\", text: outputText }], details, structuredContent };\n } finally {\n clearUpdateTimer();\n }\n },\n } satisfies ToolDefinition<typeof bashSchema, BashToolDetails | undefined>;\n}\n\nconst bashToolConfig: ShellToolConfig = {\n name: \"bash\",\n label: \"bash\",\n shellName: \"bash\",\n promptSnippet: bashToolSystemPromptContribution.snippet,\n promptGuidelines: bashToolSystemPromptContribution.guidelines,\n tempFilePrefix: \"zpi-bash\",\n};\n\nexport function createBashToolDefinition(cwd: string, options?: BashToolOptions) {\n return createShellToolDefinition(cwd, bashToolConfig, options);\n}\n","// Adapted from Pi c20cb09772bf4e2590a316cb54514cef76df4293.\n// Copyright (c) 2025 Mario Zechner. MIT license: licenses/third-party-notices.txt.\nimport { randomBytes } from \"node:crypto\";\nimport { createWriteStream, type WriteStream } from \"node:fs\";\nimport { open, readdir, rm, stat } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, type TruncationResult, truncateTail } from \"./truncate.ts\";\n\nexport interface OutputAccumulatorOptions {\n maxLines?: number;\n maxBytes?: number;\n tempFilePrefix?: string;\n}\n\nexport interface OutputSnapshot {\n content: string;\n truncation: TruncationResult;\n fullOutputPath?: string;\n}\n\nexport interface FullOutput {\n content: string;\n /** Whether `content` omits part of the output. */\n truncated: boolean;\n}\n\nfunction defaultTempFilePath(prefix: string): string {\n const id = randomBytes(8).toString(\"hex\");\n return join(tmpdir(), `${prefix}-${id}.log`);\n}\n\n/** Keep recent output available to read, and prune expired logs on the next bash invocation. */\nexport async function cleanupOutputFiles(prefix: string, directory = tmpdir()): Promise<void> {\n const cutoff = Date.now() - 7 * 24 * 60 * 60 * 1000;\n for (const file of await readdir(directory, { withFileTypes: true })) {\n if (!file.isFile() || !file.name.startsWith(`${prefix}-`)) continue;\n if (!/^[a-f0-9]{16}\\.log$/.test(file.name.slice(prefix.length + 1))) continue;\n const path = join(directory, file.name);\n try {\n if ((await stat(path)).mtimeMs < cutoff) await rm(path, { force: true });\n } catch {\n // Optional cleanup must not prevent a command from running.\n }\n }\n}\n\nfunction byteLength(text: string): number {\n return Buffer.byteLength(text, \"utf-8\");\n}\n\n/**\n * Incrementally tracks streaming output with bounded memory when producers await `append`.\n *\n * Appends decode chunks with a streaming UTF-8 decoder, keeps only a decoded\n * tail for display snapshots, and opens a temp file when the full output needs\n * to be preserved.\n */\nexport class OutputAccumulator {\n private readonly maxLines: number;\n private readonly maxBytes: number;\n private readonly maxRollingBytes: number;\n private readonly tempFilePrefix: string;\n private readonly decoder = new TextDecoder();\n\n private rawChunks: Buffer[] = [];\n private tailText = \"\";\n private tailBytes = 0;\n private tailStartsAtLineBoundary = true;\n private totalRawBytes = 0;\n private totalDecodedBytes = 0;\n private completedLines = 0;\n private totalLines = 0;\n private currentLineBytes = 0;\n private hasOpenLine = false;\n private finished = false;\n\n private tempFilePath: string | undefined;\n private tempFileStream: WriteStream | undefined;\n private tempFileError: Error | undefined;\n private tempFileDrain: Promise<void> | undefined;\n\n constructor(options: OutputAccumulatorOptions = {}) {\n this.maxLines = options.maxLines ?? DEFAULT_MAX_LINES;\n this.maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES;\n this.maxRollingBytes = Math.max(this.maxBytes * 2, 1);\n this.tempFilePrefix = options.tempFilePrefix ?? \"pi-output\";\n }\n\n /** Await the returned promise, when present, before appending another chunk. */\n append(data: Buffer): void | Promise<void> {\n if (this.finished) {\n throw new Error(\"Cannot append to a finished output accumulator\");\n }\n\n if (this.tempFileError) throw this.tempFileError;\n\n this.totalRawBytes += data.length;\n this.appendDecodedText(this.decoder.decode(data, { stream: true }));\n\n if (this.tempFileStream || this.shouldUseTempFile()) {\n this.ensureTempFile();\n const stream = this.tempFileStream;\n if (stream && !stream.write(data)) return this.waitForTempFileDrain(stream);\n } else if (data.length > 0) {\n this.rawChunks.push(data);\n }\n }\n\n finish(): void {\n if (this.finished) {\n return;\n }\n this.finished = true;\n this.appendDecodedText(this.decoder.decode());\n if (this.shouldUseTempFile()) {\n this.ensureTempFile();\n }\n }\n\n snapshot(options: { persistIfTruncated?: boolean } = {}): OutputSnapshot {\n const tailTruncation = truncateTail(this.getSnapshotText(), {\n maxLines: this.maxLines,\n maxBytes: this.maxBytes,\n });\n const truncated = this.totalLines > this.maxLines || this.totalDecodedBytes > this.maxBytes;\n const truncatedBy = truncated\n ? (tailTruncation.truncatedBy ?? (this.totalDecodedBytes > this.maxBytes ? \"bytes\" : \"lines\"))\n : null;\n const truncation: TruncationResult = {\n ...tailTruncation,\n truncated,\n truncatedBy,\n totalLines: this.totalLines,\n totalBytes: this.totalDecodedBytes,\n maxLines: this.maxLines,\n maxBytes: this.maxBytes,\n };\n\n if (options.persistIfTruncated && truncation.truncated) {\n this.ensureTempFile();\n }\n\n return {\n content: truncation.content,\n truncation,\n fullOutputPath: this.tempFilePath,\n };\n }\n\n async closeTempFile(): Promise<void> {\n if (!this.tempFileStream) {\n return;\n }\n\n const stream = this.tempFileStream;\n if (!stream.closed)\n await new Promise<void>((resolve) => {\n stream.once(\"close\", resolve);\n stream.end();\n });\n this.tempFileStream = undefined;\n if (this.tempFileError) {\n if (this.tempFilePath) await rm(this.tempFilePath, { force: true }).catch(() => {});\n throw this.tempFileError;\n }\n }\n\n /**\n * The complete output, for callers that can take more than the display snapshot. Call after\n * `finish()` and `closeTempFile()`. Output longer than `maxBytes` raw bytes keeps its first and\n * last `maxBytes / 2` bytes around an omission marker.\n */\n async readFullOutput(maxBytes: number): Promise<FullOutput> {\n if (!this.tempFilePath) {\n return { content: new TextDecoder().decode(Buffer.concat(this.rawChunks)), truncated: false };\n }\n const file = await open(this.tempFilePath, \"r\");\n try {\n const size = (await file.stat()).size;\n if (size <= maxBytes) {\n return { content: new TextDecoder().decode(await file.readFile()), truncated: false };\n }\n const headBytes = Math.floor(maxBytes / 2);\n const tailBytes = maxBytes - headBytes;\n const head = Buffer.alloc(headBytes);\n const tail = Buffer.alloc(tailBytes);\n await file.read(head, 0, headBytes, 0);\n await file.read(tail, 0, tailBytes, size - tailBytes);\n // Cut at character boundaries: streaming decode holds back an incomplete trailing sequence,\n // and the tail skips leading continuation bytes.\n const headText = new TextDecoder().decode(head, { stream: true });\n let tailStart = 0;\n while (tailStart < tail.length && (tail[tailStart] & 0xc0) === 0x80) tailStart++;\n const tailText = new TextDecoder().decode(tail.subarray(tailStart));\n const omitted = size - headBytes - tailBytes;\n return { content: `${headText}\\n\\n[... ${omitted} bytes omitted ...]\\n\\n${tailText}`, truncated: true };\n } finally {\n await file.close();\n }\n }\n\n getLastLineBytes(): number {\n return this.currentLineBytes;\n }\n\n private appendDecodedText(text: string): void {\n if (text.length === 0) {\n return;\n }\n\n const bytes = byteLength(text);\n this.totalDecodedBytes += bytes;\n this.tailText += text;\n this.tailBytes += bytes;\n if (this.tailBytes > this.maxRollingBytes * 2) {\n this.trimTail();\n }\n\n let newlines = 0;\n let lastNewline = -1;\n for (let i = text.indexOf(\"\\n\"); i !== -1; i = text.indexOf(\"\\n\", i + 1)) {\n newlines++;\n lastNewline = i;\n }\n if (newlines === 0) {\n this.currentLineBytes += bytes;\n this.hasOpenLine = true;\n } else {\n this.completedLines += newlines;\n const tail = text.slice(lastNewline + 1);\n this.currentLineBytes = byteLength(tail);\n this.hasOpenLine = tail.length > 0;\n }\n this.totalLines = this.completedLines + (this.hasOpenLine ? 1 : 0);\n }\n\n private trimTail(): void {\n const buffer = Buffer.from(this.tailText, \"utf-8\");\n if (buffer.length <= this.maxRollingBytes) {\n this.tailBytes = buffer.length;\n return;\n }\n\n let start = buffer.length - this.maxRollingBytes;\n while (start < buffer.length && (buffer[start] & 0xc0) === 0x80) {\n start++;\n }\n\n this.tailStartsAtLineBoundary = start === 0 ? this.tailStartsAtLineBoundary : buffer[start - 1] === 0x0a;\n this.tailText = buffer.subarray(start).toString(\"utf-8\");\n this.tailBytes = byteLength(this.tailText);\n }\n\n private getSnapshotText(): string {\n if (this.tailStartsAtLineBoundary) {\n return this.tailText;\n }\n\n const firstNewline = this.tailText.indexOf(\"\\n\");\n return firstNewline === -1 ? this.tailText : this.tailText.slice(firstNewline + 1);\n }\n\n private shouldUseTempFile(): boolean {\n return (\n this.totalRawBytes > this.maxBytes ||\n this.totalDecodedBytes > this.maxBytes ||\n this.totalLines > this.maxLines\n );\n }\n\n private waitForTempFileDrain(stream: WriteStream): Promise<void> {\n if (this.tempFileDrain) return this.tempFileDrain;\n const drain = new Promise<void>((resolve, reject) => {\n const finish = () => {\n stream.removeListener(\"drain\", finish);\n stream.removeListener(\"error\", finish);\n stream.removeListener(\"close\", finish);\n this.tempFileDrain = undefined;\n if (this.tempFileError) reject(this.tempFileError);\n else if (stream.destroyed && !stream.writableFinished)\n reject(new Error(\"Output file closed before draining\"));\n else resolve();\n };\n stream.once(\"drain\", finish);\n stream.once(\"error\", finish);\n stream.once(\"close\", finish);\n });\n // Legacy synchronous producers can ignore the promise. closeTempFile still reports disk errors.\n void drain.catch(() => {});\n this.tempFileDrain = drain;\n return drain;\n }\n\n private ensureTempFile(): void {\n if (this.tempFilePath) {\n return;\n }\n this.tempFilePath = defaultTempFilePath(this.tempFilePrefix);\n this.tempFileStream = createWriteStream(this.tempFilePath, { mode: 0o600 });\n this.tempFileStream.on(\"error\", (error) => {\n this.tempFileError = error;\n });\n for (const chunk of this.rawChunks) {\n this.tempFileStream.write(chunk);\n }\n this.rawChunks = [];\n }\n}\n","// Adapted from Pi c20cb09772bf4e2590a316cb54514cef76df4293.\n// Copyright (c) 2025 Mario Zechner. MIT license: licenses/third-party-notices.txt.\n/**\n * Shared truncation utilities for tool outputs.\n *\n * Truncation is based on two independent limits - whichever is hit first wins:\n * - Line limit (default: 2000 lines)\n * - Byte limit (default: 50KB)\n *\n * Never returns partial lines (except bash tail truncation edge case).\n */\n\nexport const DEFAULT_MAX_LINES = 2000;\nexport const DEFAULT_MAX_BYTES = 50 * 1024; // 50KB\n\nexport interface TruncationResult {\n /** The truncated content */\n content: string;\n /** Whether truncation occurred */\n truncated: boolean;\n /** Which limit was hit: \"lines\", \"bytes\", or null if not truncated */\n truncatedBy: \"lines\" | \"bytes\" | null;\n /** Total number of lines in the original content */\n totalLines: number;\n /** Total number of bytes in the original content */\n totalBytes: number;\n /** Number of complete lines in the truncated output */\n outputLines: number;\n /** Number of bytes in the truncated output */\n outputBytes: number;\n /** Whether the last line was partially truncated (only for tail truncation edge case) */\n lastLinePartial: boolean;\n /** Whether the first line exceeded the byte limit (for head truncation) */\n firstLineExceedsLimit: boolean;\n /** The max lines limit that was applied */\n maxLines: number;\n /** The max bytes limit that was applied */\n maxBytes: number;\n}\n\nexport interface TruncationOptions {\n /** Maximum number of lines (default: 2000) */\n maxLines?: number;\n /** Maximum number of bytes (default: 50KB) */\n maxBytes?: number;\n}\n\nfunction splitLinesForCounting(content: string): string[] {\n if (content.length === 0) {\n return [];\n }\n const lines = content.split(\"\\n\");\n if (content.endsWith(\"\\n\")) {\n lines.pop();\n }\n return lines;\n}\n\n/**\n * Format bytes as human-readable size.\n */\nexport function formatSize(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes}B`;\n } else if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)}KB`;\n } else {\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n }\n}\n\n/**\n * Truncate content from the head (keep first N lines/bytes).\n * Suitable for file reads where you want to see the beginning.\n *\n * Never returns partial lines. If first line exceeds byte limit,\n * returns empty content with firstLineExceedsLimit=true.\n */\nexport function truncateHead(content: string, options: TruncationOptions = {}): TruncationResult {\n const maxLines = options.maxLines ?? DEFAULT_MAX_LINES;\n const maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES;\n\n const totalBytes = Buffer.byteLength(content, \"utf-8\");\n const lines = splitLinesForCounting(content);\n const totalLines = lines.length;\n\n // Check if no truncation needed\n if (totalLines <= maxLines && totalBytes <= maxBytes) {\n return {\n content,\n truncated: false,\n truncatedBy: null,\n totalLines,\n totalBytes,\n outputLines: totalLines,\n outputBytes: totalBytes,\n lastLinePartial: false,\n firstLineExceedsLimit: false,\n maxLines,\n maxBytes,\n };\n }\n\n // Check if first line alone exceeds byte limit\n const firstLineBytes = Buffer.byteLength(lines[0], \"utf-8\");\n if (firstLineBytes > maxBytes) {\n return {\n content: \"\",\n truncated: true,\n truncatedBy: \"bytes\",\n totalLines,\n totalBytes,\n outputLines: 0,\n outputBytes: 0,\n lastLinePartial: false,\n firstLineExceedsLimit: true,\n maxLines,\n maxBytes,\n };\n }\n\n // Collect complete lines that fit\n const outputLinesArr: string[] = [];\n let outputBytesCount = 0;\n let truncatedBy: \"lines\" | \"bytes\" = \"lines\";\n\n for (let i = 0; i < lines.length && i < maxLines; i++) {\n const line = lines[i];\n const lineBytes = Buffer.byteLength(line, \"utf-8\") + (i > 0 ? 1 : 0); // +1 for newline\n\n if (outputBytesCount + lineBytes > maxBytes) {\n truncatedBy = \"bytes\";\n break;\n }\n\n outputLinesArr.push(line);\n outputBytesCount += lineBytes;\n }\n\n const outputContent = outputLinesArr.join(\"\\n\");\n const finalOutputBytes = Buffer.byteLength(outputContent, \"utf-8\");\n\n return {\n content: outputContent,\n truncated: true,\n truncatedBy,\n totalLines,\n totalBytes,\n outputLines: outputLinesArr.length,\n outputBytes: finalOutputBytes,\n lastLinePartial: false,\n firstLineExceedsLimit: false,\n maxLines,\n maxBytes,\n };\n}\n\n/**\n * Truncate content from the tail (keep last N lines/bytes).\n * Suitable for bash output where you want to see the end (errors, final results).\n *\n * May return partial first line if the last line of original content exceeds byte limit.\n */\nexport function truncateTail(content: string, options: TruncationOptions = {}): TruncationResult {\n const maxLines = options.maxLines ?? DEFAULT_MAX_LINES;\n const maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES;\n\n const totalBytes = Buffer.byteLength(content, \"utf-8\");\n const lines = splitLinesForCounting(content);\n const totalLines = lines.length;\n\n // Check if no truncation needed\n if (totalLines <= maxLines && totalBytes <= maxBytes) {\n return {\n content,\n truncated: false,\n truncatedBy: null,\n totalLines,\n totalBytes,\n outputLines: totalLines,\n outputBytes: totalBytes,\n lastLinePartial: false,\n firstLineExceedsLimit: false,\n maxLines,\n maxBytes,\n };\n }\n\n // Work backwards from the end\n const outputLinesArr: string[] = [];\n let outputBytesCount = 0;\n let truncatedBy: \"lines\" | \"bytes\" = \"lines\";\n let lastLinePartial = false;\n\n for (let i = lines.length - 1; i >= 0 && outputLinesArr.length < maxLines; i--) {\n const line = lines[i];\n const lineBytes = Buffer.byteLength(line, \"utf-8\") + (outputLinesArr.length > 0 ? 1 : 0); // +1 for newline\n\n if (outputBytesCount + lineBytes > maxBytes) {\n truncatedBy = \"bytes\";\n // Edge case: if we haven't added ANY lines yet and this line exceeds maxBytes,\n // take the end of the line (partial)\n if (outputLinesArr.length === 0) {\n const truncatedLine = truncateStringToBytesFromEnd(line, maxBytes);\n outputLinesArr.unshift(truncatedLine);\n outputBytesCount = Buffer.byteLength(truncatedLine, \"utf-8\");\n lastLinePartial = true;\n }\n break;\n }\n\n outputLinesArr.unshift(line);\n outputBytesCount += lineBytes;\n }\n\n const outputContent = outputLinesArr.join(\"\\n\");\n const finalOutputBytes = Buffer.byteLength(outputContent, \"utf-8\");\n\n return {\n content: outputContent,\n truncated: true,\n truncatedBy,\n totalLines,\n totalBytes,\n outputLines: outputLinesArr.length,\n outputBytes: finalOutputBytes,\n lastLinePartial,\n firstLineExceedsLimit: false,\n maxLines,\n maxBytes,\n };\n}\n\n/**\n * Truncate a string to fit within a byte limit (from the end).\n * Handles multi-byte UTF-8 characters correctly.\n */\nfunction truncateStringToBytesFromEnd(str: string, maxBytes: number): string {\n const buf = Buffer.from(str, \"utf-8\");\n if (buf.length <= maxBytes) {\n return str;\n }\n\n // Start from the end, skip maxBytes back\n let start = buf.length - maxBytes;\n\n // Find a valid UTF-8 boundary (start of a character)\n while (start < buf.length && (buf[start] & 0xc0) === 0x80) {\n start++;\n }\n\n return buf.slice(start).toString(\"utf-8\");\n}\n","// Adapted from Pi c20cb09772bf4e2590a316cb54514cef76df4293.\n// Copyright (c) 2025 Mario Zechner. MIT license: licenses/third-party-notices.txt.\nimport type { ChildProcess } from \"node:child_process\";\n\nconst EXIT_STDIO_GRACE_MS = 100;\n\n/**\n * Wait for a child process to terminate without hanging on inherited stdio handles.\n *\n * A short-lived child can `exit` while a detached descendant keeps its stdout/stderr\n * pipe open. We must not resolve and destroy the streams on a fixed deadline measured\n * from `exit`, or output still being written past that deadline is silently lost\n * (earendil-works/pi#5303). Instead, after `exit` we wait for the pipes to fall idle:\n * the grace timer is re-armed on every chunk, so an actively writing descendant keeps\n * us reading, while a quiet inherited handle (e.g. a Windows daemonized descendant\n * that never lets `close` fire) still releases us after the grace elapses.\n */\nexport function waitForChildProcess(child: ChildProcess): Promise<number | null> {\n return new Promise((resolve, reject) => {\n let settled = false;\n let exited = false;\n let exitCode: number | null = null;\n let postExitTimer: NodeJS.Timeout | undefined;\n let stdoutEnded = child.stdout === null;\n let stderrEnded = child.stderr === null;\n\n const cleanup = () => {\n if (postExitTimer) {\n clearTimeout(postExitTimer);\n postExitTimer = undefined;\n }\n child.removeListener(\"error\", onError);\n child.removeListener(\"exit\", onExit);\n child.removeListener(\"close\", onClose);\n child.stdout?.removeListener(\"end\", onStdoutEnd);\n child.stderr?.removeListener(\"end\", onStderrEnd);\n child.stdout?.removeListener(\"data\", onData);\n child.stderr?.removeListener(\"data\", onData);\n child.stdout?.removeListener(\"pause\", onOutputPaused);\n child.stderr?.removeListener(\"pause\", onOutputPaused);\n child.stdout?.removeListener(\"resume\", onOutputResumed);\n child.stderr?.removeListener(\"resume\", onOutputResumed);\n };\n\n const finalize = (code: number | null) => {\n if (settled) return;\n settled = true;\n cleanup();\n child.stdout?.destroy();\n child.stderr?.destroy();\n resolve(code);\n };\n\n const maybeFinalizeAfterExit = () => {\n if (!exited || settled) return;\n if (stdoutEnded && stderrEnded) {\n finalize(exitCode);\n }\n };\n\n const onOutputPaused = () => {\n if (postExitTimer) clearTimeout(postExitTimer);\n postExitTimer = undefined;\n };\n\n const armIdleTimer = () => {\n onOutputPaused();\n // Backpressure is deliberate inactivity, not an idle inherited handle. Give the\n // consumer time to drain before starting the grace period again.\n if (child.stdout?.isPaused() || child.stderr?.isPaused()) return;\n postExitTimer = setTimeout(() => finalize(exitCode), EXIT_STDIO_GRACE_MS);\n };\n\n const onOutputResumed = () => {\n if (exited && !settled) armIdleTimer();\n };\n\n const onData = () => {\n // Output is still arriving after exit; defer finalizing so we don't\n // destroy the stream mid-write and truncate the tail.\n if (exited && !settled) armIdleTimer();\n };\n\n const onStdoutEnd = () => {\n stdoutEnded = true;\n maybeFinalizeAfterExit();\n };\n\n const onStderrEnd = () => {\n stderrEnded = true;\n maybeFinalizeAfterExit();\n };\n\n const onError = (err: Error) => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(err);\n };\n\n const onExit = (code: number | null) => {\n exited = true;\n exitCode = code;\n maybeFinalizeAfterExit();\n if (!settled) {\n armIdleTimer();\n }\n };\n\n const onClose = (code: number | null) => {\n finalize(code);\n };\n\n child.stdout?.once(\"end\", onStdoutEnd);\n child.stderr?.once(\"end\", onStderrEnd);\n child.stdout?.on(\"data\", onData);\n child.stderr?.on(\"data\", onData);\n child.stdout?.on(\"pause\", onOutputPaused);\n child.stderr?.on(\"pause\", onOutputPaused);\n child.stdout?.on(\"resume\", onOutputResumed);\n child.stderr?.on(\"resume\", onOutputResumed);\n child.once(\"error\", onError);\n child.once(\"exit\", onExit);\n child.once(\"close\", onClose);\n });\n}\n","// Adapted from Pi c20cb09772bf4e2590a316cb54514cef76df4293.\n// Copyright (c) 2025 Mario Zechner. MIT license: licenses/third-party-notices.txt.\n\nimport { spawn, spawnSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { delimiter, join } from \"node:path\";\n\nconst getBinDir = () => join(homedir(), \".zpi\", \"agent\", \"bin\");\n\nexport interface ShellConfig {\n shell: string;\n args: string[];\n commandTransport?: \"argv\" | \"stdin\";\n}\n\n/**\n * Find bash executable on PATH (cross-platform)\n */\nfunction isLegacyWslBashPath(path: string): boolean {\n const normalized = path.replace(/\\//g, \"\\\\\").toLowerCase();\n return /^[a-z]:\\\\windows\\\\(?:system32|sysnative)\\\\bash\\.exe$/.test(normalized);\n}\n\nfunction getBashShellConfig(shell: string): ShellConfig {\n return isLegacyWslBashPath(shell)\n ? { shell, args: [\"-s\"], commandTransport: \"stdin\" }\n : { shell, args: [\"-c\"] };\n}\n\n/**\n * Spawned WSL launchers and WindowsApps aliases block forever when the backing\n * app is missing or broken (no error, no output). Before committing to one as\n * the session shell, probe it once with a hard deadline so a broken setup fails\n * with guidance instead of hanging every command.\n */\nconst launcherBashProbes = new Map<string, boolean>();\nfunction isLauncherBashPath(path: string): boolean {\n return isLegacyWslBashPath(path) || path.includes(\"\\\\WindowsApps\\\\\");\n}\nfunction isLauncherBashUsable(shell: string): boolean {\n let usable = launcherBashProbes.get(shell);\n if (usable === undefined) {\n try {\n usable =\n spawnSync(shell, [\"-c\", \"echo ok\"], {\n encoding: \"utf-8\",\n timeout: 4000,\n windowsHide: true,\n }).status === 0;\n } catch {\n usable = false;\n }\n launcherBashProbes.set(shell, usable);\n }\n return usable;\n}\n\n/** Bash.exe next to a git.exe installation, whatever the install directory. */\nfunction findGitBash(): string | null {\n try {\n const result = spawnSync(\"where\", [\"git.exe\"], {\n encoding: \"utf-8\",\n timeout: 5000,\n windowsHide: true,\n });\n if (result.status !== 0 || !result.stdout) return null;\n for (const entry of result.stdout.trim().split(/\\r?\\n/)) {\n // Git for Windows layouts: <root>\\cmd\\git.exe, <root>\\bin\\git.exe or <root>\\mingw64\\bin\\git.exe.\n const git = entry.trim();\n const root = git.replace(/[\\\\/](?:cmd|bin|mingw64[\\\\/]bin)[\\\\/]git\\.exe$/i, \"\");\n if (root === git) continue;\n const bash = `${root}\\\\bin\\\\bash.exe`;\n if (existsSync(bash)) return bash;\n }\n } catch {\n // Ignore errors\n }\n return null;\n}\n\n/**\n * All bash.exe entries on PATH. The System32 WSL launcher and the WindowsApps\n * execution alias both exist on nearly every machine while real Git installs\n * live elsewhere, so callers must rank matches themselves.\n */\nfunction findBashEntriesOnPath(): string[] {\n try {\n const result = spawnSync(\"where\", [\"bash.exe\"], {\n encoding: \"utf-8\",\n timeout: 5000,\n windowsHide: true,\n });\n if (result.status === 0 && result.stdout) {\n return result.stdout\n .trim()\n .split(/\\r?\\n/)\n .map((entry) => entry.trim())\n .filter((entry) => entry && existsSync(entry));\n }\n } catch {\n // Ignore errors\n }\n return [];\n}\n\n/** Unix: use 'which' and trust its output (handles Termux and special filesystems). */\nfunction findUnixExecutableOnPath(executable: string): string | null {\n try {\n const result = spawnSync(\"which\", [executable], { encoding: \"utf-8\", timeout: 5000 });\n if (result.status === 0 && result.stdout) {\n const firstMatch = result.stdout.trim().split(/\\r?\\n/)[0];\n if (firstMatch) {\n return firstMatch;\n }\n }\n } catch {\n // Ignore errors\n }\n return null;\n}\n\n/**\n * Resolve shell configuration based on platform and an optional explicit shell path.\n * Resolution order:\n * 1. User-specified shellPath\n * 2. On Windows: Git Bash in known locations, then bash on PATH\n * 3. On Unix: /bin/bash, then bash on PATH, then fallback to sh\n */\nexport function getShellConfig(customShellPath?: string): ShellConfig {\n // 1. Check user-specified shell path\n if (customShellPath) {\n if (existsSync(customShellPath)) {\n return getBashShellConfig(customShellPath);\n }\n throw new Error(`Custom shell path not found: ${customShellPath}`);\n }\n\n if (process.platform === \"win32\") {\n // 2. Try Git Bash in known locations\n const paths: string[] = [];\n const programFiles = process.env.ProgramFiles;\n if (programFiles) {\n paths.push(`${programFiles}\\\\Git\\\\bin\\\\bash.exe`);\n }\n const programFilesX86 = process.env[\"ProgramFiles(x86)\"];\n if (programFilesX86) {\n paths.push(`${programFilesX86}\\\\Git\\\\bin\\\\bash.exe`);\n }\n\n for (const path of paths) {\n if (existsSync(path)) {\n return getBashShellConfig(path);\n }\n }\n\n // 3. Derive bash from the git.exe installation for custom install directories.\n const gitBash = findGitBash();\n if (gitBash) {\n return getBashShellConfig(gitBash);\n }\n\n // 4. Fallback: bash.exe on PATH, preferring a real bash over WSL launchers.\n const entries = findBashEntriesOnPath();\n const bashOnPath =\n entries.find((entry) => !isLauncherBashPath(entry)) ??\n entries.find((entry) => isLauncherBashUsable(entry));\n if (bashOnPath) {\n return getBashShellConfig(bashOnPath);\n }\n\n throw new Error(\n `No bash shell found. Options:\\n` +\n ` 1. Install Git for Windows: https://git-scm.com/download/win\\n` +\n ` 2. Add your bash to PATH (Cygwin, MSYS2, etc.)\\n` +\n \" 3. Set shellPath in settings.json\\n\\n\" +\n `Searched Git Bash in:\\n${paths.map((p) => ` ${p}`).join(\"\\n\")}`,\n );\n }\n\n // Unix: try /bin/bash, then bash on PATH, then fallback to sh\n if (existsSync(\"/bin/bash\")) {\n return getBashShellConfig(\"/bin/bash\");\n }\n\n const bashOnPath = findUnixExecutableOnPath(\"bash\");\n if (bashOnPath) {\n return getBashShellConfig(bashOnPath);\n }\n\n return { shell: \"sh\", args: [\"-c\"] };\n}\n\nexport function getShellEnv(): NodeJS.ProcessEnv {\n const binDir = getBinDir();\n const pathKey = Object.keys(process.env).find((key) => key.toLowerCase() === \"path\") ?? \"PATH\";\n const currentPath = process.env[pathKey] ?? \"\";\n const pathEntries = currentPath.split(delimiter).filter(Boolean);\n const hasBinDir = pathEntries.includes(binDir);\n const updatedPath = hasBinDir ? currentPath : [binDir, currentPath].filter(Boolean).join(delimiter);\n\n return {\n ...process.env,\n [pathKey]: updatedPath,\n };\n}\n\n/**\n * Kill a process and all its children (cross-platform)\n */\nexport function killProcessTree(pid: number): void {\n if (process.platform === \"win32\") {\n // Use the trusted System32 executable so cleanup does not depend on PATH.\n try {\n const child = spawn(\n join(process.env.SystemRoot ?? \"C:\\\\Windows\", \"System32\", \"taskkill.exe\"),\n [\"/F\", \"/T\", \"/PID\", String(pid)],\n {\n stdio: \"ignore\",\n detached: true,\n windowsHide: true,\n },\n );\n // A failed spawn emits \"error\" asynchronously; consume it to avoid crashing Node.\n child.once(\"error\", () => {});\n } catch {\n // Ignore errors if taskkill fails.\n }\n } else {\n // Use SIGKILL on Unix/Linux/Mac\n try {\n process.kill(-pid, \"SIGKILL\");\n } catch {\n // Fallback to killing just the child if process group kill fails\n try {\n process.kill(pid, \"SIGKILL\");\n } catch {\n // Process already dead\n }\n }\n }\n}\n","// Adapted from Pi c20cb09772bf4e2590a316cb54514cef76df4293.\n// Copyright (c) 2025 Mario Zechner. MIT license: licenses/third-party-notices.txt.\n\nimport { constants } from \"node:fs\";\nimport { access as fsAccess, writeFile as fsWriteFile } from \"node:fs/promises\";\nimport { type Static, Type } from \"typebox\";\nimport type { ToolContext, ToolDefinition } from \"../../types.ts\";\nimport {\n applyEditsToNormalizedContent,\n type Edit,\n generateDiffString,\n generateUnifiedPatch,\n normalizeToLF,\n} from \"./edit-diff.ts\";\nimport { withFileMutationQueue } from \"./file-mutation-queue.ts\";\nimport type { FileReadState } from \"./file-read-state.ts\";\nimport { resolveToCwd } from \"./path-utils.ts\";\nimport { readRegularFile } from \"./utils/read-file.ts\";\nimport { splitBom } from \"./utils/text.ts\";\n\nconst MAX_EDIT_DETAIL_BYTES = 64 * 1024;\nconst OMITTED_EDIT_DIFF = \"[Diff omitted: exceeds the inline display or computation limit.]\";\n\nconst replaceEditSchema = Type.Object(\n {\n oldText: Type.String({\n description:\n \"Exact text for one targeted replacement. It must be unique in the original file and must not overlap with any other edits[].oldText in the same call.\",\n }),\n newText: Type.String({ description: \"Replacement text for this targeted edit.\" }),\n },\n {},\n);\n\nconst editSchema = Type.Object(\n {\n path: Type.String({ description: \"Path to the file to edit (relative or absolute)\" }),\n edits: Type.Array(replaceEditSchema, {\n description:\n \"One or more targeted replacements. Each edit is matched against the original file, not incrementally. Do not include overlapping or nested edits. If two changes touch the same block or nearby lines, merge them into one edit instead.\",\n }),\n },\n {},\n);\n\nexport const editToolSystemPromptContribution = {\n snippet:\n \"Make precise file edits with exact text replacement, including multiple disjoint edits in one call\",\n guidelines: [\n \"Use edit for precise changes (edits[].oldText must match exactly)\",\n \"When changing multiple separate locations in one file, use one edit call with multiple entries in edits[] instead of multiple edit calls\",\n \"Each edits[].oldText is matched against the original file, not after earlier edits are applied. Do not emit overlapping or nested edits. Merge nearby changes into one edit.\",\n \"Keep edits[].oldText as small as possible while still being unique in the file. Do not pad with large unchanged regions.\",\n ],\n} as const;\n\nexport type EditToolInput = Static<typeof editSchema>;\n\ntype SingleEditInput = { oldText: string; newText: string };\n\nfunction isSingleEditInput(value: unknown): value is SingleEditInput {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n const edit = value as Record<string, unknown>;\n return typeof edit.oldText === \"string\" && typeof edit.newText === \"string\";\n}\n\nexport interface EditToolDetails {\n /** Display-oriented diff of the changes made */\n diff: string;\n /** Standard unified patch of the changes made */\n patch: string;\n /** Line number of the first change in the new file (for editor navigation) */\n firstChangedLine?: number;\n}\n\n/**\n * Pluggable operations for the edit tool.\n * Override these to delegate file editing to remote systems (for example SSH).\n */\nexport interface EditOperations {\n /** Read file contents as a Buffer */\n readFile: (absolutePath: string) => Promise<Buffer>;\n /** Write content to a file */\n writeFile: (absolutePath: string, content: string) => Promise<void>;\n /** Check if file is readable and writable (throw if not) */\n access: (absolutePath: string) => Promise<void>;\n}\n\nconst defaultEditOperations: EditOperations = {\n readFile: readRegularFile,\n writeFile: (path, content) => fsWriteFile(path, content, \"utf-8\"),\n access: (path) => fsAccess(path, constants.R_OK | constants.W_OK),\n};\n\nexport interface EditToolOptions {\n /** Shared knowledge of file contents in the current model context. */\n fileReadState?: FileReadState;\n /** Custom operations for file editing. Default: local filesystem */\n operations?: EditOperations;\n}\n\nfunction prepareEditArguments(input: unknown): EditToolInput {\n if (!input || typeof input !== \"object\") {\n return input as EditToolInput;\n }\n\n const args = input as Record<string, unknown>;\n\n // Some models (Opus 4.6, GLM-5.1) send edits as a JSON string instead of an array.\n // Others send a single edit object instead of a one-element edits array.\n if (typeof args.edits === \"string\") {\n try {\n const parsed = JSON.parse(args.edits);\n if (Array.isArray(parsed)) {\n args.edits = parsed;\n } else if (isSingleEditInput(parsed)) {\n args.edits = [parsed];\n }\n } catch {}\n } else if (isSingleEditInput(args.edits)) {\n args.edits = [args.edits];\n }\n\n return args as EditToolInput;\n}\n\nfunction validateEditInput(input: EditToolInput): { path: string; edits: Edit[] } {\n if (!Array.isArray(input.edits) || input.edits.length === 0) {\n throw new Error(\"Edit tool input is invalid. edits must contain at least one replacement.\");\n }\n return { path: input.path, edits: input.edits };\n}\n\nexport function createEditToolDefinition(cwd: string, options?: EditToolOptions) {\n const ops = options?.operations ?? defaultEditOperations;\n return {\n name: \"edit\",\n label: \"edit\",\n description:\n \"Edit a single file using exact text replacement. Every edits[].oldText must match a unique, non-overlapping region of the original file. If two changes affect the same block or nearby lines, merge them into one edit instead of emitting overlapping edits. Do not include large unchanged regions just to connect distant changes.\",\n promptSnippet: editToolSystemPromptContribution.snippet,\n promptGuidelines: [...editToolSystemPromptContribution.guidelines],\n parameters: editSchema,\n prepareArguments: prepareEditArguments,\n async execute(\n _toolCallId,\n input: EditToolInput,\n signal?: AbortSignal,\n _onUpdate?,\n ctx?: Partial<ToolContext>,\n ) {\n const { path, edits } = validateEditInput(input);\n const absolutePath = resolveToCwd(path, ctx?.cwd || cwd);\n\n return withFileMutationQueue(absolutePath, async () => {\n // Do not reject from an abort event listener here: that would release the\n // mutation queue while an in-flight filesystem operation may still finish.\n // Check cancellation before writing, and keep the queue locked until the\n // write settles. A successful write must still be reported as successful.\n const throwIfAborted = (): void => {\n if (signal?.aborted) throw new Error(\"Operation aborted\");\n };\n\n throwIfAborted();\n\n // Check if file exists.\n try {\n await ops.access(absolutePath);\n } catch (error: unknown) {\n throwIfAborted();\n const errorMessage =\n error instanceof Error && \"code\" in error ? `Error code: ${error.code}` : String(error);\n throw new Error(`Could not edit file: ${path}. ${errorMessage}.`);\n }\n throwIfAborted();\n\n // Read the file.\n const buffer = await ops.readFile(absolutePath);\n const rawContent = buffer.toString(\"utf-8\");\n throwIfAborted();\n\n // Strip BOM before matching. The model will not include an invisible BOM in oldText.\n const { bom, text: content } = splitBom(rawContent);\n const normalizedContent = normalizeToLF(content);\n const { baseContent, newContent } = applyEditsToNormalizedContent(\n normalizedContent,\n edits,\n path,\n content,\n );\n throwIfAborted();\n\n const finalContent = bom + newContent;\n // The queue covers ZPI writers only. Reject changes observed during edit preparation\n // rather than overwrite them; this is not an atomic lock against external writers.\n const current = await ops.readFile(absolutePath);\n throwIfAborted();\n if (!current.equals(buffer))\n throw new Error(`File changed while preparing edits: ${path}. Read it again before retrying.`);\n await ops.writeFile(absolutePath, finalContent);\n options?.fileReadState?.recordEdit(absolutePath, rawContent, finalContent);\n\n const diffResult = generateDiffString(baseContent, newContent);\n const patch =\n diffResult.diff === undefined ? undefined : generateUnifiedPatch(path, baseContent, newContent);\n // Long changed lines appear in both display formats. Bound only these\n // previews, not the independent fileChange snapshots used for rewind.\n const diffTooLarge =\n diffResult.diff === undefined || Buffer.byteLength(diffResult.diff) > MAX_EDIT_DETAIL_BYTES;\n const patchTooLarge = patch === undefined || Buffer.byteLength(patch) > MAX_EDIT_DETAIL_BYTES;\n return {\n content: [\n {\n type: \"text\",\n text:\n `Successfully replaced ${edits.length} block(s) in ${path}. ` +\n \"No read-back needed while the edited text remains in context; re-read if it is missing or may have changed.\",\n },\n ],\n details: {\n diff: diffTooLarge || patchTooLarge ? OMITTED_EDIT_DIFF : (diffResult.diff ?? OMITTED_EDIT_DIFF),\n patch: patchTooLarge ? \"\" : (patch ?? \"\"),\n firstChangedLine: diffResult.firstChangedLine,\n },\n };\n });\n },\n } satisfies ToolDefinition<typeof editSchema, EditToolDetails | undefined>;\n}\n","// Adapted from Pi c20cb09772bf4e2590a316cb54514cef76df4293.\n// Copyright (c) 2025 Mario Zechner. MIT license: licenses/third-party-notices.txt.\n/**\n * Shared diff computation utilities for the edit and similar tools.\n */\n\nimport * as Diff from \"diff\";\n\nexport function detectLineEnding(content: string): \"\\r\\n\" | \"\\r\" | \"\\n\" {\n const ending = content.match(/\\r\\n|\\r|\\n/)?.[0];\n return ending === \"\\r\\n\" || ending === \"\\r\" ? ending : \"\\n\";\n}\n\nexport function normalizeToLF(text: string): string {\n return text.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n}\n\nexport function restoreLineEndings(text: string, ending: \"\\r\\n\" | \"\\r\" | \"\\n\"): string {\n return ending === \"\\n\" ? text : text.replace(/\\n/g, ending);\n}\n\n/**\n * Normalize text for fuzzy matching. Applies progressive transformations:\n * - Strip trailing whitespace from each line\n * - Normalize smart quotes to ASCII equivalents\n * - Normalize Unicode dashes/hyphens to ASCII hyphen\n * - Normalize special Unicode spaces to regular space\n */\nexport function normalizeForFuzzyMatch(text: string): string {\n return (\n text\n .normalize(\"NFKC\")\n // Strip trailing whitespace per line\n .split(\"\\n\")\n .map((line) => line.trimEnd())\n .join(\"\\n\")\n // Smart single quotes → '\n .replace(/[\\u2018\\u2019\\u201A\\u201B]/g, \"'\")\n // Smart double quotes → \"\n .replace(/[\\u201C\\u201D\\u201E\\u201F]/g, '\"')\n // Various dashes/hyphens → -\n // U+2010 hyphen, U+2011 non-breaking hyphen, U+2012 figure dash,\n // U+2013 en-dash, U+2014 em-dash, U+2015 horizontal bar, U+2212 minus\n .replace(/[\\u2010\\u2011\\u2012\\u2013\\u2014\\u2015\\u2212]/g, \"-\")\n // Special spaces → regular space\n // U+00A0 NBSP, U+2002-U+200A various spaces, U+202F narrow NBSP,\n // U+205F medium math space, U+3000 ideographic space\n .replace(/[\\u00A0\\u2002-\\u200A\\u202F\\u205F\\u3000]/g, \" \")\n );\n}\n\nfunction splitLinesWithEndings(content: string): string[] {\n return content.match(/[^\\r\\n]*(?:\\r\\n|\\r|\\n)|[^\\r\\n]+/g) ?? [];\n}\n\ninterface LineSpan {\n start: number;\n end: number;\n}\n\ninterface MatchedEdit {\n editIndex: number;\n matchIndex: number;\n matchLength: number;\n newText: string;\n}\n\ntype TextReplacement = Pick<MatchedEdit, \"matchIndex\" | \"matchLength\" | \"newText\">;\n\nfunction getLineSpans(content: string): LineSpan[] {\n let offset = 0;\n return splitLinesWithEndings(content).map((line) => {\n const span = { start: offset, end: offset + line.length };\n offset = span.end;\n return span;\n });\n}\n\nfunction getReplacementLineRange(lines: LineSpan[], replacement: TextReplacement) {\n const replacementStart = replacement.matchIndex;\n const replacementEnd = replacement.matchIndex + replacement.matchLength;\n\n let startLine = -1;\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (replacementStart >= line.start && replacementStart < line.end) {\n startLine = i;\n break;\n }\n }\n if (startLine === -1) {\n throw new Error(\"Replacement range is outside the base content.\");\n }\n\n let endLine = startLine;\n while (endLine < lines.length && lines[endLine].end < replacementEnd) {\n endLine++;\n }\n if (endLine >= lines.length) {\n throw new Error(\"Replacement range is outside the base content.\");\n }\n\n return { startLine, endLine: endLine + 1 };\n}\n\nfunction applyReplacements(content: string, replacements: TextReplacement[], offset = 0): string {\n let result = content;\n for (let i = replacements.length - 1; i >= 0; i--) {\n const replacement = replacements[i];\n const matchIndex = replacement.matchIndex - offset;\n result =\n result.substring(0, matchIndex) +\n replacement.newText +\n result.substring(matchIndex + replacement.matchLength);\n }\n return result;\n}\n\n/**\n * Apply replacements matched against `baseContent` to `originalContent` while\n * preserving unchanged line blocks from the original.\n *\n * This is useful when `baseContent` is a normalized view of the original. Each\n * replacement is widened to the lines it actually touches, those touched lines\n * are rewritten from the normalized base, and all other lines are copied back\n * from `originalContent`. The actual replacement ranges drive preservation so\n * duplicate normalized lines cannot be aligned to the wrong occurrence.\n */\nexport function applyReplacementsPreservingUnchangedLines(\n originalContent: string,\n baseContent: string,\n replacements: TextReplacement[],\n): string {\n const originalLines = splitLinesWithEndings(originalContent);\n const baseLines = getLineSpans(baseContent);\n if (originalLines.length !== baseLines.length) {\n throw new Error(\"Cannot preserve unchanged lines because the base content has a different line count.\");\n }\n\n const groups: Array<{ startLine: number; endLine: number; replacements: TextReplacement[] }> = [];\n const sortedReplacements = [...replacements].sort((a, b) => a.matchIndex - b.matchIndex);\n for (const replacement of sortedReplacements) {\n const range = getReplacementLineRange(baseLines, replacement);\n const current = groups[groups.length - 1];\n if (current && range.startLine < current.endLine) {\n current.endLine = Math.max(current.endLine, range.endLine);\n current.replacements.push(replacement);\n continue;\n }\n groups.push({ ...range, replacements: [replacement] });\n }\n\n let originalLineIndex = 0;\n let result = \"\";\n for (const group of groups) {\n result += originalLines.slice(originalLineIndex, group.startLine).join(\"\");\n\n const groupStartOffset = baseLines[group.startLine].start;\n const groupEndOffset = baseLines[group.endLine - 1].end;\n result += restoreLineEndings(\n applyReplacements(\n baseContent.slice(groupStartOffset, groupEndOffset),\n group.replacements,\n groupStartOffset,\n ),\n detectLineEnding(originalLines[group.startLine]),\n );\n originalLineIndex = group.endLine;\n }\n result += originalLines.slice(originalLineIndex).join(\"\");\n\n return result;\n}\n\nexport interface FuzzyMatchResult {\n /** Whether a match was found */\n found: boolean;\n /** The index where the match starts (in the content that should be used for replacement) */\n index: number;\n /** Length of the matched text */\n matchLength: number;\n /** Whether fuzzy matching was used (false = exact match) */\n usedFuzzyMatch: boolean;\n /**\n * The content to use for replacement operations.\n * When exact match: original content. When fuzzy match: normalized content.\n */\n contentForReplacement: string;\n}\n\nexport interface Edit {\n oldText: string;\n newText: string;\n}\n\nexport interface AppliedEditsResult {\n baseContent: string;\n newContent: string;\n}\n\n/**\n * Find oldText in content, trying exact match first, then fuzzy match.\n * When fuzzy matching is used, the returned contentForReplacement is the\n * fuzzy-normalized version of the content (trailing whitespace stripped,\n * Unicode quotes/dashes normalized to ASCII).\n */\nexport function fuzzyFindText(content: string, oldText: string): FuzzyMatchResult {\n // Try exact match first\n const exactIndex = content.indexOf(oldText);\n if (exactIndex !== -1) {\n return {\n found: true,\n index: exactIndex,\n matchLength: oldText.length,\n usedFuzzyMatch: false,\n contentForReplacement: content,\n };\n }\n\n // Try fuzzy match - work entirely in normalized space\n const fuzzyContent = normalizeForFuzzyMatch(content);\n const fuzzyOldText = normalizeForFuzzyMatch(oldText);\n const fuzzyIndex = fuzzyOldText.length ? fuzzyContent.indexOf(fuzzyOldText) : -1;\n\n if (fuzzyIndex === -1) {\n return {\n found: false,\n index: -1,\n matchLength: 0,\n usedFuzzyMatch: false,\n contentForReplacement: content,\n };\n }\n\n // When fuzzy matching, return offsets in normalized space. Callers can use\n // the normalized content to compute replacements, then decide how much of\n // that normalized output should be written back.\n return {\n found: true,\n index: fuzzyIndex,\n matchLength: fuzzyOldText.length,\n usedFuzzyMatch: true,\n contentForReplacement: fuzzyContent,\n };\n}\n\nfunction getNotFoundError(path: string, editIndex: number, totalEdits: number): Error {\n if (totalEdits === 1) {\n return new Error(\n `Could not find the exact text in ${path}. The old text must match exactly including all whitespace and newlines.`,\n );\n }\n return new Error(\n `Could not find edits[${editIndex}] in ${path}. The oldText must match exactly including all whitespace and newlines.`,\n );\n}\n\nfunction getDuplicateError(path: string, editIndex: number, totalEdits: number): Error {\n if (totalEdits === 1) {\n return new Error(\n `Found at least 2 occurrences of the text in ${path}. The text must be unique. Please provide more context to make it unique.`,\n );\n }\n return new Error(\n `Found at least 2 occurrences of edits[${editIndex}] in ${path}. Each oldText must be unique. Please provide more context to make it unique.`,\n );\n}\n\nfunction getEmptyOldTextError(path: string, editIndex: number, totalEdits: number): Error {\n if (totalEdits === 1) {\n return new Error(`oldText must not be empty in ${path}.`);\n }\n return new Error(`edits[${editIndex}].oldText must not be empty in ${path}.`);\n}\n\nfunction getNoChangeError(path: string, totalEdits: number): Error {\n if (totalEdits === 1) {\n return new Error(\n `No changes made to ${path}. The replacement produced identical content. This might indicate an issue with special characters or the text not existing as expected.`,\n );\n }\n return new Error(`No changes made to ${path}. The replacements produced identical content.`);\n}\n\n/**\n * Apply one or more exact-text replacements to LF-normalized content.\n *\n * All edits are matched against the same original content. Replacements are\n * then applied in reverse order so offsets remain stable. If any edit needs\n * fuzzy matching, the operation runs in fuzzy-normalized content space and then\n * overlays those line-level changes onto the original content so unchanged line\n * blocks keep their original bytes. Supply originalContent to also preserve its\n * line endings; changed blocks use the ending of their first original line.\n */\nexport function applyEditsToNormalizedContent(\n normalizedContent: string,\n edits: Edit[],\n path: string,\n originalContent = normalizedContent,\n): AppliedEditsResult {\n const normalizedEdits = edits.map((edit) => ({\n oldText: normalizeToLF(edit.oldText),\n newText: normalizeToLF(edit.newText),\n }));\n\n for (let i = 0; i < normalizedEdits.length; i++) {\n if (normalizedEdits[i].oldText.length === 0) {\n throw getEmptyOldTextError(path, i, normalizedEdits.length);\n }\n }\n\n const initialMatches = normalizedEdits.map((edit) => fuzzyFindText(normalizedContent, edit.oldText));\n const usedFuzzyMatch = initialMatches.some((match) => match.usedFuzzyMatch);\n const replacementBaseContent = usedFuzzyMatch\n ? normalizeForFuzzyMatch(normalizedContent)\n : normalizedContent;\n\n const matchedEdits: MatchedEdit[] = [];\n for (let i = 0; i < normalizedEdits.length; i++) {\n const edit = normalizedEdits[i];\n const matchResult = fuzzyFindText(replacementBaseContent, edit.oldText);\n if (!matchResult.found) {\n throw getNotFoundError(path, i, normalizedEdits.length);\n }\n\n const matchedText = replacementBaseContent.slice(\n matchResult.index,\n matchResult.index + matchResult.matchLength,\n );\n if (replacementBaseContent.indexOf(matchedText, matchResult.index + 1) !== -1) {\n throw getDuplicateError(path, i, normalizedEdits.length);\n }\n\n matchedEdits.push({\n editIndex: i,\n matchIndex: matchResult.index,\n matchLength: matchResult.matchLength,\n newText: edit.newText,\n });\n }\n\n matchedEdits.sort((a, b) => a.matchIndex - b.matchIndex);\n for (let i = 1; i < matchedEdits.length; i++) {\n const previous = matchedEdits[i - 1];\n const current = matchedEdits[i];\n if (previous.matchIndex + previous.matchLength > current.matchIndex) {\n throw new Error(\n `edits[${previous.editIndex}] and edits[${current.editIndex}] overlap in ${path}. Merge them into one edit or target disjoint regions.`,\n );\n }\n }\n\n const baseContent = originalContent;\n const newContent =\n usedFuzzyMatch || originalContent !== normalizedContent\n ? applyReplacementsPreservingUnchangedLines(originalContent, replacementBaseContent, matchedEdits)\n : applyReplacements(replacementBaseContent, matchedEdits);\n\n if (baseContent === newContent) {\n throw getNoChangeError(path, normalizedEdits.length);\n }\n\n return { baseContent, newContent };\n}\n\nconst diffBudget = { timeout: 50, maxEditLength: 1024 };\nconst maxDiffInputBytes = 4 * 1024 * 1024;\nfunction withinDiffBudget(oldContent: string, newContent: string): boolean {\n return Buffer.byteLength(oldContent) + Buffer.byteLength(newContent) <= maxDiffInputBytes;\n}\n\n/** Generate a standard unified patch, or omit it when the computation budget is exceeded. */\nexport function generateUnifiedPatch(\n path: string,\n oldContent: string,\n newContent: string,\n contextLines = 4,\n): string | undefined {\n if (!withinDiffBudget(oldContent, newContent)) return undefined;\n return Diff.createTwoFilesPatch(path, path, oldContent, newContent, undefined, undefined, {\n ...diffBudget,\n context: contextLines,\n headerOptions: Diff.FILE_HEADERS_ONLY,\n });\n}\n\n/**\n * Generate a display-oriented diff string with line numbers and context.\n * Returns both the diff string and the first changed line number (in the new file).\n */\nexport function generateDiffString(\n oldContent: string,\n newContent: string,\n contextLines = 4,\n): { diff: string | undefined; firstChangedLine: number | undefined } {\n const parts = withinDiffBudget(oldContent, newContent)\n ? Diff.diffLines(oldContent, newContent, diffBudget)\n : undefined;\n if (!parts) {\n // Keep navigation useful even when the optional preview exceeds its computation budget.\n let line = 1;\n for (let i = 0; i < Math.min(oldContent.length, newContent.length); i++) {\n if (oldContent[i] !== newContent[i]) break;\n if (newContent[i] === \"\\n\") line++;\n }\n return { diff: undefined, firstChangedLine: line };\n }\n const output: string[] = [];\n\n const oldLines = oldContent.split(\"\\n\");\n const newLines = newContent.split(\"\\n\");\n const maxLineNum = Math.max(oldLines.length, newLines.length);\n const lineNumWidth = String(maxLineNum).length;\n\n let oldLineNum = 1;\n let newLineNum = 1;\n let lastWasChange = false;\n let firstChangedLine: number | undefined;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const raw = part.value.split(\"\\n\");\n if (raw[raw.length - 1] === \"\") {\n raw.pop();\n }\n\n if (part.added || part.removed) {\n // Capture the first changed line (in the new file)\n if (firstChangedLine === undefined) {\n firstChangedLine = newLineNum;\n }\n\n // Show the change\n for (const line of raw) {\n if (part.added) {\n const lineNum = String(newLineNum).padStart(lineNumWidth, \" \");\n output.push(`+${lineNum} ${line}`);\n newLineNum++;\n } else {\n // removed\n const lineNum = String(oldLineNum).padStart(lineNumWidth, \" \");\n output.push(`-${lineNum} ${line}`);\n oldLineNum++;\n }\n }\n lastWasChange = true;\n } else {\n // Context lines - only show a few before/after changes\n const nextPartIsChange = i < parts.length - 1 && (parts[i + 1].added || parts[i + 1].removed);\n const hasLeadingChange = lastWasChange;\n const hasTrailingChange = nextPartIsChange;\n\n if (hasLeadingChange && hasTrailingChange) {\n if (raw.length <= contextLines * 2) {\n for (const line of raw) {\n const lineNum = String(oldLineNum).padStart(lineNumWidth, \" \");\n output.push(` ${lineNum} ${line}`);\n oldLineNum++;\n newLineNum++;\n }\n } else {\n const leadingLines = raw.slice(0, contextLines);\n const trailingLines = raw.slice(raw.length - contextLines);\n const skippedLines = raw.length - leadingLines.length - trailingLines.length;\n\n for (const line of leadingLines) {\n const lineNum = String(oldLineNum).padStart(lineNumWidth, \" \");\n output.push(` ${lineNum} ${line}`);\n oldLineNum++;\n newLineNum++;\n }\n\n output.push(` ${\"\".padStart(lineNumWidth, \" \")} ...`);\n oldLineNum += skippedLines;\n newLineNum += skippedLines;\n\n for (const line of trailingLines) {\n const lineNum = String(oldLineNum).padStart(lineNumWidth, \" \");\n output.push(` ${lineNum} ${line}`);\n oldLineNum++;\n newLineNum++;\n }\n }\n } else if (hasLeadingChange) {\n const shownLines = raw.slice(0, contextLines);\n const skippedLines = raw.length - shownLines.length;\n\n for (const line of shownLines) {\n const lineNum = String(oldLineNum).padStart(lineNumWidth, \" \");\n output.push(` ${lineNum} ${line}`);\n oldLineNum++;\n newLineNum++;\n }\n\n if (skippedLines > 0) {\n output.push(` ${\"\".padStart(lineNumWidth, \" \")} ...`);\n oldLineNum += skippedLines;\n newLineNum += skippedLines;\n }\n } else if (hasTrailingChange) {\n const skippedLines = Math.max(0, raw.length - contextLines);\n if (skippedLines > 0) {\n output.push(` ${\"\".padStart(lineNumWidth, \" \")} ...`);\n oldLineNum += skippedLines;\n newLineNum += skippedLines;\n }\n\n for (const line of raw.slice(skippedLines)) {\n const lineNum = String(oldLineNum).padStart(lineNumWidth, \" \");\n output.push(` ${lineNum} ${line}`);\n oldLineNum++;\n newLineNum++;\n }\n } else {\n // Skip these context lines entirely\n oldLineNum += raw.length;\n newLineNum += raw.length;\n }\n\n lastWasChange = false;\n }\n }\n\n return { diff: output.join(\"\\n\"), firstChangedLine };\n}\n","// Adapted from Pi c20cb09772bf4e2590a316cb54514cef76df4293.\n// Copyright (c) 2025 Mario Zechner. MIT license: licenses/third-party-notices.txt.\nimport { readlink, realpath } from \"node:fs/promises\";\nimport { basename, dirname, join, resolve } from \"node:path\";\n\nconst fileMutationQueues = new Map<string, Promise<void>>();\nlet registrationQueue = Promise.resolve();\nconst MAX_SYMLINK_EXPANSIONS = 40;\n\nfunction isMissingPathError(error: unknown): boolean {\n return typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\";\n}\n\nasync function getMutationQueueKey(filePath: string): Promise<string> {\n const resolvedPath = resolve(filePath);\n let ancestor = resolvedPath;\n const missing: string[] = [];\n let symlinks = 0;\n while (true) {\n try {\n return join(await realpath(ancestor), ...missing);\n } catch (error) {\n // Custom operations may target a remote directory that is a local file.\n // Leave validity to the operation, as for other paths absent locally.\n if (error instanceof Error && \"code\" in error && error.code === \"ENOTDIR\") return resolvedPath;\n if (!isMissingPathError(error)) throw error;\n let target: string | undefined;\n try {\n target = await readlink(ancestor);\n } catch (linkError) {\n if (\n !isMissingPathError(linkError) &&\n !(\n typeof linkError === \"object\" &&\n linkError !== null &&\n \"code\" in linkError &&\n linkError.code === \"EINVAL\"\n )\n )\n throw linkError;\n }\n if (target !== undefined) {\n if (++symlinks > MAX_SYMLINK_EXPANSIONS)\n throw Object.assign(new Error(`Too many symbolic links: ${filePath}`), { code: \"ELOOP\" });\n // realpath cannot resolve dangling links. Follow their relative target\n // without losing the missing suffix collected below a directory link.\n ancestor = resolve(dirname(ancestor), target);\n continue;\n }\n const parent = dirname(ancestor);\n if (parent === ancestor) throw error;\n // A missing file can still have symlinked parents. Canonicalize the\n // existing ancestor so aliases share a lock before and after creation.\n missing.unshift(basename(ancestor));\n ancestor = parent;\n }\n }\n}\n\n/**\n * Serialize file mutation operations targeting the same file.\n * Operations for different files still run in parallel.\n */\nexport async function withFileMutationQueue<T>(filePath: string, fn: () => Promise<T>): Promise<T> {\n const registration = registrationQueue.then(async () => {\n const key = await getMutationQueueKey(filePath);\n const currentQueue = fileMutationQueues.get(key) ?? Promise.resolve();\n\n let releaseNext!: () => void;\n const nextQueue = new Promise<void>((resolveQueue) => {\n releaseNext = resolveQueue;\n });\n const chainedQueue = currentQueue.then(() => nextQueue);\n fileMutationQueues.set(key, chainedQueue);\n\n return { key, currentQueue, chainedQueue, releaseNext };\n });\n registrationQueue = registration.then(\n () => undefined,\n () => undefined,\n );\n\n const { key, currentQueue, chainedQueue, releaseNext } = await registration;\n await currentQueue;\n try {\n return await fn();\n } finally {\n releaseNext();\n if (fileMutationQueues.get(key) === chainedQueue) {\n fileMutationQueues.delete(key);\n }\n }\n}\n","// Adapted from Pi c20cb09772bf4e2590a316cb54514cef76df4293.\n// Copyright (c) 2025 Mario Zechner. MIT license: licenses/third-party-notices.txt.\nimport { constants } from \"node:fs\";\nimport { access } from \"node:fs/promises\";\nimport { resolvePath } from \"./utils/paths.ts\";\n\nconst NARROW_NO_BREAK_SPACE = \"\\u202F\";\n\nfunction tryMacOSScreenshotPath(filePath: string): string {\n return filePath.replace(/ (AM|PM)\\./gi, `${NARROW_NO_BREAK_SPACE}$1.`);\n}\n\nfunction tryNFDVariant(filePath: string): string {\n // macOS stores filenames in NFD (decomposed) form, try converting user input to NFD\n return filePath.normalize(\"NFD\");\n}\n\nfunction tryCurlyQuoteVariant(filePath: string): string {\n // macOS uses U+2019 (right single quotation mark) in screenshot names like \"Capture d'écran\"\n // Users typically type U+0027 (straight apostrophe)\n return filePath.replace(/'/g, \"\\u2019\");\n}\n\nexport async function pathExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Resolve a path relative to the given cwd.\n * Handles ~ expansion and absolute paths.\n */\nexport function resolveToCwd(filePath: string, cwd: string): string {\n return resolvePath(filePath, cwd, { normalizeUnicodeSpaces: true, stripAtPrefix: true });\n}\n\nexport async function resolveReadPathAsync(filePath: string, cwd: string): Promise<string> {\n const resolved = resolveToCwd(filePath, cwd);\n\n if (await pathExists(resolved)) {\n return resolved;\n }\n\n // Try macOS AM/PM variant (narrow no-break space before AM/PM)\n const amPmVariant = tryMacOSScreenshotPath(resolved);\n if (amPmVariant !== resolved && (await pathExists(amPmVariant))) {\n return amPmVariant;\n }\n\n // Try NFD variant (macOS stores filenames in NFD form)\n const nfdVariant = tryNFDVariant(resolved);\n if (nfdVariant !== resolved && (await pathExists(nfdVariant))) {\n return nfdVariant;\n }\n\n // Try curly quote variant (macOS uses U+2019 in screenshot names)\n const curlyVariant = tryCurlyQuoteVariant(resolved);\n if (curlyVariant !== resolved && (await pathExists(curlyVariant))) {\n return curlyVariant;\n }\n\n // Try combined NFD + curly quote (for French macOS screenshots like \"Capture d'écran\")\n const nfdCurlyVariant = tryCurlyQuoteVariant(nfdVariant);\n if (nfdCurlyVariant !== resolved && (await pathExists(nfdCurlyVariant))) {\n return nfdCurlyVariant;\n }\n\n return resolved;\n}\n","// Adapted from Pi c20cb09772bf4e2590a316cb54514cef76df4293.\n// Copyright (c) 2025 Mario Zechner. MIT license: licenses/third-party-notices.txt.\nimport { homedir } from \"node:os\";\nimport { isAbsolute, join, resolve as nodeResolvePath } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst UNICODE_SPACES = /[\\u00A0\\u2000-\\u200A\\u202F\\u205F\\u3000]/g;\n\nexport interface PathInputOptions {\n /** Trim leading/trailing whitespace before normalization. */\n trim?: boolean;\n /** Expand leading `~` to a home directory. Defaults to true. */\n expandTilde?: boolean;\n /** Home directory used for `~` expansion. Defaults to `os.homedir()`. */\n homeDir?: string;\n /** Strip a leading `@`, used for CLI @file paths. */\n stripAtPrefix?: boolean;\n /** Normalize unicode space variants to regular spaces. */\n normalizeUnicodeSpaces?: boolean;\n}\n\n/** Convert Git Bash, MSYS, Cygwin, and WSL drive paths to a form native Windows APIs accept. */\nexport function normalizeWindowsShellPath(filePath: string): string {\n if (!filePath.startsWith(\"/\") || filePath.startsWith(\"//\") || filePath.includes(\"\\\\\")) return filePath;\n const match = filePath.match(/^\\/(?:mnt\\/|cygdrive\\/)?([a-z])(?:\\/(.*))?$/i);\n if (!match) return filePath;\n const suffix = match[2]?.replaceAll(\"/\", \"\\\\\");\n return `${match[1].toUpperCase()}:\\\\${suffix ?? \"\"}`;\n}\n\nexport function normalizePath(input: string, options: PathInputOptions = {}): string {\n let normalized = options.trim ? input.trim() : input;\n if (options.normalizeUnicodeSpaces) {\n normalized = normalized.replace(UNICODE_SPACES, \" \");\n }\n if (options.stripAtPrefix && normalized.startsWith(\"@\")) {\n normalized = normalized.slice(1);\n }\n if (process.platform === \"win32\") {\n normalized = normalizeWindowsShellPath(normalized);\n }\n\n if (options.expandTilde ?? true) {\n const home = options.homeDir ?? homedir();\n if (normalized === \"~\") return home;\n if (normalized.startsWith(\"~/\") || (process.platform === \"win32\" && normalized.startsWith(\"~\\\\\"))) {\n return join(home, normalized.slice(2));\n }\n }\n\n if (/^file:\\/\\//.test(normalized)) {\n return fileURLToPath(normalized);\n }\n\n return normalized;\n}\n\nexport function resolvePath(\n input: string,\n baseDir: string = process.cwd(),\n options: PathInputOptions = {},\n): string {\n const normalized = normalizePath(input, options);\n const normalizedBaseDir = normalizePath(baseDir);\n return isAbsolute(normalized)\n ? nodeResolvePath(normalized)\n : nodeResolvePath(normalizedBaseDir, normalized);\n}\n","// Adapted from Pi c20cb09772bf4e2590a316cb54514cef76df4293.\n// Copyright (c) 2025 Mario Zechner. MIT license: licenses/third-party-notices.txt.\n/** Split a leading UTF-8 byte order mark from decoded text. */\nexport function splitBom(content: string): { bom: string; text: string } {\n return content.startsWith(\"\\uFEFF\")\n ? { bom: \"\\uFEFF\", text: content.slice(1) }\n : { bom: \"\", text: content };\n}\n","import { createHash } from \"node:crypto\";\n\nfunction contentHash(content: string): string {\n return createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nfunction rangeKey(offset?: number, limit?: number): string {\n return `${offset ?? 1}:${limit ?? \"\"}`;\n}\n\n/** File contents known to the model in one live context; no transcript or disk cache. */\nexport class FileReadState {\n private files = new Map<string, { hash: string; ranges: Set<string> }>();\n\n clear(): void {\n this.files.clear();\n }\n\n isUnchanged(path: string, content: string, offset?: number, limit?: number): boolean {\n const entry = this.files.get(path);\n if (!entry?.ranges.has(rangeKey(offset, limit))) return false;\n return entry.hash === contentHash(content);\n }\n\n /** Reuse an incremental decoded-text hash without retaining the full file. */\n isHashUnchanged(path: string, hash: string, offset?: number, limit?: number): boolean {\n const entry = this.files.get(path);\n if (!entry?.ranges.has(rangeKey(offset, limit))) return false;\n return entry.hash === hash;\n }\n\n recordRead(path: string, content: string, offset?: number, limit?: number, truncated = false): void {\n this.recordReadHash(path, contentHash(content), offset, limit, truncated);\n }\n\n recordReadHash(path: string, hash: string, offset?: number, limit?: number, truncated = false): void {\n let entry = this.files.get(path);\n if (entry?.hash !== hash) {\n entry = { hash, ranges: new Set() };\n this.files.set(path, entry);\n }\n // A truncated tool result must remain readable, including its continuation notice.\n if (!truncated) entry.ranges.add(rangeKey(offset, limit));\n }\n\n recordWrite(path: string, content: string): void {\n this.files.set(path, { hash: contentHash(content), ranges: new Set([rangeKey()]) });\n }\n\n recordEdit(path: string, before: string, after: string): void {\n // Editing a range does not make the rest of the file known. Line shifts also invalidate old ranges.\n const knewFullFile = this.isUnchanged(path, before);\n this.files.delete(path);\n if (knewFullFile) this.recordWrite(path, after);\n }\n}\n","// Adapted from Pi c20cb09772bf4e2590a316cb54514cef76df4293.\n// Copyright (c) 2025 Mario Zechner. MIT license: licenses/third-party-notices.txt.\n\nimport { constants, createReadStream } from \"node:fs\";\nimport { access as fsAccess, readFile as fsReadFile } from \"node:fs/promises\";\nimport type { ImageContent, Model, TextContent } from \"@zpi-dev/ai\";\nimport { Type } from \"typebox\";\nimport { imageLimits } from \"../../image-limits.ts\";\nimport { readFileBounded } from \"../../read-file-bounded.ts\";\nimport type { ToolContext, ToolDefinition } from \"../../types.ts\";\nimport { FileReadState } from \"./file-read-state.ts\";\nimport { resolveReadPathAsync } from \"./path-utils.ts\";\nimport { readTextRange } from \"./text-range-reader.ts\";\nimport { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, type TruncationResult } from \"./truncate.ts\";\nimport { fitsImageBudget, imageBudget, readImageResizeOptions } from \"./utils/image-budget.ts\";\nimport { processImage } from \"./utils/image-process.ts\";\nimport type { ImageResizeOptions as ModelImageResizeOptions } from \"./utils/image-resize-core.ts\";\nimport { detectSupportedImageMimeTypeFromFile } from \"./utils/mime.ts\";\n\nconst readSchema = Type.Object({\n path: Type.String({ description: \"Path to the file to read (relative or absolute)\" }),\n offset: Type.Optional(\n Type.Integer({\n minimum: 1,\n maximum: Number.MAX_SAFE_INTEGER,\n description: \"Line number to start reading from (1-indexed)\",\n }),\n ),\n limit: Type.Optional(\n Type.Integer({\n minimum: 1,\n maximum: Number.MAX_SAFE_INTEGER,\n description: \"Maximum number of lines to read\",\n }),\n ),\n});\n\nexport const readToolSystemPromptContribution = {\n snippet: \"Read file contents\",\n guidelines: [\"Use read to examine files instead of cat or sed.\"],\n} as const;\n\nexport interface ReadToolDetails {\n truncation?: TruncationResult;\n}\n\n/**\n * Pluggable operations for the read tool.\n * Override these to delegate file reading to remote systems (for example SSH).\n */\nexport interface ReadOperations {\n /** Read file contents as a Buffer. Bound source I/O to maxBytes + 1 when a limit is supplied. */\n readFile: (absolutePath: string, maxBytes?: number) => Promise<Buffer>;\n /** Check if file is readable (throw if not) */\n access: (absolutePath: string) => Promise<void>;\n /** Detect image MIME type, return null or undefined for non-images */\n detectImageMimeType?: (absolutePath: string) => Promise<string | null | undefined>;\n}\n\nconst defaultReadOperations: ReadOperations = {\n readFile: (path, maxBytes) => (maxBytes === undefined ? fsReadFile(path) : readFileBounded(path, maxBytes)),\n access: (path) => fsAccess(path, constants.R_OK),\n detectImageMimeType: detectSupportedImageMimeTypeFromFile,\n};\n\nexport interface ReadToolOptions {\n /** Shared knowledge of file contents in the current model context. */\n fileReadState?: FileReadState;\n /** Whether to auto-resize images. Default: true */\n autoResizeImages?: boolean;\n /** Fallback resize profile when the execution context has no model metadata. */\n resizeOptions?: ModelImageResizeOptions;\n /** Custom operations for file reading. Default: local filesystem */\n operations?: ReadOperations;\n}\n\nfunction getNonVisionImageNote(model: Model | undefined): string | undefined {\n if (!model || model.input.includes(\"image\")) {\n return undefined;\n }\n return \"[Current model does not support images. The image will be omitted from this request.]\";\n}\n\nexport function createReadToolDefinition(cwd: string, options?: ReadToolOptions) {\n const autoResizeImages = options?.autoResizeImages ?? true;\n const fallbackResizeOptions = options?.resizeOptions;\n const ops = options?.operations ?? defaultReadOperations;\n const fileReadState = options?.fileReadState ?? new FileReadState();\n return {\n name: \"read\",\n metadata: {\n readOnly: true,\n concurrentSafe: true,\n destructive: false,\n needsApproval: false,\n requiresUserInteraction: false,\n sideEffectScope: \"none\",\n },\n label: \"read\",\n description: `Read the contents of a file. Supports text files and images (jpg, png, gif, webp, bmp). Image sources up to 20 MiB are processed under separate inline budgets; over-budget WebP images are omitted because transcoding is unavailable. For text files, output is truncated to ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.`,\n promptSnippet: readToolSystemPromptContribution.snippet,\n promptGuidelines: [...readToolSystemPromptContribution.guidelines],\n parameters: readSchema,\n async execute(\n _toolCallId,\n { path, offset, limit }: { path: string; offset?: number; limit?: number },\n signal?: AbortSignal,\n _onUpdate?,\n ctx?: Partial<ToolContext>,\n ) {\n // SDK callers can execute tools directly without the agent's schema validation.\n for (const [name, value] of Object.entries({ offset, limit })) {\n if (value !== undefined && (!Number.isSafeInteger(value) || value < 1))\n throw new Error(`${name} must be a positive integer`);\n }\n return new Promise<{ content: (TextContent | ImageContent)[]; details: ReadToolDetails | undefined }>(\n (resolve, reject) => {\n if (signal?.aborted) {\n reject(new Error(\"Operation aborted\"));\n return;\n }\n let aborted = false;\n const onAbort = () => {\n aborted = true;\n reject(new Error(\"Operation aborted\"));\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n (async () => {\n try {\n const absolutePath = await resolveReadPathAsync(path, ctx?.cwd || cwd);\n if (aborted) return;\n // Check if file exists and is readable.\n await ops.access(absolutePath);\n if (aborted) return;\n const mimeType = ops.detectImageMimeType\n ? await ops.detectImageMimeType(absolutePath)\n : undefined;\n if (aborted) return;\n let content: (TextContent | ImageContent)[];\n let details: ReadToolDetails | undefined;\n const nonVisionImageNote = getNonVisionImageNote(ctx?.model);\n if (mimeType) {\n // Read image as binary.\n const buffer = await ops.readFile(absolutePath, imageLimits.readSourceBytes);\n // Older/custom readers may ignore the optional I/O limit. Never decode oversized results.\n if (buffer.length > imageLimits.readSourceBytes)\n throw new Error(`Image exceeds the ${imageLimits.readSourceBytes} byte size limit`);\n const resizeOptions = readImageResizeOptions(\n ctx?.model?.inputLimits?.images?.resize ?? fallbackResizeOptions,\n );\n let processed = await processImage(buffer, mimeType, {\n autoResizeImages,\n resizeOptions,\n });\n // Defensive check for replacement adapters: never send an over-budget Read result.\n if (\n processed.ok &&\n !fitsImageBudget(Buffer.from(processed.data, \"base64\"), imageBudget(resizeOptions))\n )\n processed = {\n ok: false,\n code: \"read_image_budget_exceeded\",\n message: \"[Image omitted: read_image_budget_exceeded.]\",\n };\n if (!processed.ok) {\n let textNote = `Read image file [${mimeType}]\\n${processed.message}`;\n if (nonVisionImageNote) textNote += `\\n${nonVisionImageNote}`;\n content = [{ type: \"text\", text: textNote }];\n } else {\n let textNote = `Read image file [${processed.mimeType}]`;\n if (processed.hints.length > 0) textNote += `\\n${processed.hints.join(\"\\n\")}`;\n if (nonVisionImageNote) textNote += `\\n${nonVisionImageNote}`;\n content = [\n { type: \"text\", text: textNote },\n { type: \"image\", data: processed.data, mimeType: processed.mimeType },\n ];\n }\n } else {\n // Local text is streamed, including giant lines. Custom readers retain\n // their buffer-based contract and may refer to non-local paths.\n const chunks = options?.operations\n ? [(await ops.readFile(absolutePath)).toString(\"utf8\")]\n : createReadStream(absolutePath, { encoding: \"utf8\", signal });\n if (aborted) return;\n const { hash, totalFileLines, firstLineBytes, truncation } = await readTextRange(\n chunks,\n offset,\n limit,\n );\n if (aborted) return;\n // Apply offset if specified. Convert from 1-indexed input to 0-indexed array access.\n const startLine = offset === undefined ? 0 : offset - 1;\n const startLineDisplay = startLine + 1;\n // Check if offset is out of bounds.\n if (startLine >= totalFileLines && (offset !== undefined || totalFileLines > 0)) {\n throw new Error(`Offset ${offset} is beyond end of file (${totalFileLines} lines total)`);\n }\n if (fileReadState.isHashUnchanged(absolutePath, hash, offset, limit)) {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve({\n content: [\n {\n type: \"text\",\n text: \"File unchanged. Reuse the file content already in context from your earlier read or successful edit/write.\",\n },\n ],\n details: undefined,\n });\n return;\n }\n const userLimitedLines =\n limit === undefined ? undefined : Math.min(limit, totalFileLines - startLine);\n let outputText: string;\n if (truncation.firstLineExceedsLimit) {\n // First line alone exceeds the byte limit. Point the model at a bash fallback.\n const firstLineSize = formatSize(firstLineBytes);\n outputText = `[Line ${startLineDisplay} is ${firstLineSize}, exceeds ${formatSize(DEFAULT_MAX_BYTES)} limit. Use bash: sed -n '${startLineDisplay}p' ${path} | head -c ${DEFAULT_MAX_BYTES}]`;\n details = { truncation };\n } else if (truncation.truncated) {\n // Truncation occurred. Build an actionable continuation notice.\n const endLineDisplay = startLineDisplay + truncation.outputLines - 1;\n const nextOffset = endLineDisplay + 1;\n outputText = truncation.content;\n if (truncation.truncatedBy === \"lines\") {\n outputText += `\\n\\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines}. Use offset=${nextOffset} to continue.]`;\n } else {\n outputText += `\\n\\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines} (${formatSize(DEFAULT_MAX_BYTES)} limit). Use offset=${nextOffset} to continue.]`;\n }\n details = { truncation };\n } else if (userLimitedLines !== undefined && startLine + userLimitedLines < totalFileLines) {\n // User-specified limit stopped early, but the file still has more content.\n const remaining = totalFileLines - (startLine + userLimitedLines);\n const nextOffset = startLine + userLimitedLines + 1;\n outputText = `${truncation.content}\\n\\n[${remaining} more lines in file. Use offset=${nextOffset} to continue.]`;\n } else {\n // No truncation and no remaining user-limited content.\n outputText = truncation.content;\n }\n content = [{ type: \"text\", text: outputText }];\n fileReadState.recordReadHash(absolutePath, hash, offset, limit, truncation.truncated);\n }\n\n if (aborted) return;\n signal?.removeEventListener(\"abort\", onAbort);\n resolve({ content, details });\n } catch (error: unknown) {\n signal?.removeEventListener(\"abort\", onAbort);\n if (!aborted) reject(error);\n }\n })();\n },\n );\n },\n } satisfies ToolDefinition<typeof readSchema, ReadToolDetails | undefined>;\n}\n","// Read's token budget is independent of the model's output token limit.\nexport const READ_MAX_OUTPUT_TOKENS = 25_000;\nexport const READ_IMAGE_MAX_BASE64_BYTES = 5 * 1024 * 1024;\nexport const READ_IMAGE_TARGET_BYTES = Math.floor((READ_IMAGE_MAX_BASE64_BYTES * 3) / 4);\nexport const READ_IMAGE_MAX_DIMENSION = 2000;\nexport const READ_IMAGE_MAX_INPUT_BYTES = 20 * 1024 * 1024;\nexport const READ_IMAGE_TOKEN_TO_BASE64_CHAR_RATIO = 0.125;\n// Invert tokens = base64 characters × ratio. Do not substitute model.maxTokens here.\nexport const READ_IMAGE_EFFECTIVE_BASE64_BYTES = Math.floor(\n READ_MAX_OUTPUT_TOKENS / READ_IMAGE_TOKEN_TO_BASE64_CHAR_RATIO,\n);\n\nexport const imageLimits = {\n /** Imported and cached attachment originals. */\n sourceBytes: 10 * 1024 * 1024,\n /** Local/remote read-tool image inputs; attachments retain their stricter import cap. */\n readSourceBytes: READ_IMAGE_MAX_INPUT_BYTES,\n count: 8,\n pixels: 40_000_000,\n messagePixels: 80_000_000,\n} as const;\n\nimport type { Attachment, ImageAttachment } from \"@zpi-dev/ai\";\n\nexport type { Attachment, FileAttachment, ImageAttachment } from \"@zpi-dev/ai\";\nexport function isImageAttachment(attachment: Attachment): attachment is ImageAttachment {\n return \"width\" in attachment;\n}\n","import { open } from \"node:fs/promises\";\n\n/** Read at most maxBytes + 1, including when a file grows after it was inspected. */\nexport async function readFileBounded(path: string, maxBytes: number): Promise<Buffer> {\n if (!Number.isSafeInteger(maxBytes) || maxBytes < 0 || maxBytes >= Number.MAX_SAFE_INTEGER)\n throw new Error(\"Invalid file byte limit\");\n const file = await open(path, \"r\");\n try {\n // Reject known oversized inputs before allocating or reading their contents. The loop also guards growth.\n if ((await file.stat()).size > maxBytes) throw new Error(`File exceeds the ${maxBytes} byte size limit`);\n const chunks: Buffer[] = [];\n let length = 0;\n while (length <= maxBytes) {\n const chunk = Buffer.allocUnsafe(Math.min(64 * 1024, maxBytes + 1 - length));\n const { bytesRead } = await file.read(chunk, 0, chunk.length, null);\n if (!bytesRead) return Buffer.concat(chunks, length);\n length += bytesRead;\n if (length > maxBytes) throw new Error(`File exceeds the ${maxBytes} byte size limit`);\n chunks.push(chunk.subarray(0, bytesRead));\n }\n throw new Error(\"File byte limit exceeded\");\n } finally {\n await file.close();\n }\n}\n","import { createHash } from \"node:crypto\";\nimport { DEFAULT_MAX_BYTES, truncateHead } from \"./truncate.ts\";\n\n/**\n * Count and hash the entire decoded file, but retain only a bounded prefix of the\n * requested range. Never buffer a whole line: a single line can be arbitrarily large.\n */\nexport async function readTextRange(\n chunks: AsyncIterable<string> | Iterable<string>,\n offset?: number,\n limit?: number,\n) {\n const hash = createHash(\"sha256\");\n const startLine = (offset ?? 1) - 1;\n // Two bytes past the output limit ensure truncateHead sees an overflowing line,\n // even if the first extra byte is a newline that its line counter trims.\n const prefixLimit = DEFAULT_MAX_BYTES + 2;\n let prefix = \"\";\n let prefixBytes = 0;\n let totalFileLines = 0;\n let selectedLines = 0;\n let selectedBytes = 0;\n let firstLineBytes = 0;\n let lineBytes = 0;\n let lastLineBytes = 0;\n let lineStarted = false;\n let endsWithNewline = false;\n\n const append = (text: string) => {\n selectedBytes += Buffer.byteLength(text, \"utf8\");\n if (prefixBytes >= prefixLimit) return;\n // UTF-16 length bounds the retained UTF-8 bytes by a constant factor. Keep a\n // complete surrogate pair at the boundary, preserving the exact text prefix.\n let end = Math.min(text.length, prefixLimit - prefixBytes);\n const last = text.charCodeAt(end - 1);\n if (last >= 0xd800 && last <= 0xdbff && end < text.length) end++;\n const part = text.slice(0, end);\n prefix += part;\n prefixBytes += Buffer.byteLength(part, \"utf8\");\n };\n const consume = (chunk: string, start: number, end: number, newline: boolean) => {\n if (totalFileLines >= startLine && (limit === undefined || totalFileLines - startLine < limit)) {\n if (!lineStarted && selectedLines > 0) append(\"\\n\");\n const part = chunk.slice(start, end);\n append(part);\n lineBytes += Buffer.byteLength(part, \"utf8\");\n if (newline) {\n if (selectedLines === 0) firstLineBytes = lineBytes;\n lastLineBytes = lineBytes;\n selectedLines++;\n lineBytes = 0;\n }\n }\n lineStarted = !newline;\n if (newline) totalFileLines++;\n };\n\n for await (const chunk of chunks) {\n if (chunk.length === 0) continue;\n // Hash decoded text, matching FileReadState even for malformed UTF-8 input.\n hash.update(chunk);\n let start = 0;\n let end = chunk.indexOf(\"\\n\");\n while (end !== -1) {\n consume(chunk, start, end, true);\n start = end + 1;\n end = chunk.indexOf(\"\\n\", start);\n }\n if (start < chunk.length) consume(chunk, start, chunk.length, false);\n endsWithNewline = chunk.endsWith(\"\\n\");\n }\n if (lineStarted) consume(\"\", 0, 0, true);\n\n const finalNewline =\n selectedLines > 0 && endsWithNewline && (limit === undefined || limit >= totalFileLines - startLine);\n if (finalNewline) append(\"\\n\");\n // Joining a range ending in an empty line itself produces a trailing newline.\n const totalLines = selectedBytes === 0 ? 0 : selectedLines - Number(!finalNewline && lastLineBytes === 0);\n const truncation = { ...truncateHead(prefix), totalLines, totalBytes: selectedBytes };\n return { hash: hash.digest(\"hex\"), totalFileLines, firstLineBytes, truncation };\n}\n","import {\n READ_IMAGE_MAX_BASE64_BYTES,\n READ_IMAGE_MAX_DIMENSION,\n READ_IMAGE_TARGET_BYTES,\n READ_IMAGE_TOKEN_TO_BASE64_CHAR_RATIO,\n READ_MAX_OUTPUT_TOKENS,\n} from \"../../../image-limits.ts\";\nimport type { ImageResizeOptions } from \"./image-resize-core.ts\";\n\nexport interface ImageBudget {\n maxRawBytes: number;\n maxBase64Bytes: number;\n maxTokens?: number;\n tokenToBase64CharRatio: number;\n}\n\nexport function imageBudget(options?: ImageResizeOptions): ImageBudget {\n return {\n maxRawBytes: options?.maxRawBytes ?? READ_IMAGE_TARGET_BYTES,\n maxBase64Bytes: options?.maxBytes ?? READ_IMAGE_MAX_BASE64_BYTES,\n maxTokens: options?.maxTokens,\n tokenToBase64CharRatio: options?.tokenToBase64CharRatio ?? READ_IMAGE_TOKEN_TO_BASE64_CHAR_RATIO,\n };\n}\n\nexport function fitsImageBudget(bytes: Uint8Array, budget: ImageBudget): boolean {\n const base64Bytes = Math.ceil(bytes.byteLength / 3) * 4;\n if (bytes.byteLength > budget.maxRawBytes) return false;\n if (base64Bytes > budget.maxBase64Bytes) return false;\n return (\n budget.maxTokens === undefined ||\n Math.ceil(base64Bytes * budget.tokenToBase64CharRatio) <= budget.maxTokens\n );\n}\n\n/** Model profiles can tighten Read's limits, never relax its independent 25K image-token budget. */\nexport function readImageResizeOptions(options?: ImageResizeOptions): ImageResizeOptions {\n return {\n ...options,\n jpegQuality: Math.min(options?.jpegQuality ?? 80, 80),\n maxWidth: Math.min(options?.maxWidth ?? READ_IMAGE_MAX_DIMENSION, READ_IMAGE_MAX_DIMENSION),\n maxHeight: Math.min(options?.maxHeight ?? READ_IMAGE_MAX_DIMENSION, READ_IMAGE_MAX_DIMENSION),\n maxBytes: Math.min(options?.maxBytes ?? READ_IMAGE_MAX_BASE64_BYTES, READ_IMAGE_MAX_BASE64_BYTES),\n maxRawBytes: Math.min(options?.maxRawBytes ?? READ_IMAGE_TARGET_BYTES, READ_IMAGE_TARGET_BYTES),\n maxTokens: Math.min(options?.maxTokens ?? READ_MAX_OUTPUT_TOKENS, READ_MAX_OUTPUT_TOKENS),\n tokenToBase64CharRatio: Math.max(\n options?.tokenToBase64CharRatio ?? READ_IMAGE_TOKEN_TO_BASE64_CHAR_RATIO,\n READ_IMAGE_TOKEN_TO_BASE64_CHAR_RATIO,\n ),\n };\n}\n\nexport type ImageProcessorErrorCode =\n | \"invalid_request\"\n | \"empty\"\n | \"processing_failed\"\n | \"too_large\"\n | \"unsupported\";\nexport class ImageProcessorError extends Error {\n readonly code: ImageProcessorErrorCode;\n constructor(code: ImageProcessorErrorCode, message: string) {\n super(message);\n this.name = \"ImageProcessorError\";\n this.code = code;\n }\n}\n","// Adapted from Pi c20cb09772bf4e2590a316cb54514cef76df4293.\n// Copyright (c) 2025 Mario Zechner. MIT license: licenses/third-party-notices.txt.\nimport type { ResizedImage } from \"./image-resize-core.ts\";\n\nexport type { ImageResizeOptions, ResizedImage } from \"./image-resize-core.ts\";\nexport function formatDimensionNote(result: ResizedImage): string | undefined {\n if (!result.wasResized) {\n return undefined;\n }\n\n const scaleX = (result.originalWidth / result.width).toFixed(2);\n const scaleY = (result.originalHeight / result.height).toFixed(2);\n const scale = scaleX === scaleY ? scaleX : `${scaleX} horizontally and ${scaleY} vertically`;\n return `[Image: original ${result.originalWidth}x${result.originalHeight}, displayed at ${result.width}x${result.height}. Multiply coordinates by ${scale} to map to original image.]`;\n}\n","import sharp, { type Sharp } from \"sharp\";\nimport { imageLimits, READ_IMAGE_MAX_DIMENSION } from \"../../../image-limits.ts\";\nimport { fitsImageBudget, ImageProcessorError, imageBudget } from \"./image-budget.ts\";\nimport { imageFormat, openImage } from \"./image-source.ts\";\n\nexport interface ImageResizeOptions {\n maxWidth?: number;\n maxHeight?: number;\n /** Encoded base64 bytes, excluding the data URL prefix. Attachments default to 5 MiB. */\n maxBytes?: number;\n maxRawBytes?: number;\n /** Image input tokens, never the model's output limit. Omitted deliberately for user attachments. */\n maxTokens?: number;\n tokenToBase64CharRatio?: number;\n /** Optional stricter starting quality; the default ladder is 80, 60, 40, 20. */\n jpegQuality?: number;\n}\nexport interface ResizedImage {\n data: string;\n mimeType: string;\n originalWidth: number;\n originalHeight: number;\n width: number;\n height: number;\n wasResized: boolean;\n originalMimeType?: string;\n animated?: boolean;\n strategy: \"original\" | \"png-optimized\" | \"preserve-format\" | \"resized\" | \"jpeg-quality\" | \"jpeg-fallback\";\n}\ntype ImageDimensions = { width: number; height: number };\nconst JPEG_QUALITY_STEPS = [80, 60, 40, 20];\nconst PROGRESSIVE_SCALE_FACTORS = [0.75, 0.5, 0.25];\nconst AGGRESSIVE_JPEG_MAX_EDGES = [1000, 800, 600, 400, 300, 200];\nconst MIN_IMAGE_EDGE = 1;\n\nasync function materializePixels(pipeline: Sharp) {\n const { data, info } = await pipeline.raw().toBuffer({ resolveWithObject: true });\n return {\n width: info.width,\n height: info.height,\n pipeline: sharp(data, {\n raw: { width: info.width, height: info.height, channels: info.channels },\n limitInputPixels: imageLimits.pixels,\n }),\n };\n}\n\n/** First fitting candidate wins. Compression can reach quality 20 / 200px: small text may be unreadable. */\nexport async function resizeImageInProcess(\n inputBytes: Uint8Array,\n mimeType: string,\n options?: ImageResizeOptions,\n autoResizeImages = true,\n): Promise<ResizedImage> {\n const budget = imageBudget(options);\n const maxWidth = options?.maxWidth ?? READ_IMAGE_MAX_DIMENSION;\n const maxHeight = options?.maxHeight ?? READ_IMAGE_MAX_DIMENSION;\n const quality = options?.jpegQuality ?? 80;\n if (\n ![maxWidth, maxHeight, budget.maxRawBytes, budget.maxBase64Bytes, quality].every(\n (value) => Number.isSafeInteger(value) && value > 0,\n ) ||\n quality > 100 ||\n (budget.maxTokens !== undefined && (!Number.isFinite(budget.maxTokens) || budget.maxTokens < 0)) ||\n !Number.isFinite(budget.tokenToBase64CharRatio) ||\n budget.tokenToBase64CharRatio <= 0\n )\n throw new ImageProcessorError(\"invalid_request\", \"Invalid image budget or dimensions\");\n if (!inputBytes.length) throw new ImageProcessorError(\"empty\", \"Image file is empty (0 bytes)\");\n const format = imageFormat(inputBytes);\n const sourceMime = format ? `image/${format}` : mimeType;\n // Preserve the existing WebP budget-only passthrough policy independently of encoder capabilities.\n if (sourceMime === \"image/webp\") {\n if (!fitsImageBudget(inputBytes, budget))\n throw new ImageProcessorError(\n \"unsupported\",\n \"WebP image exceeds the model image budget; the passthrough policy does not transcode WebP\",\n );\n return {\n data: Buffer.from(inputBytes).toString(\"base64\"),\n mimeType: sourceMime,\n originalMimeType: sourceMime,\n originalWidth: 0,\n originalHeight: 0,\n width: 0,\n height: 0,\n wasResized: false,\n strategy: \"original\",\n };\n }\n let image: Awaited<ReturnType<typeof materializePixels>>;\n let animated: boolean;\n try {\n const source = await openImage(inputBytes);\n // Fully decode one oriented frame once, then reuse its pixels for every candidate.\n // This also validates fitting originals and PNGs with trailing bytes.\n image = await materializePixels(source.pipeline.rotate().ensureAlpha());\n animated = source.animated;\n } catch {\n throw new ImageProcessorError(\"processing_failed\", \"Unable to decode image data\");\n }\n const originalWidth = image.width;\n const originalHeight = image.height;\n const result = (\n data: Uint8Array,\n outputMime: string,\n candidate: ImageDimensions,\n strategy: ResizedImage[\"strategy\"],\n ): ResizedImage => ({\n data: Buffer.from(data).toString(\"base64\"),\n mimeType: outputMime,\n originalMimeType: sourceMime,\n originalWidth,\n originalHeight,\n width: candidate.width,\n height: candidate.height,\n wasResized: candidate.width !== originalWidth || candidate.height !== originalHeight,\n animated: animated && strategy !== \"original\",\n strategy,\n });\n const withinDimensions = originalWidth <= maxWidth && originalHeight <= maxHeight;\n if (withinDimensions && fitsImageBudget(inputBytes, budget) && sourceMime !== \"image/bmp\")\n return result(inputBytes, sourceMime, image, \"original\");\n const resize = (source: ImageDimensions, edge: number): ImageDimensions => {\n const scale = Math.min(1, edge / Math.max(source.width, source.height));\n return {\n width: Math.max(MIN_IMAGE_EDGE, Math.round(source.width * scale)),\n height: Math.max(MIN_IMAGE_EDGE, Math.round(source.height * scale)),\n };\n };\n const candidatePipeline = (candidate: ImageDimensions): Sharp => {\n const output = image.pipeline.clone();\n if (candidate.width !== originalWidth || candidate.height !== originalHeight)\n output.resize({\n width: candidate.width,\n height: candidate.height,\n fit: \"fill\",\n kernel: sharp.kernel.cubic,\n });\n return output;\n };\n // Keep only the current JPEG pixels, reusing resize/flatten work across quality attempts.\n let jpegPixels: typeof image | undefined;\n const encode = async (\n candidate: ImageDimensions,\n outputMime: string,\n strategy: ResizedImage[\"strategy\"],\n jpegQuality?: number,\n ) => {\n let output: Sharp;\n // Preserve black JPEG backgrounds and first-frame GIF output. Codec bytes may differ from ZCode.\n if (outputMime === \"image/jpeg\") {\n if (jpegPixels?.width !== candidate.width || jpegPixels.height !== candidate.height)\n jpegPixels = await materializePixels(candidatePipeline(candidate).flatten({ background: \"#000000\" }));\n output = jpegPixels.pipeline.clone().jpeg({ quality: jpegQuality ?? 100 });\n } else {\n output = candidatePipeline(candidate);\n if (outputMime === \"image/gif\") output.gif();\n else output.png({ compressionLevel: 9, adaptiveFiltering: true });\n }\n const data = await output.toBuffer();\n return fitsImageBudget(data, budget) ? result(data, outputMime, candidate, strategy) : undefined;\n };\n if (!autoResizeImages) {\n // Disabling automatic compression never disables request limits. BMP still needs\n // format normalization, but neither resampling nor lossy fallback is allowed.\n if (withinDimensions && sourceMime === \"image/bmp\") {\n const fitted = await encode(image, \"image/png\", \"preserve-format\");\n if (fitted) return fitted;\n }\n throw new ImageProcessorError(\n \"too_large\",\n \"Image exceeds the inline image limits; automatic resizing is disabled\",\n );\n }\n const jpeg = async (candidate: ImageDimensions) => {\n for (const step of [quality, ...JPEG_QUALITY_STEPS.filter((step) => step < quality)]) {\n const fitted = await encode(candidate, \"image/jpeg\", \"jpeg-quality\", step);\n if (fitted) return fitted;\n }\n return undefined;\n };\n const preserve = async (candidate: ImageDimensions) =>\n sourceMime === \"image/jpeg\"\n ? jpeg(candidate)\n : encode(\n candidate,\n sourceMime === \"image/gif\" ? \"image/gif\" : \"image/png\",\n sourceMime === \"image/gif\" ? \"preserve-format\" : \"png-optimized\",\n );\n if (withinDimensions) {\n const fitted = await preserve(image);\n if (fitted) return fitted;\n }\n const boundedEdge = Math.max(\n 1,\n Math.round(\n Math.max(originalWidth, originalHeight) *\n Math.min(1, maxWidth / originalWidth, maxHeight / originalHeight),\n ),\n );\n const bounded = resize(image, boundedEdge);\n // PNG gets one original-size lossless attempt, never a resized PNG candidate.\n const preserveSourceFormatAfterInitialAttempt = sourceMime !== \"image/png\";\n if (\n preserveSourceFormatAfterInitialAttempt &&\n (bounded.width !== originalWidth || bounded.height !== originalHeight)\n ) {\n const fitted = await encode(\n bounded,\n sourceMime === \"image/gif\" ? \"image/gif\" : sourceMime === \"image/jpeg\" ? \"image/jpeg\" : \"image/png\",\n \"resized\",\n );\n if (fitted) return fitted;\n }\n if (!withinDimensions && preserveSourceFormatAfterInitialAttempt) {\n const fitted = await preserve(bounded);\n if (fitted) return fitted;\n }\n const fitted = await jpeg(bounded);\n if (fitted) return fitted;\n // Non-cumulative scales relative to bounded; fallback edges below may be larger again.\n for (const scale of PROGRESSIVE_SCALE_FACTORS) {\n const scaled = resize(\n bounded,\n Math.max(MIN_IMAGE_EDGE, Math.round(Math.max(bounded.width, bounded.height) * scale)),\n );\n if (preserveSourceFormatAfterInitialAttempt) {\n const fitted = await preserve(scaled);\n if (fitted) return fitted;\n }\n const fitted = await jpeg(scaled);\n if (fitted) return fitted;\n }\n for (const edge of AGGRESSIVE_JPEG_MAX_EDGES) {\n const fitted = await encode(\n resize(image, Math.min(edge, boundedEdge)),\n \"image/jpeg\",\n \"jpeg-fallback\",\n 20,\n );\n if (fitted) return fitted;\n }\n throw new ImageProcessorError(\n \"too_large\",\n `Unable to compress image (${inputBytes.byteLength} bytes) within the requested model image budget`,\n );\n}\n","import bmp from \"bmp-js\";\nimport sharp, { type Sharp } from \"sharp\";\nimport { imageLimits } from \"../../../image-limits.ts\";\nimport { normalizeBmp } from \"./bmp-source.ts\";\nimport { isAnimatedPng } from \"./mime.ts\";\n\nexport function imageFormat(bytes: Uint8Array): string | undefined {\n const b = Buffer.from(bytes);\n if (b.subarray(0, 8).equals(Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]))) return \"png\";\n if (b[0] === 255 && b[1] === 216 && b[2] === 255) return \"jpeg\";\n if (/^GIF8[79]a$/.test(b.subarray(0, 6).toString())) return \"gif\";\n if (b.subarray(0, 4).toString() === \"RIFF\" && b.subarray(8, 12).toString() === \"WEBP\") return \"webp\";\n if (b.subarray(0, 2).toString() === \"BM\") return \"bmp\";\n return undefined;\n}\n\n/** Decode the first frame with the same pixel guard for attachments and the read tool. */\nexport async function openImage(bytes: Uint8Array) {\n const format = imageFormat(bytes);\n if (!format) throw new Error(\"invalid_input: 仅支持真实 JPEG、PNG、GIF、WebP、BMP 图片\");\n const input = Buffer.from(bytes);\n let pipeline: Sharp;\n if (format === \"bmp\") {\n const decoded = bmp.decode(normalizeBmp(input));\n // bmp-js produces ABGR; sharp expects RGBA.\n const rgba = Buffer.alloc(decoded.data.length);\n for (let i = 0; i < rgba.length; i += 4) {\n rgba[i] = decoded.data[i + 3];\n rgba[i + 1] = decoded.data[i + 2];\n rgba[i + 2] = decoded.data[i + 1];\n // BI_RGB16 is RGB555. bmp-js drops the low three bits; replicate the high bits.\n if (decoded.bitPP === 16) {\n for (let channel = 0; channel < 3; channel++) rgba[i + channel] |= rgba[i + channel] >> 5;\n }\n rgba[i + 3] = 255;\n }\n pipeline = sharp(rgba, {\n raw: { width: decoded.width, height: decoded.height, channels: 4 },\n limitInputPixels: imageLimits.pixels,\n });\n } else pipeline = sharp(input, { limitInputPixels: imageLimits.pixels, pages: 1, failOn: \"error\" });\n const metadata = await pipeline.metadata();\n const width = metadata.width ?? 0;\n const height = metadata.pageHeight ?? metadata.height ?? 0;\n if (!width || !height || width * height > imageLimits.pixels)\n throw new Error(\"invalid_input: 图片尺寸无效或像素超限\");\n const orientation = metadata.orientation ?? 1;\n return {\n pipeline,\n mimeType: `image/${format}`,\n width: orientation >= 5 ? height : width,\n height: orientation >= 5 ? width : height,\n orientation,\n animated: (metadata.pages ?? 1) > 1 || (format === \"png\" && isAnimatedPng(input)),\n };\n}\n","import { imageLimits } from \"../../../image-limits.ts\";\n\nconst invalid = () => new Error(\"invalid_input: BMP 文件结构无效或数据不完整\");\nconst unsupported = () =>\n new Error(\n \"invalid_input: BMP 仅支持 Windows BI_RGB(1/4/8/16/24/32 位)和 BI_RLE4/BI_RLE8,不支持位域或嵌入式编码\",\n );\n\n/** Normalize validated Windows BMPs to the uncompressed layout bmp-js reliably decodes. */\nexport function normalizeBmp(input: Buffer): Buffer {\n if (input.length < 54) throw invalid();\n const headerSize = input.readUInt32LE(14);\n const offset = input.readUInt32LE(10);\n const declaredSize = input.readUInt32LE(2);\n const width = input.readInt32LE(18);\n const signedHeight = input.readInt32LE(22);\n const height = Math.abs(signedHeight);\n const bits = input.readUInt16LE(28);\n const compression = input.readUInt32LE(30);\n const rawSize = input.readUInt32LE(34);\n const colors = input.readUInt32LE(46);\n if (width < 1 || height < 1 || width * height > imageLimits.pixels)\n throw new Error(\"invalid_input: 图片解码像素超限\");\n if (![40, 52, 56, 108, 124].includes(headerSize) || ![1, 4, 8, 16, 24, 32].includes(bits))\n throw unsupported();\n if (![0, 1, 2].includes(compression)) throw unsupported();\n if (\n 14 + headerSize > input.length ||\n input.readUInt16LE(26) !== 1 ||\n (compression === 1 && bits !== 8) ||\n (compression === 2 && bits !== 4) ||\n (compression !== 0 && signedHeight < 0)\n )\n throw invalid();\n const paletteSize = bits <= 8 ? colors || 2 ** bits : colors;\n if (paletteSize > (bits <= 8 ? 2 ** bits : 256)) throw invalid();\n const paletteStart = 14 + headerSize;\n const stride = Math.ceil((width * bits) / 32) * 4;\n const sourceEnd = declaredSize || input.length;\n if (offset < paletteStart + paletteSize * 4 || offset > sourceEnd || sourceEnd > input.length)\n throw invalid();\n let pixels: Buffer;\n if (compression === 0) {\n const end = offset + stride * height;\n if (end > sourceEnd) throw invalid();\n pixels = input.subarray(offset, end);\n if (bits <= 8) {\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const value = pixels[y * stride + Math.floor((x * bits) / 8)];\n const index = (value >> (8 - bits - ((x * bits) % 8))) & ((1 << bits) - 1);\n if (index >= paletteSize) throw invalid();\n }\n }\n }\n } else {\n const end = rawSize ? offset + rawSize : sourceEnd;\n if (end > sourceEnd) throw invalid();\n pixels = expandRle(input.subarray(offset, end), width, height, bits, stride, paletteSize);\n }\n // bmp-js ignores bfOffBits and extended DIB fields. Give it a canonical 40-byte header.\n const header = Buffer.from(input.subarray(0, 54));\n header.writeUInt32LE(40, 14);\n header.writeUInt32LE(0, 30);\n header.writeUInt32LE(pixels.length, 34);\n const palette = bits <= 8 ? input.subarray(paletteStart, paletteStart + paletteSize * 4) : Buffer.alloc(0);\n const normalized = Buffer.concat([header, palette, pixels]);\n normalized.writeUInt32LE(normalized.length, 2);\n normalized.writeUInt32LE(54 + palette.length, 10);\n return normalized;\n}\n\n/** RLE rows are bottom-up. Expand indices first, avoiding bmp-js's RLE row/delta handling. */\nfunction expandRle(\n source: Buffer,\n width: number,\n height: number,\n bits: number,\n stride: number,\n paletteSize: number,\n): Buffer {\n // Dimensions were guarded before reaching this allocation; gaps use palette entry zero.\n const pixels = Buffer.alloc(stride * height);\n let position = 0;\n let x = 0;\n let y = 0;\n const requireBytes = (count: number) => {\n if (position + count > source.length) throw invalid();\n };\n const writeIndex = (index: number) => {\n if (index >= paletteSize) throw invalid();\n const offset = y * stride + Math.floor((x * bits) / 8);\n if (bits === 8) pixels[offset] = index;\n else pixels[offset] |= index << (x % 2 === 0 ? 4 : 0);\n x++;\n };\n while (position < source.length) {\n requireBytes(2);\n const count = source[position++];\n const value = source[position++];\n if (count === 0 && value === 1) return pixels;\n if (count === 0 && value === 0) {\n x = 0;\n if (++y > height) throw invalid();\n continue;\n }\n if (count === 0 && value === 2) {\n requireBytes(2);\n x += source[position++];\n y += source[position++];\n if (x >= width || y >= height) throw invalid();\n continue;\n }\n const run = count || value;\n if (y >= height || x + run > width) throw invalid();\n if (count) {\n for (let i = 0; i < run; i++) writeIndex(bits === 8 ? value : (value >> (i % 2 === 0 ? 4 : 0)) & 15);\n } else {\n const bytes = Math.ceil((run * bits) / 8);\n const paddedBytes = bytes + (bytes % 2);\n requireBytes(paddedBytes);\n for (let i = 0; i < run; i++) {\n const packed = source[position + Math.floor((i * bits) / 8)];\n writeIndex(bits === 8 ? packed : (packed >> (i % 2 === 0 ? 4 : 0)) & 15);\n }\n position += paddedBytes;\n }\n }\n throw invalid(); // A compressed bitmap must terminate with an end-of-bitmap marker.\n}\n","// Adapted from Pi c20cb09772bf4e2590a316cb54514cef76df4293.\n// Copyright (c) 2025 Mario Zechner. MIT license: licenses/third-party-notices.txt.\nimport { constants } from \"node:fs\";\nimport { open } from \"node:fs/promises\";\n\nconst IMAGE_TYPE_SNIFF_BYTES = 4100;\nconst PNG_SIGNATURE = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];\n\nexport function detectSupportedImageMimeType(buffer: Uint8Array): string | null {\n if (startsWith(buffer, [0xff, 0xd8, 0xff])) {\n return buffer[3] === 0xf7 ? null : \"image/jpeg\";\n }\n if (startsWith(buffer, PNG_SIGNATURE)) {\n return isPng(buffer) ? \"image/png\" : null;\n }\n if (startsWithAscii(buffer, 0, \"GIF87a\") || startsWithAscii(buffer, 0, \"GIF89a\")) {\n return \"image/gif\";\n }\n if (startsWithAscii(buffer, 0, \"RIFF\") && startsWithAscii(buffer, 8, \"WEBP\")) {\n return \"image/webp\";\n }\n if (startsWithAscii(buffer, 0, \"BM\") && isBmp(buffer)) {\n return \"image/bmp\";\n }\n return null;\n}\n\nexport async function detectSupportedImageMimeTypeFromFile(filePath: string): Promise<string | null> {\n // A FIFO must not occupy a filesystem worker while waiting for a writer.\n const fileHandle = await open(filePath, constants.O_RDONLY | (constants.O_NONBLOCK ?? 0));\n try {\n if (!(await fileHandle.stat()).isFile()) throw new Error(\"Read requires a regular file\");\n const buffer = Buffer.alloc(IMAGE_TYPE_SNIFF_BYTES);\n const { bytesRead } = await fileHandle.read(buffer, 0, IMAGE_TYPE_SNIFF_BYTES, 0);\n return detectSupportedImageMimeType(buffer.subarray(0, bytesRead));\n } finally {\n await fileHandle.close();\n }\n}\n\nfunction isPng(buffer: Uint8Array): boolean {\n return (\n buffer.length >= 16 &&\n readUint32BE(buffer, PNG_SIGNATURE.length) === 13 &&\n startsWithAscii(buffer, 12, \"IHDR\")\n );\n}\n\nexport function isAnimatedPng(buffer: Uint8Array): boolean {\n let offset = PNG_SIGNATURE.length;\n while (offset + 8 <= buffer.length) {\n const chunkLength = readUint32BE(buffer, offset);\n const chunkTypeOffset = offset + 4;\n if (startsWithAscii(buffer, chunkTypeOffset, \"acTL\")) return true;\n if (startsWithAscii(buffer, chunkTypeOffset, \"IDAT\")) return false;\n\n const nextOffset = offset + 8 + chunkLength + 4;\n if (nextOffset <= offset || nextOffset > buffer.length) return false;\n offset = nextOffset;\n }\n return false;\n}\n\nfunction isBmp(buffer: Uint8Array): boolean {\n if (buffer.length < 26) return false;\n\n const declaredFileSize = readUint32LE(buffer, 2);\n const pixelDataOffset = readUint32LE(buffer, 10);\n const dibHeaderSize = readUint32LE(buffer, 14);\n if (declaredFileSize !== 0 && declaredFileSize < 26) return false;\n if (pixelDataOffset < 14 + dibHeaderSize) return false;\n if (declaredFileSize !== 0 && pixelDataOffset >= declaredFileSize) return false;\n\n let colorPlanes: number;\n let bitsPerPixel: number;\n if (dibHeaderSize === 12) {\n colorPlanes = readUint16LE(buffer, 22);\n bitsPerPixel = readUint16LE(buffer, 24);\n } else if (dibHeaderSize >= 40 && dibHeaderSize <= 124) {\n if (buffer.length < 30) return false;\n colorPlanes = readUint16LE(buffer, 26);\n bitsPerPixel = readUint16LE(buffer, 28);\n } else {\n return false;\n }\n\n return colorPlanes === 1 && [1, 4, 8, 16, 24, 32].includes(bitsPerPixel);\n}\n\nfunction readUint16LE(buffer: Uint8Array, offset: number): number {\n return (buffer[offset] ?? 0) + ((buffer[offset + 1] ?? 0) << 8);\n}\n\nfunction readUint32BE(buffer: Uint8Array, offset: number): number {\n return (\n (buffer[offset] ?? 0) * 0x1000000 +\n ((buffer[offset + 1] ?? 0) << 16) +\n ((buffer[offset + 2] ?? 0) << 8) +\n (buffer[offset + 3] ?? 0)\n );\n}\n\nfunction readUint32LE(buffer: Uint8Array, offset: number): number {\n return (\n (buffer[offset] ?? 0) +\n ((buffer[offset + 1] ?? 0) << 8) +\n ((buffer[offset + 2] ?? 0) << 16) +\n (buffer[offset + 3] ?? 0) * 0x1000000\n );\n}\n\nfunction startsWith(buffer: Uint8Array, bytes: number[]): boolean {\n if (buffer.length < bytes.length) return false;\n return bytes.every((byte, index) => buffer[index] === byte);\n}\n\nfunction startsWithAscii(buffer: Uint8Array, offset: number, text: string): boolean {\n if (buffer.length < offset + text.length) return false;\n for (let index = 0; index < text.length; index++) {\n if (buffer[offset + index] !== text.charCodeAt(index)) return false;\n }\n return true;\n}\n","import { ImageProcessorError } from \"./image-budget.ts\";\nimport { formatDimensionNote, type ImageResizeOptions } from \"./image-resize.ts\";\nimport { resizeImageInProcess } from \"./image-resize-core.ts\";\n\nexport interface ProcessImageOptions {\n autoResizeImages?: boolean;\n resizeOptions?: ImageResizeOptions;\n}\nexport type ProcessImageResult =\n | { ok: true; data: string; mimeType: string; hints: string[]; strategy?: string }\n | { ok: false; message: string; code?: string };\n\n/** Attachments deliberately omit maxTokens: 5 MiB base64, unlike Read's 200,000 bytes. */\nexport async function processImage(\n bytes: Uint8Array,\n mimeType: string,\n options?: ProcessImageOptions,\n): Promise<ProcessImageResult> {\n try {\n const resized = await resizeImageInProcess(\n bytes,\n mimeType,\n options?.resizeOptions,\n options?.autoResizeImages,\n );\n const hints: string[] = resized.animated ? [\"[Animated image: only the first frame is sent.]\"] : [];\n if (resized.originalMimeType !== resized.mimeType)\n hints.push(`[Image converted from ${resized.originalMimeType} to ${resized.mimeType}.]`);\n const dimensionNote = formatDimensionNote(resized);\n if (dimensionNote) hints.push(dimensionNote);\n if (resized.strategy !== \"original\")\n hints.push(\n \"[Image compressed: small text, buttons and layout details may be unreadable. Compression success does not guarantee readability.]\",\n );\n return { ok: true, data: resized.data, mimeType: resized.mimeType, hints, strategy: resized.strategy };\n } catch (error) {\n const code = error instanceof ImageProcessorError ? error.code : \"processing_failed\";\n return {\n ok: false,\n code,\n message: `[Image omitted: ${code}. ${error instanceof Error ? error.message : \"Unable to process image\"}.]`,\n };\n }\n}\n","// Adapted from Pi c20cb09772bf4e2590a316cb54514cef76df4293.\n// Copyright (c) 2025 Mario Zechner. MIT license: licenses/third-party-notices.txt.\n\nimport { mkdir as fsMkdir, writeFile as fsWriteFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { Type } from \"typebox\";\nimport type { ToolContext, ToolDefinition } from \"../../types.ts\";\nimport { withFileMutationQueue } from \"./file-mutation-queue.ts\";\nimport type { FileReadState } from \"./file-read-state.ts\";\nimport { resolveToCwd } from \"./path-utils.ts\";\n\nconst writeSchema = Type.Object({\n path: Type.String({ description: \"Path to the file to write (relative or absolute)\" }),\n content: Type.String({ description: \"Content to write to the file\" }),\n});\n\nexport const writeToolSystemPromptContribution = {\n snippet: \"Create or overwrite files\",\n guidelines: [\"Use write only for new files or complete rewrites.\"],\n} as const;\n\n/**\n * Pluggable operations for the write tool.\n * Override these to delegate file writing to remote systems (for example SSH).\n */\nexport interface WriteOperations {\n /** Write content to a file */\n writeFile: (absolutePath: string, content: string) => Promise<void>;\n /** Create directory recursively */\n mkdir: (dir: string) => Promise<void>;\n}\n\nconst defaultWriteOperations: WriteOperations = {\n writeFile: (path, content) => fsWriteFile(path, content, \"utf-8\"),\n mkdir: (dir) => fsMkdir(dir, { recursive: true }).then(() => {}),\n};\n\nexport interface WriteToolOptions {\n /** Shared knowledge of file contents in the current model context. */\n fileReadState?: FileReadState;\n /** Custom operations for file writing. Default: local filesystem */\n operations?: WriteOperations;\n}\n\nexport function createWriteToolDefinition(cwd: string, options?: WriteToolOptions) {\n const ops = options?.operations ?? defaultWriteOperations;\n return {\n name: \"write\",\n label: \"write\",\n description:\n \"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.\",\n promptSnippet: writeToolSystemPromptContribution.snippet,\n promptGuidelines: [...writeToolSystemPromptContribution.guidelines],\n parameters: writeSchema,\n async execute(\n _toolCallId,\n { path, content }: { path: string; content: string },\n signal?: AbortSignal,\n _onUpdate?,\n ctx?: Partial<ToolContext>,\n ) {\n const absolutePath = resolveToCwd(path, ctx?.cwd || cwd);\n const dir = dirname(absolutePath);\n return withFileMutationQueue(absolutePath, async () => {\n // Do not reject from an abort event listener here: that would release the\n // mutation queue while an in-flight filesystem operation may still finish.\n // Check cancellation before writing, and keep the queue locked until the\n // write settles. A successful write must still be reported as successful.\n const throwIfAborted = (): void => {\n if (signal?.aborted) throw new Error(\"Operation aborted\");\n };\n\n throwIfAborted();\n // Create parent directories if needed.\n await ops.mkdir(dir);\n throwIfAborted();\n\n // Write the file contents.\n await ops.writeFile(absolutePath, content);\n options?.fileReadState?.recordWrite(absolutePath, content);\n\n return {\n content: [{ type: \"text\", text: `Successfully wrote to ${path}` }],\n details: undefined,\n };\n });\n },\n } satisfies ToolDefinition<typeof writeSchema, undefined>;\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { lstatSync, readFileSync, renameSync, rmSync, writeFileSync } from \"node:fs\";\nimport { lstat, realpath } from \"node:fs/promises\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { readFileBounded } from \"./read-file-bounded.ts\";\nimport type { FileChange } from \"./tools/file-change.ts\";\n\nexport interface FileRewindConflict {\n path: string;\n reason: string;\n}\nexport interface FileRewindOptions {\n checkPath?(path: string): void | Promise<void>;\n readCheckpoint?(path: string): Promise<Buffer>;\n}\nconst maxBytes = 4 * 1024 * 1024;\nasync function readCheckpoint(path: string): Promise<Buffer> {\n if (!(await lstat(path)).isFile()) throw new Error(\"无法读取文件 checkpoint\");\n return readFileBounded(path, maxBytes);\n}\n\nconst hash = (bytes: Buffer) => createHash(\"sha256\").update(bytes).digest(\"hex\");\ninterface RestoreFile {\n path: string;\n before: Buffer | null;\n current: Buffer;\n mode: number;\n}\nexport interface FileRewindPlan {\n files: RestoreFile[];\n conflicts: FileRewindConflict[];\n}\n/** Preflight every checkpoint before touching any workspace file or conversation entry. */\nexport async function planFileRewind(\n changes: readonly FileChange[],\n options: FileRewindOptions = {},\n): Promise<FileRewindPlan> {\n const groups = new Map<string, FileChange[]>();\n for (const change of changes) {\n const group = groups.get(change.path) ?? [];\n group.push(change);\n groups.set(change.path, group);\n }\n const plan: FileRewindPlan = { files: [], conflicts: [] };\n for (const [path, writes] of groups) {\n try {\n const actual = await realpath(path);\n if (actual !== resolve(path)) throw new Error(\"旧 checkpoint 无法安全还原\");\n await options.checkPath?.(actual);\n const first = writes[0],\n last = writes.at(-1) as FileChange;\n if (writes.some((write, i) => i > 0 && write.beforeHash !== writes[i - 1].afterHash))\n throw new Error(\"当前文件已被外部修改\");\n const info = await lstat(actual);\n if (!info.isFile() || info.nlink !== 1 || info.size > maxBytes)\n throw new Error(\"旧 checkpoint 无法安全还原\");\n const current = await readFileBounded(actual, maxBytes);\n if (hash(current) !== last.afterHash) throw new Error(\"当前文件已被外部修改\");\n let before: Buffer | null = null;\n if (first.beforeHash !== null) {\n if (!first.beforeFile) throw new Error(\"缺少文件 checkpoint\");\n before = await (options.readCheckpoint ?? readCheckpoint)(first.beforeFile);\n if (hash(before) !== first.beforeHash) throw new Error(\"无法读取文件 checkpoint\");\n }\n plan.files.push({ path: actual, before, current, mode: info.mode });\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n plan.conflicts.push({ path, reason: code ? \"无法读取当前文件\" : (error as Error).message });\n }\n }\n return plan;\n}\nfunction replaceFile(path: string, content: Buffer, mode: number) {\n const temporary = join(dirname(path), `.zpi-rewind-${randomUUID()}`);\n try {\n writeFileSync(temporary, content, { mode, flag: \"wx\" });\n renameSync(temporary, path);\n } finally {\n rmSync(temporary, { force: true });\n }\n}\nfunction matchesFile(path: string, expected: Buffer | null): boolean {\n try {\n return lstatSync(path).isFile() && expected !== null && readFileSync(path).equals(expected);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return expected === null;\n throw error;\n }\n}\n/** Keep workspace and transcript together; roll workspace back if the transcript cannot commit. */\nexport async function applyFileRewind(\n plan: FileRewindPlan,\n commit: () => void | Promise<void>,\n): Promise<FileRewindConflict[]> {\n if (plan.conflicts.length) return plan.conflicts;\n const conflicts: FileRewindConflict[] = [];\n for (const file of plan.files) {\n try {\n if (!matchesFile(file.path, file.current)) throw new Error(\"当前文件已被外部修改\");\n } catch (error) {\n conflicts.push({ path: file.path, reason: (error as Error).message });\n }\n }\n if (conflicts.length) return conflicts;\n const applied: RestoreFile[] = [];\n try {\n for (const file of plan.files) {\n if (file.before === null) rmSync(file.path);\n else replaceFile(file.path, file.before, file.mode);\n applied.push(file);\n }\n await commit();\n } catch (error) {\n const failures: Error[] = [];\n for (const file of applied.reverse()) {\n try {\n // commit() yields to other tasks and external editors. Never roll back over their newer content.\n if (!matchesFile(file.path, file.before)) throw new Error(\"文件已变化,已保留当前状态\");\n replaceFile(file.path, file.current, file.mode);\n } catch (cause) {\n failures.push(\n new Error(`${file.path}: ${cause instanceof Error ? cause.message : String(cause)}`, { cause }),\n );\n }\n }\n if (failures.length)\n throw new AggregateError(\n [error, ...failures],\n `文件回退提交失败:${String(error)};部分文件未回滚:${failures.map((failure) => failure.message).join(\";\")}`,\n { cause: error },\n );\n throw error;\n }\n return [];\n}\n","import { closeSync, fsyncSync, openSync } from \"node:fs\";\n\nexport function syncDirectory(path: string): void {\n // Windows does not expose directory fsync through Node's file API.\n if (process.platform === \"win32\") return;\n const fd = openSync(path, \"r\");\n try {\n fsyncSync(fd);\n } finally {\n closeSync(fd);\n }\n}\n","import type { Stats } from \"node:fs\";\nimport { readdir, stat } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport {\n applyFileRewind,\n type FileChange,\n planFileRewind,\n type SessionEntry,\n SessionManager,\n} from \"@zpi-dev/coding-agent\";\nimport { assistantMessage, messageText, messageUuids, userMessage } from \"./messages.ts\";\nimport type { Options, RewindFilesResult } from \"./types.ts\";\n\nexport interface SDKSessionInfo {\n sessionId: string;\n summary: string;\n lastModified: number;\n fileSize?: number;\n customTitle?: string;\n firstPrompt?: string;\n cwd?: string;\n tag?: string;\n}\nexport interface ListSessionsOptions {\n dir?: string;\n limit?: number;\n includeWorktrees?: boolean;\n zpi?: { agentDir?: string };\n}\nexport interface SessionMessage {\n type: \"user\" | \"assistant\" | \"system\";\n uuid: string;\n session_id: string;\n message: unknown;\n parent_tool_use_id: string | null;\n parent_agent_id: string | null;\n}\nexport const agentDirectory = (options?: { agentDir?: string }) =>\n resolve(options?.agentDir ?? join(homedir(), \".zpi\", \"sdk\"));\nfunction sessionPath(id: string, options?: { agentDir?: string }): string {\n if (!/^[a-zA-Z0-9_-]+$/.test(id)) throw new Error(\"Invalid session ID\");\n return join(agentDirectory(options), \"sessions\", `${id}.jsonl`);\n}\nfunction sessionInfo(path: string, info: Stats, dir?: string): SDKSessionInfo | undefined {\n const manager = SessionManager.open(path);\n if (dir && resolve(manager.getCwd()) !== resolve(dir)) return undefined;\n const entries = manager.getEntries(),\n first = entries.find((entry) => entry.type === \"message\" && entry.message.role === \"user\"),\n title = entries.findLast((entry) => entry.type === \"session_info\"),\n tag = entries.findLast((entry) => entry.type === \"custom\" && entry.customType === \"sdk.tag\"),\n firstPrompt = first?.type === \"message\" ? messageText(first.message) : undefined;\n return {\n sessionId: manager.getSessionId(),\n summary: title?.type === \"session_info\" ? title.name : (firstPrompt?.slice(0, 120) ?? \"\"),\n customTitle: title?.type === \"session_info\" ? title.name : undefined,\n firstPrompt,\n lastModified: info.mtimeMs,\n fileSize: info.size,\n cwd: manager.getCwd(),\n ...(tag?.type === \"custom\" && typeof tag.data === \"string\" ? { tag: tag.data } : {}),\n };\n}\nexport async function listSessions(options: ListSessionsOptions = {}): Promise<SDKSessionInfo[]> {\n if (options.limit !== undefined && (!Number.isSafeInteger(options.limit) || options.limit < 0))\n throw new Error(\"Invalid session limit\");\n if (options.limit === 0) return [];\n const root = join(agentDirectory(options.zpi), \"sessions\");\n const files = await readdir(root).catch((error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") return [];\n throw error;\n });\n const candidates = await Promise.all(\n files\n .filter((file) => file.endsWith(\".jsonl\"))\n .map(async (file) => {\n const path = join(root, file);\n return { path, info: await stat(path) };\n }),\n );\n const rows: SDKSessionInfo[] = [];\n for (const { path, info } of candidates.sort((a, b) => b.info.mtimeMs - a.info.mtimeMs)) {\n const row = sessionInfo(path, info, options.dir);\n if (!row) continue;\n rows.push(row);\n if (options.limit !== undefined && rows.length >= options.limit) break;\n }\n return rows;\n}\nexport async function getSessionInfo(\n sessionId: string,\n options: ListSessionsOptions = {},\n): Promise<SDKSessionInfo | undefined> {\n const path = sessionPath(sessionId, options.zpi);\n try {\n return sessionInfo(path, await stat(path), options.dir);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return undefined;\n throw error;\n }\n}\nexport async function getSessionMessages(\n sessionId: string,\n options: ListSessionsOptions & { limit?: number; offset?: number; includeSystemMessages?: boolean } = {},\n): Promise<SessionMessage[]> {\n const manager = SessionManager.open(sessionPath(sessionId, options.zpi));\n if (options.dir && resolve(options.dir) !== resolve(manager.getCwd()))\n throw new Error(\"Session does not belong to dir\");\n const entries = manager.getEntries(),\n ids = messageUuids(entries);\n return entries\n .filter(\n (entry): entry is Extract<SessionEntry, { type: \"message\" }> =>\n entry.type === \"message\" &&\n (entry.message.role !== \"system\" || options.includeSystemMessages === true),\n )\n .slice(\n options.offset ?? 0,\n options.limit === undefined ? undefined : (options.offset ?? 0) + options.limit,\n )\n .map((entry): SessionMessage => {\n const message = entry.message,\n uuid = ids.get(entry.id) as string;\n if (message.role === \"system\")\n return {\n type: \"system\",\n uuid,\n session_id: sessionId,\n message,\n parent_tool_use_id: null,\n parent_agent_id: null,\n };\n const value =\n message.role === \"assistant\"\n ? assistantMessage(message, sessionId, uuid)\n : userMessage(message, sessionId, uuid);\n return {\n type: value.type,\n uuid,\n session_id: sessionId,\n message: value.message,\n parent_tool_use_id: null,\n parent_agent_id: null,\n };\n });\n}\nexport async function renameSession(\n sessionId: string,\n title: string,\n options: ListSessionsOptions = {},\n): Promise<void> {\n if (!title.trim()) throw new Error(\"Session title cannot be empty\");\n const manager = SessionManager.open(sessionPath(sessionId, options.zpi));\n manager.appendSessionInfo(title);\n await manager.flushAsync();\n}\nexport async function tagSession(\n sessionId: string,\n tag: string | null,\n options: ListSessionsOptions = {},\n): Promise<void> {\n const manager = SessionManager.open(sessionPath(sessionId, options.zpi));\n await manager.appendCustomEntryAsync(\"sdk.tag\", tag ?? \"\");\n}\nexport async function forkSession(\n sessionId: string,\n options: ListSessionsOptions & { upToMessageId?: string; title?: string } = {},\n): Promise<{ sessionId: string }> {\n const source = SessionManager.open(sessionPath(sessionId, options.zpi));\n const entries = source.getEntries(),\n ids = messageUuids(entries);\n const index = options.upToMessageId\n ? entries.findIndex((entry) => ids.get(entry.id) === options.upToMessageId)\n : entries.length - 1;\n if (index < 0) throw new Error(\"Message not found\");\n const target = SessionManager.create(source.getCwd(), join(agentDirectory(options.zpi), \"sessions\"));\n target.replaceEntries(\n entries.slice(0, index + 1).map((entry) => {\n if (\n entry.type !== \"message\" ||\n entry.message.role !== \"toolResult\" ||\n !entry.message.details ||\n typeof entry.message.details !== \"object\"\n )\n return entry;\n const { fileChange: _, ...details } = entry.message.details as import(\"@zpi-dev/ai\").JsonObject;\n return { ...entry, message: { ...entry.message, details } };\n }),\n );\n if (options.title) target.appendSessionInfo(options.title);\n return { sessionId: target.getSessionId() };\n}\nexport async function openSession(options: Options, cwd: string): Promise<SessionManager> {\n const directory = join(agentDirectory(options.zpi), \"sessions\");\n if (options.persistSession === false) {\n if (options.resume || options.continue || options.forkSession)\n throw new Error(\"In-memory sessions cannot resume or fork\");\n return SessionManager.inMemory(cwd, { id: options.sessionId });\n }\n let id = options.resume;\n if (options.continue && id) throw new Error(\"Use resume or continue, not both\");\n if (options.continue) id = (await listSessions({ dir: cwd, limit: 1, zpi: options.zpi }))[0]?.sessionId;\n if (options.forkSession && !id) throw new Error(\"forkSession requires resume or an existing conversation\");\n if (id && options.forkSession)\n id = (await forkSession(id, { zpi: options.zpi, upToMessageId: options.resumeSessionAt })).sessionId;\n if (!id) return SessionManager.create(cwd, directory, { id: options.sessionId });\n const manager = SessionManager.open(sessionPath(id, options.zpi), undefined, cwd);\n if (options.resumeSessionAt && !options.forkSession) {\n const entries = manager.getEntries(),\n ids = messageUuids(entries),\n index = entries.findIndex((entry) => ids.get(entry.id) === options.resumeSessionAt);\n if (index < 0) throw new Error(\"resumeSessionAt message not found\");\n manager.replaceEntries(entries.slice(0, index + 1));\n }\n return manager;\n}\nexport async function rewindFiles(\n manager: SessionManager,\n userMessageId: string,\n dryRun = false,\n): Promise<RewindFilesResult> {\n const entries = manager.getEntries(),\n ids = messageUuids(entries),\n index = entries.findIndex(\n (entry) =>\n ids.get(entry.id) === userMessageId && entry.type === \"message\" && entry.message.role === \"user\",\n );\n if (index < 0) return { canRewind: false, error: \"User message not found\" };\n const changes: FileChange[] = [];\n for (const entry of entries.slice(index + 1)) {\n if (entry.type !== \"message\" || entry.message.role !== \"toolResult\") continue;\n const details = entry.message.details;\n if (!details || typeof details !== \"object\" || Array.isArray(details)) continue;\n const change = (details as { fileChange?: FileChange }).fileChange;\n if (change) changes.push(change);\n }\n try {\n const plan = await planFileRewind(changes);\n const conflicts = dryRun ? plan.conflicts : await applyFileRewind(plan, () => {});\n if (conflicts.length)\n return {\n canRewind: false,\n error: conflicts.map(({ path, reason }) => `${path}: ${reason}`).join(\"\\n\"),\n };\n return { canRewind: true, filesChanged: plan.files.map((file) => file.path) };\n } catch (error) {\n return { canRewind: false, error: error instanceof Error ? error.message : String(error) };\n }\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport {\n type AssistantMessage,\n contentText,\n isJsonObject,\n type Message,\n type Usage as NativeUsage,\n} from \"@zpi-dev/ai\";\nimport type { SessionEntry } from \"@zpi-dev/coding-agent\";\nimport type { SDKAssistantMessage, SDKUserMessage, Usage } from \"./types.ts\";\n\nexport const emptyUsage = (): Usage => ({\n input_tokens: 0,\n output_tokens: 0,\n cache_creation_input_tokens: 0,\n cache_read_input_tokens: 0,\n server_tool_use: { web_search_requests: 0, web_fetch_requests: 0 },\n});\nexport function usage(value: NativeUsage): Usage {\n return {\n ...emptyUsage(),\n input_tokens: value.input,\n output_tokens: value.output,\n cache_creation_input_tokens: value.cacheWrite,\n cache_read_input_tokens: value.cacheRead,\n };\n}\nexport function stableUuid(id: string): string {\n const h = createHash(\"sha256\").update(id).digest(\"hex\");\n return `${h.slice(0, 8)}-${h.slice(8, 12)}-5${h.slice(13, 16)}-8${h.slice(17, 20)}-${h.slice(20, 32)}`;\n}\nexport function messageText(message: Message): string {\n return contentText(message.content);\n}\nexport function assistantMessage(\n message: AssistantMessage,\n sessionId: string,\n uuid: string = randomUUID(),\n parent: string | null = null,\n): SDKAssistantMessage {\n return {\n type: \"assistant\",\n uuid,\n session_id: sessionId,\n parent_tool_use_id: parent,\n ...(message.stopReason === \"error\" ? { error: \"unknown\" as const } : {}),\n ...(message.stopReason === \"aborted\" ? { aborted: true as const } : {}),\n message: {\n id: `msg_${uuid}`,\n type: \"message\",\n role: \"assistant\",\n model: message.model,\n content: message.content.map((part) =>\n part.type === \"text\"\n ? { type: \"text\", text: part.text }\n : part.type === \"thinking\"\n ? { type: \"thinking\", thinking: part.thinking, signature: part.thinkingSignature ?? \"\" }\n : {\n type: \"tool_use\",\n id: part.id,\n name: part.name,\n input: part.arguments as Record<string, unknown>,\n },\n ),\n stop_reason:\n message.stopReason === \"toolUse\"\n ? \"tool_use\"\n : message.stopReason === \"length\"\n ? \"max_tokens\"\n : [\"aborted\", \"error\"].includes(message.stopReason)\n ? null\n : \"end_turn\",\n stop_sequence: null,\n usage: usage(message.usage),\n },\n };\n}\nexport function userMessage(\n message: Extract<Message, { role: \"user\" | \"toolResult\" }>,\n sessionId: string,\n uuid: string,\n parent: string | null = null,\n): SDKUserMessage {\n const content =\n typeof message.content === \"string\"\n ? message.content\n : message.content.map((part) =>\n part.type === \"text\"\n ? { type: \"text\" as const, text: part.text }\n : {\n type: \"image\" as const,\n source: { type: \"base64\" as const, media_type: part.mimeType, data: part.data },\n },\n );\n return {\n type: \"user\",\n uuid,\n session_id: sessionId,\n parent_tool_use_id: parent,\n message: {\n role: \"user\",\n content:\n message.role === \"toolResult\"\n ? [{ type: \"tool_result\", tool_use_id: message.toolCallId, content, is_error: message.isError }]\n : content,\n },\n };\n}\nexport function messageUuids(entries: readonly SessionEntry[]): Map<string, string> {\n const ids = new Map<string, string>();\n let user: { uuid: string; text: string } | undefined;\n for (const entry of entries) {\n if (\n entry.type === \"custom\" &&\n entry.customType === \"sdk.user\" &&\n isJsonObject(entry.data) &&\n typeof entry.data.uuid === \"string\" &&\n typeof entry.data.text === \"string\"\n )\n user = { uuid: entry.data.uuid, text: entry.data.text };\n if (entry.type === \"message\") {\n const isUser = entry.message.role === \"user\" && user && messageText(entry.message) === user.text;\n ids.set(entry.id, isUser && user ? user.uuid : stableUuid(entry.id));\n if (isUser) user = undefined;\n }\n }\n return ids;\n}\n","import { randomUUID } from \"node:crypto\";\nimport { join, resolve } from \"node:path\";\nimport {\n type AssistantMessage,\n abortable,\n assertSupportedOptions,\n contentText,\n type ImageContent,\n} from \"@zpi-dev/ai\";\nimport {\n type AgentSession,\n type AgentSessionEvent,\n buildSystemContext,\n type CreateAgentSessionOptions,\n createAgentSession,\n type ModelRuntime,\n type ResourceLoader,\n type SessionManager,\n type SessionPlugin,\n SettingsManager,\n type ToolContext,\n type ToolDefinition,\n} from \"@zpi-dev/coding-agent\";\nimport { bindExternalPlugin, importLocalPlugin } from \"@zpi-dev/plugin-compat\";\nimport { type TObject, Type } from \"typebox\";\nimport { Check } from \"typebox/value\";\nimport { version as sdkVersion } from \"../package.json\";\nimport { coreHooks, lifecycleHook } from \"./hooks.ts\";\nimport { assistantMessage, emptyUsage, messageText, stableUuid, usage, userMessage } from \"./messages.ts\";\nimport { matchesRule, permissionHook, permissionRules } from \"./permissions.ts\";\nimport { pluginAgents, SdkResources } from \"./resources.ts\";\nimport { runtimeFor, selectModel, thinkingLevel } from \"./runtime.ts\";\nimport { agentDirectory, openSession, rewindFiles } from \"./sessions.ts\";\nimport { Tasks } from \"./tasks.ts\";\nimport { canonicalTools } from \"./tools.ts\";\nimport type {\n Options,\n Query,\n SDKControlInitializeResponse,\n SDKMessage,\n SDKPartialAssistantMessage,\n SDKPermissionDenial,\n SDKResultMessage,\n SDKUserMessage,\n} from \"./types.ts\";\n\nexport interface QueryParams {\n prompt: string | AsyncIterable<SDKUserMessage>;\n options?: Options;\n}\nconst allowedOptions = [\n \"cwd\",\n \"model\",\n \"abortController\",\n \"env\",\n \"tools\",\n \"allowedTools\",\n \"disallowedTools\",\n \"canUseTool\",\n \"systemPrompt\",\n \"thinking\",\n \"effort\",\n \"maxThinkingTokens\",\n \"maxTurns\",\n \"maxBudgetUsd\",\n \"includePartialMessages\",\n \"forwardSubagentText\",\n \"includeHookEvents\",\n \"hooks\",\n \"persistSession\",\n \"resume\",\n \"continue\",\n \"forkSession\",\n \"resumeSessionAt\",\n \"sessionId\",\n \"title\",\n \"outputFormat\",\n \"agents\",\n \"agent\",\n \"plugins\",\n \"skills\",\n \"settingSources\",\n \"enableFileCheckpointing\",\n \"zpi\",\n];\nexport function query(params: QueryParams): Query {\n return new AgentQuery(params);\n}\n\nclass AgentQuery implements Query {\n readonly [Symbol.toStringTag] = \"AsyncGenerator\";\n private options: Options;\n private prompt: QueryParams[\"prompt\"];\n private controller: AbortController;\n private session?: AgentSession;\n private manager?: SessionManager;\n private runtime?: ModelRuntime;\n private loader?: ResourceLoader;\n private initialized?: Promise<void>;\n private producing?: Promise<void>;\n private output: SDKMessage[] = [];\n private requests: Promise<unknown> = Promise.resolve();\n private wake?: () => void;\n private done = false;\n private closed = false;\n private error?: unknown;\n private interrupted = false;\n private owns = true;\n private tasks = new Tasks();\n private denials: SDKPermissionDenial[] = [];\n private turns = 0;\n private totalUsage = emptyUsage();\n private modelUsage: SDKResultMessage[\"modelUsage\"] = {};\n private totalCost = 0;\n private limit?: Exclude<SDKResultMessage[\"subtype\"], \"success\">;\n private assistantId: string = randomUUID();\n private unsubscribe?: () => void;\n private pendingUser?: { uuid: string; text: string };\n private abortListener: () => void;\n constructor(params: QueryParams) {\n assertSupportedOptions(params, [\"prompt\", \"options\"], \"query\");\n this.options = { ...params.options };\n assertSupportedOptions(\n this.options,\n allowedOptions,\n \"Agent SDK Options (permissionMode, MCP, LSP and UI are not supported)\",\n );\n if (typeof params.prompt !== \"string\" && typeof params.prompt?.[Symbol.asyncIterator] !== \"function\")\n throw new Error(\"prompt must be a string or AsyncIterable<SDKUserMessage>\");\n for (const key of [\"maxTurns\", \"maxBudgetUsd\"] as const)\n if (\n this.options[key] !== undefined &&\n (!Number.isFinite(this.options[key]) ||\n Number(this.options[key]) <= 0 ||\n (key === \"maxTurns\" && !Number.isSafeInteger(this.options[key])))\n )\n throw new Error(`Invalid ${key}`);\n if (this.options.skills !== undefined) {\n if (\n this.options.skills !== \"all\" &&\n (!Array.isArray(this.options.skills) ||\n this.options.skills.some(\n (name) => typeof name !== \"string\" || !/^[A-Za-z0-9_.-]+(?::[A-Za-z0-9_.-]+)?$/.test(name),\n ))\n )\n throw new Error(\"skills must contain exact skill names\");\n this.options.allowedTools = [...(this.options.allowedTools ?? []), \"Skill\"];\n }\n permissionRules(this.options.allowedTools);\n permissionRules(this.options.disallowedTools);\n this.prompt = params.prompt;\n this.controller = this.options.abortController ?? new AbortController();\n this.abortListener = () => {\n void this.session?.abort();\n this.wake?.();\n };\n this.controller.signal.addEventListener(\"abort\", this.abortListener);\n }\n private push(message: SDKMessage): void {\n if (this.closed) return;\n if (this.output.length >= 4096) {\n this.error = new Error(\"SDK consumer did not drain the message stream (4096 pending messages)\");\n this.controller.abort();\n return;\n }\n this.output.push(message);\n this.wake?.();\n this.wake = undefined;\n }\n private initialize(): Promise<void> {\n this.initialized ??= this.initializeSession();\n return this.initialized;\n }\n private async initializeSession(): Promise<void> {\n const options = this.options,\n cwd = resolve(options.cwd ?? process.cwd());\n this.controller.signal.throwIfAborted();\n if (options.zpi?.session) {\n if (!options.zpi.sessionManager || !options.zpi.modelRuntime)\n throw new Error(\"A host-owned session requires sessionManager and modelRuntime\");\n if (\n options.hooks ||\n options.allowedTools ||\n options.disallowedTools ||\n options.canUseTool ||\n options.tools ||\n options.maxTurns ||\n options.maxBudgetUsd\n )\n throw new Error(\"Configure tool/loop policy when creating a host-owned SDK session\");\n this.owns = false;\n this.session = options.zpi.session;\n this.manager = options.zpi.sessionManager;\n this.runtime = options.zpi.modelRuntime;\n } else {\n this.runtime = await runtimeFor(options);\n const model = await selectModel(this.runtime, options.model);\n this.manager = await openSession(options, cwd);\n if (options.title && !this.manager.getEntries().some((entry) => entry.type === \"session_info\"))\n this.manager.appendSessionInfo(options.title);\n const directory = agentDirectory(options.zpi),\n cache = join(directory, \"plugins\");\n const imported: SessionPlugin[] = [];\n const agents = { ...options.agents };\n for (const plugin of options.plugins ?? []) {\n if (plugin.type !== \"local\") throw new Error(\"Only local plugins are supported\");\n const snapshot = await importLocalPlugin(resolve(cwd, plugin.path), cache);\n Object.assign(agents, pluginAgents(snapshot));\n imported.push(\n bindExternalPlugin(snapshot, {\n storage: cache,\n transcriptPath: this.manager.getSessionFile(),\n env: options.env,\n }),\n );\n }\n options.agents = { ...agents, ...options.agents };\n const plugins = [...(options.zpi?.plugins ?? []), ...imported].map((plugin) =>\n options.skills && options.skills !== \"all\"\n ? {\n ...plugin,\n skills: plugin.skills?.filter(\n (skill) => options.skills === \"all\" || options.skills?.includes(skill.name),\n ),\n }\n : plugin,\n );\n const context = (): ToolContext => {\n if (!this.session || !this.manager) throw new Error(\"Session is not initialized\");\n return {\n cwd,\n model: this.session.model,\n thinkingLevel: this.session.thinkingLevel,\n sessionManager: this.manager,\n isIdle: () => this.session?.isIdle ?? true,\n getSystemPrompt: () => this.session?.systemPrompt ?? \"\",\n getToolNames: () => this.session?.state.tools.map((tool) => tool.name) ?? [],\n };\n };\n const primary = options.agent ? options.agents?.[options.agent] : undefined;\n if (options.agent && !primary) throw new Error(`Unknown agent: ${options.agent}`);\n const selection = primary?.tools ?? (Array.isArray(options.tools) ? options.tools : undefined);\n const outputDir = join(directory, \"tool-output\", this.manager.getSessionId());\n const prepareTools = (loader: ResourceLoader) => {\n this.loader = loader;\n const tools: ToolDefinition[] = [\n ...(selection?.length === 0 ? [] : canonicalTools(cwd, outputDir, context, options, this.tasks)),\n ...(options.zpi?.customTools ?? []),\n ];\n if (this.loader.listSkills?.().skills.length)\n tools.push({\n name: \"Skill\",\n label: \"Skill\",\n description: \"Load a skill by name and follow its instructions.\",\n parameters: Type.Object({ skill: Type.String(), args: Type.Optional(Type.String()) }),\n execute: async (_id, input: Record<string, unknown>) => {\n const skill = await this.loader?.loadSkill?.(String(input.skill));\n if (!skill) throw new Error(\"Unknown skill\");\n return {\n content: [\n {\n type: \"text\",\n text: `${skill.body}\\n\\nSkill directory: ${skill.baseDir}\\nArguments: ${input.args ?? \"\"}`,\n },\n ],\n details: undefined,\n };\n },\n });\n if (Object.keys(options.agents ?? {}).length) tools.push(this.agentTool());\n const declared = [\n ...tools.map((tool) => tool.name),\n ...plugins.flatMap((plugin) => (plugin.tools ?? []).map((tool) => tool.name)),\n ];\n const disabled = new Set(\n permissionRules(options.disallowedTools)\n .filter((rule) => rule.argument === undefined)\n .flatMap((rule) => declared.filter((name) => matchesRule(rule, name, {}, cwd))),\n );\n const names = (Array.isArray(options.tools) ? options.tools : declared).filter(\n (name) => !disabled.has(name),\n );\n return { customTools: tools, tools: primary?.tools?.filter((name) => !disabled.has(name)) ?? names };\n };\n const systemPrompt: Exclude<CreateAgentSessionOptions[\"systemPrompt\"], string | undefined> = () => {\n const value = options.systemPrompt;\n return (\n primary?.prompt ??\n (typeof value === \"string\"\n ? value\n : Array.isArray(value)\n ? value.join(\"\\n\\n\")\n : value?.type === \"custom\"\n ? [value.prompt].flat().join(\"\\n\\n\")\n : value?.type === \"preset\"\n ? buildSystemContext({ cwd, tools: [] }).base\n : \"You are a helpful assistant.\")\n );\n };\n const customInstructions = () => {\n const value = options.systemPrompt;\n return [\n typeof value === \"object\" && !Array.isArray(value) && value.type === \"preset\"\n ? value.append\n : undefined,\n ...(Object.keys(options.agents ?? {}).length\n ? [\n `Available agents:\\n${Object.entries(options.agents ?? {})\n .map(([name, agent]) => `${name}: ${agent.description}`)\n .join(\"\\n\")}`,\n ]\n : []),\n ...(options.outputFormat\n ? [`Return only JSON satisfying this schema: ${JSON.stringify(options.outputFormat.schema)}`]\n : []),\n ].filter((part): part is string => typeof part === \"string\" && !!part);\n };\n const hooks = [\n ...coreHooks(options, this.manager.getSessionFile() ?? \"\"),\n permissionHook(options, this.denials, () => {\n this.interrupted = true;\n void this.session?.abort();\n }),\n ];\n const created = await createAgentSession({\n cwd,\n agentDir: directory,\n modelRuntime: this.runtime,\n model: primary?.model ? await selectModel(this.runtime, primary.model) : model,\n thinkingLevel: thinkingLevel(options),\n modelRequestOptions: () => {\n const request =\n typeof this.options.zpi?.requestOptions === \"function\"\n ? this.options.zpi.requestOptions()\n : this.options.zpi?.requestOptions;\n const budget =\n this.options.maxThinkingTokens ??\n (this.options.thinking?.type === \"enabled\" ? this.options.thinking.budgetTokens : undefined);\n return budget && budget > 0\n ? {\n ...request,\n thinkingBudgets: {\n minimal: budget,\n low: budget,\n medium: budget,\n high: budget,\n xhigh: budget,\n max: budget,\n },\n }\n : (request ?? {});\n },\n onCompaction: (phase, data, signal) =>\n lifecycleHook(\n options,\n phase === \"before\" ? \"PreCompact\" : \"PostCompact\",\n {\n session_id: this.manager?.getSessionId() ?? \"\",\n transcript_path: this.manager?.getSessionFile() ?? \"\",\n cwd,\n trigger: data.manual ? \"manual\" : \"auto\",\n custom_instructions: data.instructions ?? \"\",\n },\n signal ?? this.controller.signal,\n ),\n sessionManager: this.manager,\n settingsManager: SettingsManager.inMemory({ retry: { enabled: false } }),\n resourceLoader: options.zpi?.resourceLoader ?? new SdkResources(options, cwd),\n systemPrompt,\n customInstructions,\n plugins,\n prepareTools,\n noTools: \"builtin\",\n hooks,\n beforeModelRequest: () => {\n if (\n (options.maxTurns !== undefined && this.turns >= options.maxTurns) ||\n (options.maxBudgetUsd !== undefined && this.totalCost >= options.maxBudgetUsd)\n ) {\n this.limit =\n options.maxTurns !== undefined && this.turns >= options.maxTurns\n ? \"error_max_turns\"\n : \"error_max_budget_usd\";\n this.controller.abort(new Error(this.limit));\n throw new Error(this.limit);\n }\n this.turns++;\n },\n });\n this.session = created.session;\n }\n this.unsubscribe = this.session.subscribe((event) => this.observe(event));\n this.push({\n type: \"system\",\n subtype: \"init\",\n uuid: randomUUID(),\n session_id: this.session.sessionId,\n cwd: this.manager.getCwd(),\n model: this.session.model.id,\n tools: this.session.state.tools.map((tool) => tool.name),\n apiKeySource: options.zpi?.providers || options.zpi?.modelRuntime ? \"user\" : \"env\",\n claude_code_version: `zpi/${sdkVersion}`,\n mcp_servers: [],\n slash_commands: this.session.listCommands().map((command) => command.name),\n output_style: \"default\",\n skills: this.loader?.listSkills?.().skills.map((skill) => skill.name) ?? [],\n plugins: (options.plugins ?? []).map((plugin) => ({ name: plugin.path, path: plugin.path })),\n agents: Object.keys(options.agents ?? {}),\n capabilities: [\"zpi_sdk_v1\"],\n });\n }\n private observe(event: AgentSessionEvent): void {\n if (!this.session || !this.manager) return;\n const sessionId = this.session.sessionId;\n const stream = (value: SDKPartialAssistantMessage[\"event\"]) => {\n if (this.options.includePartialMessages)\n this.push({\n type: \"stream_event\",\n uuid: randomUUID(),\n session_id: sessionId,\n parent_tool_use_id: null,\n event: value,\n });\n };\n if (event.type === \"message_start\" && event.message.role === \"assistant\") {\n if (!this.owns) this.turns++;\n this.assistantId = randomUUID();\n stream({\n type: \"message_start\",\n message: assistantMessage(event.message, sessionId, this.assistantId).message,\n });\n } else if (event.type === \"message_update\") {\n const delta = event.assistantMessageEvent;\n if (delta.type === \"text_start\" || delta.type === \"thinking_start\" || delta.type === \"toolcall_start\") {\n const part = delta.partial.content[delta.contentIndex];\n stream({\n type: \"content_block_start\",\n index: delta.contentIndex,\n content_block:\n part?.type === \"toolCall\"\n ? { type: \"tool_use\", id: part.id, name: part.name, input: {} }\n : part?.type === \"thinking\"\n ? { type: \"thinking\", thinking: \"\", signature: \"\" }\n : { type: \"text\", text: \"\" },\n });\n } else if (\n delta.type === \"text_delta\" ||\n delta.type === \"thinking_delta\" ||\n delta.type === \"toolcall_delta\"\n )\n stream({\n type: \"content_block_delta\",\n index: delta.contentIndex,\n delta:\n delta.type === \"text_delta\"\n ? { type: \"text_delta\", text: delta.delta }\n : delta.type === \"thinking_delta\"\n ? { type: \"thinking_delta\", thinking: delta.delta }\n : { type: \"input_json_delta\", partial_json: delta.delta },\n });\n else if (delta.type === \"text_end\" || delta.type === \"thinking_end\" || delta.type === \"toolcall_end\")\n stream({ type: \"content_block_stop\", index: delta.contentIndex });\n } else if (event.type === \"message_end\") {\n const entry = this.manager.getLastEntry(),\n uuid =\n entry?.type === \"message\"\n ? event.message.role === \"user\" &&\n this.pendingUser &&\n messageText(event.message) === this.pendingUser.text\n ? this.pendingUser.uuid\n : stableUuid(entry.id)\n : randomUUID();\n if (event.message.role === \"assistant\") {\n const message = assistantMessage(event.message, sessionId, uuid);\n this.addUsage(event.message);\n stream({\n type: \"message_delta\",\n delta: { stop_reason: message.message.stop_reason, stop_sequence: null },\n usage: message.message.usage,\n });\n stream({ type: \"message_stop\" });\n this.push(message);\n } else if (event.message.role === \"user\" || event.message.role === \"toolResult\") {\n if (uuid === this.pendingUser?.uuid) this.pendingUser = undefined;\n this.push(userMessage(event.message, sessionId, uuid));\n }\n } else if (\n event.type === \"hook_execution\" &&\n (this.options.includeHookEvents || event.execution.event === \"SessionStart\")\n )\n this.push({\n type: \"system\",\n subtype: \"hook_response\",\n uuid: randomUUID(),\n session_id: sessionId,\n hook_id: `${event.execution.invocationId}:${event.execution.index}`,\n hook_name: event.execution.pluginId ?? \"sdk\",\n hook_event: event.execution.event,\n output: \"\",\n stdout: \"\",\n stderr: \"\",\n exit_code: event.execution.status === \"completed\" ? 0 : 1,\n outcome:\n event.execution.status === \"completed\"\n ? \"success\"\n : event.execution.status === \"cancelled\"\n ? \"cancelled\"\n : \"error\",\n });\n else if (event.type === \"compaction\" && event.status === \"completed\")\n this.push({\n type: \"system\",\n subtype: \"compact_boundary\",\n uuid: randomUUID(),\n session_id: sessionId,\n compact_metadata: { trigger: event.origin, pre_tokens: 0 },\n });\n }\n private addUsage(message: AssistantMessage): void {\n const value = usage(message.usage);\n for (const key of [\n \"input_tokens\",\n \"output_tokens\",\n \"cache_read_input_tokens\",\n \"cache_creation_input_tokens\",\n ] as const)\n this.totalUsage[key] += value[key];\n this.totalCost += message.usage.cost.total;\n const model = this.session?.model;\n this.modelUsage[message.model] ??= {\n inputTokens: 0,\n outputTokens: 0,\n cacheReadInputTokens: 0,\n cacheCreationInputTokens: 0,\n webSearchRequests: 0,\n costUSD: 0,\n contextWindow: model?.contextWindow ?? 0,\n maxOutputTokens: model?.maxTokens ?? 0,\n };\n const row = this.modelUsage[message.model];\n row.inputTokens += value.input_tokens;\n row.outputTokens += value.output_tokens;\n row.cacheReadInputTokens += value.cache_read_input_tokens;\n row.cacheCreationInputTokens += value.cache_creation_input_tokens;\n row.costUSD += message.usage.cost.total;\n }\n private agentTool(): ToolDefinition<TObject> {\n return {\n name: \"Agent\",\n label: \"Agent\",\n description: \"Delegate a task to one of the configured agents. Background runs return task_id.\",\n parameters: Type.Object({\n description: Type.String(),\n prompt: Type.String(),\n subagent_type: Type.String(),\n run_in_background: Type.Optional(Type.Boolean()),\n }),\n execute: async (toolId, input, signal) => {\n const definition = this.options.agents?.[String(input.subagent_type)];\n if (!definition) throw new Error(\"Unknown subagent_type\");\n const run = async (childSignal: AbortSignal): Promise<string> => {\n const controller = new AbortController(),\n abort = () => controller.abort(childSignal.reason);\n childSignal.addEventListener(\"abort\", abort, { once: true });\n try {\n const childOptions: Options = {\n ...this.options,\n agents: undefined,\n agent: undefined,\n includePartialMessages:\n !!this.options.forwardSubagentText && !!this.options.includePartialMessages,\n resume: undefined,\n continue: undefined,\n forkSession: undefined,\n sessionId: undefined,\n title: undefined,\n tools:\n definition.tools ??\n this.session?.state.tools.map((tool) => tool.name).filter((name) => name !== \"Agent\"),\n disallowedTools: [\n ...(this.options.disallowedTools ?? []),\n ...(definition.disallowedTools ?? []),\n ],\n systemPrompt: definition.prompt,\n model:\n definition.model === \"inherit\"\n ? this.options.model\n : (definition.model ?? this.options.model),\n effort: definition.effort ?? this.options.effort,\n skills: definition.skills ?? this.options.skills,\n maxTurns: definition.maxTurns ?? this.options.maxTurns,\n persistSession: false,\n abortController: controller,\n zpi: {\n ...this.options.zpi,\n modelRuntime: this.runtime,\n session: undefined,\n sessionManager: undefined,\n input: undefined,\n },\n };\n await lifecycleHook(\n this.options,\n \"SubagentStart\",\n {\n session_id: this.session?.sessionId ?? \"\",\n transcript_path: this.manager?.getSessionFile() ?? \"\",\n cwd: this.manager?.getCwd() ?? \"\",\n agent_id: toolId,\n agent_type: String(input.subagent_type),\n },\n controller.signal,\n );\n let result = \"\";\n for await (const message of query({ prompt: String(input.prompt), options: childOptions })) {\n if (message.type === \"result\") {\n this.totalCost += message.total_cost_usd;\n for (const key of [\n \"input_tokens\",\n \"output_tokens\",\n \"cache_read_input_tokens\",\n \"cache_creation_input_tokens\",\n ] as const)\n this.totalUsage[key] += message.usage[key];\n for (const [name, usage] of Object.entries(message.modelUsage)) {\n const prior = this.modelUsage[name];\n if (!prior) this.modelUsage[name] = { ...usage };\n else\n for (const key of [\n \"inputTokens\",\n \"outputTokens\",\n \"cacheReadInputTokens\",\n \"cacheCreationInputTokens\",\n \"webSearchRequests\",\n \"costUSD\",\n ] as const)\n prior[key] += usage[key];\n }\n if (message.subtype !== \"success\") throw new Error(message.errors.join(\"\\n\"));\n result = message.result;\n } else if (\n this.options.forwardSubagentText &&\n (message.type === \"assistant\" || message.type === \"user\" || message.type === \"stream_event\")\n )\n this.push({ ...message, parent_tool_use_id: toolId });\n }\n await lifecycleHook(\n this.options,\n \"SubagentStop\",\n {\n stop_hook_active: false,\n last_assistant_message: result,\n session_id: this.session?.sessionId ?? \"\",\n transcript_path: this.manager?.getSessionFile() ?? \"\",\n cwd: this.manager?.getCwd() ?? \"\",\n agent_id: toolId,\n agent_type: String(input.subagent_type),\n },\n controller.signal,\n );\n return result;\n } finally {\n childSignal.removeEventListener(\"abort\", abort);\n }\n };\n return {\n content: [\n {\n type: \"text\",\n text: input.run_in_background\n ? JSON.stringify({ task_id: this.tasks.start(run) })\n : await run(signal ?? new AbortController().signal),\n },\n ],\n details: undefined,\n };\n },\n };\n }\n private async produce(): Promise<void> {\n try {\n await this.initialize();\n const iterator = typeof this.prompt === \"string\" ? undefined : this.prompt[Symbol.asyncIterator]();\n try {\n do {\n this.controller.signal.throwIfAborted();\n const next = iterator\n ? await abortable(iterator.next(), this.controller.signal)\n : {\n done: false as const,\n value: {\n type: \"user\" as const,\n uuid: randomUUID(),\n parent_tool_use_id: null,\n message: { role: \"user\" as const, content: this.prompt as string },\n },\n };\n if (next.done) break;\n await this.turn(next.value);\n if (!iterator) break;\n } while (!this.controller.signal.aborted);\n } finally {\n void iterator?.return?.().catch(() => {});\n }\n } catch (error) {\n if (!this.closed && !this.limit) this.error = error;\n } finally {\n if (this.owns && this.session && this.manager) {\n try {\n await lifecycleHook(\n this.options,\n \"SessionEnd\",\n {\n session_id: this.session.sessionId,\n transcript_path: this.manager.getSessionFile() ?? \"\",\n cwd: this.manager.getCwd(),\n reason: this.closed ? \"other\" : \"prompt_input_exit\",\n },\n new AbortController().signal,\n );\n } catch (error) {\n this.error ??= error;\n }\n }\n this.unsubscribe?.();\n this.controller.signal.removeEventListener(\"abort\", this.abortListener);\n await this.tasks.close();\n if (this.owns) this.session?.dispose();\n this.done = true;\n this.wake?.();\n }\n }\n private async turn(input: SDKUserMessage): Promise<void> {\n if (!this.session || !this.manager) throw new Error(\"Session unavailable\");\n if (input.type !== \"user\" || input.message?.role !== \"user\")\n throw new Error(\"Streaming input must contain SDKUserMessage values\");\n if (input.session_id && input.session_id !== this.session.sessionId)\n throw new Error(\"Input session_id does not match the active session\");\n const content = input.message.content;\n const text = contentText(content);\n if (typeof content !== \"string\" && content.some((block) => block.type === \"tool_result\"))\n throw new Error(\"External tool_result prompt injection is unsupported\");\n const images: ImageContent[] =\n typeof content === \"string\"\n ? []\n : content\n .filter((block) => block.type === \"image\")\n .map((block) => ({ type: \"image\", data: block.source.data, mimeType: block.source.media_type }));\n this.turns = 0;\n this.totalCost = 0;\n this.totalUsage = emptyUsage();\n this.modelUsage = {};\n this.denials.splice(0);\n this.interrupted = false;\n this.limit = undefined;\n const start = Date.now(),\n apiStart = this.session.modelPerformance.llmMs ?? 0,\n priorAssistant = this.session.messages.findLast((message) => message.role === \"assistant\");\n let failure: unknown;\n let structured: unknown;\n try {\n if (this.owns) {\n this.pendingUser = { uuid: input.uuid ?? randomUUID(), text };\n await this.manager.appendCustomEntryAsync(\"sdk.user\", this.pendingUser);\n }\n if (this.options.zpi?.input)\n await this.session.executeInput(this.options.zpi.input.parsed, this.options.zpi.input.context);\n else {\n const prepared = await this.session.prepareInput(text, { images });\n await this.session.executeInput(prepared, { images });\n }\n if (this.options.outputFormat) {\n for (let retry = 0; retry < 3; retry++) {\n const last = this.session.messages.findLast((message) => message.role === \"assistant\");\n try {\n structured = JSON.parse(last ? messageText(last).replace(/^```(?:json)?\\s*|\\s*```$/g, \"\") : \"\");\n if (!Check(Type.Unsafe(this.options.outputFormat.schema), structured))\n throw new Error(\"Output does not match schema\");\n break;\n } catch {\n if (retry === 2 || this.controller.signal.aborted) {\n this.limit ??= \"error_max_structured_output_retries\";\n break;\n }\n await this.session.prompt(\"Return the final answer as JSON only, matching the provided schema.\");\n }\n }\n }\n } catch (error) {\n failure = error;\n }\n await this.manager.flushAsync();\n const latest = this.session.messages.findLast((message) => message.role === \"assistant\"),\n last = this.turns === 0 || latest === priorAssistant ? undefined : latest,\n reason = last?.role === \"assistant\" ? last.stopReason : null;\n const error =\n failure ??\n this.limit ??\n (this.interrupted || this.controller.signal.aborted\n ? new Error(\"Query interrupted\")\n : last?.role === \"assistant\" && [\"error\", \"aborted\"].includes(last.stopReason)\n ? new Error(last.errorMessage ?? last.stopReason)\n : undefined);\n const base = {\n type: \"result\" as const,\n uuid: randomUUID(),\n session_id: this.session.sessionId,\n duration_ms: Date.now() - start,\n duration_api_ms: Math.max(0, (this.session.modelPerformance.llmMs ?? 0) - apiStart),\n num_turns: this.turns,\n total_cost_usd: this.totalCost,\n usage: this.totalUsage,\n modelUsage: this.modelUsage,\n permission_denials: [...this.denials],\n stop_reason:\n reason === \"stop\"\n ? \"end_turn\"\n : reason === \"toolUse\"\n ? \"tool_use\"\n : reason === \"length\"\n ? \"max_tokens\"\n : reason,\n };\n this.push(\n error\n ? {\n ...base,\n subtype: this.limit ?? \"error_during_execution\",\n is_error: true,\n errors: [error instanceof Error ? error.message : String(error)],\n }\n : {\n ...base,\n subtype: \"success\",\n is_error: false,\n result: last ? messageText(last) : \"\",\n ...(this.options.outputFormat ? { structured_output: structured } : {}),\n },\n );\n }\n next(): Promise<IteratorResult<SDKMessage, void>> {\n const next = this.requests.then(() => this.takeNext());\n this.requests = next.then(\n () => {},\n () => {},\n );\n return next;\n }\n private async takeNext(): Promise<IteratorResult<SDKMessage, void>> {\n if (this.closed) return { value: undefined, done: true };\n this.producing ??= this.produce();\n while (!this.output.length && !this.done)\n await new Promise<void>((resolve) => {\n this.wake = resolve;\n });\n if (this.output.length) return { value: this.output.shift() as SDKMessage, done: false };\n if (this.error) {\n const error = this.error;\n this.error = undefined;\n throw error;\n }\n return { value: undefined, done: true };\n }\n async return(): Promise<IteratorResult<SDKMessage, void>> {\n this.close();\n await this.producing;\n return { value: undefined, done: true };\n }\n async throw(error?: unknown): Promise<IteratorResult<SDKMessage, void>> {\n await this.return();\n throw error;\n }\n [Symbol.asyncIterator](): Query {\n return this;\n }\n async [Symbol.asyncDispose](): Promise<void> {\n await this.return();\n }\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.output.splice(0);\n this.controller.abort();\n void this.session?.abort();\n if (this.initialized && !this.producing) this.producing = this.produce();\n else if (!this.producing) {\n this.done = true;\n this.controller.signal.removeEventListener(\"abort\", this.abortListener);\n }\n this.wake?.();\n }\n async interrupt(): Promise<undefined> {\n this.interrupted = true;\n await this.session?.abort();\n return undefined;\n }\n async setModel(model?: string): Promise<void> {\n await this.initialize();\n if (this.runtime && this.session) await this.session.setModel(await selectModel(this.runtime, model));\n }\n async setMaxThinkingTokens(tokens: number | null): Promise<void> {\n if (tokens !== null && (!Number.isSafeInteger(tokens) || tokens < 0))\n throw new Error(\"Invalid maxThinkingTokens\");\n this.options.maxThinkingTokens = tokens ?? undefined;\n this.options.thinking =\n tokens === 0 ? { type: \"disabled\" } : { type: \"enabled\", budgetTokens: tokens ?? undefined };\n await this.initialize();\n this.session?.setThinkingLevel(\n tokens === 0\n ? \"off\"\n : thinkingLevel({\n ...this.options,\n thinking: { type: \"enabled\", budgetTokens: tokens ?? undefined },\n }),\n );\n }\n async supportedCommands() {\n await this.initialize();\n return (this.session?.listCommands() ?? []).map((command) => ({\n name: command.name,\n description: command.description,\n argumentHint: \"\",\n }));\n }\n async supportedModels() {\n await this.initialize();\n return ((await this.runtime?.getAvailable()) ?? []).map((model) => ({\n value: `${model.provider}/${model.id}`,\n displayName: model.name ?? model.id,\n description: model.provider,\n supportsEffort: model.reasoning,\n }));\n }\n async supportedAgents() {\n await this.initialize();\n return Object.entries(this.options.agents ?? {}).map(([name, agent]) => ({\n name,\n description: agent.description,\n model: agent.model,\n }));\n }\n async initializationResult(): Promise<SDKControlInitializeResponse> {\n await this.initialize();\n return {\n commands: await this.supportedCommands(),\n models: await this.supportedModels(),\n agents: await this.supportedAgents(),\n account: { apiKeySource: this.options.zpi?.modelRuntime ? \"user\" : \"env\" },\n };\n }\n async rewindFiles(id: string, options: { dryRun?: boolean } = {}) {\n await this.initialize();\n if (!this.options.enableFileCheckpointing || !this.manager)\n return { canRewind: false, error: \"enableFileCheckpointing is required\" };\n if (!this.session?.isIdle)\n return { canRewind: false, error: \"Interrupt the query before rewinding files\" };\n return rewindFiles(this.manager, id, options.dryRun);\n }\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { lstatSync, readdirSync, readFileSync } from \"node:fs\";\nimport { chmod, mkdir, rename, rm, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, isAbsolute, join, relative, resolve, sep } from \"node:path\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport { isJsonObject, type JsonObject } from \"@zpi-dev/ai\";\nimport {\n hookEvents,\n type PluginSkill,\n type PluginSnapshot,\n parseMarkdownFrontmatter,\n pluginSnapshotData,\n type SessionPlugin,\n validatePluginSnapshot,\n} from \"@zpi-dev/coding-agent\";\n\nimport { bindCommandHooks, type CommandHook, parseCommandHook } from \"./command-hooks.ts\";\n\nexport {\n bindCommandHooks,\n type CommandHook,\n decodeHookOutput,\n hookInputPayload,\n parseCommandHook,\n} from \"./command-hooks.ts\";\n\nconst runtime = \"external.command-v1\";\nconst maxFileBytes = 2 * 1024 * 1024;\nconst maxTreeBytes = 32 * 1024 * 1024;\ninterface FileEntry {\n path: string;\n bytes: Buffer;\n executable: boolean;\n}\ninterface ExternalData {\n root: string;\n digest: string;\n hooks: CommandHook[];\n}\n\nfunction fail(message: string): never {\n throw new Error(`configuration: 本地插件:${message}`);\n}\nfunction tree(root: string): FileEntry[] {\n const files: FileEntry[] = [];\n let bytes = 0,\n entries = 0;\n const walk = (directory: string, depth: number) => {\n if (depth > 16) fail(\"目录层级超过 16\");\n for (const name of readdirSync(directory).sort()) {\n if ([\".git\", \"node_modules\"].includes(name)) continue;\n if (++entries > 4000) fail(\"文件数量超过 4000\");\n const path = join(directory, name),\n info = lstatSync(path);\n if (info.isSymbolicLink()) fail(`不接受符号链接:${relative(root, path)}`);\n if (info.isDirectory()) {\n walk(path, depth + 1);\n continue;\n }\n if (!info.isFile() || info.size > maxFileBytes) fail(`文件类型或大小无效:${relative(root, path)}`);\n const content = readFileSync(path);\n bytes += content.length;\n if (content.length > maxFileBytes || bytes > maxTreeBytes) fail(\"文件内容超过读取上限\");\n files.push({\n path: relative(root, path).split(sep).join(\"/\"),\n bytes: content,\n executable: !!(info.mode & 0o111),\n });\n }\n };\n if (!lstatSync(root).isDirectory()) fail(\"请选择插件根目录\");\n walk(root, 0);\n return files;\n}\nfunction digest(files: FileEntry[]): string {\n const hash = createHash(\"sha256\");\n for (const file of files) {\n hash.update(JSON.stringify([file.path, file.bytes.length, file.executable]));\n hash.update(file.bytes);\n }\n return hash.digest(\"hex\");\n}\nfunction json(bytes: Buffer, path: string): JsonObject {\n try {\n const value: unknown = JSON.parse(bytes.toString(\"utf8\"));\n if (isJsonObject(value)) return value;\n } catch {\n /* Report only the component path. */\n }\n return fail(`JSON 无效:${path}`);\n}\nfunction markdown(bytes: Buffer, path: string): { fields: JsonObject; body: string } {\n const text = bytes.toString(\"utf8\");\n try {\n return parseMarkdownFrontmatter(text) ?? { fields: {}, body: text.trim() };\n } catch {\n return fail(`frontmatter 无效:${path}`);\n }\n}\nfunction relativePath(path: string): string {\n const normalized = path.replaceAll(\"\\\\\", \"/\").replace(/^\\.\\//, \"\").replace(/\\/+$/, \"\");\n if (\n !normalized ||\n isAbsolute(path) ||\n normalized.split(\"/\").some((part) => [\"\", \".\", \"..\"].includes(part)) ||\n /^[A-Za-z]:/.test(path)\n )\n fail(`组件路径必须位于插件内:${path}`);\n return normalized;\n}\nfunction componentFiles(files: FileEntry[], declared: unknown, standard: string): FileEntry[] {\n const paths = declared === undefined ? [standard] : typeof declared === \"string\" ? [declared] : declared;\n if (!Array.isArray(paths) || paths.some((path) => typeof path !== \"string\"))\n fail(`组件路径声明无效:${standard}`);\n const roots = [\n ...new Set(\n paths.map((path) =>\n standard === \"skills\" && [\".\", \"./\"].includes(path as string) ? \"\" : relativePath(path as string),\n ),\n ),\n ];\n const under = (file: FileEntry, root: string) =>\n root === \"\" || file.path === root || file.path.startsWith(`${root}/`);\n if (declared !== undefined)\n for (const root of roots) if (!files.some((file) => under(file, root))) fail(`组件路径不存在:${root}`);\n if (standard === \"skills\" && !roots.includes(standard)) roots.push(standard);\n return files.filter((file) => roots.some((root) => under(file, root)));\n}\n\nfunction parseHooks(files: FileEntry[], manifest: JsonObject): CommandHook[] {\n const hooks: CommandHook[] = [],\n loaded = new Set<string>();\n const read = (source: unknown) => {\n if (typeof source === \"string\") {\n const path = relativePath(source);\n if (loaded.has(path)) return;\n loaded.add(path);\n const file = files.find((file) => file.path === path);\n if (!file) fail(`缺少 hooks 文件:${path}`);\n read(json(file.bytes, path));\n return;\n }\n if (Array.isArray(source)) {\n for (const entry of source) read(entry);\n return;\n }\n if (!isJsonObject(source)) fail(\"hooks 必须是对象或相对 JSON 路径\");\n const events = isJsonObject(source.hooks) ? source.hooks : source;\n for (const [event, groups] of Object.entries(events)) {\n if (!(hookEvents as readonly string[]).includes(event)) fail(`暂不支持 hook 事件:${event}`);\n if (!Array.isArray(groups)) fail(`hook 分组无效:${event}`);\n for (const group of groups) {\n if (\n !isJsonObject(group) ||\n !Array.isArray(group.hooks) ||\n Object.keys(group).some((key) => ![\"matcher\", \"hooks\"].includes(key))\n )\n fail(`hook 分组字段无效:${event}`);\n for (const hook of group.hooks) {\n hooks.push(parseCommandHook(hook, event, group.matcher));\n if (hooks.length > 100) fail(\"hooks 数量超过 100\");\n }\n }\n }\n };\n if (files.some((file) => file.path === \"hooks/hooks.json\")) read(\"hooks/hooks.json\");\n if (manifest.hooks !== undefined) read(manifest.hooks);\n return hooks;\n}\nfunction rootVariables(text: string, root: string): string {\n return text.replace(/\\$\\{(?:ZPI|ZCODE|CLAUDE)_PLUGIN_ROOT\\}/g, () => root);\n}\n\nfunction compilePlugin(files: FileEntry[], storage: string, treeDigest?: string): PluginSnapshot {\n const manifestFile = [\n \".zpi-plugin/plugin.json\",\n \".zcode-plugin/plugin.json\",\n \".claude-plugin/plugin.json\",\n \".codex-plugin/plugin.json\",\n ]\n .map((path) => files.find((file) => file.path === path))\n .find(Boolean);\n if (!manifestFile) fail(\"找不到插件 manifest\");\n const manifest = json(manifestFile.bytes, manifestFile.path);\n if (\n typeof manifest.name !== \"string\" ||\n !/^[a-z][a-z0-9-]{1,49}$/.test(manifest.name) ||\n (manifest.version !== undefined && (typeof manifest.version !== \"string\" || !manifest.version.trim()))\n )\n fail(\"插件 name/version 无效\");\n for (const key of [\n \"mcpServers\",\n \"lspServers\",\n \"ui\",\n \"outputStyles\",\n \"settings\",\n \"entry\",\n \"main\",\n \"tools\",\n \"dependencies\",\n \"userConfig\",\n \"channels\",\n \"experimental\",\n \"types\",\n ])\n if (\n manifest[key] !== undefined ||\n (key === \"mcpServers\" && files.some((file) => file.path === \".mcp.json\")) ||\n (key === \"lspServers\" && files.some((file) => file.path === \".lsp.json\"))\n )\n fail(`暂不支持组件:${key}`);\n const hash = treeDigest ?? digest(files),\n root = join(resolve(storage), \"cache\", hash);\n const hooks = parseHooks(files, manifest);\n const commands = componentFiles(files, manifest.commands, \"commands\")\n .filter((file) => /\\.md$/i.test(file.path))\n .map((file) => {\n const parsed = markdown(file.bytes, file.path);\n for (const key of [\"allowed-tools\", \"model\", \"hooks\", \"skills\"])\n if (parsed.fields[key] !== undefined) fail(`暂不支持命令字段 ${key}:${file.path}`);\n if (/!`|```!/.test(parsed.body)) fail(`暂不支持命令 Shell 插值:${file.path}`);\n return {\n name: `${manifest.name}:${basename(file.path, \".md\")}`,\n description: String(parsed.fields.description ?? basename(file.path)),\n prompt: rootVariables(parsed.body, root).replace(/\\$ARGUMENTS/g, \"{{arguments}}\"),\n };\n });\n const skills: PluginSkill[] = componentFiles(files, manifest.skills, \"skills\")\n .filter((file) => basename(file.path) === \"SKILL.md\")\n .map((file) => {\n const parsed = markdown(file.bytes, file.path);\n if (typeof parsed.fields.description !== \"string\" || !parsed.fields.description.trim())\n fail(`缺少技能 description:${file.path}`);\n for (const key of [\"hooks\", \"allowed-tools\", \"context\", \"agent\"])\n if (parsed.fields[key] !== undefined) fail(`暂不支持技能字段 ${key}:${file.path}`);\n return {\n name: `${manifest.name}:${basename(dirname(file.path))}`,\n description: parsed.fields.description,\n path: join(root, file.path),\n baseDir: join(root, dirname(file.path)),\n body: rootVariables(parsed.body, root),\n };\n });\n const agents = componentFiles(files, manifest.agents, \"agents\")\n .filter((file) => /\\.md$/i.test(file.path))\n .map((file) => {\n const parsed = markdown(file.bytes, file.path);\n for (const key of [\n \"hooks\",\n \"skills\",\n \"permissionMode\",\n \"mcpServers\",\n \"memory\",\n \"maxTurns\",\n \"background\",\n \"isolation\",\n ])\n if (parsed.fields[key] !== undefined) fail(`暂不支持 Agent 字段 ${key}:${file.path}`);\n return { name: basename(file.path, \".md\"), markdown: rootVariables(file.bytes.toString(\"utf8\"), root) };\n });\n const instructions = manifest.instructions ?? [];\n if (!Array.isArray(instructions) || instructions.some((part) => typeof part !== \"string\"))\n fail(\"instructions 必须是字符串数组\");\n const snapshot: PluginSnapshot = {\n id: `local.${manifest.name}`,\n version: String(manifest.version ?? \"unversioned\"),\n name: manifest.name,\n description: typeof manifest.description === \"string\" ? manifest.description : \"本地插件\",\n runtime,\n instructions: instructions as string[],\n commands,\n skills,\n options: { root, digest: hash, hooks: JSON.parse(JSON.stringify(hooks)), agents },\n };\n validatePluginSnapshot(snapshot);\n if (\n new Set(commands.map((command) => command.name)).size !== commands.length ||\n new Set(skills.map((skill) => skill.name)).size !== skills.length\n )\n fail(\"组件名称重复\");\n return snapshot;\n}\n\n/** Import reads data only. No module import, installation scripts or hooks run here. */\nexport async function importLocalPlugin(source: string, storage: string): Promise<PluginSnapshot> {\n const files = tree(resolve(source));\n const snapshot = compilePlugin(files, storage);\n const root = String(snapshot.options?.root);\n const temporary = join(resolve(storage), `import-${randomUUID()}`);\n await mkdir(temporary, { recursive: true, mode: 0o700 });\n const directories = new Set([temporary]);\n try {\n for (const file of files) {\n const target = join(temporary, file.path);\n const directory = dirname(target);\n if (!directories.has(directory)) {\n await mkdir(directory, { recursive: true, mode: 0o700 });\n directories.add(directory);\n }\n await writeFile(target, file.bytes, { mode: file.executable ? 0o700 : 0o600 });\n await chmod(target, file.executable ? 0o700 : 0o600);\n }\n await mkdir(dirname(root), { recursive: true, mode: 0o700 });\n try {\n await rename(temporary, root);\n } catch (error) {\n if (![\"EEXIST\", \"ENOTEMPTY\"].includes((error as NodeJS.ErrnoException).code ?? \"\")) throw error;\n }\n assertExternalPlugin(snapshot, storage, true);\n return snapshot;\n } finally {\n await rm(temporary, { recursive: true, force: true });\n }\n}\nexport function isExternalPlugin(snapshot: PluginSnapshot): boolean {\n return snapshot.runtime === runtime;\n}\nexport function assertExternalPlugin(snapshot: PluginSnapshot, storage: string, verifyFiles = false): void {\n validatePluginSnapshot(snapshot);\n const options = snapshot.options;\n if (\n !isExternalPlugin(snapshot) ||\n !snapshot.id.startsWith(\"local.\") ||\n !options ||\n typeof options.digest !== \"string\" ||\n !/^[a-f0-9]{64}$/.test(options.digest) ||\n options.root !== join(resolve(storage), \"cache\", options.digest) ||\n !Array.isArray(options.hooks) ||\n !Array.isArray(options.agents)\n )\n fail(\"快照或运行时无效\");\n for (const hook of options.hooks) {\n if (\n !isJsonObject(hook) ||\n !(hookEvents as readonly unknown[]).includes(hook.event) ||\n ![\"command\", \"process\"].includes(hook.type as string) ||\n typeof hook.command !== \"string\" ||\n !Array.isArray(hook.args) ||\n hook.args.some((arg) => typeof arg !== \"string\") ||\n typeof hook.timeoutMs !== \"number\" ||\n hook.timeoutMs < 1 ||\n hook.timeoutMs > 300000\n )\n fail(\"hook 快照无效\");\n parseCommandHook(\n { type: hook.type, command: hook.command, args: hook.args, timeoutMs: hook.timeoutMs },\n String(hook.event),\n hook.matcher,\n );\n }\n if (verifyFiles) {\n const files = tree(options.root as string);\n const treeDigest = digest(files);\n if (treeDigest !== options.digest) fail(\"缓存内容已改变,请重新导入插件\");\n const expected = compilePlugin(files, storage, treeDigest);\n if (!isDeepStrictEqual(pluginSnapshotData(snapshot), pluginSnapshotData(expected)))\n fail(\"冻结快照与插件内容不一致\");\n }\n}\n\nexport function bindExternalPlugin(\n snapshot: PluginSnapshot,\n options: { storage: string; transcriptPath?: string; env?: Record<string, string | undefined> },\n): SessionPlugin {\n assertExternalPlugin(snapshot, options.storage);\n const data = {\n ...(snapshot.options as unknown as ExternalData),\n id: snapshot.id,\n name: snapshot.name ?? snapshot.id,\n };\n return {\n ...snapshot,\n hooks: bindCommandHooks(data.hooks, {\n root: data.root,\n dataDirectory: join(options.storage, \"data\", data.id),\n id: data.id,\n name: data.name,\n transcriptPath: options.transcriptPath,\n env: options.env,\n validate: () => assertExternalPlugin(snapshot, options.storage, true),\n }),\n };\n}\n","import { spawn } from \"node:child_process\";\nimport { mkdir } from \"node:fs/promises\";\nimport { isJsonObject } from \"@zpi-dev/ai\";\nimport {\n getShellConfig,\n getShellEnv,\n type HookInput,\n type HookOutput,\n type HookRegistration,\n hookEvents,\n killProcessTree,\n} from \"@zpi-dev/coding-agent\";\n\nexport interface CommandHook {\n event: string;\n matcher?: string;\n type: \"command\" | \"process\";\n command: string;\n args: string[];\n timeoutMs: number;\n}\nexport interface CommandHookContext {\n root: string;\n dataDirectory: string;\n id: string;\n name: string;\n transcriptPath?: string;\n env?: Record<string, string | undefined>;\n validate?: () => void;\n}\nconst maxFileBytes = 2 * 1024 * 1024;\nconst maxOutputBytes = 128 * 1024;\nfunction fail(message: string): never {\n throw new Error(`configuration: 钩子:${message}`);\n}\nconst aliases: Record<string, string> = {\n Bash: \"bash\",\n Read: \"read\",\n Edit: \"edit\",\n Write: \"write\",\n Task: \"Agent\",\n};\nfunction matcher(value: unknown): string | undefined {\n if (value === undefined || value === \"\" || value === \"*\") return undefined;\n if (typeof value !== \"string\") fail(\"hook matcher 必须是字符串\");\n let pattern: RegExp;\n try {\n pattern = new RegExp(value);\n } catch {\n fail(\"hook matcher 正则表达式无效\");\n }\n const nativeNames = Object.entries(aliases)\n .filter(([alias]) => pattern.test(alias))\n .map(([, native]) => native);\n return nativeNames.length ? `(?:${value})|^(?:${nativeNames.join(\"|\")})$` : value;\n}\nexport function parseCommandHook(hook: unknown, event: string, match: unknown): CommandHook {\n if (!(hookEvents as readonly string[]).includes(event)) fail(`暂不支持 hook 事件:${event}`);\n if (\n !isJsonObject(hook) ||\n ![\"command\", \"process\"].includes(hook.type as string) ||\n typeof hook.command !== \"string\" ||\n !hook.command.trim()\n )\n fail(\"只支持 command/process hooks\");\n if (\n Object.keys(hook).some(\n (key) => ![\"type\", \"command\", \"args\", \"timeout\", \"timeoutMs\", \"statusMessage\", \"async\"].includes(key),\n ) ||\n (hook.async !== undefined && hook.async !== false)\n )\n fail(\"暂不支持此 hook 字段或异步 hook\");\n if (\n (hook.timeout !== undefined && typeof hook.timeout !== \"number\") ||\n (hook.timeoutMs !== undefined && typeof hook.timeoutMs !== \"number\")\n )\n fail(\"hook 超时必须是数字\");\n const timeoutMs = hook.timeoutMs ?? (typeof hook.timeout === \"number\" ? hook.timeout * 1000 : 30000);\n if (\n typeof timeoutMs !== \"number\" ||\n !Number.isSafeInteger(timeoutMs) ||\n timeoutMs < 1 ||\n timeoutMs > 300000\n )\n fail(\"hook 超时必须在 1–300000 毫秒之间\");\n const args = hook.args === undefined ? [] : hook.args;\n if (\n !Array.isArray(args) ||\n args.some((arg) => typeof arg !== \"string\") ||\n (hook.type === \"command\" && args.length)\n )\n fail(\"hook args 无效;command 使用 shell 字符串,process 使用 argv\");\n return {\n event,\n matcher: matcher(match),\n type: hook.type as CommandHook[\"type\"],\n command: hook.command,\n args: args as string[],\n timeoutMs,\n };\n}\n\nexport function decodeHookOutput(value: unknown, event: HookInput[\"event\"]): HookOutput | undefined {\n if (!isJsonObject(value)) fail(\"hook 输出必须是 JSON 对象\");\n const specific = isJsonObject(value.hookSpecificOutput) ? value.hookSpecificOutput : {};\n if (specific.hookEventName !== undefined && specific.hookEventName !== event) fail(\"hook 输出事件不匹配\");\n const context = specific.additionalContext ?? value.additionalContext ?? value.additional_context;\n const reason = specific.permissionDecisionReason ?? value.reason ?? value.stopReason;\n const block =\n value.block === true ||\n value.continue === false ||\n value.decision === \"block\" ||\n [\"deny\", \"ask\"].includes(specific.permissionDecision as string);\n if (\n (context !== undefined && typeof context !== \"string\") ||\n (reason !== undefined && typeof reason !== \"string\")\n )\n fail(\"hook 上下文或理由必须是字符串\");\n if (event === \"Stop\" && block)\n return { additionalContext: (reason as string) || \"Hook requested another verification.\" };\n const updatedInput = specific.updatedInput ?? value.updatedInput;\n return {\n ...(context ? { additionalContext: context as string } : {}),\n ...(block ? { block: true, reason: reason as string | undefined } : {}),\n ...(updatedInput !== undefined ? { updatedInput } : {}),\n };\n}\nexport function hookInputPayload(input: HookInput, transcriptPath?: string) {\n return {\n ...input,\n hookEventName: input.event,\n hook_event_name: input.event,\n session_id: input.sessionId,\n ...(transcriptPath ? { transcriptPath: transcriptPath, transcript_path: transcriptPath } : {}),\n ...(\"toolName\" in input\n ? {\n tool_name:\n Object.entries(aliases).find(([, native]) => native === input.toolName)?.[0] ?? input.toolName,\n tool_input: input.toolInput,\n tool_use_id: input.toolCallId,\n tool_response: input.toolResult,\n error: input.toolResult?.isError ? JSON.stringify(input.toolResult.content) : undefined,\n }\n : {}),\n ...(input.event === \"Stop\"\n ? { stop_hook_active: input.stopHookActive, last_assistant_message: input.response }\n : {}),\n ...(input.event === \"Notification\" ? { notification_type: input.notificationType } : {}),\n };\n}\nasync function commandHook(\n hook: CommandHook,\n input: HookInput,\n data: CommandHookContext,\n signal: AbortSignal,\n): Promise<HookOutput | undefined> {\n signal.throwIfAborted();\n const pluginData = data.dataDirectory;\n await mkdir(pluginData, { recursive: true, mode: 0o700 });\n signal.throwIfAborted();\n const env: NodeJS.ProcessEnv = {\n ...(data.env ?? getShellEnv()),\n ZPI_PROJECT_DIR: input.cwd,\n ZCODE_PROJECT_DIR: input.cwd,\n CLAUDE_PROJECT_DIR: input.cwd,\n };\n for (const prefix of [\"ZPI\", \"ZCODE\", \"CLAUDE\"])\n Object.assign(env, {\n [`${prefix}_PLUGIN_ROOT`]: data.root,\n [`${prefix}_PLUGIN_DATA`]: pluginData,\n [`${prefix}_PLUGIN_ID`]: data.id,\n [`${prefix}_PLUGIN_NAME`]: data.name,\n });\n const expand = (text: string) =>\n text.replace(/\\$\\{((?:ZPI|ZCODE|CLAUDE)_PLUGIN_(?:ROOT|DATA))\\}/g, (_, key: string) => env[key] ?? \"\");\n const payload = hookInputPayload(input, data.transcriptPath);\n const stdin = JSON.stringify(payload);\n if (Buffer.byteLength(stdin) > maxFileBytes) fail(\"hook 输入超过 2 MiB\");\n const invocation =\n hook.type === \"process\"\n ? { executable: expand(hook.command), args: hook.args.map(expand) }\n : (() => {\n const shell = getShellConfig();\n return { executable: shell.shell, args: [...shell.args, hook.command] };\n })();\n const child = spawn(invocation.executable, invocation.args, {\n cwd: input.cwd,\n env,\n detached: process.platform !== \"win32\",\n windowsHide: true,\n stdio: \"pipe\",\n });\n return new Promise((resolveResult, reject) => {\n const chunks: Buffer[] = [],\n errors: Buffer[] = [];\n let size = 0,\n failure: Error | undefined;\n const stop = (error: Error) => {\n failure ??= error;\n if (child.pid) killProcessTree(child.pid);\n };\n const abort = () => stop(new Error(\"Hook cancelled\"));\n signal.addEventListener(\"abort\", abort, { once: true });\n if (signal.aborted) abort();\n const timer = setTimeout(() => stop(new Error(\"Hook timed out\")), hook.timeoutMs);\n for (const stream of [child.stdout, child.stderr])\n stream.on(\"data\", (chunk: Buffer) => {\n size += chunk.length;\n if (size > maxOutputBytes) stop(new Error(\"Hook output exceeds 128 KiB\"));\n else (stream === child.stdout ? chunks : errors).push(Buffer.from(chunk));\n });\n child.stdin.on(\"error\", () => {});\n child.stdin.end(stdin);\n child.on(\"error\", (error) => {\n failure ??= error;\n });\n child.on(\"close\", (code) => {\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", abort);\n if (signal.aborted) {\n reject(signal.reason);\n return;\n }\n if (failure) {\n reject(failure);\n return;\n }\n const text = Buffer.concat(chunks).toString(\"utf8\").trim();\n const reason = Buffer.concat(errors).toString(\"utf8\").trim() || text;\n if (code === 2 && [\"PreToolUse\", \"UserPromptSubmit\", \"Stop\"].includes(input.event)) {\n resolveResult(\n input.event === \"Stop\"\n ? { additionalContext: reason || \"Hook requested verification.\" }\n : { block: true, reason: reason || \"Blocked by plugin hook\" },\n );\n return;\n }\n if (code !== 0) {\n reject(new Error(`Plugin hook exited with code ${code}`));\n return;\n }\n try {\n resolveResult(\n text.startsWith(\"{\") || text.startsWith(\"[\")\n ? decodeHookOutput(JSON.parse(text), input.event)\n : [\"SessionStart\", \"UserPromptSubmit\"].includes(input.event) && text\n ? { additionalContext: text }\n : undefined,\n );\n } catch (error) {\n reject(error);\n }\n });\n });\n}\nexport function bindCommandHooks(\n hooks: readonly CommandHook[],\n context: CommandHookContext,\n): HookRegistration[] {\n return hooks.map((hook) => ({\n event: hook.event as HookInput[\"event\"],\n matcher: hook.matcher,\n timeoutMs: Math.min(hook.timeoutMs + 1000, 300000),\n onError: \"block\",\n handler: async (input, signal) => {\n context.validate?.();\n return commandHook(hook, input, context, signal);\n },\n }));\n}\n","{\n \"name\": \"@zpi-dev/agent-sdk\",\n \"version\": \"0.1.61\",\n \"type\": \"module\",\n \"description\": \"TypeScript Agent SDK for ZPI with a Claude-compatible public API\",\n \"exports\": {\n \".\": {\n \"development\": \"./src/index.ts\",\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./host\": {\n \"development\": \"./src/host.ts\",\n \"types\": \"./dist/host.d.ts\",\n \"import\": \"./dist/host.js\"\n }\n },\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist\",\n \"README.md\",\n \"NOTICE\"\n ],\n \"engines\": {\n \"node\": \">=24 <25\"\n },\n \"scripts\": {\n \"build\": \"node ../../scripts/build-agent-sdk.mjs\",\n \"prepack\": \"npm run build\"\n },\n \"dependencies\": {\n \"sharp\": \"0.35.5\",\n \"typebox\": \"1.3.27\",\n \"openai\": \"7.19.0\",\n \"@anthropic-ai/sdk\": \"0.124.0\"\n },\n \"devDependencies\": {\n \"@zpi-dev/ai\": \"0.1.61\",\n \"@zpi-dev/agent\": \"0.1.61\",\n \"@zpi-dev/coding-agent\": \"0.1.61\",\n \"@zpi-dev/plugin-compat\": \"0.1.61\",\n \"yaml\": \"2.9.1\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/1316151417/zpi.git\",\n \"directory\": \"packages/agent-sdk\"\n },\n \"homepage\": \"http://101.200.240.206/zpi/docs/features/sdk\",\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n }\n}\n","import type { HookRegistration } from \"@zpi-dev/coding-agent\";\nimport { decodeHookOutput, hookInputPayload } from \"@zpi-dev/plugin-compat\";\nimport type { HookEvent, HookInput, Options } from \"./types.ts\";\n\nexport function coreHooks(options: Options, transcript: string): HookRegistration[] {\n const core = new Set([\n \"SessionStart\",\n \"UserPromptSubmit\",\n \"PreToolUse\",\n \"PostToolUse\",\n \"PostToolUseFailure\",\n \"Stop\",\n ]);\n return Object.entries(options.hooks ?? {}).flatMap(([event, groups]) => {\n if (!core.has(event)) return [];\n return (groups ?? []).flatMap((group) =>\n group.hooks.map(\n (callback): HookRegistration => ({\n event: event as HookRegistration[\"event\"],\n matcher: group.matcher,\n timeoutMs: (group.timeout ?? 30) * 1000,\n onError: group.onFailure ?? \"continue\",\n handler: async (input, signal) => {\n const output = await callback(\n { ...hookInputPayload(input, transcript), transcript_path: transcript } as HookInput,\n \"toolCallId\" in input ? input.toolCallId : undefined,\n { signal },\n );\n if (\"async\" in output) throw new Error(\"Async hook output is not supported\");\n return decodeHookOutput(output, input.event);\n },\n }),\n ),\n );\n });\n}\nexport async function lifecycleHook(\n options: Options,\n event: HookEvent,\n input: import(\"./types.ts\").BaseHookInput & {\n agent_id?: string;\n agent_type?: string;\n reason?: string;\n trigger?: \"manual\" | \"auto\";\n custom_instructions?: string;\n stop_hook_active?: boolean;\n last_assistant_message?: string;\n },\n signal: AbortSignal,\n): Promise<void> {\n for (const group of options.hooks?.[event] ?? []) {\n if (\n group.matcher &&\n !new RegExp(group.matcher).test(input.agent_type ?? input.trigger ?? input.reason ?? \"\")\n )\n continue;\n for (const callback of group.hooks) {\n const controller = new AbortController();\n const abort = () => controller.abort(signal.reason);\n signal.addEventListener(\"abort\", abort, { once: true });\n const timer = setTimeout(\n () => controller.abort(new Error(\"Hook timed out\")),\n (group.timeout ?? 30) * 1000,\n );\n try {\n signal.throwIfAborted();\n const { abortable } = await import(\"@zpi-dev/ai\");\n await abortable(\n callback({ ...input, hook_event_name: event } as HookInput, undefined, {\n signal: controller.signal,\n }),\n controller.signal,\n );\n } catch (error) {\n if (signal.aborted || group.onFailure === \"block\") throw error;\n } finally {\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", abort);\n }\n }\n }\n}\n","import { isAbsolute, resolve } from \"node:path\";\nimport type { HookRegistration } from \"@zpi-dev/coding-agent\";\nimport type { Options, SDKPermissionDenial } from \"./types.ts\";\n\ninterface Rule {\n name: string;\n argument?: string;\n}\nexport function permissionRules(rules: readonly string[] = []): Rule[] {\n return rules.map((source) => {\n const match = /^([A-Za-z0-9_*.-]+)(?:\\((.+)\\))?$/.exec(source);\n if (!match) throw new Error(`Invalid tool permission rule: ${source}`);\n return { name: match[1], argument: match[2] };\n });\n}\nfunction glob(text: string, pattern: string): boolean {\n return new RegExp(\n `^${pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replaceAll(\"*\", \".*\")\n .replaceAll(\"?\", \".\")}$`,\n ).test(text);\n}\nexport function matchesRule(rule: Rule, name: string, input: Record<string, unknown>, cwd: string): boolean {\n if (!glob(name, rule.name)) return false;\n if (rule.argument === undefined) return true;\n if (typeof input.command === \"string\") {\n if (rule.argument.endsWith(\":*\")) {\n const prefix = rule.argument.slice(0, -2);\n return input.command === prefix || input.command.startsWith(`${prefix} `);\n }\n return glob(input.command, rule.argument);\n }\n if (typeof input.file_path === \"string\") {\n const pattern = isAbsolute(rule.argument) ? rule.argument : resolve(cwd, rule.argument);\n return glob(resolve(cwd, input.file_path), pattern);\n }\n return false;\n}\nexport function permissionHook(\n options: Options,\n denials: SDKPermissionDenial[],\n interrupt: () => void,\n): HookRegistration {\n const allow = permissionRules(options.allowedTools),\n deny = permissionRules(options.disallowedTools);\n return {\n event: \"PreToolUse\",\n onError: \"block\",\n handler: async (event, signal) => {\n if (!(\"toolName\" in event)) return;\n const input = event.toolInput as Record<string, unknown>;\n const denied = deny.some((rule) => matchesRule(rule, event.toolName, input, event.cwd));\n const allowed = allow.some((rule) => matchesRule(rule, event.toolName, input, event.cwd));\n const result = denied\n ? { behavior: \"deny\" as const, message: \"Tool use denied by disallowedTools\" }\n : allowed || !options.canUseTool\n ? { behavior: \"allow\" as const }\n : await options.canUseTool(event.toolName, structuredClone(input), {\n signal,\n toolUseID: event.toolCallId,\n requestId: event.invocationId,\n });\n signal.throwIfAborted();\n if (result?.behavior === \"allow\")\n return { ...(result.updatedInput ? { updatedInput: result.updatedInput } : {}) };\n if (result && result.behavior !== \"deny\")\n throw new Error(\"canUseTool returned an invalid permission result\");\n denials.push({\n tool_name: event.toolName,\n tool_use_id: event.toolCallId,\n tool_input: structuredClone(input),\n });\n if (result?.interrupt) interrupt();\n return { block: true, reason: result?.message || \"Tool use was not approved\" };\n },\n };\n}\n","import { readdir, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n type LoadedSkill,\n parseMarkdownFrontmatter,\n type ResourceLoader,\n readFileBounded,\n type SkillList,\n} from \"@zpi-dev/coding-agent\";\nimport { sdkHome } from \"./runtime.ts\";\nimport type { Options } from \"./types.ts\";\n\n/** SDK opt-in settings discovery; no project code or config executes during loading. */\nexport class SdkResources implements ResourceLoader {\n private instructions: string[] = [];\n private skills: LoadedSkill[] = [];\n private options: Options;\n private cwd: string;\n constructor(options: Options, cwd: string) {\n this.options = options;\n this.cwd = cwd;\n }\n getInstructions(): string[] {\n return [...this.instructions];\n }\n listSkills(): SkillList {\n return { skills: this.skills.map(({ body: _, ...metadata }) => metadata), diagnostics: [] };\n }\n async loadSkill(name: string): Promise<LoadedSkill> {\n const skill = this.skills.find((skill) => skill.name === name);\n if (!skill) throw new Error(`Unknown skill: ${name}`);\n return structuredClone(skill);\n }\n async reload(): Promise<void> {\n this.instructions = [];\n this.skills = [];\n const sources = this.options.settingSources ?? [];\n const roots = [\n ...(sources.includes(\"user\")\n ? [{ path: join(sdkHome(this.options), \".claude\"), source: \"user\" as const }]\n : []),\n ...(sources.includes(\"project\") || sources.includes(\"local\")\n ? [{ path: join(this.cwd, \".claude\"), source: \"project\" as const }]\n : []),\n ];\n const files = [\n ...roots.map((root) => join(root.path, \"CLAUDE.md\")),\n ...(sources.includes(\"project\") ? [join(this.cwd, \"CLAUDE.md\"), join(this.cwd, \"AGENTS.md\")] : []),\n ...(sources.includes(\"local\") ? [join(this.cwd, \"CLAUDE.local.md\")] : []),\n ];\n for (const path of files) {\n const value = await boundedText(path);\n if (value !== undefined)\n this.instructions.push(\n `<project_instructions path=${JSON.stringify(path)}>\\n${value}\\n</project_instructions>`,\n );\n }\n for (const root of roots) {\n const directory = join(root.path, \"skills\");\n const entries = await readdir(directory, { withFileTypes: true }).catch(\n (error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") return [];\n throw error;\n },\n );\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const path = join(directory, entry.name, \"SKILL.md\"),\n content = await boundedText(path);\n if (!content) continue;\n const parsed = parseMarkdownFrontmatter(content);\n if (!parsed) throw new Error(`Skill is missing frontmatter: ${path}`);\n const metadata = parsed.fields;\n const name = metadata.name === undefined ? entry.name : metadata.name;\n if (\n typeof name !== \"string\" ||\n !/^[A-Za-z0-9_.-]+$/.test(name) ||\n typeof metadata.description !== \"string\" ||\n !metadata.description.trim()\n )\n throw new Error(`Invalid skill metadata: ${path}`);\n if (this.options.skills && this.options.skills !== \"all\" && !this.options.skills.includes(name))\n continue;\n this.skills = this.skills.filter((skill) => skill.name !== name);\n this.skills.push({\n name,\n description: metadata.description,\n path,\n baseDir: join(directory, entry.name),\n source: root.source,\n body: parsed.body,\n });\n }\n }\n }\n}\nasync function boundedText(path: string): Promise<string | undefined> {\n const info = await stat(path).catch((error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") return undefined;\n throw error;\n });\n if (!info) return;\n if (!info.isFile() || info.size > 1024 * 1024)\n throw new Error(`Instruction/skill file is invalid or exceeds 1 MiB: ${path}`);\n return (await readFileBounded(path, 1024 * 1024)).toString(\"utf8\");\n}\n\n/** Agent markdown is data; execution still goes through the SDK's registered tools. */\nexport function pluginAgents(\n snapshot: import(\"@zpi-dev/coding-agent\").PluginSnapshot,\n): Record<string, import(\"./types.ts\").AgentDefinition> {\n const result: Record<string, import(\"./types.ts\").AgentDefinition> = {};\n const definitions = snapshot.options?.agents;\n if (!Array.isArray(definitions)) throw new Error(`Invalid plugin agent catalog: ${snapshot.name}`);\n for (const definition of definitions) {\n if (\n !definition ||\n typeof definition !== \"object\" ||\n Array.isArray(definition) ||\n typeof definition.markdown !== \"string\"\n )\n throw new Error(\"Invalid plugin agent definition\");\n const parsed = parseMarkdownFrontmatter(definition.markdown);\n if (!parsed) throw new Error(\"Agent definition requires YAML frontmatter\");\n const fields = parsed.fields;\n if (typeof fields.description !== \"string\") throw new Error(\"Invalid plugin agent metadata\");\n const list = (value: unknown): string[] | undefined => {\n if (value === undefined) return;\n const values = typeof value === \"string\" ? value.split(\",\").map((name) => name.trim()) : value;\n if (!Array.isArray(values) || values.some((item) => typeof item !== \"string\" || !item))\n throw new Error(\"Invalid agent tools\");\n return values;\n };\n const name = fields.name ?? definition.name;\n if (typeof name !== \"string\" || !name || (typeof fields.model !== \"string\" && fields.model !== undefined))\n throw new Error(\"Invalid agent name/model\");\n result[`${snapshot.name}:${name}`] = {\n description: fields.description,\n prompt: parsed.body,\n tools: list(fields.tools),\n disallowedTools: list(fields.disallowedTools),\n model: fields.model === \"inherit\" ? undefined : fields.model,\n };\n }\n return result;\n}\n","import { homedir } from \"node:os\";\nimport { resolve } from \"node:path\";\nimport {\n discoverProviderCredentials,\n type Model,\n presetModels,\n providerApi,\n providerBaseUrl,\n} from \"@zpi-dev/ai\";\nimport { ModelRuntime } from \"@zpi-dev/coding-agent\";\nimport type { Options } from \"./types.ts\";\n\nexport async function runtimeFor(options: Options): Promise<ModelRuntime> {\n if (options.zpi?.modelRuntime) return options.zpi.modelRuntime;\n const runtime = await ModelRuntime.create({ fetch: options.zpi?.fetch });\n const env = options.env ?? process.env;\n for (const { preset, apiKey } of discoverProviderCredentials(env)) {\n const api = providerApi(preset);\n runtime.registerProvider(preset, {\n apiKey,\n api,\n baseUrl: providerBaseUrl(preset, api),\n models: presetModels(preset, api).map(\n ({ availability: _availability, metadataSource: _metadataSource, ...model }) => ({\n ...model,\n name: model.name ?? model.id,\n input: (model.input ?? [\"text\"]).filter(\n (kind): kind is \"text\" | \"image\" => kind === \"text\" || kind === \"image\",\n ),\n reasoning: model.reasoning ?? false,\n contextWindow: model.contextWindow ?? 128000,\n maxTokens: model.maxTokens ?? 8192,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n }),\n ),\n });\n }\n if (env.ANTHROPIC_API_KEY) {\n const id = (options.model ?? env.ANTHROPIC_MODEL)?.replace(/^anthropic\\//, \"\");\n if (!id) throw new Error(\"Set options.model or ANTHROPIC_MODEL for the Anthropic provider\");\n runtime.registerProvider(\"anthropic\", {\n apiKey: env.ANTHROPIC_API_KEY,\n api: \"anthropic-messages\",\n baseUrl: env.ANTHROPIC_BASE_URL ?? \"https://api.anthropic.com\",\n models: [\n {\n id,\n name: id,\n input: [\"text\", \"image\"],\n reasoning: true,\n contextWindow: 200000,\n maxTokens: 32000,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n },\n ],\n });\n }\n for (const [id, config] of Object.entries(options.zpi?.providers ?? {}))\n runtime.registerProvider(id, config);\n return runtime;\n}\nexport async function selectModel(runtime: ModelRuntime, name?: string): Promise<Model> {\n const models = await runtime.getAvailable();\n const qualified = name ? models.filter((model) => `${model.provider}/${model.id}` === name) : [];\n const provider = name ? models.filter((model) => model.provider === name) : [];\n const matches = qualified.length\n ? qualified\n : provider.length\n ? provider\n : name\n ? models.filter((model) => model.id === name)\n : models;\n if (!matches.length)\n throw new Error(\n name\n ? `Model is not configured: ${name}`\n : \"No model configured. Set a provider API key or options.zpi.providers.\",\n );\n if (name && !provider.length && matches.length > 1)\n throw new Error(`Ambiguous model: ${name}; use provider/model`);\n return matches[0];\n}\nexport function thinkingLevel(options: Options): \"off\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\" {\n if (options.thinking?.type === \"disabled\" || options.maxThinkingTokens === 0) return \"off\";\n return options.effort ?? \"medium\";\n}\nexport const sdkHome = (options: Options) => resolve(options.env?.HOME ?? homedir());\n","import { randomUUID } from \"node:crypto\";\nimport { abortable } from \"@zpi-dev/ai\";\nimport type { ToolDefinition } from \"@zpi-dev/coding-agent\";\nimport { type TObject, Type } from \"typebox\";\n\ninterface Task {\n id: string;\n controller: AbortController;\n done: Promise<string>;\n status: \"running\" | \"completed\" | \"failed\" | \"stopped\";\n output: string;\n}\nexport class Tasks {\n private tasks = new Map<string, Task>();\n start(run: (signal: AbortSignal) => Promise<string>): string {\n const task: Task = {\n id: randomUUID(),\n controller: new AbortController(),\n status: \"running\",\n output: \"\",\n done: Promise.resolve(\"\"),\n };\n this.tasks.set(task.id, task);\n task.done = Promise.resolve()\n .then(() => run(task.controller.signal))\n .then(\n (output) => {\n task.output = output;\n task.status = task.controller.signal.aborted ? \"stopped\" : \"completed\";\n return output;\n },\n (error) => {\n task.status = task.controller.signal.aborted ? \"stopped\" : \"failed\";\n task.output = String(error);\n return task.output;\n },\n );\n return task.id;\n }\n tools(): ToolDefinition<TObject>[] {\n return [\n {\n name: \"TaskOutput\",\n label: \"TaskOutput\",\n description: \"Read a background task's output. Optionally wait for completion.\",\n parameters: Type.Object({\n task_id: Type.String(),\n block: Type.Optional(Type.Boolean()),\n timeout: Type.Optional(Type.Integer({ minimum: 0, maximum: 600000 })),\n }),\n execute: async (_id, input, signal) => {\n const task = this.tasks.get(input.task_id as string);\n if (!task) throw new Error(\"Unknown task_id\");\n if (input.block !== false && task.status === \"running\") {\n const timer = AbortSignal.timeout(Number(input.timeout ?? 30000));\n try {\n await abortable(task.done, signal ? AbortSignal.any([timer, signal]) : timer);\n } catch (error) {\n if (signal?.aborted) throw error;\n }\n }\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ task_id: task.id, status: task.status, output: task.output }),\n },\n ],\n details: undefined,\n };\n },\n },\n {\n name: \"TaskStop\",\n label: \"TaskStop\",\n description: \"Stop a background task owned by this query.\",\n parameters: Type.Object({ task_id: Type.String() }),\n execute: async (_id, input) => {\n const task = this.tasks.get(input.task_id as string);\n if (!task) throw new Error(\"Unknown task_id\");\n task.controller.abort();\n await task.done;\n return { content: [{ type: \"text\", text: `Stopped ${task.id}` }], details: undefined };\n },\n },\n ];\n }\n async close(): Promise<void> {\n for (const task of this.tasks.values()) task.controller.abort();\n try {\n await Promise.all([...this.tasks.values()].map((task) => task.done));\n } finally {\n this.tasks.clear();\n }\n }\n}\n","import { execFile } from \"node:child_process\";\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { relative, resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { contentText } from \"@zpi-dev/ai\";\nimport {\n createBashTool,\n createCodingTools,\n type ToolContext,\n type ToolDefinition,\n} from \"@zpi-dev/coding-agent\";\nimport { type TObject, Type } from \"typebox\";\nimport type { Tasks } from \"./tasks.ts\";\nimport type { Options } from \"./types.ts\";\n\nconst text = (value: string) => ({ content: [{ type: \"text\" as const, text: value }], details: undefined });\nconst executeFile = promisify(execFile);\nexport function canonicalTools(\n cwd: string,\n outputDir: string,\n context: () => ToolContext,\n options: Options,\n tasks: Tasks,\n): ToolDefinition<TObject>[] {\n const tools = new Map(\n createCodingTools(\n cwd,\n options.enableFileCheckpointing ? outputDir : undefined,\n () => context().model,\n context,\n ).map((tool) => [tool.name, tool]),\n );\n tools.set(\n \"bash\",\n createBashTool(\n cwd,\n {\n exposeSessionEnvironment: false,\n ...(options.env ? { spawnHook: (input) => ({ ...input, env: { ...options.env } }) } : {}),\n },\n context,\n ),\n );\n const call = (\n name: string,\n id: string,\n args: Record<string, unknown>,\n signal?: AbortSignal,\n update?: Parameters<ToolDefinition[\"execute\"]>[3],\n ) => {\n const tool = tools.get(name);\n if (!tool) throw new Error(`Unknown native tool: ${name}`);\n return tool.execute(id, args, signal, update);\n };\n return [\n {\n name: \"Read\",\n label: \"Read\",\n description: \"Read a file's text or supported image content. Use before editing a file.\",\n metadata: { readOnly: true, concurrentSafe: true },\n parameters: Type.Object({\n file_path: Type.String(),\n offset: Type.Optional(Type.Integer({ minimum: 1 })),\n limit: Type.Optional(Type.Integer({ minimum: 1 })),\n }),\n execute: (id, input, signal, update) =>\n call(\"read\", id, { path: input.file_path, offset: input.offset, limit: input.limit }, signal, update),\n },\n {\n name: \"Write\",\n label: \"Write\",\n description: \"Write a UTF-8 file, creating its parent directories as needed.\",\n parameters: Type.Object({ file_path: Type.String(), content: Type.String() }),\n execute: (id, input, signal, update) =>\n call(\"write\", id, { path: input.file_path, content: input.content }, signal, update),\n },\n {\n name: \"Edit\",\n label: \"Edit\",\n description:\n \"Replace an exact string in an existing file. The old string must be unique unless replace_all is true.\",\n parameters: Type.Object({\n file_path: Type.String(),\n old_string: Type.String({ minLength: 1 }),\n new_string: Type.String(),\n replace_all: Type.Optional(Type.Boolean()),\n }),\n execute: async (id, input, signal, update) => {\n let oldText = input.old_string as string,\n newText = input.new_string as string;\n if (input.replace_all) {\n const source = await readFile(resolve(cwd, input.file_path as string), \"utf8\");\n if (!source.includes(oldText)) throw new Error(\"old_string was not found\");\n newText = source.split(oldText).join(newText);\n oldText = source;\n }\n return call(\"edit\", id, { path: input.file_path, edits: [{ oldText, newText }] }, signal, update);\n },\n },\n {\n name: \"Bash\",\n label: \"Bash\",\n description:\n \"Run a shell command. timeout is in milliseconds. Background commands return a task ID for TaskOutput and TaskStop.\",\n parameters: Type.Object({\n command: Type.String(),\n timeout: Type.Optional(Type.Integer({ minimum: 1, maximum: 600000 })),\n description: Type.Optional(Type.String()),\n run_in_background: Type.Optional(Type.Boolean()),\n }),\n execute: async (id, input, signal, update) => {\n const args = {\n command: input.command,\n ...(input.timeout !== undefined ? { timeout: Number(input.timeout) / 1000 } : {}),\n };\n if (input.run_in_background)\n return text(\n JSON.stringify({\n task_id: tasks.start(async (taskSignal) => {\n const result = await call(\"bash\", id, args, taskSignal);\n return contentText(result.content);\n }),\n }),\n );\n return call(\"bash\", id, args, signal, update);\n },\n },\n {\n name: \"Glob\",\n label: \"Glob\",\n description: \"Find files by glob pattern under path (defaults to cwd). Returns up to 1000 paths.\",\n metadata: { readOnly: true, concurrentSafe: true },\n parameters: Type.Object({ pattern: Type.String(), path: Type.Optional(Type.String()) }),\n execute: async (_id, input, signal) => {\n const root = resolve(cwd, String(input.path ?? \".\"));\n const { matchesGlob } = await import(\"node:path\");\n const found: { path: string; mtime: number }[] = [];\n let entries = 0;\n const walk = async (directory: string, depth: number): Promise<void> => {\n signal?.throwIfAborted();\n if (depth > 32 || entries > 50000) return;\n for (const item of await readdir(directory, { withFileTypes: true })) {\n signal?.throwIfAborted();\n if (++entries > 50000) return;\n if ([\".git\", \"node_modules\"].includes(item.name)) continue;\n const path = resolve(directory, item.name);\n if (item.isDirectory()) await walk(path, depth + 1);\n else if (\n item.isFile() &&\n (matchesGlob(relative(root, path), String(input.pattern)) ||\n matchesGlob(path, String(input.pattern)))\n )\n found.push({ path, mtime: (await stat(path)).mtimeMs });\n }\n };\n await walk(root, 0);\n return text(\n found\n .sort((a, b) => b.mtime - a.mtime)\n .slice(0, 1000)\n .map((file) => file.path)\n .join(\"\\n\") || \"No files found\",\n );\n },\n },\n {\n name: \"Grep\",\n label: \"Grep\",\n description:\n \"Search file content with ripgrep. output_mode is content, files_with_matches, or count. Regex syntax follows ripgrep.\",\n metadata: { readOnly: true, concurrentSafe: true },\n parameters: Type.Object({\n pattern: Type.String(),\n path: Type.Optional(Type.String()),\n glob: Type.Optional(Type.String()),\n type: Type.Optional(Type.String()),\n output_mode: Type.Optional(\n Type.Union([Type.Literal(\"content\"), Type.Literal(\"files_with_matches\"), Type.Literal(\"count\")]),\n ),\n \"-i\": Type.Optional(Type.Boolean()),\n \"-n\": Type.Optional(Type.Boolean()),\n \"-A\": Type.Optional(Type.Integer({ minimum: 0 })),\n \"-B\": Type.Optional(Type.Integer({ minimum: 0 })),\n \"-C\": Type.Optional(Type.Integer({ minimum: 0 })),\n context: Type.Optional(Type.Integer({ minimum: 0 })),\n multiline: Type.Optional(Type.Boolean()),\n head_limit: Type.Optional(Type.Integer({ minimum: 0 })),\n offset: Type.Optional(Type.Integer({ minimum: 0 })),\n }),\n execute: async (_id, input, signal) => {\n const args = [\"--color\", \"never\", \"--no-heading\", \"--hidden\", \"-g\", \"!.git\", \"-g\", \"!node_modules\"];\n const mode = input.output_mode ?? \"files_with_matches\";\n if (mode === \"files_with_matches\") args.push(\"--files-with-matches\");\n else if (mode === \"count\") args.push(\"--count\");\n else if (input[\"-n\"] !== false) args.push(\"--line-number\");\n if (input[\"-i\"]) args.push(\"--ignore-case\");\n if (input.multiline) args.push(\"--multiline\", \"--multiline-dotall\");\n if (input.glob) args.push(\"--glob\", String(input.glob));\n if (input.type) args.push(\"--type\", String(input.type));\n for (const key of [\"-A\", \"-B\", \"-C\"] as const)\n if (input[key] !== undefined) args.push(key, String(input[key]));\n if (input.context !== undefined) args.push(\"-C\", String(input.context));\n args.push(\"--\", String(input.pattern), resolve(cwd, String(input.path ?? \".\")));\n let output: string;\n try {\n output = (await executeFile(\"rg\", args, { signal, cwd, maxBuffer: 4 * 1024 * 1024 })).stdout;\n } catch (error) {\n if ((error as { code?: unknown }).code === 1) return text(\"No matches found\");\n if ((error as { code?: unknown }).code === \"ENOENT\")\n throw new Error(\"Grep requires ripgrep (rg) on PATH\");\n throw error;\n }\n const lines = output.trimEnd().split(\"\\n\"),\n offset = Number(input.offset ?? 0),\n limit = Number(input.head_limit ?? 0);\n return text(lines.slice(offset, limit ? offset + limit : undefined).join(\"\\n\"));\n },\n },\n ...tasks.tools(),\n ];\n}\n"],"mappings":"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","names":["hash","delimiter","level","version","useColors","json","req","resolve","Agent","resolve","header","HttpsProxyAgent","PerMessageDeflate","data","PerMessageDeflate","Receiver","message","PerMessageDeflate","Sender","merge","byteLength","message","header","extension","EventEmitter","randomBytes","createHash","URL","PerMessageDeflate","Receiver","Sender","WebSocket","key","digest","message","WebSocket","createWebSocketStream","message","err","open","header","protocol","EventEmitter","createHash","extension","PerMessageDeflate","subprotocol","WebSocket","WebSocketServer","version","message","digest","byteLength","SocksCommand","Socks4Response","Socks5Auth","Socks5Response","Socks5HostType","SocksClientState","message","message","entry","constants","constants4","constants6","compact","entry","resolve","header","SocksProxyAgent","resolve","version","res","res","anchors","doc","node","text","i","end","json","header","merge","value","merge","stringify","comment","str","Type","map","seq","require_schema","pairs","omap","require_bool","require_float","require_int","n","set","res","require_schema","merge","merge","tags","merge","version","json","res","message","sep","sep","sep","message","header","splitLines","value","end","message","sep","sep","tag","message","message","message","header","sep","i","ch","message","sep","start","lineCounter","parseDocument","require_dist","setPixelData","rgb","randomUUID","message","message","entry","call","entry","message","call","message","entry","randomUUID","header","entry","message","thinkingLevel","usage","systemMessage","text","readFileSync","homedir","join","randomUUID","message","text","entry","message","usage","message","entry","thinkingLevel","randomUUID","text","open","object","join","homedir","readFileSync","resolve","createHash","PerMessageDeflate","Receiver","Sender","WebSocket","WebSocketServer","createWebSocketStream","extension","subprotocol","WebSocket","maxBytes","byteLength","entry","resolve","_EventEmitter_removeEmittedListener","_EventEmitter_cleanupEmittedListeners","message","error","query","resolve","text","WebSocket","resolve","createHash","WebSocket","socket","unsupported","text","homedir","join","resolve","result","randomUUID","Type","randomUUID","version","runtime","tool","entry","randomUUID","Check","call","tool","call","tool","resolve","text","message","message","call","Check","result","call","tool","Check","message","text","message","message","entry","text","runtime","thinkingLevel","performance","message","command","resolve","randomUUID","retryDelayMs","signal","entry","homedir","dirname","join","resolve","text","document","text","dirname","join","homedir","entry","resolve","tool","text","tool","createHash","realpath","writeFile","createHash","randomUUID","join","value","header","entry","text","open","createHash","randomUUID","join","spawn","constants","Type","open","readdir","stat","join","maxBytes","join","readdir","stat","text","resolve","maxBytes","open","resolve","existsSync","homedir","join","entry","bashOnPath","Type","constants","spawn","text","snapshot","constants","fsAccess","Type","text","realpath","basename","dirname","join","resolve","missing","key","currentQueue","releaseNext","chainedQueue","constants","homedir","join","constants","Type","fsAccess","constants","createHash","entry","hash","constants","fsAccess","Type","open","maxBytes","createHash","hash","createHash","text","message","sharp","header","run","constants","open","text","bmp","sharp","image","fitted","step","Type","maxBytes","fsAccess","constants","resolve","hash","fsWriteFile","dirname","Type","Type","fsWriteFile","dirname","tool","writeFile","realpath","createHash","mkdir","access","constants","resolve","join","homedir","runtime","tool","thinking","createHash","randomUUID","readFileSync","renameSync","rmSync","writeFileSync","realpath","dirname","join","resolve","hash","createHash","realpath","resolve","join","dirname","randomUUID","writeFileSync","renameSync","rmSync","readFileSync","readdir","stat","homedir","join","resolve","createHash","randomUUID","usage","createHash","message","randomUUID","entry","resolve","join","homedir","entry","readdir","stat","message","randomUUID","join","resolve","createHash","randomUUID","lstatSync","readFileSync","mkdir","rm","writeFile","basename","dirname","isAbsolute","join","resolve","isDeepStrictEqual","spawn","mkdir","message","mkdir","text","spawn","maxFileBytes","fail","message","join","lstatSync","readFileSync","hash","createHash","text","isAbsolute","file","entry","resolve","basename","dirname","randomUUID","mkdir","writeFile","rm","isDeepStrictEqual","Type","Check","abortable","isAbsolute","resolve","text","readdir","stat","join","homedir","resolve","runtime","resolve","homedir","skill","join","readdir","entry","stat","name","randomUUID","Type","run","randomUUID","readdir","readFile","stat","relative","resolve","Type","text","tool","call","readFile","resolve","readdir","relative","stat","randomUUID","message","resolve","entry","join","tool","Type","usage","run","text","last","Check","error"]}
|